diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c5f3f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 44c4caa..ae4a4ac 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,7 +47,7 @@ android { applicationId "com.example.traderscircuit" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/assets/images/png/face-id.png b/assets/images/png/face-id.png new file mode 100644 index 0000000..cce8dbf Binary files /dev/null and b/assets/images/png/face-id.png differ diff --git a/assets/images/png/fingerprint.png b/assets/images/png/fingerprint.png new file mode 100644 index 0000000..116f6a1 Binary files /dev/null and b/assets/images/png/fingerprint.png differ diff --git a/assets/images/png/pin.png b/assets/images/png/pin.png new file mode 100644 index 0000000..6039cfc Binary files /dev/null and b/assets/images/png/pin.png differ diff --git a/lib/Utils/Common/CommonAppbar.dart b/lib/Utils/Common/CommonAppbar.dart new file mode 100644 index 0000000..2203ac4 --- /dev/null +++ b/lib/Utils/Common/CommonAppbar.dart @@ -0,0 +1,77 @@ +// ignore_for_file: non_constant_identifier_names, file_names, prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class CommonAppbar extends StatelessWidget implements PreferredSizeWidget { + @override + Size get preferredSize => Size.fromHeight(height); + const CommonAppbar( + {Key? key, + required this.titleTxt, + this.showLeading = true, + this.customBack, + this.backPageName = '', + this.height = 105}) + : super(key: key); + + final String titleTxt; + final bool? showLeading; + final bool? customBack; + final String? backPageName; + final double height; + @override + Widget build(BuildContext context) { + return PreferredSize( + preferredSize: Size.fromHeight(130), + child: AppBar( + scrolledUnderElevation: 0.0, + backgroundColor: Colors.black, + elevation: 0, + leadingWidth: 56.w, + leading: Padding( + padding: EdgeInsets.only(left: 16.w, top: 20.h), + child: GestureDetector( + onTap: () { + customBack ?? false ? Get.toNamed(backPageName!) : Get.back(); + }, + child: Padding( + padding: EdgeInsets.only(left: 8.w), + child: Icon( + Icons.arrow_back_ios, + color: Colors.white, + size: 25.r, + ), + ), + ), + ), + flexibleSpace: FlexibleSpaceBar( + centerTitle: false, + titlePadding: EdgeInsets.all(0), + title: Padding( + padding: EdgeInsets.only(left: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + titleTxt, + style: TextStyle( + color: Colors.white, + fontSize: 24.sp, + fontWeight: FontWeight.w500, + fontFamily: 'manrope'), + maxLines: 2, + softWrap: true, + ), + // newTextfield( + // FontWeight.w400, 0) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/Utils/Common/CustomTextFormField.dart b/lib/Utils/Common/CustomTextFormField.dart index d7156b2..0268f4d 100644 --- a/lib/Utils/Common/CustomTextFormField.dart +++ b/lib/Utils/Common/CustomTextFormField.dart @@ -123,13 +123,13 @@ class _CustomTextFormFieldState extends State { ), style: TextStyle(color: Colors.white), keyboardType: widget.texttype, - validator: widget.validator ?? - (value) { - if (value == null || value.isEmpty) { - return "Empty value"; - } - return null; - }, + // validator: widget.validator ?? + // (value) { + // if (value == null || value.isEmpty) { + // return "Empty value"; + // } + // return null; + // }, inputFormatters: widget.inputFormatters, onChanged: (value) { widget.onInput?.call(value); diff --git a/lib/Utils/Dialogs.dart b/lib/Utils/Dialogs.dart new file mode 100644 index 0000000..6cc75b5 --- /dev/null +++ b/lib/Utils/Dialogs.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:get/get.dart'; + +class utils { + static showToast(String? msg) { + if (msg != null && msg != "null" && msg.isNotEmpty) { + Fluttertoast.showToast(msg: msg); + } + } + + static loader() { + Get.dialog( + Dialog( + elevation: 0, + backgroundColor: Colors.transparent, + child: WillPopScope( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator( + color: Color(0xffc18948), + ), + ], + ), + ), + onWillPop: () async => false), + ), + barrierDismissible: false, + ); + } +} diff --git a/lib/Utils/Common/text.dart b/lib/Utils/text.dart similarity index 73% rename from lib/Utils/Common/text.dart rename to lib/Utils/text.dart index 631d1bc..904b2b6 100644 --- a/lib/Utils/Common/text.dart +++ b/lib/Utils/text.dart @@ -1,6 +1,17 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +Widget text20W400(String text) { + return Text( + text, + style: TextStyle( + fontSize: 20.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'manrope'), + ); +} + Widget text18W800(String text) { return Text( text, @@ -23,6 +34,17 @@ Widget text18W600(String text) { ); } +Widget text18W400(String text) { + return Text( + text, + style: TextStyle( + fontSize: 18.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'manrope'), + ); +} + Widget text16W400(String text) { return Text( text, diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index e1a33fa..bdb68ef 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -1,8 +1,19 @@ class RouteName { static const String splashScreen = '/'; static const String nointernet = '/nointernet'; + + //slidescreen static const String sliderscreen1 = '/sliderscreen1'; static const String sliderscreen2 = '/sliderscreen2'; static const String sliderscreen3 = '/sliderscreen3'; + + //login/signup static const String loginscreen = '/loginscreen'; + static const String verifyotp = '/verifyotp'; + + //secureaccess + static const String secureaccess = '/secureaccess'; + static const String faceid = '/faceid'; + static const String fingerprint = '/fingerprint'; + static const String pin = '/pin'; } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 4f45edd..591d019 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -2,10 +2,15 @@ import 'package:get/get.dart'; import 'package:traderscircuit/Utils/Common/noInternet.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/login/LoginScreen.dart'; +import 'package:traderscircuit/view/login/VerifyOtp.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen2.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen3.dart'; +import 'package:traderscircuit/view/secureAccess.dart/Faceid.dart'; +import 'package:traderscircuit/view/secureAccess.dart/Fingerprint.dart'; +import 'package:traderscircuit/view/secureAccess.dart/Pin.dart'; +import 'package:traderscircuit/view/secureAccess.dart/SecureAccess.dart'; class AppRoutes { static appRoutes() => [ @@ -17,6 +22,8 @@ class AppRoutes { name: RouteName.nointernet, page: () => const NoInternet(), ), + + //slidescreen GetPage( name: RouteName.sliderscreen1, page: () => const Sliderscreen1(), @@ -29,9 +36,33 @@ class AppRoutes { name: RouteName.sliderscreen3, page: () => const Sliderscreen3(), ), + + //login/signup GetPage( name: RouteName.loginscreen, page: () => const LoginScreen(), ), + GetPage( + name: RouteName.verifyotp, + page: () => const VerifyOTP(), + ), + + //secureaccess + GetPage( + name: RouteName.secureaccess, + page: () => const SecureAccess(), + ), + GetPage( + name: RouteName.faceid, + page: () => const Faceid(), + ), + GetPage( + name: RouteName.fingerprint, + page: () => const Fingerprint(), + ), + GetPage( + name: RouteName.pin, + page: () => const Pin(), + ), ]; } diff --git a/lib/view/login/LoginScreen.dart b/lib/view/login/LoginScreen.dart index 026edda..abacfef 100644 --- a/lib/view/login/LoginScreen.dart +++ b/lib/view/login/LoginScreen.dart @@ -1,13 +1,16 @@ import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:get/get.dart'; import 'package:glassmorphism/glassmorphism.dart'; import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart'; import 'package:traderscircuit/Utils/Common/commonBotton.dart'; -import 'package:traderscircuit/Utils/Common/text.dart'; +import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/main.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; class LoginScreen extends StatefulWidget { @@ -18,6 +21,13 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { + TextEditingController phonecontroller = TextEditingController(); + bool isValidPhoneNumber(String phoneNumber) { + final RegExp phoneNumberExpression = RegExp(r"^0{10}$"); + + return !phoneNumberExpression.hasMatch(phoneNumber); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -124,7 +134,26 @@ class _LoginScreenState extends State { ), Container( width: 285.w, - child: CustomTextFormField(), + child: CustomTextFormField( + texttype: TextInputType.phone, + textEditingController: phonecontroller, + // validator: (value) { + // if (value.isEmpty) { + // return 'Enter your phone number'; + // } else if (!RegExp(r'(^(?:[+0]9)?[0-9]{10}$)') + // .hasMatch(value)) { + // return 'Enter a valid phone number'; + // } else if (!isValidPhoneNumber(value)) { + // return 'Phone number cannot contain 10 zeros'; + // } + // return null; + // }, + inputFormatters: [ + LengthLimitingTextInputFormatter(10), + FilteringTextInputFormatter.allow( + RegExp('[0-9]')), + ], + ), ) ], ), @@ -136,7 +165,11 @@ class _LoginScreenState extends State { SizedBox( height: 65.h, ), - CommonBtn(text: "Login/Signup", onTap: () {}), + CommonBtn( + text: "Login/Signup", + onTap: () { + Get.toNamed(RouteName.verifyotp); + }), SizedBox( height: 10.h, ), diff --git a/lib/view/login/VerifyOtp.dart b/lib/view/login/VerifyOtp.dart new file mode 100644 index 0000000..3aea9ba --- /dev/null +++ b/lib/view/login/VerifyOtp.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import 'package:traderscircuit/Utils/Dialogs.dart'; + +class VerifyOTP extends StatefulWidget { + const VerifyOTP({super.key}); + + @override + State createState() => _VerifyOTPState(); +} + +class _VerifyOTPState extends State { + final GlobalKey _otpform = GlobalKey(); + TextEditingController pincode = TextEditingController(); + Color primaryColor = Colors.transparent.withOpacity(0.2); + Color secondaryColor = Colors.grey.shade800; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar(titleTxt: "Verify OTP"), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: Form( + key: _otpform, + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text18W400("Enter four digit code send to"), + SizedBox( + height: 100.h, + ), + Container( + child: PinCodeTextField( + showCursor: true, + cursorColor: Colors.white, + textStyle: + TextStyle(fontSize: 18.sp, color: Colors.white), + errorTextSpace: 22, + validator: (value) { + if (value != null && value.isEmpty) { + return "Please Enter verification code"; + } else if (value != null && value.length < 4) { + return "OTP length should be atleast 4"; + } + return null; + }, + keyboardType: TextInputType.number, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + length: 4, + obscureText: false, + animationType: AnimationType.fade, + pinTheme: PinTheme( + selectedFillColor: primaryColor, + inactiveFillColor: primaryColor, + activeFillColor: primaryColor, + inactiveColor: secondaryColor, + activeColor: secondaryColor, + selectedColor: secondaryColor, + shape: PinCodeFieldShape.box, + borderRadius: BorderRadius.circular(15), + fieldHeight: 60.h, + fieldWidth: 60.w, + ), + animationDuration: Duration(milliseconds: 300), + enableActiveFill: true, + controller: pincode, + onCompleted: (v) { + print("Completed"); + }, + onChanged: (value) { + print(value); + setState(() {}); + }, + beforeTextPaste: (text) { + print("Allowing to paste $text"); + + return true; + }, + appContext: context, + ), + ), + SizedBox( + height: 45.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + text16W700("Resend Code"), + ], + ), + SizedBox( + height: 200.h, + ), + CommonBtn( + text: "Verify OTP", + onTap: () { + Get.toNamed(RouteName.secureaccess); + }, + ) + ], + ), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/secureAccess.dart/Faceid.dart b/lib/view/secureAccess.dart/Faceid.dart new file mode 100644 index 0000000..ecd9b37 --- /dev/null +++ b/lib/view/secureAccess.dart/Faceid.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; + +class Faceid extends StatefulWidget { + const Faceid({super.key}); + + @override + State createState() => _FaceidState(); +} + +class _FaceidState extends State { + Color primaryColor = Colors.transparent.withOpacity(0.2); + Color secondaryColor = Colors.grey.shade800; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar(titleTxt: "Secure your access"), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + SizedBox( + height: 10.h, + ), + text18W400("Quickly set up Face ID for secure access."), + SizedBox( + height: 180.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset("assets/images/png/face-id.png"), + ], + ), + SizedBox( + height: 180.h, + ), + CommonBtn( + text: "Setup", + onTap: () { + Get.toNamed(RouteName.loginscreen); + }, + ) + ], + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/secureAccess.dart/Fingerprint.dart b/lib/view/secureAccess.dart/Fingerprint.dart new file mode 100644 index 0000000..e482638 --- /dev/null +++ b/lib/view/secureAccess.dart/Fingerprint.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; + +class Fingerprint extends StatefulWidget { + const Fingerprint({super.key}); + + @override + State createState() => _FingerprintState(); +} + +class _FingerprintState extends State { + Color primaryColor = Colors.transparent.withOpacity(0.2); + Color secondaryColor = Colors.grey.shade800; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar(titleTxt: "Secure your access"), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + SizedBox( + height: 10.h, + ), + text18W400("Quickly set up Fingerprint for secure access."), + SizedBox( + height: 180.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset("assets/images/png/fingerprint.png"), + ], + ), + SizedBox( + height: 180.h, + ), + CommonBtn( + text: "Setup", + onTap: () { + Get.toNamed(RouteName.loginscreen); + }, + ) + ], + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/secureAccess.dart/Pin.dart b/lib/view/secureAccess.dart/Pin.dart new file mode 100644 index 0000000..af2e77e --- /dev/null +++ b/lib/view/secureAccess.dart/Pin.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; + +class Pin extends StatefulWidget { + const Pin({super.key}); + + @override + State createState() => _PinState(); +} + +class _PinState extends State { + TextEditingController pin = TextEditingController(); + Color primaryColor = Colors.transparent.withOpacity(0.2); + Color secondaryColor = Colors.grey.shade800; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar(titleTxt: "Verify your number"), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + SizedBox( + height: 10.h, + ), + text18W400("Quickly set up pin for secure access."), + SizedBox( + height: 180.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + child: PinCodeTextField( + showCursor: true, + cursorColor: Colors.white, + textStyle: + TextStyle(fontSize: 18.sp, color: Colors.white), + errorTextSpace: 22, + validator: (value) { + if (value != null && value.isEmpty) { + return "Please Enter verification code"; + } else if (value != null && value.length < 4) { + return "OTP length should be atleast 4"; + } + return null; + }, + keyboardType: TextInputType.number, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + length: 4, + obscureText: false, + animationType: AnimationType.fade, + pinTheme: PinTheme( + selectedFillColor: primaryColor, + inactiveFillColor: primaryColor, + activeFillColor: primaryColor, + inactiveColor: secondaryColor, + activeColor: secondaryColor, + selectedColor: secondaryColor, + shape: PinCodeFieldShape.box, + borderRadius: BorderRadius.circular(15), + fieldHeight: 60.h, + fieldWidth: 60.w, + ), + animationDuration: Duration(milliseconds: 300), + enableActiveFill: true, + controller: pin, + onCompleted: (v) { + print("Completed"); + }, + onChanged: (value) { + print(value); + setState(() {}); + }, + beforeTextPaste: (text) { + print("Allowing to paste $text"); + + return true; + }, + appContext: context, + ), + ), + ], + ), + SizedBox( + height: 180.h, + ), + CommonBtn( + text: "Setup", + onTap: () { + Get.toNamed(RouteName.loginscreen); + }, + ) + ], + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/secureAccess.dart/SecureAccess.dart b/lib/view/secureAccess.dart/SecureAccess.dart new file mode 100644 index 0000000..dbaec0c --- /dev/null +++ b/lib/view/secureAccess.dart/SecureAccess.dart @@ -0,0 +1,267 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; + +class SecureAccess extends StatefulWidget { + const SecureAccess({super.key}); + + @override + State createState() => _SecureAccessState(); +} + +class _SecureAccessState extends State { + TextEditingController pincode = TextEditingController(); + Color primaryColor = Colors.transparent.withOpacity(0.2); + Color secondaryColor = Colors.grey.shade800; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar(titleTxt: "Secure ypur access"), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + SizedBox( + height: 30.h, + ), + InkWell( + onTap: () { + Get.toNamed(RouteName.faceid); + }, + child: GlassmorphicContainer( + width: double.infinity, + height: 80.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withOpacity(0.1), + Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: [ + 0.1, + 1, + ]), + border: 0, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff9A0000).withOpacity(0.5), + Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 10.w, + ), + Image.asset( + "assets/images/png/face-id.png", + height: 40.h, + width: 40.w, + ), + SizedBox( + width: 20.w, + ), + text20W400( + "Face ID", + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + Icons.arrow_forward_ios, + color: Colors.white, + ), + SizedBox( + width: 20.w, + ), + ], + ) + ], + ), + ), + ), + ), + SizedBox( + height: 20.h, + ), + InkWell( + onTap: () { + Get.toNamed(RouteName.fingerprint); + }, + child: GlassmorphicContainer( + width: double.infinity, + height: 80.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withOpacity(0.1), + Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: [ + 0.1, + 1, + ]), + border: 0, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff9A0000).withOpacity(0.5), + Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 10.w, + ), + Image.asset( + "assets/images/png/fingerprint.png", + height: 40.h, + width: 40.w, + ), + SizedBox( + width: 20.w, + ), + text20W400("Fingerprint"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + Icons.arrow_forward_ios, + color: Colors.white, + ), + SizedBox( + width: 20.w, + ) + ], + ) + ], + ), + ), + ), + ), + SizedBox( + height: 20.h, + ), + InkWell( + onTap: () {}, + child: GlassmorphicContainer( + width: double.infinity, + height: 80.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withOpacity(0.1), + Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: [ + 0.1, + 1, + ]), + border: 0, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff9A0000).withOpacity(0.5), + Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 10.w, + ), + Image.asset( + "assets/images/png/pin.png", + height: 40.h, + width: 40.w, + ), + SizedBox( + width: 20.w, + ), + text20W400("4 Digit Pin"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + Icons.arrow_forward_ios, + color: Colors.white, + ), + SizedBox( + width: 20.w, + ) + ], + ), + ], + ), + ), + ), + ), + SizedBox( + height: 250.h, + ), + CommonBtn( + text: "Verify OTP", + onTap: () { + Get.toNamed(RouteName.loginscreen); + }, + ) + ], + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 510fa38..2363400 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -144,6 +144,14 @@ packages: description: flutter source: sdk version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 + url: "https://pub.dev" + source: hosted + version: "8.2.4" get: dependency: "direct main" description: @@ -272,6 +280,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" + pin_code_fields: + dependency: "direct main" + description: + name: pin_code_fields + sha256: "4c0db7fbc889e622e7c71ea54b9ee624bb70c7365b532abea0271b17ea75b729" + url: "https://pub.dev" + source: hosted + version: "8.0.1" platform: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4dc407d..755ae70 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,6 +41,8 @@ dependencies: shared_preferences: ^2.0.15 connectivity_plus: ^5.0.2 glassmorphism: ^3.0.0 + pin_code_fields: ^8.0.1 + fluttertoast: ^8.0.9