diff --git a/assets/icons/icon-education.png b/assets/icons/icon-education.png new file mode 100644 index 0000000..8d304f0 Binary files /dev/null and b/assets/icons/icon-education.png differ diff --git a/assets/icons/icon-fund.png b/assets/icons/icon-fund.png new file mode 100644 index 0000000..4af5a2c Binary files /dev/null and b/assets/icons/icon-fund.png differ diff --git a/assets/icons/icon-gadget-outline.png b/assets/icons/icon-gadget-outline.png new file mode 100644 index 0000000..5cef4ce Binary files /dev/null and b/assets/icons/icon-gadget-outline.png differ diff --git a/assets/icons/icon-home.png b/assets/icons/icon-home.png new file mode 100644 index 0000000..04bd1c0 Binary files /dev/null and b/assets/icons/icon-home.png differ diff --git a/assets/icons/icon-shop.png b/assets/icons/icon-shop.png new file mode 100644 index 0000000..6053960 Binary files /dev/null and b/assets/icons/icon-shop.png differ diff --git a/assets/images/img-empty-transaction.png b/assets/images/img-empty-transaction.png new file mode 100644 index 0000000..f202c5a Binary files /dev/null and b/assets/images/img-empty-transaction.png differ diff --git a/lib/application/assets/path_assets.dart b/lib/application/assets/path_assets.dart index fc3a0ee..9b760ae 100644 --- a/lib/application/assets/path_assets.dart +++ b/lib/application/assets/path_assets.dart @@ -49,12 +49,23 @@ class PathAssets { static const String iconTicket = 'assets/icons/icon-ticket.png'; static const String iconGadget = 'assets/icons/icon-gadget.png'; static const String iconCar = 'assets/icons/icon-car.png'; - static const String iconNavigationHome = 'assets/icons/icon-navigation-home.png'; - static const String iconNavigationPlan = 'assets/icons/icon-navigation-plan.png'; - static const String iconNavigationTransaction = 'assets/icons/icon-navigation-transaction.png'; - static const String iconNavigationPortfolio = 'assets/icons/icon-navigation-portfolio.png'; - static const String iconNavigationProfile = 'assets/icons/icon-navigation-profile.png'; + static const String iconNavigationHome = + 'assets/icons/icon-navigation-home.png'; + static const String iconNavigationPlan = + 'assets/icons/icon-navigation-plan.png'; + static const String iconNavigationTransaction = + 'assets/icons/icon-navigation-transaction.png'; + static const String iconNavigationPortfolio = + 'assets/icons/icon-navigation-portfolio.png'; + static const String iconNavigationProfile = + 'assets/icons/icon-navigation-profile.png'; static const String iconRemove = 'assets/icons/icon-remove.png'; + static const String iconEducation = 'assets/icons/icon-education.png'; + static const String iconFund = 'assets/icons/icon-fund.png'; + static const String iconHome = 'assets/icons/icon-home.png'; + static const String iconShop = 'assets/icons/icon-shop.png'; + static const String iconGadgetOutline = + 'assets/icons/icon-gadget-outline.png'; /// IMAGE static const String imgSplashLogo = 'assets/images/splash-logo.png'; @@ -89,9 +100,12 @@ class PathAssets { static const String imgGuide1 = 'assets/images/img-guide1.png'; static const String imgGuide2 = 'assets/images/img-guide2.png'; static const String imgOpenShopping = 'assets/images/img-open-shopping.png'; - static const String imgPaymentSuccess = 'assets/images/img-payment-success.png'; + static const String imgPaymentSuccess = + 'assets/images/img-payment-success.png'; static const String frameSignature = 'assets/images/frame-signature.png'; static const String imgFinish = 'assets/images/img-finish.png'; + static const String imgEmptyTransaction = + 'assets/images/img-empty-transaction.png'; static const Map goalInvestIcon = { 'Education': iconToga, diff --git a/lib/application/component/card_transaction/card_transaction_view.dart b/lib/application/component/card_transaction/card_transaction_view.dart new file mode 100644 index 0000000..cf79d90 --- /dev/null +++ b/lib/application/component/card_transaction/card_transaction_view.dart @@ -0,0 +1,100 @@ +import 'package:cims_apps/application/component/image/image_view.dart'; +import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:flutter/material.dart'; + +class CardTransactionView extends StatelessWidget { + final VoidCallback onTap; + final String iconPath, type, amount, subs, step; + final String? timeTransaction; + const CardTransactionView({ + Key? key, + required this.step, + required this.type, + required this.amount, + required this.iconPath, + required this.subs, + required this.onTap, + this.timeTransaction, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + TextTheme textTheme = Theme.of(context).textTheme; + return GestureDetector( + onTap: onTap, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 16.0), + padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(width: 1, color: ColorPalette.slate200), + borderRadius: const BorderRadius.all(Radius.circular(12)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: SizeConfig.width * .4, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + ImageView( + image: iconPath, width: SizeConfig.width * .12), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Text( + type, + style: textTheme.headlineSmall, + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Text( + amount, + style: textTheme.headlineSmall, + ), + ), + ], + )), + SizedBox( + width: SizeConfig.width * .4, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + height: SizeConfig.height * .08, + child: Text( + subs, + style: const TextStyle(color: ColorPalette.primary), + )), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + step == 'waiting' + ? const Icon(Icons.access_time_sharp, + color: ColorPalette.slate400) + : const SizedBox(), + step == 'waiting' + ? Text(timeTransaction.toString()) + : const SizedBox(), + const Padding( + padding: EdgeInsets.only(left: 16.0), + child: Icon(Icons.arrow_forward_ios), + ), + ], + ), + ], + )), + ], + ), + ), + ); + } +} diff --git a/lib/application/component/card_transaction/empty_card_transaction.dart b/lib/application/component/card_transaction/empty_card_transaction.dart new file mode 100644 index 0000000..af14e03 --- /dev/null +++ b/lib/application/component/card_transaction/empty_card_transaction.dart @@ -0,0 +1,44 @@ +import 'package:cims_apps/application/assets/path_assets.dart'; +import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/image/image_view.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:flutter/material.dart'; + +class EmptyCardTransaction extends StatelessWidget { + final VoidCallback onPressedButton; + const EmptyCardTransaction({Key? key, required this.onPressedButton}) + : super(key: key); + + @override + Widget build(BuildContext context) { + TextTheme textTheme = Theme.of(context).textTheme; + return Container( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + ImageView( + image: PathAssets.imgEmptyTransaction, + width: SizeConfig.width * .4, + ), + Text( + 'No Transaction Yet', + style: textTheme.headlineSmall, + ), + Text( + "Let's keep building your investment for even greater financial growth!", + style: textTheme.bodyMedium, + textAlign: TextAlign.center, + ), + ButtonView( + name: 'Investing Now', + width: SizeConfig.width * .5, + onPressed: onPressedButton, + ), + ], + ), + ), + ); + } +} diff --git a/lib/application/component/take_picture_screen/display_picture_screen.dart b/lib/application/component/take_picture_screen/display_picture_screen.dart index 9d7038e..b34033a 100644 --- a/lib/application/component/take_picture_screen/display_picture_screen.dart +++ b/lib/application/component/take_picture_screen/display_picture_screen.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/component/button/button_view.dart'; +import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; import 'package:cims_apps/application/component/image/image_view.dart'; import 'package:cims_apps/application/component/take_picture_screen/take_picture_screen.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; @@ -94,10 +95,8 @@ class _DisplayPictureScreenState extends State { return Consumer( builder: (context, provider, child) { return Scaffold( - appBar: AppBar( - title: const Text('Preview'), - automaticallyImplyLeading: false, - ), + appBar: CustomAppBar( + height: SizeConfig.height * .08, title: 'Preview'), body: Container( padding: const EdgeInsets.symmetric(horizontal: 24.0), child: Column( diff --git a/lib/application/component/take_picture_screen/take_picture_screen.dart b/lib/application/component/take_picture_screen/take_picture_screen.dart index 405409b..9d2f461 100644 --- a/lib/application/component/take_picture_screen/take_picture_screen.dart +++ b/lib/application/component/take_picture_screen/take_picture_screen.dart @@ -1,5 +1,6 @@ import 'package:camera/camera.dart'; import 'package:cims_apps/application/assets/path_assets.dart'; +import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; import 'package:cims_apps/application/component/image/image_view.dart'; import 'package:cims_apps/application/component/take_picture_screen/display_picture_screen.dart'; import 'package:cims_apps/core/route/route.dart'; @@ -27,7 +28,6 @@ class TakePictureScreenState extends State { late String _takeContent; Future changeFlash() async { - await _controller.setFlashMode(FlashMode.auto); setState(() { isFlash = !isFlash; }); @@ -44,6 +44,7 @@ class TakePictureScreenState extends State { // Next, initialize the controller. This returns a Future. _initializeControllerFuture = _controller.initialize(); _takeContent = widget.takeContent; + _controller.setFlashMode(isFlash ? FlashMode.torch : FlashMode.off); } @override @@ -57,9 +58,10 @@ class TakePictureScreenState extends State { Widget build(BuildContext context) { // Fill this out in the next steps. return Scaffold( - appBar: AppBar( - title: const Text('Registration'), - actions: [ + appBar: CustomAppBar( + title: 'Registration', + height: SizeConfig.height * .08, + trailing: [ IconButton( onPressed: () { changeFlash(); diff --git a/lib/core/utils/string_utils.dart b/lib/core/utils/string_utils.dart index 307fb19..d503567 100644 --- a/lib/core/utils/string_utils.dart +++ b/lib/core/utils/string_utils.dart @@ -1,3 +1,5 @@ +import 'package:intl/intl.dart'; + class StringUtils { static bool emailValidation(String email) { return RegExp( @@ -13,4 +15,12 @@ class StringUtils { return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})') .hasMatch(password); } + + static String formatTime(DateTime? dateTime) { + if (dateTime != null) { + DateFormat formatter = DateFormat('HH:mm:ss'); + return formatter.format(dateTime); + } + return '--:--:--'; + } } diff --git a/lib/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart b/lib/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart index 590e9a8..591052e 100644 --- a/lib/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart +++ b/lib/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart @@ -6,107 +6,120 @@ import 'package:cims_apps/application/theme/color_palette.dart'; import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; +import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ModelDataBank { + final String? title, subtitle; + ModelDataBank(this.title, this.subtitle); +} class ConfirmBankAccount extends StatelessWidget { const ConfirmBankAccount({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - List listData = [ - {'title': 'Bank Name', 'subtitle': 'Bank Mandiri'}, - {'title': 'Account Number', 'subtitle': '123002212084'}, - {'title': 'Account Owner Name', 'subtitle': 'Muhamad Rosyidin'}, - {'title': 'Name on ID card', 'subtitle': 'Muhamad Rosyidin'}, - ]; - return Scaffold( - appBar: AppBar( - toolbarHeight: 70, - backgroundColor: Colors.white, - surfaceTintColor: Colors.white, - automaticallyImplyLeading: false, - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const BackButtonView(), - const Text('Registration'), - SizedBox( - width: SizeConfig.width * 0.1, - ) - ], - ), - shape: const RoundedRectangleBorder( - side: BorderSide(color: ColorPalette.slate200)), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.all(16.0), - child: SizedBox( - height: SizeConfig.height * .85, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption(title: 'Bank account confirmation'), - SizedBox( - height: SizeConfig.height * .6, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ...listData.map((e) { - return Padding( - padding: const EdgeInsets.only(bottom: 16.0), + final listDataBank = + ModalRoute.of(context)!.settings.arguments as List; + + return ChangeNotifierProvider( + create: (context) => SubmissionDataViewModel(), + builder: (context, child) { + return Scaffold( + appBar: AppBar( + toolbarHeight: 70, + backgroundColor: Colors.white, + surfaceTintColor: Colors.white, + automaticallyImplyLeading: false, + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const BackButtonView(), + const Text('Registration'), + SizedBox( + width: SizeConfig.width * 0.1, + ) + ], + ), + shape: const RoundedRectangleBorder( + side: BorderSide(color: ColorPalette.slate200)), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + height: SizeConfig.height * .85, + child: Consumer( + builder: (context, provider, child) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption(title: 'Bank account confirmation'), + SizedBox( + height: SizeConfig.height * .6, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - e['title'], - style: const TextStyle( - color: ColorPalette.slate400, fontSize: 16), - ), - Text( - e['subtitle'], - style: const TextStyle( - fontSize: 16, - color: ColorPalette.slate800, - fontWeight: FontWeight.w600), + ...listDataBank.map((e) { + return Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + e.title!, + style: const TextStyle( + color: ColorPalette.slate400, + fontSize: 16), + ), + Text( + e.subtitle!, + style: const TextStyle( + fontSize: 16, + color: ColorPalette.slate800, + fontWeight: FontWeight.w600), + ), + ], + ), + ); + }).toList(), + const ListTileView( + title: + 'Make sure your data is correct as it will affect the disbursement process', ), ], ), - ); - }).toList(), - const ListTileView( - title: - 'Make sure your data is correct as it will affect the disbursement process', - ), - ], - ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ButtonView( + name: 'Recheck', + isOutlined: true, + width: SizeConfig.width * .42, + onPressed: () { + Navigator.pop(context); + }, + ), + ButtonView( + name: 'Confirm', + width: SizeConfig.width * .42, + onPressed: () { + routePush(context, + page: const SubmissionParent()); + }, + ), + ], + ) + ], + ); + }), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ButtonView( - name: 'Recheck', - isOutlined: true, - width: SizeConfig.width * .42, - onPressed: () { - Navigator.pop(context); - }, - ), - ButtonView( - name: 'Confirm', - width: SizeConfig.width * .42, - onPressed: () { - routePush(context, page: const SubmissionParent()); - }, - ), - ], - ) - ], - ), - ), - ), - ); + ), + ); + }); } } diff --git a/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart b/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart index 7c26f43..078e1f5 100644 --- a/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart +++ b/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart @@ -63,61 +63,98 @@ class SubmitBankAccount extends StatelessWidget { return SizedBox( child: Consumer( builder: (context, provider, child) { - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption(title: 'Input your bank account data'), - TextFormView( - name: 'Bank Name', - hintText: 'Select bank', - readOnly: true, - ctrl: provider.ctrlBankName, - onTap: () { - showSearchBank(provider.ctrlBankName); - }, - suffixIcon: const Icon( - Icons.keyboard_arrow_down_outlined, + return SizedBox( + height: SizeConfig.height * .8, + child: Form( + key: provider.formKeySubmitDataBank, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const TextCaption(title: 'Input your bank account data'), + TextFormView( + name: 'Bank Name', + hintText: 'Select bank', + readOnly: true, + ctrl: provider.ctrlBankName, + onTap: () { + showSearchBank(provider.ctrlBankName); + }, + suffixIcon: const Icon( + Icons.keyboard_arrow_down_outlined, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), - ), - TextFormView( - name: 'Account Number', - hintText: 'Input Account Number', - keyboardType: TextInputType.number, - trailingTitleWidget: SizedBox( - width: 24, - child: GestureDetector( - onTap: () { - routePush(context, page: const GuideScreen()); - }, - child: - const ImageView(image: PathAssets.iconQuestion), + TextFormView( + name: 'Account Number', + hintText: 'Input Account Number', + ctrl: provider.ctrlNoAccountBank, + keyboardType: TextInputType.number, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, + trailingTitleWidget: SizedBox( + width: 24, + child: GestureDetector( + onTap: () { + routePush(context, page: const GuideScreen()); + }, + child: + const ImageView(image: PathAssets.iconQuestion), + ), ), ), - ), - TextFormView( - name: 'Account Owner Name', - hintText: 'Input Account Name', - ), - const Text( - "Make sure the account you use is in your name, not someone else's", - style: TextStyle( - color: ColorPalette.slate400, - ), - ), - SizedBox(height: SizeConfig.height * .08), - ButtonView( - name: 'Next', - onPressed: () { - provider.next(context).then((value) { - if (value) { - routePush(context, - page: const ConfirmBankAccount()); + TextFormView( + name: 'Account Owner Name', + hintText: 'Input Account Name', + ctrl: provider.ctrlNameAccountBank, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; } - }); - }, - ) - ], + return null; + }, + ), + const Text( + "Make sure the account you use is in your name, not someone else's", + style: TextStyle( + color: ColorPalette.slate400, + ), + ), + SizedBox(height: SizeConfig.height * .08), + ButtonView( + name: 'Next', + onPressed: () { + if (provider.formKeySubmitDataBank.currentState! + .validate()) { + provider + .submitDataBank( + bankName: provider.ctrlBankName.text, + accountNumber: provider.ctrlNoAccountBank.text, + accountName: provider.ctrlNameAccountBank.text, + ) + .then((values) { + provider.next(context).then((value) { + if (value) { + routePush(context, + page: const ConfirmBankAccount(), + arguments: values); + } + }); + }); + } + }, + ) + ], + ), ), ); }), diff --git a/lib/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart b/lib/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart index 03a2520..d5b08ab 100644 --- a/lib/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart +++ b/lib/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart @@ -14,12 +14,12 @@ class RiskProfileView extends StatelessWidget { Widget build(BuildContext context) { return Container( width: SizeConfig.width, - height: SizeConfig.height, - padding: EdgeInsets.all(24), + height: SizeConfig.height * .8, + padding: const EdgeInsets.all(24), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Column( + const Column( children: [ ImageView(image: PathAssets.imgDataReport), SizedBox( @@ -48,7 +48,7 @@ class RiskProfileView extends StatelessWidget { ), Column( children: [ - Row( + const Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ImageView( @@ -68,7 +68,7 @@ class RiskProfileView extends StatelessWidget { ) ], ), - SizedBox( + const SizedBox( height: 24, ), ButtonView( diff --git a/lib/features/auth/registration/view/submission_data/submission_parent.dart b/lib/features/auth/registration/view/submission_data/submission_parent.dart index 6f8a6fd..9f4689d 100644 --- a/lib/features/auth/registration/view/submission_data/submission_parent.dart +++ b/lib/features/auth/registration/view/submission_data/submission_parent.dart @@ -1,3 +1,4 @@ +import 'package:cims_apps/application/component/button/back_button_view.dart'; import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; import 'package:cims_apps/core/route/route.dart'; @@ -66,47 +67,55 @@ class _SubmissionParentState extends State { return ChangeNotifierProvider( create: (context) => SubmissionDataViewModel(), builder: (context, child) { - return WillPopScope( - onWillPop: () async { + return PopScope( + canPop: false, + onPopInvoked: (didPop) async { + if (didPop) { + return; + } await routePush(context, page: const BottomNavigationView(), routeType: RouteType.pushReplace); - return false; }, child: Consumer( builder: (context, provider, child) { return Scaffold( appBar: CustomAppBar( - height: SizeConfig.height * .1, title: 'Registration'), - body: Stack( + height: SizeConfig.height * .1, + title: 'Registration', + leading: BackButtonView( + onPress: () { + routePush( + context, + page: const BottomNavigationView(), + routeType: RouteType.pushReplace, + ); + }, + ), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: - List.generate(provider.stepAmount, (index) { - return _stepItem( - isCurrentStep: - provider.getCurrentStep == index + 1 || - provider.getCurrentStep - 1 > index, - ); - }), - ), - ), - Expanded( - child: Container( - padding: - const EdgeInsets.symmetric(horizontal: 16.0), - child: _content(provider.getCurrentStep), - ), - ), - ], + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: List.generate(provider.stepAmount, (index) { + return _stepItem( + isCurrentStep: + provider.getCurrentStep == index + 1 || + provider.getCurrentStep - 1 > index, + ); + }), + ), + ), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: _content(provider.getCurrentStep), + ), ), ], ), diff --git a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart index 94b84f2..5150346 100644 --- a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart +++ b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart @@ -176,79 +176,107 @@ class SubmitDataIdCard extends StatelessWidget { return SingleChildScrollView( child: Consumer( builder: (context, provider, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption( - title: 'Check your ID card data for accuracy'), - TextFormView( - name: 'NIK', - keyboardType: TextInputType.number, - ), - TextFormView(name: 'Full Name'), - DatePickerView( + return Form( + key: provider.formKeySubmitIdCard, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption( + title: 'Check your ID card data for accuracy'), + TextFormView( + name: 'NIK', + keyboardType: TextInputType.number, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, + ), + TextFormView( + name: 'Full Name', + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, + ), + DatePickerView( name: 'Birth Date', ctrl: provider.ctrlBirthDate, maxDate: DateTime.now(), isMultipleSelection: false, - enabled: true), - photoDocument(provider), - Container( - width: SizeConfig.width, - padding: const EdgeInsets.symmetric(horizontal: 16.0), - margin: const EdgeInsets.symmetric(vertical: 16.0), - decoration: BoxDecoration( - color: ColorPalette.blue50, - borderRadius: BorderRadius.circular(10), - border: Border.all( - color: ColorPalette.greyLights, - width: 1, - ), + enabled: true, + validatorDate: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const ImageView( - image: PathAssets.iconShield, - width: 20, - height: 22, + photoDocument(provider), + Container( + width: SizeConfig.width, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + margin: const EdgeInsets.symmetric(vertical: 16.0), + decoration: BoxDecoration( + color: ColorPalette.blue50, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: ColorPalette.greyLights, + width: 1, ), - const SizedBox( - width: 8, - ), - const Expanded( - child: Text( - 'Will my data be safe?', - style: TextStyle( - fontWeight: FontWeight.w600, - color: ColorPalette.primary, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const ImageView( + image: PathAssets.iconShield, + width: 20, + height: 22, + ), + const SizedBox( + width: 8, + ), + const Expanded( + child: Text( + 'Will my data be safe?', + style: TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.primary, + ), ), ), - ), - IconButton( - onPressed: () { - bottomSheet(); - }, - icon: const Icon( - Icons.arrow_forward_ios, - color: ColorPalette.primary, - size: 20, - ), - ) - ], + IconButton( + onPressed: () { + bottomSheet(); + }, + icon: const Icon( + Icons.arrow_forward_ios, + color: ColorPalette.primary, + size: 20, + ), + ) + ], + ), ), - ), - ButtonView( - name: 'Next', - onPressed: () async { - await provider.next(context).then((value) { - if (value) { - routePush(context, page: const SubmissionParent()); + ButtonView( + name: 'Next', + onPressed: () async { + if (provider.formKeySubmitIdCard.currentState! + .validate()) { + await provider.next(context).then((value) { + if (value) { + routePush(context, + page: const SubmissionParent()); + } + }); } - }); - }, - ) - ], + }, + ) + ], + ), ); }), ); diff --git a/lib/features/auth/registration/view/submission_data/submit_email.dart b/lib/features/auth/registration/view/submission_data/submit_email.dart index bf367fe..5eccf81 100644 --- a/lib/features/auth/registration/view/submission_data/submit_email.dart +++ b/lib/features/auth/registration/view/submission_data/submit_email.dart @@ -15,41 +15,70 @@ import 'package:provider/provider.dart'; class SubmitEmail extends StatelessWidget { const SubmitEmail({Key? key}) : super(key: key); - Widget _emailVerify() { - return Column( - children: [ - const ImageView(image: PathAssets.imgEmail), - Align( - alignment: Alignment.center, - child: RichText( - textAlign: TextAlign.center, - text: TextSpan(children: [ - const TextSpan( - text: - 'We have sent a verification link to your e-mail. \nPlease check your email for ', - style: TextStyle( - color: Colors.black, - decoration: TextDecoration.none, + Widget _emailVerify(BuildContext context, SubmissionDataViewModel provider) { + var textTheme = Theme.of(context).textTheme; + return Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption(title: 'Check your e-mail'), + const ImageView(image: PathAssets.imgEmail), + Align( + alignment: Alignment.center, + child: RichText( + textAlign: TextAlign.center, + text: TextSpan(children: [ + TextSpan( + text: + 'We have sent a verification link to your e-mail. \nPlease check your email for ', + style: textTheme.displayMedium, ), - ), - TextSpan( - recognizer: TapGestureRecognizer()..onTap = () {}, - text: 'verification', - style: const TextStyle( - color: Colors.blue, + TextSpan( + recognizer: TapGestureRecognizer() + ..onTap = () async { + await provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmissionParent()); + } + }); + }, + text: 'verification', + style: const TextStyle( + color: Colors.blue, + ), ), - ), - const TextSpan( - text: ' to \ncontinue registration.', - style: TextStyle( - color: Colors.black, - decoration: TextDecoration.none, + TextSpan( + text: ' to \ncontinue registration.', + style: textTheme.displayMedium, ), - ), - ]), + ]), + ), ), + ], + ), + ); + } + + showEmailVerify(BuildContext context, SubmissionDataViewModel provider) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: false, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.zero, ), - ], + ), + builder: (context) { + var flutterView = View.of(context); + return Padding( + padding: EdgeInsets.only( + top: MediaQueryData.fromView(flutterView).padding.top, + ), + child: _emailVerify(context, provider), + ); + }, ); } @@ -60,45 +89,41 @@ class SubmitEmail extends StatelessWidget { builder: (context, child) { return Consumer( builder: (context, provider, child) { - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - !provider.isEmailVerify - ? const TextCaption(title: 'Enter your e-mail') - : const TextCaption(title: 'Check your e-mail '), - !provider.isEmailVerify - ? TextFormView( - name: 'E-mail Address', - hintText: 'Input e-mail address', - keyboardType: TextInputType.emailAddress, - validator: (value) { - if (value!.isEmpty) { - return 'Filled cannot be empty'; - } else if (!StringUtils.emailValidation(value)) { - return 'Format email wrong'; - } else { - return null; - } - }, - // onTap: () { - // provider.submitEmail(); - // }, - ) - : _emailVerify(), - SizedBox(height: SizeConfig.height * .42), - ButtonView( - name: 'Next', - onPressed: () async { - await provider.next(context).then((value) { - if (value) { - routePush(context, page: const SubmissionParent()); + return SizedBox( + height: SizeConfig.height * .78, + child: Form( + key: provider.formKeySubmitEmail, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const TextCaption(title: 'Enter your e-mail'), + TextFormView( + name: 'E-mail Address', + hintText: 'Input e-mail address', + keyboardType: TextInputType.emailAddress, + validator: (value) { + if (value!.isEmpty) { + return 'Filled cannot be empty'; + } else if (!StringUtils.emailValidation(value)) { + return 'Format email wrong'; + } else { + return null; } - }); - }, - ) - ], + }, + ), + SizedBox(height: SizeConfig.height * .43), + ButtonView( + name: 'Next', + onPressed: () async { + if (provider.formKeySubmitEmail.currentState! + .validate()) { + showEmailVerify(context, provider); + } + }, + ) + ], + ), ), ); }); diff --git a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart index 65e8607..6dca75e 100644 --- a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart +++ b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart @@ -2,6 +2,7 @@ import 'package:cims_apps/application/component/button/button_view.dart'; import 'package:cims_apps/application/component/select_form/select_form_view.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/core/route/route.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; @@ -17,12 +18,13 @@ class SubmitPersonalData extends StatelessWidget { builder: (context, child) { return Consumer( builder: (context, provider, child) { - return SingleChildScrollView( + return SizedBox( + height: SizeConfig.height * .78, child: Form( key: provider.formKeyPersonalData, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ const TextCaption(title: 'Your personal details'), SelectFormView( @@ -31,6 +33,12 @@ class SubmitPersonalData extends StatelessWidget { ctrl: provider.ctrlOccupation, listItem: provider.listOccupation, onSelect: (value) {}, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), SelectFormView( name: 'Income Level (IDR)', @@ -38,6 +46,12 @@ class SubmitPersonalData extends StatelessWidget { ctrl: provider.ctrlIncome, listItem: provider.listIncome, onSelect: (value) {}, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), SelectFormView( name: 'Marital Status', @@ -45,6 +59,12 @@ class SubmitPersonalData extends StatelessWidget { ctrl: provider.ctrlMarital, listItem: provider.listMarital, onSelect: (value) {}, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), SelectFormView( name: 'Source of Fund', @@ -52,20 +72,28 @@ class SubmitPersonalData extends StatelessWidget { ctrl: provider.ctrlSourceFund, listItem: provider.listSourceFund, onSelect: (value) {}, + validator: (value) { + if (value!.isEmpty) { + return 'Field must be filled'; + } + return null; + }, ), - Align( - alignment: Alignment.bottomCenter, - child: ButtonView( - name: 'Next', - onPressed: () async { + // SizedBox(height: SizeConfig.height * .18), + ButtonView( + marginVertical: 0, + name: 'Next', + onPressed: () async { + if (provider.formKeyPersonalData.currentState! + .validate()) { await provider.next(context).then((value) { if (value) { routePush(context, page: const SubmissionParent()); } }); - }, - ), + } + }, ) ], ), diff --git a/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart b/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart index 1811e35..d1bdbd3 100644 --- a/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart +++ b/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart @@ -24,26 +24,30 @@ class InitialSignature extends StatelessWidget { builder: (context, child) { return Consumer( builder: (context, provider, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption(title: 'Draw your digital sign'), - const ImageView(image: PathAssets.frameSignature), - const ListTileView( - title: - 'Make sure the sign you draw is match with your ID Card'), - SizedBox(height: SizeConfig.height * .07), - ButtonView( - name: 'Next', - onPressed: () { - provider.next(context).then((value) { - if (value) { - routePush(context, page: const SubmitSignature()); - } - }); - }, - ) - ], + return SizedBox( + height: SizeConfig.height * .8, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const TextCaption(title: 'Draw your digital sign'), + const ImageView(image: PathAssets.frameSignature), + const ListTileView( + title: + 'Make sure the sign you draw is match with your ID Card'), + SizedBox(height: SizeConfig.height * .1), + ButtonView( + name: 'Next', + onPressed: () { + provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmitSignature()); + } + }); + }, + ) + ], + ), ); }); }); diff --git a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart index bb23b50..38314be 100644 --- a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart @@ -1,5 +1,6 @@ import 'package:camera/camera.dart'; import 'package:cims_apps/application/component/select_form/select_form_view.dart'; +import 'package:cims_apps/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -14,11 +15,16 @@ class SubmissionDataViewModel extends ChangeNotifier { bool _isEmailVerify = false; bool get isEmailVerify => _isEmailVerify; var formKeyPersonalData = GlobalKey(); + var formKeySubmitEmail = GlobalKey(); + var formKeySubmitIdCard = GlobalKey(); + var formKeySubmitDataBank = GlobalKey(); TextEditingController ctrlOccupation = TextEditingController(); TextEditingController ctrlIncome = TextEditingController(); TextEditingController ctrlMarital = TextEditingController(); TextEditingController ctrlSourceFund = TextEditingController(); TextEditingController ctrlBankName = TextEditingController(); + TextEditingController ctrlNameAccountBank = TextEditingController(); + TextEditingController ctrlNoAccountBank = TextEditingController(); TextEditingController ctrlBankNameSearch = TextEditingController(); TextEditingController ctrlBirthDate = TextEditingController(); int step = 1; @@ -120,4 +126,21 @@ class SubmissionDataViewModel extends ChangeNotifier { valueBank = value; notifyListeners(); } + + List listDataBank = []; + + Future?> submitDataBank( + {required String bankName, accountNumber, accountName}) async { + List listResponse = [ + ModelDataBank('Bank Name', bankName), + ModelDataBank('Account Number', accountNumber), + ModelDataBank('Account Owner Name', accountName), + ModelDataBank('Name on ID card', accountName), + ]; + if (listResponse.first.subtitle != null) { + // listDataBank = listResponse; + return listResponse; + } + return null; + } } diff --git a/lib/features/transaction/view/cancel_view.dart b/lib/features/transaction/view/cancel_view.dart new file mode 100644 index 0000000..3a5d243 --- /dev/null +++ b/lib/features/transaction/view/cancel_view.dart @@ -0,0 +1,35 @@ +import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; +import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; +import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CancelView extends StatelessWidget { + const CancelView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Consumer( + builder: (context, provider, child) => Column( + children: [ + if (provider.listOnProcessTransaction.isEmpty) + EmptyCardTransaction( + onPressedButton: () {}, + ), + ...provider.listOnProcessTransaction.map((e) { + return CardTransactionView( + step: 'cancel', + type: 'type', + amount: 'amount', + iconPath: 'iconPath', + subs: 'subs', + onTap: () {}, + ); + }), + ], + ), + ), + ); + } +} diff --git a/lib/features/transaction/view/done_view.dart b/lib/features/transaction/view/done_view.dart new file mode 100644 index 0000000..808104e --- /dev/null +++ b/lib/features/transaction/view/done_view.dart @@ -0,0 +1,37 @@ +import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; +import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; +import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class DoneView extends StatelessWidget { + const DoneView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Consumer( + builder: (context, provider, child) { + return Column( + children: [ + if (provider.listOnProcessTransaction.isEmpty) + EmptyCardTransaction( + onPressedButton: () {}, + ), + ...provider.listOnProcessTransaction.map((e) { + return CardTransactionView( + step: 'done', + type: 'type', + amount: 'amount', + iconPath: 'iconPath', + subs: 'subs', + onTap: () {}, + ); + }), + ], + ); + }, + ), + ); + } +} diff --git a/lib/features/transaction/view/onprocess_view.dart b/lib/features/transaction/view/onprocess_view.dart new file mode 100644 index 0000000..fe52771 --- /dev/null +++ b/lib/features/transaction/view/onprocess_view.dart @@ -0,0 +1,34 @@ +import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; +import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; +import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class OnProcessView extends StatelessWidget { + const OnProcessView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: + Consumer(builder: (context, provider, child) { + return Column(children: [ + if (provider.listOnProcessTransaction.isEmpty) + EmptyCardTransaction( + onPressedButton: () {}, + ), + ...provider.listOnProcessTransaction.map((e) { + return CardTransactionView( + step: 'on process', + type: 'type', + amount: 'amount', + iconPath: 'iconPath', + subs: 'subs', + onTap: () {}, + ); + }), + ]); + }), + ); + } +} diff --git a/lib/features/transaction/view/transaction_view.dart b/lib/features/transaction/view/transaction_view.dart index 8a9b14b..c678123 100644 --- a/lib/features/transaction/view/transaction_view.dart +++ b/lib/features/transaction/view/transaction_view.dart @@ -1,14 +1,124 @@ -import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; +import 'package:cims_apps/application/assets/path_assets.dart'; +import 'package:cims_apps/application/component/image/image_view.dart'; +import 'package:cims_apps/application/theme/color_palette.dart'; import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:cims_apps/features/transaction/view/cancel_view.dart'; +import 'package:cims_apps/features/transaction/view/done_view.dart'; +import 'package:cims_apps/features/transaction/view/onprocess_view.dart'; +import 'package:cims_apps/features/transaction/view/waiting_view.dart'; +import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_toggle_tab/flutter_toggle_tab.dart'; +import 'package:provider/provider.dart'; class TransactionView extends StatelessWidget { const TransactionView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return Scaffold( - appBar: CustomAppBar(height: SizeConfig.height * 0.08, title: 'Transaction'), - ); + List textTabs = const [ + Tab(text: 'Waiting'), + Tab(text: 'On process'), + Tab(text: 'Done'), + Tab(text: 'Cancel'), + ]; + List listTabBarView = const [ + WaitingView(), + OnProcessView(), + DoneView(), + CancelView(), + ]; + + return ChangeNotifierProvider( + create: (context) => TransactionViewModel(), + builder: (context, child) { + return Scaffold( + backgroundColor: ColorPalette.primary, + body: SizedBox( + child: Stack( + children: [ + const ImageView(image: PathAssets.imgDashboardAccount), + Column( + children: [ + SizedBox( + height: SizeConfig.height * .05, + ), + const Center( + child: Text( + 'Transaction', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w700, + color: Colors.white), + ), + ), + SizedBox( + height: SizeConfig.height * .04, + ), + Container( + margin: const EdgeInsets.symmetric(horizontal: 24), + child: FlutterToggleTab( + height: SizeConfig.height * .065, + width: SizeConfig.width * .2, + marginSelected: const EdgeInsets.all(8.0), + isScroll: false, + selectedTextStyle: const TextStyle( + color: ColorPalette.primary, + fontWeight: FontWeight.w700, + ), + unSelectedTextStyle: const TextStyle( + color: ColorPalette.blackFont, + fontWeight: FontWeight.w700, + ), + unSelectedBackgroundColors: const [ + ColorPalette.blue50 + ], + selectedBackgroundColors: const [ColorPalette.white], + labels: const ['Subscribe', 'Reedem'], + selectedLabelIndex: (p0) {}, + selectedIndex: 0, + ), + ), + Expanded( + child: DefaultTabController( + length: textTabs.length, + child: Container( + color: Colors.transparent, + padding: const EdgeInsets.only(top: 32.0), + child: Container( + margin: const EdgeInsets.only(top: 24), + padding: const EdgeInsets.only(top: 16.0), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24)), + ), + child: Column( + children: [ + TabBar( + tabs: textTabs, + indicatorColor: Colors.blueAccent, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 4.0, + ), + child: TabBarView(children: listTabBarView), + )) + ], + ), + ), + ), + )), + ], + ) + ], + ), + ), + ); + }); } } diff --git a/lib/features/transaction/view/waiting_view.dart b/lib/features/transaction/view/waiting_view.dart new file mode 100644 index 0000000..decce6a --- /dev/null +++ b/lib/features/transaction/view/waiting_view.dart @@ -0,0 +1,42 @@ +import 'package:cims_apps/application/assets/path_assets.dart'; +import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; +import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; +import 'package:cims_apps/core/utils/number_formatter.dart'; +import 'package:cims_apps/core/utils/string_utils.dart'; +import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class WaitingView extends StatelessWidget { + const WaitingView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: + Consumer(builder: (context, provider, child) { + return Column( + children: [ + provider.listWaitingTransaction.isNotEmpty + ? CardTransactionView( + onTap: () {}, + iconPath: PathAssets.iconEducation, + type: 'Education', + amount: NumberFormatter.numberCurrency( + 6000000, + 'Rp ', + 'id_ID', + decimalDigits: 0, + ), + timeTransaction: StringUtils.formatTime(DateTime.now()), + subs: '3 Subscription', + step: 'waiting') + : EmptyCardTransaction( + onPressedButton: () {}, + ), + ], + ); + }), + ); + } +} diff --git a/lib/features/transaction/viewmodel/transaction_viewmodel.dart b/lib/features/transaction/viewmodel/transaction_viewmodel.dart new file mode 100644 index 0000000..9e5579c --- /dev/null +++ b/lib/features/transaction/viewmodel/transaction_viewmodel.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; + +class TransactionViewModel extends ChangeNotifier { + List listWaitingTransaction = [1]; + List listOnProcessTransaction = []; + List listDoneTransaction = []; + List listCancelTransaction = []; +} diff --git a/lib/main.dart b/lib/main.dart index 70c5712..4ccabd7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,68 +20,66 @@ class MyApp extends StatelessWidget { title: 'CIMS', debugShowCheckedModeBanner: false, theme: ThemeData( - appBarTheme: const AppBarTheme( - centerTitle: true, - backgroundColor: Colors.white, - elevation: 1, - foregroundColor: Colors.black, - titleTextStyle: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w700, - fontFamily: 'Manrope', + appBarTheme: const AppBarTheme( + centerTitle: true, + backgroundColor: Colors.white, + elevation: 1, + foregroundColor: Colors.black, + titleTextStyle: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w700, + fontFamily: 'Manrope', + color: ColorPalette.slate800, + )), + fontFamily: 'Manrope', + scaffoldBackgroundColor: Colors.white, + textTheme: const TextTheme( + displaySmall: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, color: ColorPalette.slate800, - )), - fontFamily: 'Manrope', - scaffoldBackgroundColor: Colors.white, - textTheme: const TextTheme( - displaySmall: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: ColorPalette.slate800, + ), + displayMedium: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: ColorPalette.slate800, + ), + displayLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + bodyMedium: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: ColorPalette.slate500, + ), + bodyLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate500, + ), + headlineSmall: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + headlineLarge: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), ), - displayMedium: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: ColorPalette.slate800, + colorScheme: const ColorScheme.light().copyWith( + primary: const Color(0xff2563EB), + onPrimary: const Color(0xFFFF9130), + secondary: const Color(0xFFFECDA6), + onBackground: const Color(0xFFA9A9A9), ), - displayLarge: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: ColorPalette.slate800, + bottomSheetTheme: const BottomSheetThemeData( + backgroundColor: Colors.white, surfaceTintColor: Colors.white) + // useMaterial3: true, ), - bodyMedium: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: ColorPalette.slate500, - ), - bodyLarge: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: ColorPalette.slate500, - ), - headlineSmall: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: ColorPalette.slate800, - ), - headlineLarge: TextStyle( - fontSize: 28, - fontWeight: FontWeight.bold, - color: ColorPalette.slate800, - ), - ), - colorScheme: const ColorScheme.light().copyWith( - primary: const Color(0xff2563EB), - onPrimary: const Color(0xFFFF9130), - secondary: const Color(0xFFFECDA6), - onBackground: const Color(0xFFA9A9A9), - ), - bottomSheetTheme: BottomSheetThemeData( - backgroundColor: Colors.white, - surfaceTintColor: Colors.white - ) - // useMaterial3: true, - ), initialRoute: initialRoute, onGenerateRoute: generateRoutes, navigatorObservers: [ diff --git a/pubspec.lock b/pubspec.lock index 446b2ba..29bef45 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -259,6 +259,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_toggle_tab: + dependency: "direct main" + description: + name: flutter_toggle_tab + sha256: "90ad0d050f656df677998825f985637d010117a1793828cd7e6dadada4ecd2c5" + url: "https://pub.dev" + source: hosted + version: "1.4.1" flutter_web_plugins: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index cb05aa4..a267e1f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: shared_preferences: ^2.2.2 calendar_date_picker2: ^0.5.3 google_sign_in: ^6.2.1 + flutter_toggle_tab: ^1.4.1