diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2a8ac42..ab55086 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,6 +4,10 @@ android:label="Trader's Circuit" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> + + + + diff --git a/assets/images/svg/cancel.svg b/assets/images/svg/cancel.svg new file mode 100644 index 0000000..578cbc6 --- /dev/null +++ b/assets/images/svg/cancel.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/search-svgrepo-com.svg b/assets/images/svg/search-svgrepo-com.svg new file mode 100644 index 0000000..5a10e0e --- /dev/null +++ b/assets/images/svg/search-svgrepo-com.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/sidemenu/Gray.svg b/assets/images/svg/sidemenu/Gray.svg new file mode 100644 index 0000000..17309fc --- /dev/null +++ b/assets/images/svg/sidemenu/Gray.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/sidemenu/Group 51347.svg b/assets/images/svg/sidemenu/Group 51347.svg new file mode 100644 index 0000000..224da5c --- /dev/null +++ b/assets/images/svg/sidemenu/Group 51347.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/thumbs-down.svg b/assets/images/svg/thumbs-down.svg new file mode 100644 index 0000000..a272caa --- /dev/null +++ b/assets/images/svg/thumbs-down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/thumbs-up.svg b/assets/images/svg/thumbs-up.svg new file mode 100644 index 0000000..eb958fd --- /dev/null +++ b/assets/images/svg/thumbs-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/upload-cloud.svg b/assets/images/svg/upload-cloud.svg new file mode 100644 index 0000000..183197a --- /dev/null +++ b/assets/images/svg/upload-cloud.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/Utils/Common/CommonAppbar.dart b/lib/Utils/Common/CommonAppbar.dart index 4fde113..9c9ec29 100644 --- a/lib/Utils/Common/CommonAppbar.dart +++ b/lib/Utils/Common/CommonAppbar.dart @@ -7,7 +7,7 @@ import 'package:traderscircuit/Utils/text.dart'; class CommonAppbar extends StatelessWidget implements PreferredSizeWidget { @override - Size get preferredSize => Size.fromHeight(height); + Size get preferredSize => Size.fromHeight(height!); const CommonAppbar( {Key? key, required this.titleTxt, @@ -27,11 +27,11 @@ class CommonAppbar extends StatelessWidget implements PreferredSizeWidget { final String? backPageName; final Widget? customActionWidget; final VoidCallback? onCustomActionPressed; - final double height; + final double? height; @override Widget build(BuildContext context) { return PreferredSize( - preferredSize: Size.fromHeight(130), + preferredSize: Size.fromHeight(height ?? 130), child: AppBar( scrolledUnderElevation: 0.0, backgroundColor: Colors.black, diff --git a/lib/Utils/Common/CommonBottomNavigation.dart b/lib/Utils/Common/CommonBottomNavigation.dart index f0cb756..b4f406a 100644 --- a/lib/Utils/Common/CommonBottomNavigation.dart +++ b/lib/Utils/Common/CommonBottomNavigation.dart @@ -75,9 +75,9 @@ GlassmorphicContainer bottomnavigationbar(MainController _mainController) { shape: BoxShape.circle, boxShadow: [ BoxShadow( - color: Colors.grey.withOpacity(0.4), + color: Colors.grey.withOpacity(0.2), spreadRadius: 15, - blurRadius: 10, + blurRadius: 5, offset: Offset(0, 10), ), ], diff --git a/lib/Utils/Common/CustomTextFormField.dart b/lib/Utils/Common/CustomTextFormField.dart index 18fba02..54bd94f 100644 --- a/lib/Utils/Common/CustomTextFormField.dart +++ b/lib/Utils/Common/CustomTextFormField.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:glassmorphism/glassmorphism.dart'; class CustomTextFormField extends StatefulWidget { @@ -145,3 +146,156 @@ class _CustomTextFormFieldState extends State { ); } } + +class CustomTextFormField1 extends StatefulWidget { + const CustomTextFormField1({ + Key? key, + this.validator, + this.textEditingController, + this.hintText, + this.leadingIcon, + this.prefixIconColor = const Color(0xFF737373), + this.isInputPassword = false, + this.validatorText, + this.value, + this.readonly = false, + this.enabled = true, + this.maxlines = 1, + this.texttype, + this.inputFormatters, + this.onInput, + this.onTap, + this.suffixIcon, + }) : super(key: key); + + final dynamic validator; + final TextEditingController? textEditingController; + final String? hintText; + final Widget? leadingIcon; + final Color prefixIconColor; + final bool isInputPassword; + final String? validatorText; + final String? value; + final bool readonly; + final bool enabled; + final int maxlines; + final TextInputType? texttype; + final dynamic inputFormatters; + final Function(String)? onInput; + final VoidCallback? onTap; + final Widget? suffixIcon; + + @override + State createState() => _CustomTextFormField1State(); +} + +class _CustomTextFormField1State extends State { + late bool obscureText; + + @override + void initState() { + super.initState(); + obscureText = widget.isInputPassword; + } + + @override + Widget build(BuildContext context) { + return GlassmorphicContainer( + width: double.infinity, + height: 50, + borderRadius: 8, + blur: 10, + alignment: Alignment.bottomCenter, + border: 0.8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFFffffff).withOpacity(0.1), + Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: [ + 0.1, + 1, + ]), + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff3A3A3A), + Color(0xFF3A3A3A), + ], + ), + child: TextFormField( + cursorColor: Colors.red, + initialValue: widget.value, + readOnly: widget.readonly, + onTap: widget.onTap, + enabled: widget.enabled, + enableInteractiveSelection: false, + maxLines: widget.maxlines, + autovalidateMode: AutovalidateMode.onUserInteraction, + obscureText: obscureText, + controller: widget.textEditingController, + + decoration: InputDecoration( + hintText: widget.hintText, + prefixIconColor: widget.prefixIconColor, + + hintStyle: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'manrope'), + + // ignore: prefer_null_aware_operators + prefixIcon: widget.leadingIcon == null ? null : widget.leadingIcon!, + suffixIcon: widget.isInputPassword + ? GestureDetector( + onTap: () => setState(() => obscureText = !obscureText), + child: obscureText + ? const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(right: 20.0), + child: Icon(Icons.remove_red_eye), + ), + ], + ) + : const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(right: 20.0), + child: Icon( + Icons.remove_red_eye_outlined, + color: Color(0xFF959595), + ), + ), + ], + ), + ) + : widget.suffixIcon == null + ? null + : widget.suffixIcon!, + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + ), + style: TextStyle(color: Colors.white), + keyboardType: widget.texttype, + // 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/Common/ImagePicker.dart b/lib/Utils/Common/ImagePicker.dart new file mode 100644 index 0000000..20d518a --- /dev/null +++ b/lib/Utils/Common/ImagePicker.dart @@ -0,0 +1,36 @@ +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; + +class ImagePickerMethod { + Future getImage(ImageSource imgSource) async { + final ImagePicker picker = ImagePicker(); + + final XFile? pickedImg = await picker.pickImage(source: imgSource); + if (pickedImg != null) { + final croppedImg = await ImageCropper().cropImage( + sourcePath: pickedImg.path, + aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1), + compressFormat: ImageCompressFormat.jpg, + maxHeight: 512, + maxWidth: 512, + uiSettings: [ + IOSUiSettings( + rotateButtonsHidden: true, + rotateClockwiseButtonHidden: true, + ) + ], + compressQuality: 100, + aspectRatioPresets: [ + CropAspectRatioPreset.square, + ], + ); + if (croppedImg != null) { + return croppedImg.path; + } else { + return ""; + } + } else { + return ""; + } + } +} diff --git a/lib/Utils/Common/commonBotton.dart b/lib/Utils/Common/commonBotton.dart index 1c6b2f5..fb855c6 100644 --- a/lib/Utils/Common/commonBotton.dart +++ b/lib/Utils/Common/commonBotton.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:glassmorphism/glassmorphism.dart'; +import 'package:traderscircuit/Utils/Common/sized_box.dart'; +import 'package:traderscircuit/Utils/text.dart'; Widget CommonBtn({void Function()? onTap, required String text}) { return InkWell( @@ -23,3 +26,117 @@ Widget CommonBtn({void Function()? onTap, required String text}) { ), )); } + +Widget CommonYesNoBtn({ + void Function()? yesonTap, + void Function()? noonTap, +}) { + return Row( + children: [ + GestureDetector( + onTap: yesonTap, + child: GlassmorphicContainer( + width: 170.w, + height: 50.h, + borderRadius: 8, + blur: 10, + alignment: Alignment.center, + border: 0.9, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withOpacity(0.1), + Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: [ + 0.1, + 1, + ], + ), + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color.fromRGBO(70, 5, 1, 0.8), + Color.fromRGBO(102, 102, 102, 0.8), + ], + ), + child: Center( + child: text18W500('Yes'), + ), + ), + ), + sizedBoxWidth(10.w), + GestureDetector( + onTap: noonTap, + child: Container( + height: 50.h, + width: 170.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.r), + border: Border.all(color: Color(0xFF9A0000), width: 1.w), + color: Color(0xFF6C0000)), + child: Center(child: text18W500('No')), + ), + ) + ], + ); +} + + // InkWell( + // onTap: onTap, + // child: Container( + // width: double.infinity, + // height: 50.h, + // decoration: BoxDecoration( + // color: Color(0xff9A0000), borderRadius: BorderRadius.circular(5)), + // child: Center( + // child: Text( + // text, + // textAlign: TextAlign.center, + // style: TextStyle( + // color: Colors.white, + // fontSize: 20.sp, + // fontFamily: 'Cambria', + // fontWeight: FontWeight.w400, + // ), + // ), + // ), + // )); +Widget kycBtn({ + void Function()? onTap, + required String text, + required Color bgClr, + required Color borderClr, +}) { + return InkWell( + onTap: onTap, + child: Container( + width: 191, + height: 50, + decoration: ShapeDecoration( + color: bgClr, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: borderClr, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Center( + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 20.sp, + fontFamily: 'Cambria', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ); +} diff --git a/lib/Utils/Common/custom_drop_down.dart b/lib/Utils/Common/custom_drop_down.dart new file mode 100644 index 0000000..b2aec98 --- /dev/null +++ b/lib/Utils/Common/custom_drop_down.dart @@ -0,0 +1,192 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../text.dart'; + +class CustomDropDownWidget extends StatefulWidget { + const CustomDropDownWidget( + {super.key, required this.header, required this.listData}); + final String header; + final List listData; + + @override + State createState() => _CustomDropDownWidgetState(); +} + +class _CustomDropDownWidgetState extends State { + RxBool onDropTap = false.obs; + RxString selectedValue = "".obs; + @override + Widget build(BuildContext context) { + return Obx( + () => SizedBox( + width: Get.width, + // height: onDropTap.value ? 350 : 55, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + onDropTap.value = !onDropTap.value; + }, + child: SizedBox( + width: 398, + height: 55, + child: Stack( + children: [ + Positioned( + left: 398, + top: 55, + child: Opacity( + opacity: 0.50, + child: Transform( + transform: Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-3.14), + child: Container( + width: 398, + height: 55, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: const Alignment(0.98, -0.21), + end: const Alignment(-0.98, 0.21), + colors: [ + Colors.white + .withOpacity(0.03999999910593033), + Colors.white + .withOpacity(0.05999999865889549) + ], + ), + border: Border( + top: onDropTap.value + ? const BorderSide( + width: 0, color: Color(0xFF393939)) + : const BorderSide( + width: 0.50, + color: Color(0xFF393939)), + bottom: const BorderSide( + width: 0.50, color: Color(0xFF393939)), + left: const BorderSide( + width: 0.50, + color: Color(0xFF393939), + ), + right: const BorderSide( + width: 0.50, + color: Color(0xFF393939), + ), + )), + ), + ), + ), + ), + Positioned( + left: 14, + top: 16, + child: Text( + selectedValue.isNotEmpty + ? selectedValue.value + : widget.header, + style: const TextStyle( + color: Color(0xFFADADAD), + fontSize: 16, + fontFamily: 'Manrope', + fontWeight: FontWeight.w400, + height: 0, + ), + ), + ), + Positioned( + right: 14, + top: 16, + child: onDropTap.value + ? const Icon( + Icons.keyboard_arrow_up_rounded, + color: Colors.white, + ) + : const Icon( + Icons.keyboard_arrow_down_rounded, + color: Colors.white, + )), + ], + ), + ), + ), + !onDropTap.value + ? const SizedBox() + : Opacity( + opacity: 0.50, + child: Container( + width: Get.width, + // height: 216, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: const Alignment(0.98, -0.21), + end: const Alignment(-0.98, 0.21), + colors: [ + Colors.white.withOpacity(0.03999999910593033), + Colors.white.withOpacity(0.05999999865889549) + ], + ), + shape: const RoundedRectangleBorder( + side: + BorderSide(width: 0.50, color: Color(0xFF393939)), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + ), + ), + child: ListView.builder( + shrinkWrap: true, + itemCount: widget.listData.length, + itemBuilder: (context, index) { + return InkWell( + onTap: () { + selectedValue.value = widget.listData[index]; + onDropTap.value = !onDropTap.value; + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + left: 14, + top: index == 0 ? 16 : 0, + bottom: index == + widget.listData.length - 1 + ? 16 + : 0), + child: + text16W400(widget.listData[index])), + index == widget.listData.length - 1 + ? const SizedBox() + : Container( + width: Get.width, + margin: const EdgeInsets.only( + top: 16, bottom: 16), + decoration: const ShapeDecoration( + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.60, + strokeAlign: BorderSide + .strokeAlignCenter, + color: Color(0xFF393939), + ), + ), + ), + ), + ], + ), + ); + }), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/Utils/text.dart b/lib/Utils/text.dart index 3b9a021..9440424 100644 --- a/lib/Utils/text.dart +++ b/lib/Utils/text.dart @@ -12,6 +12,18 @@ Widget text20W400(String text) { ); } +Widget text20W400_center(String text) { + return Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20.sp, + color: Colors.white, + fontWeight: FontWeight.w400, + fontFamily: 'manrope'), + ); +} + Widget text18W800(String text) { return Text( text, @@ -56,6 +68,19 @@ Widget text18W400(String text) { ); } +Widget text24W500(String text) { + return Text( + text, + style: TextStyle( + color: Colors.white, + fontSize: 24.sp, + fontWeight: FontWeight.w500, + fontFamily: 'manrope'), + maxLines: 2, + softWrap: true, + ); +} + Widget text16W400(String text) { return Text( text, @@ -154,6 +179,7 @@ Widget text12W400(String text) { fontFamily: 'manrope'), ); } + Widget text12W500(String text) { return Text( text, @@ -231,8 +257,8 @@ Widget text14W300(String text) { ); } - -Widget text14W400(String text) { return Text( +Widget text14W400(String text) { + return Text( text, style: TextStyle( fontSize: 14.sp, @@ -243,13 +269,11 @@ Widget text14W400(String text) { return Text( } Widget text14W500(String text) { - return Text( text, style: TextStyle( fontSize: 14.sp, color: Colors.white, - fontWeight: FontWeight.w500, fontFamily: 'manrope'), ); @@ -261,13 +285,11 @@ Widget text16W400_DADADA(String text) { style: TextStyle( fontSize: 16.sp, color: Color(0xFFDADADA), - fontWeight: FontWeight.w400, fontFamily: 'manrope'), ); } - Widget text14W400_979797(String text) { return Text( text, @@ -313,4 +335,3 @@ Widget text14W500_black(String text) { fontFamily: 'manrope'), ); } - diff --git a/lib/controller/kyc_controller.dart b/lib/controller/kyc_controller.dart new file mode 100644 index 0000000..dcaa715 --- /dev/null +++ b/lib/controller/kyc_controller.dart @@ -0,0 +1,8 @@ +import 'package:get/get.dart'; + +class KYCController extends GetxController { + RxString panFrontImage = "".obs; + RxString panBackImage = "".obs; + RxString aadharFrontImage = "".obs; + RxString aadharBackImage = "".obs; +} diff --git a/lib/main.dart b/lib/main.dart index 406c806..26695f6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -97,7 +97,7 @@ class _MyAppState extends State with WidgetsBindingObserver { fontFamily: 'manrope', ), debugShowCheckedModeBanner: false, - initialRoute: RouteName.mainscreen, + initialRoute: RouteName.splashScreen, getPages: AppRoutes.appRoutes(), ), designSize: const Size(390, 844), diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index 762b008..f5555f5 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -31,6 +31,7 @@ class RouteName { //kyc static const String kyc = '/kyc'; + static const String kycImage = "/kycImage"; //update risk profile static const String updateriskprofile = '/updateriskprofile'; @@ -40,6 +41,6 @@ class RouteName { static const String privacypolicy = '/privacypolicy'; static const String aboutus = '/aboutus'; + static const String faqscreen = '/faqscreen'; - } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 47e36af..780542a 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -3,6 +3,7 @@ import 'package:traderscircuit/Utils/Common/noInternet.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/MainScreen/ExploreUnseen.dart'; import 'package:traderscircuit/view/Sidemenu/AboutUs.dart'; +import 'package:traderscircuit/view/Sidemenu/FaqScreen.dart'; import 'package:traderscircuit/view/Sidemenu/PrivacyPolicy.dart'; import 'package:traderscircuit/view/Sidemenu/TermsAndCondition.dart'; @@ -27,6 +28,8 @@ import 'package:traderscircuit/view/secureAccess.dart/Fingerprint.dart'; import 'package:traderscircuit/view/secureAccess.dart/Pin.dart'; import 'package:traderscircuit/view/secureAccess.dart/SecureAccess.dart'; +import '../../view/login/uploadKycImage.dart'; + class AppRoutes { static appRoutes() => [ GetPage( @@ -114,6 +117,10 @@ class AppRoutes { name: RouteName.kyc, page: () => const Kyc(), ), + GetPage( + name: RouteName.kycImage, + page: () => const UploadKYCImage(), + ), //update risk profile GetPage( @@ -130,9 +137,13 @@ class AppRoutes { name: RouteName.privacypolicy, page: () => const PrivacyPolicy(), ), - GetPage( + GetPage( name: RouteName.aboutus, page: () => const AboutUs(), + ), + GetPage( + name: RouteName.faqscreen, + page: () => const FaqScreen(), ), ]; } diff --git a/lib/view/MainScreen/ShortTrade.dart b/lib/view/MainScreen/ShortTrade.dart index 1fdc152..0f2939d 100644 --- a/lib/view/MainScreen/ShortTrade.dart +++ b/lib/view/MainScreen/ShortTrade.dart @@ -30,7 +30,7 @@ class _ShortTradeState extends State { return Scaffold( key: _scaffoldKey1, backgroundColor: Colors.black, - drawer: Container(width: 320.w, child: SideMenu()), + drawer: Container(child: SideMenu()), extendBody: true, appBar: AppBar( scrolledUnderElevation: 0.0, @@ -50,6 +50,7 @@ class _ShortTradeState extends State { ), ), ), + // title: text22W600('Short'), ), // CommonAppbar( @@ -136,7 +137,7 @@ class _ShortTradeState extends State { Widget ActiveCallsTab() { return Obx(() { WidgetsBinding.instance.addPostFrameCallback((_) { - if (selectedIndex == 1) _unlockbottomsheet(); + if (selectedIndex == 1 || selectedIndex == 2) _unlockbottomsheet(); }); return selectedIndex == 0 ? Column( @@ -235,25 +236,35 @@ class _ShortTradeState extends State { void _unlockbottomsheet() { Get.bottomSheet( - SizedBox( - height: 200, - child: commonGlassContainer( - width: double.infinity, - height: 200, - borderradius: 2, - customWidget: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Image.asset( - // 'assets/images/png/Group 1000003722.png', - // height: 100.h, - // ), - // sizedBoxHeight(25.h), - text20W400('Please subscribed to unlock'), - sizedBoxHeight(30.h), - CommonBtn(text: 'Subscribe Now'), - ], + + commonGlassContainer( + width: double.infinity, + height: 439.h, + borderradius: 4, + customWidget: Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 35.w), + child: Column( + children: [ + sizedBoxHeight(50.h), + // Image.asset( + // 'assets/images/png/Group 1000003722.png', + // height: 100.h, + // ), + // sizedBoxHeight(25.h), + text20W400('Please subscribed to unlock'), + sizedBoxHeight(30.h), + CommonBtn( + text: 'Subscribe Now', + onTap: () {}, + ), + + SizedBox( + height: 100, + ) + ], + ), + ), ), ), diff --git a/lib/view/Sidemenu/FaqScreen.dart b/lib/view/Sidemenu/FaqScreen.dart new file mode 100644 index 0000000..149889c --- /dev/null +++ b/lib/view/Sidemenu/FaqScreen.dart @@ -0,0 +1,324 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/Common/CommonAppBar.dart'; +import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart'; +import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart'; +import 'package:traderscircuit/Utils/Common/sized_box.dart'; +import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; + +class FaqScreen extends StatefulWidget { + const FaqScreen({super.key}); + + @override + State createState() => _FaqScreenState(); +} + +class _FaqScreenState extends State { + List containerTexts = [ + "Subscriptions", + "Investments", + "App features" + ]; + + final selectedIndex = 0.obs; + late RxList isExpandedList; + @override + void initState() { + isExpandedList = RxList.generate(Faqcard.length, (index) => index == 0); + super.initState(); + } + + List> Faqcard = [ + { + 'title': 'How to create new account?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + { + 'title': 'What is Traders Circuits ?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + { + 'title': 'What is Traders Circuits ?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + { + 'title': 'What is Traders Circuits ?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + { + 'title': 'What is Traders Circuits ?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + ]; + + List> Faqcard2 = [ + { + 'title': 'How to create new account?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + { + 'title': 'What is Traders Circuits ?', + 'content': + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum has been the industry's standard dummy text ever since.", + }, + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CommonAppbar( + titleTxt: "", + ), + backgroundColor: Colors.black, + extendBody: true, + body: Stack(children: [ + CommonBlurLeft(), + CommonBlurRight(), + Stack(children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: ListView(physics: BouncingScrollPhysics(), children: [ + text25W600('FAQ'), + sizedBoxHeight(20), + CustomTextFormField1( + hintText: 'Search Chats', + leadingIcon: Container( + height: 20, + width: 20, + child: Center( + child: SvgPicture.asset( + 'assets/images/svg/search-svgrepo-com.svg', + ), + ), + ), + ), + sizedBoxHeight(20.h), + SizedBox( + height: 60, + width: double.infinity, + // color: Colors.amber, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: containerTexts.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + selectedIndex.value = index; + }, + child: Row( + children: [ + topContainer(containerTexts[index], index), + sizedBoxWidth(10.w) + ], + ), + ); + }), + ), + sizedBoxHeight(20.h), + Obx(() { + return selectedIndex == 0 + ? Column( + children: List.generate(Faqcard.length, (index) { + return customExpandableItem( + isExpanded: isExpandedList[index], + title: Faqcard[index]['title']!, + content: Faqcard[index]['content']!, + toggleExpansion: () => toggleExpansion(index), + ); + })) + : Column( + children: List.generate(Faqcard2.length, (index) { + return customExpandableItem( + isExpanded: isExpandedList[index], + title: Faqcard2[index]['title']!, + content: Faqcard2[index]['content']!, + toggleExpansion: () => toggleExpansion(index), + ); + })); + }), + + // ListView.builder( + // shrinkWrap: true, + // itemCount: Faqcard.length, + // itemBuilder: (BuildContext context, int index) { + // return Obx( + // () { + // return customExpandableItem( + // isExpanded: isExpandedList[index], + // title: Faqcard[index]['title']!, + // content: Faqcard[index]['content']!, + // toggleExpansion: () => toggleExpansion(index), + // ); + // }, + // ); + // }, + // ), + + sizedBoxHeight(30.h), + ])) + ]) + ])); + } + + Widget topContainer(String text, int index) { + return Obx(() { + return selectedIndex.value == index + ? Container( + height: 38.h, + width: 136.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: Color(0XFF3F0502), + border: Border.all(color: Color(0xFF9A0000), width: 1)), + child: Center(child: text16W500(text)), + ) + : commonGlassContainer( + width: 136.w, + height: 38.h, + borderradius: 5, + customWidget: Center(child: text16W400(text)), + ); + }); + } + + void toggleExpansion(int index) { + // isExpandedList[index] = !isExpandedList[index]; + for (int i = 0; i < isExpandedList.length; i++) { + if (i != index) { + isExpandedList[i] = false; + } + } + // Toggle the expansion state of the container being toggled + isExpandedList[index] = !isExpandedList[index]; + } + + Widget customExpandableItem({ + required bool isExpanded, + required String title, + required String content, + required VoidCallback toggleExpansion, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: toggleExpansion, + child: commonGlassContainer( + width: double.infinity, + height: isExpanded ? 55.h : 65.h, + borderradius: 8, + customWidget: Padding( + padding: EdgeInsets.only(right: 13.w, left: 13.w), + child: Center( + child: Row( + children: [ + Text( + title, + style: TextStyle( + fontFamily: 'manrope', + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + ), + Spacer(), + Icon( + isExpanded + ? Icons.keyboard_arrow_up_outlined + : Icons.keyboard_arrow_down_outlined, + color: Colors.white, + size: 25.sp, + ), + ], + ), + ), + ), + ), + ), + Visibility( + visible: isExpanded, + child: Column( + children: [ + Container( + height: 198.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8.r), + bottomRight: Radius.circular(8.r), + ), + color: Colors.black, + border: Border.all(color: Color(0xFF3A3A3A), width: 0.5)), + child: Padding( + padding: EdgeInsets.only( + top: 11.h, left: 14.w, bottom: 25.h, right: 28.w), + child: Text( + content, + style: TextStyle( + color: Color(0xFFFFFFFF), + fontFamily: 'manrope', + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + sizedBoxHeight(12.h), + commonGlassContainer( + width: double.infinity, + height: 65.h, + borderradius: 8, + customWidget: Padding( + padding: EdgeInsets.only(right: 8.w, left: 13.w), + child: Center( + child: Row(children: [ + Text( + 'Was this answer helpful?', + style: TextStyle( + fontFamily: 'manrope', + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + ), + Spacer(), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + text16W500('Yes'), + sizedBoxWidth(2.w), + SvgPicture.asset( + 'assets/images/svg/thumbs-up.svg'), + sizedBoxWidth(8.w), + text16W500('No'), + sizedBoxWidth(2.w), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + sizedBoxHeight(5.h), + SvgPicture.asset( + 'assets/images/svg/thumbs-down.svg'), + ], + ) + ], + ) + ]), + ))) + ], + ), + ), + isExpanded ? sizedBoxHeight(40.h) : sizedBoxHeight(18.h), + ], + ); + } +} diff --git a/lib/view/Sidemenu/Sidemenu.dart b/lib/view/Sidemenu/Sidemenu.dart index ca68bf7..97c692a 100644 --- a/lib/view/Sidemenu/Sidemenu.dart +++ b/lib/view/Sidemenu/Sidemenu.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; +import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/Common/comonGlassmorphicContainer.dart'; import 'package:traderscircuit/Utils/Common/sized_box.dart'; import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; @@ -108,7 +110,7 @@ class _SideMenuState extends State { decoration: ShapeDecoration( image: DecorationImage( image: AssetImage( - "assets/images/png/Ellipse 560.png"), + "assets/images/png/Ellipse 560 (1).png"), fit: BoxFit.fill, ), shape: const OvalBorder(), @@ -141,11 +143,8 @@ class _SideMenuState extends State { ), ), ListTile( - leading: SizedBox( - width: 25.w, - height: 25.h, - child: SvgPicture.asset( - 'assets/images/svg/sidemenu/sub.svg')), + leading: + SvgPicture.asset('assets/images/svg/sidemenu/sub.svg'), title: text18W400('My Subscription'), trailing: Container( height: 35.h, @@ -176,11 +175,8 @@ class _SideMenuState extends State { ), ), ListTile( - leading: SizedBox( - width: 25.w, - height: 25.h, - child: SvgPicture.asset( - 'assets/images/svg/sidemenu/content.svg')), + leading: SvgPicture.asset( + 'assets/images/svg/sidemenu/content.svg'), title: text18W400('Content bytes'), selected: true, onTap: () { @@ -206,7 +202,7 @@ class _SideMenuState extends State { width: 25.w, height: 25.h, child: SvgPicture.asset( - 'assets/images/svg/sidemenu/sub.svg')), + 'assets/images/svg/sidemenu/Gray.svg')), title: text18W400('Update My KYC'), trailing: Container( height: 40.h, @@ -256,11 +252,8 @@ class _SideMenuState extends State { ), ), ListTile( - leading: SizedBox( - width: 25.w, - height: 25.h, - child: SvgPicture.asset( - 'assets/images/svg/sidemenu/sub.svg')), + leading: SvgPicture.asset( + 'assets/images/svg/sidemenu/Group 51347.svg'), title: text18W400('My Subscription'), trailing: Container( height: 35.h, @@ -402,7 +395,7 @@ void navigateTo(int index, BuildContext context) { switch (index) { case 0: { - // Get.toNamed(RouteName.FAQScreen); + Get.toNamed(RouteName.faqscreen); } break; @@ -420,124 +413,57 @@ void navigateTo(int index, BuildContext context) { case 3: { - // Get.toNamed(RouteName.contactUs); + Get.toNamed(RouteName.termsandcondition); } break; case 4: { - Get.toNamed(RouteName.termsandcondition); + Get.toNamed(RouteName.privacypolicy); } break; case 5: { - Get.toNamed(RouteName.privacypolicy); + Get.toNamed(RouteName.aboutus); } break; case 6: { - Get.toNamed(RouteName.aboutus); + // Get.toNamed(RouteName.settings); } break; case 7: { Get.bottomSheet( - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox( - width: double.infinity, - child: SvgPicture.asset('assets/images/svg/logout.svg'), - ), - Text( - 'Are You Sure You Want To Logout?', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 20.sp, + commonGlassContainer( + width: double.infinity, + height: 363.h, + borderradius: 4, + customWidget: Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: Column( + children: [ + sizedBoxHeight(60.h), + // Image.asset( + // 'assets/images/png/Group 1000003722.png', + // height: 100.h, + // ), + // sizedBoxHeight(25.h), + text22W600('Confirm Logout'), + sizedBoxHeight(30.h), + text20W400_center( + 'Are you sure you want to logout your account?'), + sizedBoxHeight(50.h), + CommonYesNoBtn(), + ], ), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - InkWell( - onTap: () { - Navigator.of(context).pop(); - }, - child: Container( - width: 150.w, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(5.r), - border: Border.all( - color: Colors.black, - ), - ), - child: Padding( - padding: const EdgeInsets.all(18.0), - child: Text( - 'No', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 16.sp, - ), - ), - ), - ), - ), - InkWell( - // onTap: () async { - // FirebaseAuth auth = FirebaseAuth.instance; - // final GoogleSignIn googleSignIn = GoogleSignIn(); - - // if (auth.currentUser != null && - // auth.currentUser?.providerData.any((userInfo) => - // userInfo.providerId == 'google.com') == - // true) { - // await googleSignIn.signOut(); - // Navigator.of(context).pop(); - // Get.back(); - // Get.toNamed(RouteName.login); - // } else { - // SharedPreferences prefs = - // await SharedPreferences.getInstance(); - // prefs.remove('token'); - // Navigator.of(context).pop(); - // Get.back(); - // Get.toNamed(RouteName.login); - // } - // }, - onTap: () { - Get.back(); - // Get.toNamed(RouteName.login); - }, - child: Container( - width: 150.w, - decoration: BoxDecoration( - color: Color(0xFF3192D8), - borderRadius: BorderRadius.circular(5.r), - ), - child: Padding( - padding: const EdgeInsets.all(18.0), - child: Text( - 'Yes', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 16.sp, - ), - ), - ), - ), - ), - ], - ) - ], + ), ), - backgroundColor: Colors.white, + backgroundColor: Colors.black.withOpacity(0.3), ); } break; diff --git a/lib/view/login/Kyc.dart b/lib/view/login/Kyc.dart index 1225b12..488328b 100644 --- a/lib/view/login/Kyc.dart +++ b/lib/view/login/Kyc.dart @@ -1,7 +1,9 @@ +import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:glassmorphism/glassmorphism.dart'; import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; @@ -12,6 +14,8 @@ import 'package:traderscircuit/Utils/text.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import '../../controller/kyc_controller.dart'; + class Kyc extends StatefulWidget { const Kyc({super.key}); @@ -25,372 +29,554 @@ class _KycState extends State { Color primaryColor = Colors.transparent.withOpacity(0.2); Color secondaryColor = Colors.grey.shade800; - bool isSwitched = false; + KYCController kycController = Get.put(KYCController()); - void _toggleSwitch(bool value) { - setState(() { - isSwitched = value; - }); - } + // DateTime timebackPressed = DateTime.now(); - DateTime timebackPressed = DateTime.now(); + // Future _selectDate(BuildContext context) async { + // final DateTime? picked = await showDatePicker( + // context: context, + // initialDate: DateTime.now(), + // firstDate: DateTime(1900), + // lastDate: DateTime.now(), + // builder: (context, child) { + // return Theme( + // data: Theme.of(context).copyWith( + // colorScheme: const ColorScheme.light( + // surface: Colors.black, + // onSurface: Colors.white, + // primary: Color(0xff9A0000), + // onPrimary: Colors.white, + // ), + // textButtonTheme: TextButtonThemeData( + // style: TextButton.styleFrom( + // foregroundColor: Colors.white, + // ), + // ), + // ), + // child: child!); + // }); - Future _selectDate(BuildContext context) async { - final DateTime? picked = await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(1900), - lastDate: DateTime.now(), - builder: (context, child) { - return Theme( - data: Theme.of(context).copyWith( - colorScheme: ColorScheme.light( - surface: Colors.black, - onSurface: Colors.white, - primary: Color(0xff9A0000), - onPrimary: Colors.white, - ), - textButtonTheme: TextButtonThemeData( - style: TextButton.styleFrom( - foregroundColor: Colors.white, - ), - ), - ), - child: child!); - }); - - if (picked != null && picked != DateTime.now()) { - setState(() { - dobcontroller.text = "${picked.toLocal()}".split(' ')[0]; - final birthDate = DateTime( - picked.year, - picked.month, - picked.day, - ); - }); - } - } + // if (picked != null && picked != DateTime.now()) { + // setState(() { + // dobcontroller.text = "${picked.toLocal()}".split(' ')[0]; + // final birthDate = DateTime( + // picked.year, + // picked.month, + // picked.day, + // ); + // }); + // } + // } @override Widget build(BuildContext context) { - return Scaffold( - appBar: CommonAppbar( - titleTxt: "KYC", - customActionWidget: text16W400("skip"), - ), - 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, + return Obx( + () => Scaffold( + appBar: CommonAppbar( + titleTxt: "KYC", + customActionWidget: text16W400(""), + ), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + Stack( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + physics: const BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]), - Row( - children: [ - text18W400("Full Name"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Email Address"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Phone Number"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Date Of Birth"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField( - suffixIcon: Icon( - Icons.calendar_month_outlined, - color: Colors.white, + children: [ + // CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]), + // Row( + // children: [ + // text18W400("Full Name"), + // ], + // ), + // SizedBox( + // height: 15.h, + // ), + // CustomTextFormField(), + // SizedBox( + // height: 30.h, + // ), + // Row( + // children: [ + // text18W400("Email Address"), + // ], + // ), + // SizedBox( + // height: 15.h, + // ), + // CustomTextFormField(), + // SizedBox( + // height: 30.h, + // ), + // Row( + // children: [ + // text18W400("Phone Number"), + // ], + // ), + // SizedBox( + // height: 15.h, + // ), + // CustomTextFormField(), + // SizedBox( + // height: 30.h, + // ), + // Row( + // children: [ + // text18W400("Date Of Birth"), + // ], + // ), + // SizedBox( + // height: 15.h, + // ), + // CustomTextFormField( + // suffixIcon: Icon( + // Icons.calendar_month_outlined, + // color: Colors.white, + // ), + // readonly: true, + // onTap: () { + // _selectDate(context); + // }, + // ), + // SizedBox( + // height: 30.h, + // ), + // Row( + // children: [ + // text18W400("City"), + // ], + // ), + // SizedBox( + // height: 15.h, + // ), + // CustomTextFormField(), + Row( + children: [ + text18W500("Step 1 : Personal Information"), + ], ), - readonly: true, - onTap: () { - _selectDate(context); - }, - ), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("City"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Upload pan card image"), - ], - ), - SizedBox( - height: 15.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GlassmorphicContainer( - width: 170.w, - height: 105.h, - borderRadius: 8, - linearGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), - ], - stops: [ - 0.1, - 1, - ]), - border: 0.8, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff9A0000).withOpacity(0.5), - Color(0xFFffffff).withOpacity(0.5), - ], - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.file_upload_outlined, - size: 42, - color: Colors.white, - ), - SizedBox( - height: 10.h, - ), - text14W400("Front Side") - ], + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Upload pan card image"), + ], + ), + SizedBox( + height: 15.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + if (kycController.panFrontImage.isEmpty) { + Get.toNamed(RouteName.kycImage, arguments: { + "type": "pan front", + }); + } + }, + child: GlassmorphicContainer( + width: 170.w, + height: 105.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: const [ + 0.1, + 1, + ]), + border: 0.8, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: (kycController.panFrontImage.isNotEmpty) + ? Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 40), + child: Image( + image: FileImage( + File( + kycController + .panFrontImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 50.h, + ), + ), + Positioned( + top: 6, + right: 10, + child: InkWell( + onTap: () { + kycController + .panFrontImage.value = ""; + }, + child: SvgPicture.asset( + "assets/images/svg/cancel.svg", + width: 18, + height: 18, + ), + ), + ) + ], + ) + : Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons.file_upload_outlined, + size: 42, + color: Colors.white, + ), + SizedBox( + height: 10.h, + ), + text14W400("Front Side") + ], + ), + ), ), ), - ), - GlassmorphicContainer( - width: 170.w, - height: 105.h, - borderRadius: 8, - linearGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), - ], - stops: [ - 0.1, - 1, - ]), - border: 0.8, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff9A0000).withOpacity(0.5), - Color(0xFFffffff).withOpacity(0.5), - ], - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.file_upload_outlined, - size: 42, - color: Colors.white, - ), - SizedBox( - height: 10.h, - ), - text14W400("Back Side") - ], + InkWell( + onTap: () { + if (kycController.panBackImage.isEmpty) { + Get.toNamed(RouteName.kycImage, arguments: { + "type": "pan back", + }); + } + }, + child: GlassmorphicContainer( + width: 170.w, + height: 105.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: const [ + 0.1, + 1, + ]), + border: 0.8, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: (kycController.panBackImage.isNotEmpty) + ? Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 40), + child: Image( + image: FileImage( + File( + kycController + .panBackImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 50.h, + ), + ), + Positioned( + top: 6, + right: 10, + child: InkWell( + onTap: () { + kycController.panBackImage.value = + ""; + }, + child: SvgPicture.asset( + "assets/images/svg/cancel.svg", + width: 18, + height: 18, + ), + ), + ) + ], + ) + : Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons.file_upload_outlined, + size: 42, + color: Colors.white, + ), + SizedBox( + height: 10.h, + ), + text14W400("Back Side") + ], + ), + ), + ), + ) + ], + ), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Aadhar Number"), + ], + ), + SizedBox( + height: 15.h, + ), + const CustomTextFormField(), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Upload Aadhar card image"), + ], + ), + SizedBox( + height: 15.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + if (kycController.aadharFrontImage.isEmpty) { + Get.toNamed(RouteName.kycImage, arguments: { + "type": "aadhar front", + }); + } + }, + child: GlassmorphicContainer( + width: 170.w, + height: 105.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: const [ + 0.1, + 1, + ]), + border: 0.8, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: (kycController.aadharFrontImage.isNotEmpty) + ? Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 40), + child: Image( + image: FileImage( + File( + kycController + .aadharFrontImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 50.h, + ), + ), + Positioned( + top: 6, + right: 10, + child: InkWell( + onTap: () { + kycController + .aadharFrontImage.value = ""; + }, + child: SvgPicture.asset( + "assets/images/svg/cancel.svg", + width: 18, + height: 18, + ), + ), + ) + ], + ) + : Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons.file_upload_outlined, + size: 42, + color: Colors.white, + ), + SizedBox( + height: 10.h, + ), + text14W400("Front Side") + ], + ), + ), ), ), - ) - ], - ), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Aadhaar Number"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Upload Aadhaar card image"), - ], - ), - SizedBox( - height: 15.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GlassmorphicContainer( - width: 170.w, - height: 105.h, - borderRadius: 8, - linearGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), - ], - stops: [ - 0.1, - 1, - ]), - border: 0.8, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff9A0000).withOpacity(0.5), - Color(0xFFffffff).withOpacity(0.5), - ], - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.file_upload_outlined, - size: 42, - color: Colors.white, - ), - SizedBox( - height: 10.h, - ), - text14W400("Front Side") - ], + InkWell( + onTap: () { + if (kycController.aadharBackImage.isEmpty) { + Get.toNamed(RouteName.kycImage, arguments: { + "type": "aadhar back", + }); + } + }, + child: GlassmorphicContainer( + width: 170.w, + height: 105.h, + borderRadius: 8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: const [ + 0.1, + 1, + ]), + border: 0.8, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), + ], + ), + child: (kycController.aadharBackImage.isNotEmpty) + ? Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, horizontal: 40), + child: Image( + image: FileImage( + File( + kycController + .aadharBackImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 50.h, + ), + ), + Positioned( + top: 6, + right: 10, + child: InkWell( + onTap: () { + kycController + .aadharBackImage.value = ""; + }, + child: SvgPicture.asset( + "assets/images/svg/cancel.svg", + width: 18, + height: 18, + ), + ), + ) + ], + ) + : Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons.file_upload_outlined, + size: 42, + color: Colors.white, + ), + SizedBox( + height: 10.h, + ), + text14W400("Back Side") + ], + ), + ), ), - ), - ), - GlassmorphicContainer( - width: 170.w, - height: 105.h, - borderRadius: 8, - linearGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), - ], - stops: [ - 0.1, - 1, - ]), - border: 0.8, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff9A0000).withOpacity(0.5), - Color(0xFFffffff).withOpacity(0.5), - ], - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.file_upload_outlined, - size: 42, - color: Colors.white, - ), - SizedBox( - height: 10.h, - ), - text14W400("Back Side") - ], - ), - ), - ) - ], - ), - SizedBox( - height: 70.h, - ), - CommonBtn( - text: "Next", - onTap: () { - Get.toNamed(RouteName.updateriskprofile); - }, - ), - SizedBox( - height: 10.h, - ), - ], + ) + ], + ), + SizedBox( + height: 70.h, + ), + CommonBtn( + text: "Next", + onTap: () { + Get.toNamed(RouteName.updateriskprofile); + }, + ), + SizedBox( + height: 10.h, + ), + ], + ), ), - ), - ], - ), - ], + ], + ), + ], + ), ), ); } diff --git a/lib/view/login/LoginScreen.dart b/lib/view/login/LoginScreen.dart index abacfef..6f8e5d4 100644 --- a/lib/view/login/LoginScreen.dart +++ b/lib/view/login/LoginScreen.dart @@ -3,13 +3,11 @@ 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/text.dart'; -import 'package:traderscircuit/main.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; @@ -35,14 +33,15 @@ class _LoginScreenState extends State { extendBody: true, body: Stack( children: [ - CommonBlurLeft(), - CommonBlurRight(), + const CommonBlurLeft(), + const CommonBlurRight(), Stack( children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: ListView( - physics: BouncingScrollPhysics(), + physics: const BouncingScrollPhysics(), // mainAxisAlignment: MainAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -80,59 +79,61 @@ class _LoginScreenState extends State { ), Row( children: [ - GlassmorphicContainer( - width: 60, - height: 50, - borderRadius: 8, - blur: 10, - alignment: Alignment.center, - border: 0.8, - linearGradient: LinearGradient( + Expanded( + child: GlassmorphicContainer( + width: 60, + height: 50, + borderRadius: 8, + blur: 10, + alignment: Alignment.center, + border: 0.8, + linearGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), + ], + stops: const [ + 0.1, + 1, + ]), + borderGradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Colors.white.withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), ], - stops: [ - 0.1, - 1, - ]), - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff9A0000).withOpacity(0.5), - Color(0xFFffffff).withOpacity(0.5), - ], - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // SvgPicture.asset("assets/images/svg/india.svg"), - Image.asset( - "assets/images/png/india.png", - height: 25.h, - width: 25.h, - ), - SizedBox( - width: 2, - ), - Text( - "+91", - style: TextStyle( - fontSize: 15, - color: Colors.white, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // SvgPicture.asset("assets/images/svg/india.svg"), + Image.asset( + "assets/images/png/india.png", + height: 25.h, + width: 25.h, ), - ) - ], + const SizedBox( + width: 2, + ), + const Text( + "+91", + style: TextStyle( + fontSize: 15, + color: Colors.white, + ), + ) + ], + ), ), ), - SizedBox( + const SizedBox( width: 10, ), - Container( + SizedBox( width: 285.w, child: CustomTextFormField( texttype: TextInputType.phone, @@ -157,7 +158,7 @@ class _LoginScreenState extends State { ) ], ), - SizedBox( + const SizedBox( height: 10, ), text14W300( @@ -211,10 +212,10 @@ class _LoginScreenState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), ], - stops: [ + stops: const [ 0.1, 1, ]), @@ -224,11 +225,11 @@ class _LoginScreenState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFAF2E89).withOpacity(0.2), - Color(0xFFA23E31).withOpacity(0.2), - Color(0xFF0000).withOpacity(0.2), + const Color(0xFFAF2E89).withOpacity(0.2), + const Color(0xFFA23E31).withOpacity(0.2), + const Color(0xFF0000).withOpacity(0.2), ], - stops: [ + stops: const [ 0.3, 0.6, 1, @@ -261,10 +262,10 @@ class _LoginScreenState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFffffff).withOpacity(0.1), - Color(0xFFFFFFFF).withOpacity(0.05), + const Color(0xFFffffff).withOpacity(0.1), + const Color(0xFFFFFFFF).withOpacity(0.05), ], - stops: [ + stops: const [ 0.1, 1, ]), @@ -274,11 +275,11 @@ class _LoginScreenState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFAF2E89).withOpacity(0.2), - Color(0xFFA23E31).withOpacity(0.2), - Color(0xFF0000).withOpacity(0.2), + const Color(0xFFAF2E89).withOpacity(0.2), + const Color(0xFFA23E31).withOpacity(0.2), + const Color(0xFF0000).withOpacity(0.2), ], - stops: [ + stops: const [ 0.3, 0.6, 1, diff --git a/lib/view/login/UpdateRiskProfile.dart b/lib/view/login/UpdateRiskProfile.dart index 8cc0b34..c1bfd49 100644 --- a/lib/view/login/UpdateRiskProfile.dart +++ b/lib/view/login/UpdateRiskProfile.dart @@ -3,15 +3,14 @@ import 'dart:ui'; 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/CommonDropdown.dart'; -import 'package:traderscircuit/Utils/Common/CustomTextFormField.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 '../../Utils/Common/custom_drop_down.dart'; + class UpdateRiskProfile extends StatefulWidget { const UpdateRiskProfile({super.key}); @@ -25,27 +24,54 @@ class _UpdateRiskProfileState extends State { return Scaffold( appBar: CommonAppbar( titleTxt: "Update Risk Profile", - customActionWidget: text16W400("skip"), + customActionWidget: text16W400(""), ), backgroundColor: Colors.black, extendBody: true, body: Stack( children: [ - CommonBlurLeft(), - CommonBlurRight(), + const CommonBlurLeft(), + const CommonBlurRight(), Stack( children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: ListView( - physics: BouncingScrollPhysics(), + physics: const BouncingScrollPhysics(), // mainAxisAlignment: MainAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start, children: [ - // CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]), + updateRiskProfileData( + "What is your investment goal?", + "Select your goal", + ), + updateRiskProfileData( + "Add Investment Experience field", + "Select your Experience", + ), + updateRiskProfileData( + "What types of stocks do you prefer?", + "Select types of stock", + ), + updateRiskProfileData( + "What is your Risk Perception?", + "Select your Perception", + ), + updateRiskProfileData( + "What is your favoured Market Condition?", + "Select Condition", + ), + updateRiskProfileData( + "What is your Emotional Response to Market Volatility?", + "Choose your query", + ), + SizedBox( + height: 70.h, + ), CommonBtn( - text: "Next", + text: "Submit", onTap: () { Get.toNamed(RouteName.mainscreen); }, @@ -63,3 +89,64 @@ class _UpdateRiskProfileState extends State { ); } } + +Widget updateRiskProfileData( + String tilte, + String headerText, +) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text18W400(tilte), + SizedBox( + height: 15.h, + ), + CustomDropDownWidget( + header: headerText, + listData: dropHeader[headerText]!, + ), + SizedBox( + height: 35.h, + ), + ], + ); +} + +Map> dropHeader = { + "Select your goal": [ + "Wealth Preservation", + "Capital Growth", + "Income Generation", + "Retirement Planning" + ], + "Select your Experience": [ + "No Experience", + "Beginner (0 - 3 months)", + "Intermediate (3 - 12 months)", + "Expert ( > 12 months)", + "Professional ( 3 - 5 years )" + ], + "Select types of stock": [ + "Swing Trade", + "Options", + "Multibagger", + "Long term", + ], + "Select your Perception": [ + "Very Conservative", + "Conservative", + "Moderate", + "Aggressive", + ], + "Select Condition": [ + "Bullish", + "Neutral", + "Bearish", + ], + "Choose your query": [ + "Calm", + "Neutral", + "Anxious", + "Stressed", + ], +}; diff --git a/lib/view/login/uploadKycImage.dart b/lib/view/login/uploadKycImage.dart new file mode 100644 index 0000000..e47d5d4 --- /dev/null +++ b/lib/view/login/uploadKycImage.dart @@ -0,0 +1,384 @@ +import 'dart:io'; + +import 'package:dotted_border/dotted_border.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:gap/gap.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:traderscircuit/controller/kyc_controller.dart'; + +import '../../Utils/Common/ImagePicker.dart'; +import '../../Utils/Common/commonBotton.dart'; +import '../../Utils/text.dart'; +import '../onBoarding/splashScreen1.dart'; + +class UploadKYCImage extends StatefulWidget { + const UploadKYCImage({super.key}); + + @override + State createState() => _UploadKYCImageState(); +} + +class _UploadKYCImageState extends State { + KYCController kycController = Get.put(KYCController()); + String type = Get.arguments["type"]; + @override + Widget build(BuildContext context) { + return Obx( + () => WillPopScope( + onWillPop: () async { + type == "pan front" + ? kycController.panFrontImage.value = "" + : type == "pan back" + ? kycController.panBackImage.value = "" + : type == "aadhar front" + ? kycController.aadharFrontImage.value = "" + : kycController.aadharBackImage.value = ""; + await Future.delayed(const Duration(milliseconds: 210)); + + return true; + }, + child: Scaffold( + bottomNavigationBar: (type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController.aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty) + ? Padding( + padding: + const EdgeInsets.symmetric(horizontal: 17, vertical: 100), + child: Row( + children: [ + Expanded( + child: SizedBox( + width: 191.w, + child: kycBtn( + text: "Retake", + onTap: () { + if (type == "pan front") { + kycController.panFrontImage.value = ""; + } else if (type == "pan back") { + kycController.panBackImage.value = ""; + } else if (type == "aadhar front") { + kycController.aadharFrontImage.value = ""; + } else { + kycController.aadharBackImage.value = ""; + } + }, + bgClr: const Color(0xFF111313), + borderClr: const Color(0xFF990000), + ), + ), + ), + const Gap(16), + Expanded( + child: SizedBox( + width: 191.w, + child: kycBtn( + text: "Submit", + onTap: () { + Get.back(); + }, + bgClr: const Color(0xFF6C0000), + borderClr: const Color(0xFF990000), + ), + ), + ), + ], + ), + ) + : const SizedBox(), + appBar: AppBar( + elevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + toolbarHeight: 80, + leadingWidth: 56.w, + leading: Padding( + padding: EdgeInsets.only(left: 16.w, top: 20.h), + child: GestureDetector( + onTap: () async { + type == "pan front" + ? kycController.panFrontImage.value = "" + : type == "pan back" + ? kycController.panBackImage.value = "" + : type == "aadhar front" + ? kycController.aadharFrontImage.value = "" + : kycController.aadharBackImage.value = ""; + await Future.delayed(const Duration(milliseconds: 210)); + Get.back(result: false); + }, + child: Padding( + padding: EdgeInsets.only(left: 8.w), + child: Icon( + Icons.arrow_back_ios, + color: Colors.white, + size: 25.r, + ), + ), + ), + ), + ), + backgroundColor: Colors.black, + extendBody: true, + body: Stack( + children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + Stack( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 0), + child: ListView( + physics: const NeverScrollableScrollPhysics(), + children: [ + (type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty) + ? text24W500("Preview") + : text24W500(type.contains("pan") + ? "Upload Image of pan card" + : "Upload Image of Aadhar card"), + (type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty) + ? const SizedBox() + : const Gap(14), + (type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty) + ? const SizedBox() + : text18W400( + type.contains("front") ? "Front" : " Back"), + const Gap(40), + InkWell( + onTap: () async { + if ((type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty)) { + } else { + var result = await ImagePickerMethod() + .getImage(ImageSource.gallery); + if (type == "pan front") { + kycController.panFrontImage.value = result; + } else if (type == "pan back") { + kycController.panBackImage.value = result; + } else if (type == "aadhar front") { + kycController.aadharFrontImage.value = result; + } else { + kycController.aadharBackImage.value = result; + } + } + }, + child: DottedBorder( + radius: const Radius.circular(10), + borderType: BorderType.RRect, + color: const Color(0xFF393939), + strokeWidth: 1, + child: Container( + width: Get.width, + height: 170, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: const Alignment(0.98, -0.21), + end: const Alignment(-0.98, 0.21), + colors: [ + Colors.white + .withOpacity(0.03999999910593033), + Colors.white + .withOpacity(0.05999999865889549) + ], + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: (type == "pan front" && + kycController.panFrontImage.isNotEmpty) + ? Padding( + padding: const EdgeInsets.symmetric( + vertical: 17, horizontal: 30), + child: Image( + image: FileImage( + File( + kycController.panFrontImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 150.h, + ), + ) + : (type == "pan back" && + kycController.panBackImage.isNotEmpty) + ? Padding( + padding: const EdgeInsets.symmetric( + vertical: 17, horizontal: 30), + child: Image( + image: FileImage( + File( + kycController + .panBackImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 150.h, + ), + ) + : (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) + ? Padding( + padding: + const EdgeInsets.symmetric( + vertical: 17, + horizontal: 30), + child: Image( + image: FileImage( + File( + kycController + .aadharFrontImage.value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 150.h, + ), + ) + : (type == "aadhar back" && + kycController.aadharBackImage + .isNotEmpty) + ? Padding( + padding: const EdgeInsets + .symmetric( + vertical: 17, + horizontal: 30), + child: Image( + image: FileImage( + File( + kycController + .aadharBackImage + .value, + ), + ), + fit: BoxFit.cover, + width: Get.width, + height: 150.h, + ), + ) + : Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + SvgPicture.asset( + "assets/images/svg/upload-cloud.svg"), + text16W400( + "Upload from gallery") + ], + ), + ), + ), + ), + const Gap(20), + (type == "pan front" && + kycController.panFrontImage.isNotEmpty) || + (type == "pan back" && + kycController.panBackImage.isNotEmpty) || + (type == "aadhar front" && + kycController + .aadharFrontImage.isNotEmpty) || + (type == "aadhar back" && + kycController.aadharBackImage.isNotEmpty) + ? const SizedBox() + : InkWell( + onTap: () async { + var result = await ImagePickerMethod() + .getImage(ImageSource.camera); + if (type == "pan front") { + kycController.panFrontImage.value = result; + } else if (type == "pan back") { + kycController.panBackImage.value = result; + } else if (type == "aadhar front") { + kycController.aadharFrontImage.value = + result; + } else { + kycController.aadharBackImage.value = + result; + } + }, + child: Container( + width: Get.width, + height: 47, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: const Alignment(0.98, -0.21), + end: const Alignment(-0.98, 0.21), + colors: [ + Colors.white + .withOpacity(0.03999999910593033), + Colors.white + .withOpacity(0.05999999865889549) + ], + ), + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, color: Color(0xFF393939)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + "assets/images/svg/camera.svg"), + const Gap(10), + text16W400('Click an image') + ], + ), + ), + ), + ], + ), + ), + ], + ) + ], + ), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 6c503b9..11fcd3a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -89,6 +89,7 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + cupertino_icons: dependency: "direct main" description: @@ -105,6 +106,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.10" + dotted_border: + dependency: "direct main" + description: + name: dotted_border + sha256: "108837e11848ca776c53b30bc870086f84b62ed6e01c503ed976e8f8c7df9c04" + url: "https://pub.dev" + source: hosted + version: "2.1.0" dropdown_button2: dependency: "direct main" description: @@ -137,6 +146,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" flutter: dependency: "direct main" description: flutter @@ -150,6 +191,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" flutter_screenutil: dependency: "direct main" description: @@ -162,10 +211,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c url: "https://pub.dev" source: hosted - version: "2.0.10+1" + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -184,6 +233,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.2.4" + gap: + dependency: "direct main" + description: + name: gap + sha256: f19387d4e32f849394758b91377f9153a1b41d79513ef7668c088c77dbc6955d + url: "https://pub.dev" + source: hosted + version: "3.0.1" get: dependency: "direct main" description: @@ -204,10 +261,10 @@ packages: dependency: transitive description: name: http - sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "0.13.6" http_parser: dependency: transitive description: @@ -216,6 +273,94 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "542c3453109d16bcc388e43ae2276044d2cd6a6d20c68bdcff2c94ab9363ea15" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: "89c936aa772a35b69ca67b78049ae9fa163a4fb8da2f6dee3893db8883fb49d2" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: b232175c132b2f7ede3e1f101652bcd635cb4079a77c6dded8e6d32e6578d685 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" + url: "https://pub.dev" + source: hosted + version: "0.8.9+3" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 + url: "https://pub.dev" + source: hosted + version: "3.0.2" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + url: "https://pub.dev" + source: hosted + version: "0.8.9+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b + url: "https://pub.dev" + source: hosted + version: "2.9.3" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" js: dependency: transitive description: @@ -228,18 +373,12 @@ packages: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" url: "https://pub.dev" source: hosted - version: "2.0.1" - lottie: - dependency: "direct main" - description: - name: lottie - sha256: ce2bb2605753915080e4ee47f036a64228c88dc7f56f7bc1dbe912d75b55b1e2 - url: "https://pub.dev" - source: hosted - version: "3.1.0" + + version: "2.1.1" + matcher: dependency: transitive description: @@ -264,6 +403,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" nm: dependency: transitive description: @@ -280,6 +427,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" + path_drawing: + dependency: transitive + description: + name: path_drawing + sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 + url: "https://pub.dev" + source: hosted + version: "1.0.1" path_parsing: dependency: transitive description: @@ -316,10 +471,10 @@ packages: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "5.4.0" pin_code_fields: dependency: "direct main" description: @@ -396,10 +551,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.1" shared_preferences_windows: dependency: transitive description: @@ -473,26 +628,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.10+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33 url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.10+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.10+1" vector_math: dependency: transitive description: @@ -513,10 +668,10 @@ packages: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.1.1" xdg_directories: dependency: transitive description: @@ -529,10 +684,10 @@ packages: dependency: transitive description: name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.3.0" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.2.0-194.0.dev <4.0.0" + flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index ecb4918..f352490 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,38 +1,17 @@ name: traderscircuit description: A new Flutter project. -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: "none" # Remove this line if you wish to publish to pub.dev -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. +publish_to: "none" + version: 1.0.0+1 environment: sdk: ">=2.19.6 <3.0.0" -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 get: ^4.6.5 flutter_screenutil: ^5.9.0 @@ -43,30 +22,24 @@ dependencies: pin_code_fields: ^8.0.1 fluttertoast: ^8.0.9 dropdown_button2: ^2.1.4 + lottie: ^3.1.0 + gap: ^3.0.1 + image_picker: ^1.0.7 + dotted_border: ^2.1.0 + image_cropper: ^4.0.1 + + dev_dependencies: flutter_test: sdk: flutter - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^2.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - # To add assets to your application, add an assets section, like this: assets: - assets/images/ - assets/images/svg/ @@ -74,29 +47,7 @@ flutter: - assets/images/png/sidemenu/ - assets/images/png/ - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: fonts: - family: manrope fonts: - asset: assets/fonts/manrope/Manrope-VariableFont_wght.ttf - - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages