feat: transaction
This commit is contained in:
parent
ff515e2621
commit
6f5d3ccca8
BIN
assets/icons/icon-education.png
Normal file
BIN
assets/icons/icon-education.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
BIN
assets/icons/icon-fund.png
Normal file
BIN
assets/icons/icon-fund.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
BIN
assets/icons/icon-gadget-outline.png
Normal file
BIN
assets/icons/icon-gadget-outline.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
assets/icons/icon-home.png
Normal file
BIN
assets/icons/icon-home.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
assets/icons/icon-shop.png
Normal file
BIN
assets/icons/icon-shop.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
BIN
assets/images/img-empty-transaction.png
Normal file
BIN
assets/images/img-empty-transaction.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
|
@ -49,12 +49,23 @@ class PathAssets {
|
||||||
static const String iconTicket = 'assets/icons/icon-ticket.png';
|
static const String iconTicket = 'assets/icons/icon-ticket.png';
|
||||||
static const String iconGadget = 'assets/icons/icon-gadget.png';
|
static const String iconGadget = 'assets/icons/icon-gadget.png';
|
||||||
static const String iconCar = 'assets/icons/icon-car.png';
|
static const String iconCar = 'assets/icons/icon-car.png';
|
||||||
static const String iconNavigationHome = 'assets/icons/icon-navigation-home.png';
|
static const String iconNavigationHome =
|
||||||
static const String iconNavigationPlan = 'assets/icons/icon-navigation-plan.png';
|
'assets/icons/icon-navigation-home.png';
|
||||||
static const String iconNavigationTransaction = 'assets/icons/icon-navigation-transaction.png';
|
static const String iconNavigationPlan =
|
||||||
static const String iconNavigationPortfolio = 'assets/icons/icon-navigation-portfolio.png';
|
'assets/icons/icon-navigation-plan.png';
|
||||||
static const String iconNavigationProfile = 'assets/icons/icon-navigation-profile.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 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
|
/// IMAGE
|
||||||
static const String imgSplashLogo = 'assets/images/splash-logo.png';
|
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 imgGuide1 = 'assets/images/img-guide1.png';
|
||||||
static const String imgGuide2 = 'assets/images/img-guide2.png';
|
static const String imgGuide2 = 'assets/images/img-guide2.png';
|
||||||
static const String imgOpenShopping = 'assets/images/img-open-shopping.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 frameSignature = 'assets/images/frame-signature.png';
|
||||||
static const String imgFinish = 'assets/images/img-finish.png';
|
static const String imgFinish = 'assets/images/img-finish.png';
|
||||||
|
static const String imgEmptyTransaction =
|
||||||
|
'assets/images/img-empty-transaction.png';
|
||||||
|
|
||||||
static const Map<String, String> goalInvestIcon = {
|
static const Map<String, String> goalInvestIcon = {
|
||||||
'Education': iconToga,
|
'Education': iconToga,
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
class StringUtils {
|
class StringUtils {
|
||||||
static bool emailValidation(String email) {
|
static bool emailValidation(String email) {
|
||||||
return RegExp(
|
return RegExp(
|
||||||
|
@ -13,4 +15,12 @@ class StringUtils {
|
||||||
return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})')
|
return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})')
|
||||||
.hasMatch(password);
|
.hasMatch(password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String formatTime(DateTime? dateTime) {
|
||||||
|
if (dateTime != null) {
|
||||||
|
DateFormat formatter = DateFormat('HH:mm:ss');
|
||||||
|
return formatter.format(dateTime);
|
||||||
|
}
|
||||||
|
return '--:--:--';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
35
lib/features/transaction/view/cancel_view.dart
Normal file
35
lib/features/transaction/view/cancel_view.dart
Normal file
|
@ -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<TransactionViewModel>(
|
||||||
|
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: () {},
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
37
lib/features/transaction/view/done_view.dart
Normal file
37
lib/features/transaction/view/done_view.dart
Normal file
|
@ -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<TransactionViewModel>(
|
||||||
|
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: () {},
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
34
lib/features/transaction/view/onprocess_view.dart
Normal file
34
lib/features/transaction/view/onprocess_view.dart
Normal file
|
@ -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<TransactionViewModel>(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: () {},
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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/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/material.dart';
|
||||||
|
import 'package:flutter_toggle_tab/flutter_toggle_tab.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class TransactionView extends StatelessWidget {
|
class TransactionView extends StatelessWidget {
|
||||||
const TransactionView({Key? key}) : super(key: key);
|
const TransactionView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
List<Tab> textTabs = const [
|
||||||
appBar: CustomAppBar(height: SizeConfig.height * 0.08, title: 'Transaction'),
|
Tab(text: 'Waiting'),
|
||||||
);
|
Tab(text: 'On process'),
|
||||||
|
Tab(text: 'Done'),
|
||||||
|
Tab(text: 'Cancel'),
|
||||||
|
];
|
||||||
|
List<Widget> 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),
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
42
lib/features/transaction/view/waiting_view.dart
Normal file
42
lib/features/transaction/view/waiting_view.dart
Normal file
|
@ -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<TransactionViewModel>(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: () {},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class TransactionViewModel extends ChangeNotifier {
|
||||||
|
List listWaitingTransaction = [1];
|
||||||
|
List listOnProcessTransaction = [];
|
||||||
|
List listDoneTransaction = [];
|
||||||
|
List listCancelTransaction = [];
|
||||||
|
}
|
114
lib/main.dart
114
lib/main.dart
|
@ -20,68 +20,66 @@ class MyApp extends StatelessWidget {
|
||||||
title: 'CIMS',
|
title: 'CIMS',
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
appBarTheme: const AppBarTheme(
|
appBarTheme: const AppBarTheme(
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
elevation: 1,
|
elevation: 1,
|
||||||
foregroundColor: Colors.black,
|
foregroundColor: Colors.black,
|
||||||
titleTextStyle: TextStyle(
|
titleTextStyle: TextStyle(
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
fontFamily: 'Manrope',
|
fontFamily: 'Manrope',
|
||||||
|
color: ColorPalette.slate800,
|
||||||
|
)),
|
||||||
|
fontFamily: 'Manrope',
|
||||||
|
scaffoldBackgroundColor: Colors.white,
|
||||||
|
textTheme: const TextTheme(
|
||||||
|
displaySmall: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
color: ColorPalette.slate800,
|
color: ColorPalette.slate800,
|
||||||
)),
|
),
|
||||||
fontFamily: 'Manrope',
|
displayMedium: TextStyle(
|
||||||
scaffoldBackgroundColor: Colors.white,
|
fontSize: 16,
|
||||||
textTheme: const TextTheme(
|
fontWeight: FontWeight.w600,
|
||||||
displaySmall: TextStyle(
|
color: ColorPalette.slate800,
|
||||||
fontSize: 14,
|
),
|
||||||
fontWeight: FontWeight.w500,
|
displayLarge: TextStyle(
|
||||||
color: ColorPalette.slate800,
|
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(
|
colorScheme: const ColorScheme.light().copyWith(
|
||||||
fontSize: 16,
|
primary: const Color(0xff2563EB),
|
||||||
fontWeight: FontWeight.w600,
|
onPrimary: const Color(0xFFFF9130),
|
||||||
color: ColorPalette.slate800,
|
secondary: const Color(0xFFFECDA6),
|
||||||
|
onBackground: const Color(0xFFA9A9A9),
|
||||||
),
|
),
|
||||||
displayLarge: TextStyle(
|
bottomSheetTheme: const BottomSheetThemeData(
|
||||||
fontSize: 16,
|
backgroundColor: Colors.white, surfaceTintColor: Colors.white)
|
||||||
fontWeight: FontWeight.bold,
|
// useMaterial3: true,
|
||||||
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,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
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,
|
initialRoute: initialRoute,
|
||||||
onGenerateRoute: generateRoutes,
|
onGenerateRoute: generateRoutes,
|
||||||
navigatorObservers: [
|
navigatorObservers: [
|
||||||
|
|
|
@ -259,6 +259,14 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
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:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
|
@ -53,6 +53,7 @@ dependencies:
|
||||||
shared_preferences: ^2.2.2
|
shared_preferences: ^2.2.2
|
||||||
calendar_date_picker2: ^0.5.3
|
calendar_date_picker2: ^0.5.3
|
||||||
google_sign_in: ^6.2.1
|
google_sign_in: ^6.2.1
|
||||||
|
flutter_toggle_tab: ^1.4.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user