From 17c755915802834cb025bb23e7b18c0e3d2a1526 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Fri, 8 Mar 2024 19:00:45 +0700 Subject: [PATCH 1/2] feat: page profile --- lib/features/profile/view/profile_view.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/features/profile/view/profile_view.dart b/lib/features/profile/view/profile_view.dart index 4dbf7ba..eab954b 100644 --- a/lib/features/profile/view/profile_view.dart +++ b/lib/features/profile/view/profile_view.dart @@ -1,7 +1,6 @@ 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/route/route.dart'; import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/profile/model/list_menu_model.dart'; import 'package:flutter/material.dart'; @@ -64,7 +63,9 @@ class ProfileView extends StatelessWidget { image: e.pathAsset, width: SizeConfig.width * .08), trailing: const Icon(Icons.arrow_forward_ios, color: ColorPalette.slate400), - onTap: () => routePush(context, page: e.page), + onTap: () { + // routePush(context, page: e.page); + }, ), ); }), -- 2.45.2 From c23075304a54ef8a29773c8fc00d9fa95a4a3b4f Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Wed, 13 Mar 2024 15:28:59 +0700 Subject: [PATCH 2/2] fix: page transaction --- .../component/list_tile/list_tile_view.dart | 41 +++--- lib/core/utils/string_utils.dart | 15 ++ .../transaction/view/cancel_view.dart | 30 +++- lib/features/transaction/view/done_view.dart | 30 +++- .../transaction/view/onprocess_view.dart | 26 +++- .../view/subscribe_detail_view.dart | 137 +++++++++++++++++- .../transaction/view/waiting_view.dart | 5 +- .../viewmodel/transaction_viewmodel.dart | 2 +- 8 files changed, 241 insertions(+), 45 deletions(-) diff --git a/lib/application/component/list_tile/list_tile_view.dart b/lib/application/component/list_tile/list_tile_view.dart index 683e277..7036e67 100644 --- a/lib/application/component/list_tile/list_tile_view.dart +++ b/lib/application/component/list_tile/list_tile_view.dart @@ -8,22 +8,26 @@ class ListTileView extends StatelessWidget { final String title; final VoidCallback? onPressed; final Widget? prefixIcon, suffixIcon; - final Color? colorTitle; + final EdgeInsetsGeometry? padding, margin; + final TextStyle? textStyle; const ListTileView( {Key? key, required this.title, this.onPressed, this.prefixIcon, this.suffixIcon, - this.colorTitle}) + this.padding, + this.textStyle, + this.margin}) : super(key: key); @override Widget build(BuildContext context) { return Container( width: SizeConfig.width, - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), - margin: const EdgeInsets.symmetric(vertical: 16.0), + padding: padding ?? + const EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), + margin: margin ?? const EdgeInsets.symmetric(vertical: 16.0), decoration: BoxDecoration( color: ColorPalette.blue50, borderRadius: BorderRadius.circular(10), @@ -47,22 +51,23 @@ class ListTileView extends StatelessWidget { Expanded( child: Text( title, - style: TextStyle( - fontWeight: FontWeight.w600, - color: colorTitle ?? ColorPalette.slate500, - ), + style: textStyle ?? + const TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.slate500, + ), ), ), - suffixIcon != null - ? IconButton( - onPressed: onPressed, - icon: const Icon( - Icons.arrow_forward_ios, - color: ColorPalette.primary, - size: 20, - ), - ) - : const SizedBox(), + suffixIcon ?? + IconButton( + onPressed: onPressed, + icon: const Icon( + Icons.arrow_forward_ios, + color: ColorPalette.primary, + size: 20, + ), + ), + // : const SizedBox(), ], ), ); diff --git a/lib/core/utils/string_utils.dart b/lib/core/utils/string_utils.dart index d503567..b513500 100644 --- a/lib/core/utils/string_utils.dart +++ b/lib/core/utils/string_utils.dart @@ -1,3 +1,6 @@ +import 'package:cims_apps/application/theme/color_palette.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; class StringUtils { @@ -23,4 +26,16 @@ class StringUtils { } return '--:--:--'; } + + static void iCopyToClipboard(BuildContext context, + {String? desc, required String text}) { + Clipboard.setData(ClipboardData(text: text)); + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar( + backgroundColor: ColorPalette.primary, + content: Text(desc ?? "Text copied to clipboard"), + )) + .closed + .then((value) => ScaffoldMessenger.of(context).removeCurrentSnackBar()); + } } diff --git a/lib/features/transaction/view/cancel_view.dart b/lib/features/transaction/view/cancel_view.dart index 3a5d243..c3c9087 100644 --- a/lib/features/transaction/view/cancel_view.dart +++ b/lib/features/transaction/view/cancel_view.dart @@ -1,5 +1,10 @@ +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/route/route.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/view/subscribe_detail_view.dart'; import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -13,18 +18,29 @@ class CancelView extends StatelessWidget { child: Consumer( builder: (context, provider, child) => Column( children: [ - if (provider.listOnProcessTransaction.isEmpty) + if (provider.listCancelTransaction.isEmpty) EmptyCardTransaction( onPressedButton: () {}, ), - ...provider.listOnProcessTransaction.map((e) { + ...provider.listCancelTransaction.map((e) { return CardTransactionView( + onTap: () { + routePush(context, + page: const SubscribeDetailView( + type: 'virtual', + )); + }, + iconPath: PathAssets.iconEducation, + type: 'Education', + amount: NumberFormatter.numberCurrency( + 6000000, + 'Rp ', + 'id_ID', + decimalDigits: 0, + ), + timeTransaction: StringUtils.formatTime(DateTime.now()), + subs: '3 Subscription', 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 index 808104e..b0a2b88 100644 --- a/lib/features/transaction/view/done_view.dart +++ b/lib/features/transaction/view/done_view.dart @@ -1,5 +1,10 @@ +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/route/route.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/view/subscribe_detail_view.dart'; import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -14,18 +19,29 @@ class DoneView extends StatelessWidget { builder: (context, provider, child) { return Column( children: [ - if (provider.listOnProcessTransaction.isEmpty) + if (provider.listDoneTransaction.isEmpty) EmptyCardTransaction( onPressedButton: () {}, ), - ...provider.listOnProcessTransaction.map((e) { + ...provider.listDoneTransaction.map((e) { return CardTransactionView( + onTap: () { + routePush(context, + page: const SubscribeDetailView( + type: 'virtual', + )); + }, + iconPath: PathAssets.iconEducation, + type: 'Education', + amount: NumberFormatter.numberCurrency( + 6000000, + 'Rp ', + 'id_ID', + decimalDigits: 0, + ), + timeTransaction: StringUtils.formatTime(DateTime.now()), + subs: '3 Subscription', 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 index fe52771..a21247f 100644 --- a/lib/features/transaction/view/onprocess_view.dart +++ b/lib/features/transaction/view/onprocess_view.dart @@ -1,5 +1,10 @@ +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/route/route.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/view/subscribe_detail_view.dart'; import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -19,12 +24,23 @@ class OnProcessView extends StatelessWidget { ), ...provider.listOnProcessTransaction.map((e) { return CardTransactionView( + onTap: () { + routePush(context, + page: const SubscribeDetailView( + type: 'virtual', + )); + }, + iconPath: PathAssets.iconHome, + type: 'Home', + amount: NumberFormatter.numberCurrency( + 6000000, + 'Rp ', + 'id_ID', + decimalDigits: 0, + ), + timeTransaction: StringUtils.formatTime(DateTime.now()), + subs: '3 Subscription', step: 'on process', - type: 'type', - amount: 'amount', - iconPath: 'iconPath', - subs: 'subs', - onTap: () {}, ); }), ]); diff --git a/lib/features/transaction/view/subscribe_detail_view.dart b/lib/features/transaction/view/subscribe_detail_view.dart index 6b9a43d..980c072 100644 --- a/lib/features/transaction/view/subscribe_detail_view.dart +++ b/lib/features/transaction/view/subscribe_detail_view.dart @@ -1,12 +1,16 @@ import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/component/button/back_button_view.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/application/component/list_tile/list_tile_view.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:cims_apps/core/utils/string_utils.dart'; import 'package:flutter/material.dart'; class SubscribeDetailView extends StatelessWidget { - const SubscribeDetailView({Key? key}) : super(key: key); + final String type; + const SubscribeDetailView({Key? key, required this.type}) : super(key: key); Widget _stepper( TextTheme textTheme, { @@ -160,6 +164,114 @@ class SubscribeDetailView extends StatelessWidget { ); } + Widget _cardVA(BuildContext context) { + return Container( + margin: const EdgeInsets.only(top: 16.0, bottom: 8.0), + padding: const EdgeInsets.only(bottom: 16.0), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(width: 1, color: ColorPalette.slate200), + borderRadius: const BorderRadius.all(Radius.circular(12)), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: SizeConfig.height * .02), + RichText( + text: const TextSpan(children: [ + TextSpan( + text: 'Transfer to ', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.normal, + ), + ), + TextSpan( + text: 'ABC Virtual Account', + style: TextStyle( + color: ColorPalette.slate800, + fontWeight: FontWeight.bold, + ), + ), + ])), + SizedBox(height: SizeConfig.height * .01), + const Text( + 'Ferdy Maulana', + style: TextStyle( + color: Colors.black87, + fontSize: 16, + ), + ), + ListTileView( + title: '8785 0000 3165 5512', + prefixIcon: const SizedBox(), + padding: const EdgeInsets.only(right: 16.0), + margin: const EdgeInsets.only(top: 8.0, bottom: 8.0), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, color: ColorPalette.primary), + suffixIcon: ButtonView( + name: 'Copy', + width: SizeConfig.width * .3, + height: SizeConfig.height * .052, + sizeBorderRadius: 8.0, + widthPrefix: 8.0, + marginVertical: 10.0, + prefixIcon: const Icon( + Icons.file_copy_outlined, + color: Colors.white, + size: 20, + ), + onPressed: () { + StringUtils.iCopyToClipboard( + context, + text: '8785 0000 3165 5512', + ); + }, + ), + ), + const Divider(color: ColorPalette.slate200), + const Text( + 'Amount to be transferred', + style: TextStyle( + color: Colors.black87, + fontSize: 16, + ), + ), + ListTileView( + title: 'Rp 10.000.000', + prefixIcon: const SizedBox(), + padding: const EdgeInsets.only(right: 16.0), + margin: const EdgeInsets.only(top: 8.0), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, color: ColorPalette.primary), + suffixIcon: ButtonView( + name: 'Copy', + width: SizeConfig.width * .3, + height: SizeConfig.height * .052, + sizeBorderRadius: 8.0, + widthPrefix: 8.0, + marginVertical: 10.0, + prefixIcon: const Icon( + Icons.file_copy_outlined, + color: Colors.white, + size: 20, + ), + onPressed: () { + StringUtils.iCopyToClipboard( + context, + text: '10.000.000', + ); + }, + ), + ), + ], + ), + ), + ); + } + Widget _cardContent(BuildContext context) { TextTheme textTheme = Theme.of(context).textTheme; List mySteps = const [ @@ -213,6 +325,7 @@ class SubscribeDetailView extends StatelessWidget { Text('23:56:42', style: textTheme.headlineSmall), ], ), + type == 'virtual' ? _cardVA(context) : const SizedBox(), Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: Text('Purchase Details', style: textTheme.headlineSmall), @@ -323,6 +436,18 @@ class SubscribeDetailView extends StatelessWidget { ], ), ), + type == 'virtual' + ? const Padding( + padding: EdgeInsets.only(bottom: 8.0), + child: Text( + 'Virtual Account', + style: TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + ) + : const SizedBox(), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -330,11 +455,11 @@ class SubscribeDetailView extends StatelessWidget { image: PathAssets.imgProduct, width: SizeConfig.width * .08, ), - const Padding( - padding: EdgeInsets.only(left: 8.0), + Padding( + padding: const EdgeInsets.only(left: 8.0), child: Text( - 'Shopping Pay', - style: TextStyle( + type == 'virtual' ? 'ABC' : 'Shopping Pay', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.white, ), @@ -368,7 +493,7 @@ class SubscribeDetailView extends StatelessWidget { child: Container( color: Colors.transparent, width: SizeConfig.width, - padding: const EdgeInsets.only(top: 32.0), + padding: const EdgeInsets.only(top: 16.0), child: Container( margin: const EdgeInsets.only(top: 32.0), padding: const EdgeInsets.only(top: 32.0), diff --git a/lib/features/transaction/view/waiting_view.dart b/lib/features/transaction/view/waiting_view.dart index e64dc2a..d4ae3db 100644 --- a/lib/features/transaction/view/waiting_view.dart +++ b/lib/features/transaction/view/waiting_view.dart @@ -22,7 +22,10 @@ class WaitingView extends StatelessWidget { provider.listWaitingTransaction.isNotEmpty ? CardTransactionView( onTap: () { - routePush(context, page: const SubscribeDetailView()); + routePush(context, + page: const SubscribeDetailView( + type: 'normal', + )); }, iconPath: PathAssets.iconEducation, type: 'Education', diff --git a/lib/features/transaction/viewmodel/transaction_viewmodel.dart b/lib/features/transaction/viewmodel/transaction_viewmodel.dart index 9e5579c..c3a3935 100644 --- a/lib/features/transaction/viewmodel/transaction_viewmodel.dart +++ b/lib/features/transaction/viewmodel/transaction_viewmodel.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; class TransactionViewModel extends ChangeNotifier { List listWaitingTransaction = [1]; - List listOnProcessTransaction = []; + List listOnProcessTransaction = [1]; List listDoneTransaction = []; List listCancelTransaction = []; } -- 2.45.2