Merge pull request 'bayu/dev' (#15) from bayu/dev into dev
Reviewed-on: #15
This commit is contained in:
commit
4737a91ab1
|
@ -24,160 +24,163 @@ class _TotalPaymentViewState extends State<TotalPaymentView> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return SingleChildScrollView(
|
||||||
decoration: BoxDecoration(
|
child: Container(
|
||||||
color: Colors.white,
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(16)
|
color: Colors.white, borderRadius: BorderRadius.circular(16)),
|
||||||
),
|
child: Column(
|
||||||
child: Column(
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisSize: MainAxisSize.min,
|
children: [
|
||||||
children: [
|
Padding(
|
||||||
Padding(
|
padding: const EdgeInsets.all(24.0),
|
||||||
padding: const EdgeInsets.all(24.0),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
const Text('Your Investment Today',
|
|
||||||
style: TextStyle(
|
|
||||||
color: ColorPalette.slate800,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontSize: 16
|
|
||||||
),
|
|
||||||
),
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () => Navigator.pop(context),
|
|
||||||
child: const Icon(Icons.close_rounded)
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
...widget.listProduct.asMap().entries.map((e) {
|
|
||||||
return Container(
|
|
||||||
padding: const EdgeInsets.only(left: 16, right: 24, bottom: 16, top: 16),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border(
|
|
||||||
left: BorderSide(
|
|
||||||
width: 8,
|
|
||||||
color: ColorPalette.investTypeColor[e.value.type]!
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
const Text(
|
||||||
flex: 5,
|
'Your Investment Today',
|
||||||
child: Text(e.value.name ?? '',
|
style: TextStyle(
|
||||||
style: const TextStyle(
|
color: ColorPalette.slate800,
|
||||||
color: ColorPalette.slate400,
|
fontWeight: FontWeight.w600,
|
||||||
fontWeight: FontWeight.w600,
|
fontSize: 16),
|
||||||
fontSize: 16
|
|
||||||
),
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
Expanded(
|
GestureDetector(
|
||||||
flex: 7,
|
onTap: () => Navigator.pop(context),
|
||||||
child: Text(
|
child: const Icon(Icons.close_rounded))
|
||||||
NumberFormatter.numberCurrency(widget.totalInvest * e.value.totalPercent!, 'Rp ', 'id_ID'),
|
],
|
||||||
textAlign: TextAlign.end,
|
),
|
||||||
style: const TextStyle(
|
),
|
||||||
fontWeight: FontWeight.w700,
|
...widget.listProduct.asMap().entries.map((e) {
|
||||||
fontSize: 18,
|
return Container(
|
||||||
color: ColorPalette.slate800
|
padding: const EdgeInsets.only(
|
||||||
),
|
left: 16, right: 24, bottom: 16, top: 16),
|
||||||
)
|
decoration: BoxDecoration(
|
||||||
|
border: Border(
|
||||||
|
left: BorderSide(
|
||||||
|
width: 8,
|
||||||
|
color:
|
||||||
|
ColorPalette.investTypeColor[e.value.type]!))),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 5,
|
||||||
|
child: Text(
|
||||||
|
e.value.name ?? '',
|
||||||
|
style: const TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 16),
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 7,
|
||||||
|
child: Text(
|
||||||
|
NumberFormatter.numberCurrency(
|
||||||
|
widget.totalInvest * e.value.totalPercent!,
|
||||||
|
'Rp ',
|
||||||
|
'id_ID'),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
fontSize: 18,
|
||||||
|
color: ColorPalette.slate800),
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
const Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 24),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Purchase Commission',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 16),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'Free',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.primary,
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.w700),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
|
||||||
}).toList(),
|
|
||||||
const SizedBox(height: 16),
|
|
||||||
const Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 24),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text('Purchase Commission',
|
|
||||||
style: TextStyle(
|
|
||||||
color: ColorPalette.slate400,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontSize: 16
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text('Free',
|
|
||||||
style: TextStyle(
|
|
||||||
color: ColorPalette.primary,
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.w700
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
const SizedBox(
|
||||||
const SizedBox(height: 16,),
|
height: 16,
|
||||||
Container(
|
|
||||||
color: ColorPalette.slate200.withOpacity(0.5),
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
const Text('Total',
|
|
||||||
style: TextStyle(
|
|
||||||
color: ColorPalette.slate400,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontSize: 16
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(NumberFormatter.numberCurrency(widget.totalInvest, 'Rp ', 'id_ID'),
|
|
||||||
textAlign: TextAlign.end,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontWeight: FontWeight.w700,
|
|
||||||
fontSize: 18,
|
|
||||||
color: ColorPalette.slate800
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
Container(
|
||||||
buttonAgreement(),
|
color: ColorPalette.slate200.withOpacity(0.5),
|
||||||
Container(
|
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
child: Row(
|
||||||
child: Row(
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
children: [
|
||||||
children: [
|
const Text(
|
||||||
const Text('Total Payment',
|
'Total',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ColorPalette.slate400,
|
color: ColorPalette.slate400,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
fontSize: 16
|
fontSize: 16),
|
||||||
),
|
),
|
||||||
),
|
Text(
|
||||||
Text(NumberFormatter.numberCurrency(widget.totalInvest, 'Rp ', 'id_ID'),
|
NumberFormatter.numberCurrency(
|
||||||
textAlign: TextAlign.end,
|
widget.totalInvest, 'Rp ', 'id_ID'),
|
||||||
style: const TextStyle(
|
textAlign: TextAlign.end,
|
||||||
fontWeight: FontWeight.w700,
|
style: const TextStyle(
|
||||||
fontSize: 18,
|
fontWeight: FontWeight.w700,
|
||||||
color: ColorPalette.slate800
|
fontSize: 18,
|
||||||
),
|
color: ColorPalette.slate800),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
buttonAgreement(),
|
||||||
ButtonView(
|
Container(
|
||||||
disabled: !isAgreement,
|
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
|
||||||
name: 'Subscribe Now',
|
child: Row(
|
||||||
onPressed: () {
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
routePush(context, page: PaymentMethodView(
|
children: [
|
||||||
totalInvest: widget.totalInvest,
|
const Text(
|
||||||
));
|
'Total Payment',
|
||||||
},
|
style: TextStyle(
|
||||||
disabledBgColor: ColorPalette.slate200.withOpacity(0.5),
|
color: ColorPalette.slate400,
|
||||||
textColor: isAgreement ? Colors.white : ColorPalette.slate400,
|
fontWeight: FontWeight.w600,
|
||||||
textWeight: FontWeight.w700,
|
fontSize: 16),
|
||||||
textSize: 20,
|
),
|
||||||
backgroundColor: ColorPalette.primary,
|
Text(
|
||||||
)
|
NumberFormatter.numberCurrency(
|
||||||
],
|
widget.totalInvest, 'Rp ', 'id_ID'),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
fontSize: 18,
|
||||||
|
color: ColorPalette.slate800),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ButtonView(
|
||||||
|
disabled: !isAgreement,
|
||||||
|
name: 'Subscribe Now',
|
||||||
|
onPressed: () {
|
||||||
|
routePush(context,
|
||||||
|
page: PaymentMethodView(
|
||||||
|
totalInvest: widget.totalInvest,
|
||||||
|
));
|
||||||
|
},
|
||||||
|
disabledBgColor: ColorPalette.slate200.withOpacity(0.5),
|
||||||
|
textColor: isAgreement ? Colors.white : ColorPalette.slate400,
|
||||||
|
textWeight: FontWeight.w700,
|
||||||
|
textSize: 20,
|
||||||
|
backgroundColor: ColorPalette.primary,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -205,50 +208,48 @@ class _TotalPaymentViewState extends State<TotalPaymentView> {
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: isAgree ? ColorPalette.primary : ColorPalette.slate200
|
color: isAgree
|
||||||
)
|
? ColorPalette.primary
|
||||||
),
|
: ColorPalette.slate200)),
|
||||||
child: AnimatedContainer(
|
child: AnimatedContainer(
|
||||||
duration: const Duration(milliseconds: 200),
|
duration: const Duration(milliseconds: 200),
|
||||||
child: Container(
|
child: Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: isAgree ? ColorPalette.primary : ColorPalette.white,
|
color:
|
||||||
shape: BoxShape.circle
|
isAgree ? ColorPalette.primary : ColorPalette.white,
|
||||||
),
|
shape: BoxShape.circle),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12,),
|
const SizedBox(
|
||||||
|
width: 12,
|
||||||
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
const Text('I agree to buy the mutual fund on this page and have read and agreed to all the contents of the Prospectus and summary information and understand the risks of my investment decision.',
|
const Text(
|
||||||
|
'I agree to buy the mutual fund on this page and have read and agreed to all the contents of the Prospectus and summary information and understand the risks of my investment decision.',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: ColorPalette.slate400),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {},
|
||||||
|
child: const Text(
|
||||||
|
'Read More',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
color: ColorPalette.slate400
|
decoration: TextDecoration.underline,
|
||||||
),
|
color: ColorPalette.primary),
|
||||||
),
|
))
|
||||||
GestureDetector(
|
],
|
||||||
onTap: () {
|
))
|
||||||
|
|
||||||
},
|
|
||||||
child: const Text('Read More',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 16,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
decoration: TextDecoration.underline,
|
|
||||||
color: ColorPalette.primary
|
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_v
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'dart:math' as math;
|
||||||
|
|
||||||
class DisplayPictureScreen extends StatefulWidget {
|
class DisplayPictureScreen extends StatefulWidget {
|
||||||
final String imagePath, content;
|
final String imagePath, content;
|
||||||
|
@ -106,7 +107,14 @@ class _DisplayPictureScreenState extends State<DisplayPictureScreen> {
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: SizeConfig.width,
|
width: SizeConfig.width,
|
||||||
height: SizeConfig.height * .4,
|
height: SizeConfig.height * .4,
|
||||||
child: Image.file(File(widget.imagePath))),
|
child: Transform(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
transform: widget.content == 'selfie'
|
||||||
|
? Matrix4.rotationY(math.pi)
|
||||||
|
: Matrix4.rotationY(0),
|
||||||
|
child: Image.file(
|
||||||
|
File(widget.imagePath),
|
||||||
|
))),
|
||||||
const Padding(
|
const Padding(
|
||||||
padding: EdgeInsets.symmetric(vertical: 16.0),
|
padding: EdgeInsets.symmetric(vertical: 16.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|
|
@ -141,7 +141,7 @@ class TextFormView extends StatelessWidget {
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
color: fontColorDisabled ?? ColorPalette.slate500,
|
color: fontColorDisabled ?? ColorPalette.slate800,
|
||||||
),
|
),
|
||||||
readOnly: readOnly,
|
readOnly: readOnly,
|
||||||
validator: validator,
|
validator: validator,
|
||||||
|
@ -163,7 +163,7 @@ class TextFormView extends StatelessWidget {
|
||||||
hintStyle: hintTextStyle ??
|
hintStyle: hintTextStyle ??
|
||||||
const TextStyle(
|
const TextStyle(
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
color: ColorPalette.greyFont,
|
color: ColorPalette.slate400,
|
||||||
fontWeight: FontWeight.normal,
|
fontWeight: FontWeight.normal,
|
||||||
),
|
),
|
||||||
isDense: true,
|
isDense: true,
|
||||||
|
|
|
@ -1,19 +1,12 @@
|
||||||
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/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/text_form/text_form_view.dart';
|
|
||||||
import 'package:cims_apps/application/component/text_title/text_title.dart';
|
|
||||||
import 'package:cims_apps/application/theme/color_palette.dart';
|
import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/core/route/route.dart';
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
import 'package:cims_apps/core/utils/size_config.dart';
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
import 'package:cims_apps/features/auth/login/view/password_view.dart';
|
import 'package:cims_apps/features/auth/login/view/password_view.dart';
|
||||||
import 'package:cims_apps/features/auth/login/view/phone_number_view.dart';
|
import 'package:cims_apps/features/auth/login/view/phone_number_view.dart';
|
||||||
import 'package:cims_apps/features/auth/login/view_model/login_view_model.dart';
|
import 'package:cims_apps/features/auth/login/view_model/login_view_model.dart';
|
||||||
import 'package:cims_apps/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart';
|
|
||||||
import 'package:cims_apps/features/bottom_navigation_view.dart';
|
import 'package:cims_apps/features/bottom_navigation_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class LoginView extends StatefulWidget {
|
class LoginView extends StatefulWidget {
|
||||||
|
@ -90,7 +83,11 @@ class _LoginViewState extends State<LoginView> {
|
||||||
currentPage++;
|
currentPage++;
|
||||||
pageController.jumpToPage(1);
|
pageController.jumpToPage(1);
|
||||||
} else {
|
} else {
|
||||||
routePush(context, page: BottomNavigationView());
|
routePush(
|
||||||
|
context,
|
||||||
|
page: const BottomNavigationView(),
|
||||||
|
routeType: RouteType.pushReplace,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,70 +10,83 @@ import 'package:provider/provider.dart';
|
||||||
class PasswordView extends StatelessWidget {
|
class PasswordView extends StatelessWidget {
|
||||||
final void Function() nextStep;
|
final void Function() nextStep;
|
||||||
final TextEditingController controller;
|
final TextEditingController controller;
|
||||||
const PasswordView({super.key, required this.nextStep, required this.controller});
|
const PasswordView(
|
||||||
|
{super.key, required this.nextStep, required this.controller});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Consumer<LoginViewModel>(
|
return Consumer<LoginViewModel>(builder: (context, provider, child) {
|
||||||
builder: (context, provider, child) {
|
return Container(
|
||||||
return Container(
|
width: SizeConfig.width,
|
||||||
width: SizeConfig.width,
|
height: SizeConfig.height,
|
||||||
height: SizeConfig.height,
|
padding: const EdgeInsets.all(24),
|
||||||
padding: const EdgeInsets.all(24),
|
child: Form(
|
||||||
child: Column(
|
key: provider.formKey,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
child: SingleChildScrollView(
|
||||||
children: [
|
child: Column(
|
||||||
const TextTitle(title: 'Enter your password', fontSize: 24),
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
SizedBox(
|
children: [
|
||||||
height: 24,
|
const TextTitle(title: 'Enter your password', fontSize: 24),
|
||||||
),
|
SizedBox(
|
||||||
TextFormView(
|
height: 24,
|
||||||
name: 'Password',
|
),
|
||||||
ctrl: controller,
|
TextFormView(
|
||||||
obscureText: !provider.showPassword,
|
name: 'Password',
|
||||||
contentPadding: EdgeInsets.all(12),
|
ctrl: controller,
|
||||||
suffixIcon: GestureDetector(
|
obscureText: !provider.showPassword,
|
||||||
onTap: () {
|
contentPadding: EdgeInsets.all(12),
|
||||||
provider.changeShowPassword();
|
validator: (value) {
|
||||||
|
if (value!.isEmpty) {
|
||||||
|
return 'Password must filled';
|
||||||
|
} else if (value.length < 8) {
|
||||||
|
return 'Minimum password 8 Character';
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
child: Icon(
|
suffixIcon: GestureDetector(
|
||||||
provider.showPassword
|
onTap: () {
|
||||||
? Icons.visibility_outlined
|
provider.changeShowPassword();
|
||||||
: Icons.visibility_off_outlined,
|
},
|
||||||
color: ColorPalette.greyDarker,
|
child: Icon(
|
||||||
|
provider.showPassword
|
||||||
|
? Icons.visibility_outlined
|
||||||
|
: Icons.visibility_off_outlined,
|
||||||
|
color: ColorPalette.greyDarker,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
TextButton(
|
||||||
TextButton(
|
style: TextButton.styleFrom(padding: EdgeInsets.all(0)),
|
||||||
style: TextButton.styleFrom(
|
onPressed: () {},
|
||||||
padding: EdgeInsets.all(0)
|
child: Text(
|
||||||
|
'Forget the password?',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.primary,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
SizedBox(
|
||||||
|
height: 16,
|
||||||
),
|
),
|
||||||
onPressed: () {
|
ButtonView(
|
||||||
|
name: 'Confirm',
|
||||||
},
|
heightWrapContent: true,
|
||||||
child: Text(
|
width: SizeConfig.width,
|
||||||
'Forget the password?',
|
textSize: 18,
|
||||||
style: TextStyle(
|
marginVertical: 0,
|
||||||
color: ColorPalette.primary,
|
contentPadding:
|
||||||
),
|
EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||||
|
onPressed: () {
|
||||||
|
if (provider.formKey.currentState!.validate()) {
|
||||||
|
nextStep();
|
||||||
|
}
|
||||||
|
},
|
||||||
)
|
)
|
||||||
),
|
],
|
||||||
SizedBox(
|
),
|
||||||
height: 16,
|
|
||||||
),
|
|
||||||
ButtonView(
|
|
||||||
name: 'Confirm',
|
|
||||||
heightWrapContent: true,
|
|
||||||
width: SizeConfig.width,
|
|
||||||
textSize: 18,
|
|
||||||
marginVertical: 0,
|
|
||||||
contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
|
||||||
onPressed: nextStep,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
}
|
);
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,118 +1,135 @@
|
||||||
import 'package:cims_apps/application/assets/path_assets.dart';
|
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/button/button_view.dart';
|
||||||
import 'package:cims_apps/application/component/image/image_view.dart';
|
import 'package:cims_apps/application/component/image/image_view.dart';
|
||||||
import 'package:cims_apps/application/component/numeric_pad/numeric_pad.dart';
|
|
||||||
import 'package:cims_apps/application/component/text_form/text_form_view.dart';
|
import 'package:cims_apps/application/component/text_form/text_form_view.dart';
|
||||||
import 'package:cims_apps/application/component/text_title/text_title.dart';
|
import 'package:cims_apps/application/component/text_title/text_title.dart';
|
||||||
import 'package:cims_apps/application/theme/color_palette.dart';
|
import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/core/route/route.dart';
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
import 'package:cims_apps/core/utils/size_config.dart';
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
|
import 'package:cims_apps/features/auth/login/view_model/login_view_model.dart';
|
||||||
import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
|
import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class PhoneNumberView extends StatelessWidget {
|
class PhoneNumberView extends StatelessWidget {
|
||||||
final void Function() nextStep;
|
final void Function() nextStep;
|
||||||
final TextEditingController controller;
|
final TextEditingController controller;
|
||||||
const PhoneNumberView({super.key, required this.nextStep, required this.controller});
|
const PhoneNumberView(
|
||||||
|
{super.key, required this.nextStep, required this.controller});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return ChangeNotifierProvider(
|
||||||
width: SizeConfig.width,
|
create: (context) => LoginViewModel(),
|
||||||
height: SizeConfig.height,
|
builder: (context, child) {
|
||||||
padding: const EdgeInsets.all(24),
|
return Container(
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
const TextTitle(title: 'Enter your phone number', fontSize: 24),
|
|
||||||
SizedBox(
|
|
||||||
height: 24,
|
|
||||||
),
|
|
||||||
TextFormView(
|
|
||||||
name: 'Phone Number',
|
|
||||||
keyboardType: TextInputType.number,
|
|
||||||
ctrl: controller,
|
|
||||||
inputFormatters: [
|
|
||||||
FilteringTextInputFormatter.deny(RegExp(r'^0'))
|
|
||||||
],
|
|
||||||
contentPadding: EdgeInsets.all(1),
|
|
||||||
prefixIcon: Container(
|
|
||||||
width: SizeConfig.width * .23,
|
|
||||||
padding:
|
|
||||||
const EdgeInsets.symmetric(horizontal: 16.0),
|
|
||||||
margin: const EdgeInsets.only(right: 16),
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
color: ColorPalette.grey,
|
|
||||||
borderRadius: BorderRadius.only(
|
|
||||||
topLeft: Radius.circular(8),
|
|
||||||
bottomLeft: Radius.circular(8),
|
|
||||||
)),
|
|
||||||
child: const Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
ImageView(
|
|
||||||
image: PathAssets.iconFlag,
|
|
||||||
fit: BoxFit.contain,
|
|
||||||
width: 24,
|
|
||||||
height: 24,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'+62',
|
|
||||||
style: TextStyle(
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
color: ColorPalette.slate800,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
validator: (value) {
|
|
||||||
if (value!.isEmpty) {
|
|
||||||
return 'Phone number must be filled';
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 32,
|
|
||||||
),
|
|
||||||
ButtonView(
|
|
||||||
name: 'Next',
|
|
||||||
heightWrapContent: true,
|
|
||||||
width: SizeConfig.width,
|
width: SizeConfig.width,
|
||||||
marginVertical: 0,
|
height: SizeConfig.height,
|
||||||
contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
padding: const EdgeInsets.all(24),
|
||||||
onPressed: nextStep,
|
child:
|
||||||
),
|
Consumer<LoginViewModel>(builder: (context, provider, child) {
|
||||||
Row(
|
return Form(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
key: provider.formKey,
|
||||||
children: [
|
child: SingleChildScrollView(
|
||||||
Text(
|
child: Column(
|
||||||
"Don't have an account yet?",
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
style: TextStyle(
|
children: [
|
||||||
color: ColorPalette.slate500,
|
const TextTitle(
|
||||||
),
|
title: 'Enter your phone number', fontSize: 24),
|
||||||
),
|
SizedBox(
|
||||||
TextButton(
|
height: 24,
|
||||||
onPressed: () {
|
),
|
||||||
routePush(context, page: RegistrationView());
|
TextFormView(
|
||||||
},
|
name: 'Phone Number',
|
||||||
style: TextButton.styleFrom(
|
keyboardType: TextInputType.number,
|
||||||
padding: EdgeInsets.all(0)
|
ctrl: controller,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.deny(RegExp(r'^0'))
|
||||||
|
],
|
||||||
|
contentPadding: EdgeInsets.all(1),
|
||||||
|
prefixIcon: Container(
|
||||||
|
width: SizeConfig.width * .23,
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
|
margin: const EdgeInsets.only(right: 16),
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: ColorPalette.grey,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(8),
|
||||||
|
bottomLeft: Radius.circular(8),
|
||||||
|
)),
|
||||||
|
child: const Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ImageView(
|
||||||
|
image: PathAssets.iconFlag,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'+62',
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: ColorPalette.slate800,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
validator: (value) {
|
||||||
|
if (value!.isEmpty) {
|
||||||
|
return 'Phone number must be filled';
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 32,
|
||||||
|
),
|
||||||
|
ButtonView(
|
||||||
|
name: 'Next',
|
||||||
|
heightWrapContent: true,
|
||||||
|
width: SizeConfig.width,
|
||||||
|
marginVertical: 0,
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 16, vertical: 12),
|
||||||
|
onPressed: () {
|
||||||
|
if (provider.formKey.currentState!.validate()) {
|
||||||
|
nextStep();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Don't have an account yet?",
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
routePush(context, page: RegistrationView());
|
||||||
|
},
|
||||||
|
style: TextButton.styleFrom(
|
||||||
|
padding: EdgeInsets.all(0)),
|
||||||
|
child: Text(
|
||||||
|
'Sign Up',
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: ColorPalette.primary),
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
child: Text(
|
),
|
||||||
'Sign Up',
|
);
|
||||||
style: TextStyle(
|
}),
|
||||||
fontWeight: FontWeight.w600,
|
);
|
||||||
color: ColorPalette.primary
|
});
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class LoginViewModel extends ChangeNotifier {
|
class LoginViewModel extends ChangeNotifier {
|
||||||
bool showPassword = false;
|
bool showPassword = false;
|
||||||
|
var formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
void changeShowPassword() {
|
void changeShowPassword() {
|
||||||
showPassword = !showPassword;
|
showPassword = !showPassword;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/core/route/route.dart';
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
import 'package:cims_apps/core/utils/size_config.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/view/submission_data/submission_parent.dart';
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_public/view/dashboard_public_view.dart';
|
import 'package:cims_apps/features/bottom_navigation_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class InitialRegistrationStep extends StatelessWidget {
|
class InitialRegistrationStep extends StatelessWidget {
|
||||||
|
@ -203,7 +203,7 @@ class InitialRegistrationStep extends StatelessWidget {
|
||||||
isOutlined: true,
|
isOutlined: true,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
routePush(context,
|
routePush(context,
|
||||||
page: const DashboardPublicView(),
|
page: const BottomNavigationView(),
|
||||||
routeType: RouteType.pushReplace);
|
routeType: RouteType.pushReplace);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
@ -45,7 +45,7 @@ class RegistrationPasswordView extends StatelessWidget {
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value!.isEmpty) {
|
if (value!.isEmpty) {
|
||||||
return 'Password must filled';
|
return 'Password must filled';
|
||||||
} else if (value.length <= 8) {
|
} else if (value.length < 8) {
|
||||||
return 'Minimum password 8 Character';
|
return 'Minimum password 8 Character';
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -29,52 +29,57 @@ class SubmitBankAccount extends StatelessWidget {
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
child: Consumer<SubmissionDataViewModel>(
|
child: Consumer<SubmissionDataViewModel>(
|
||||||
builder: (context, provider, child) {
|
builder: (context, provider, child) {
|
||||||
return Column(
|
return SingleChildScrollView(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
child: Column(
|
||||||
children: [
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
const TextCaption(title: 'Input your bank account data'),
|
children: [
|
||||||
SelectFormView(
|
const TextCaption(title: 'Input your bank account data'),
|
||||||
name: 'Bank Name',
|
SelectFormView(
|
||||||
hintText: 'Select Bank',
|
name: 'Bank Name',
|
||||||
listItem: provider.listBank,
|
hintText: 'Select Bank',
|
||||||
ctrl: provider.ctrlBankName,
|
listItem: provider.listBank,
|
||||||
onSelect: (value) {},
|
ctrl: provider.ctrlBankName,
|
||||||
),
|
onSelect: (value) {},
|
||||||
TextFormView(
|
),
|
||||||
name: 'Account Number',
|
TextFormView(
|
||||||
hintText: 'Input Account Number',
|
name: 'Account Number',
|
||||||
trailingTitleWidget: SizedBox(
|
hintText: 'Input Account Number',
|
||||||
width: 24,
|
keyboardType: TextInputType.number,
|
||||||
child: GestureDetector(
|
trailingTitleWidget: SizedBox(
|
||||||
onTap: () {
|
width: 24,
|
||||||
routePush(context, page: const GuideScreen());
|
child: GestureDetector(
|
||||||
},
|
onTap: () {
|
||||||
child: const ImageView(image: PathAssets.iconQuestion),
|
routePush(context, page: const GuideScreen());
|
||||||
|
},
|
||||||
|
child:
|
||||||
|
const ImageView(image: PathAssets.iconQuestion),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
TextFormView(
|
||||||
TextFormView(
|
name: 'Account Owner Name',
|
||||||
name: 'Account Owner Name',
|
hintText: 'Input Account 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,
|
|
||||||
),
|
),
|
||||||
),
|
const Text(
|
||||||
SizedBox(height: SizeConfig.height * .08),
|
"Make sure the account you use is in your name, not someone else's",
|
||||||
ButtonView(
|
style: TextStyle(
|
||||||
name: 'Next',
|
color: ColorPalette.slate400,
|
||||||
onPressed: () {
|
),
|
||||||
provider.next(context).then((value) {
|
),
|
||||||
if (value) {
|
SizedBox(height: SizeConfig.height * .08),
|
||||||
routePush(context, page: const ConfirmBankAccount());
|
ButtonView(
|
||||||
}
|
name: 'Next',
|
||||||
});
|
onPressed: () {
|
||||||
},
|
provider.next(context).then((value) {
|
||||||
)
|
if (value) {
|
||||||
],
|
routePush(context,
|
||||||
|
page: const ConfirmBankAccount());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import 'package:cims_apps/features/auth/registration/view/submission_data/submis
|
||||||
import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart';
|
import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'dart:math' as math;
|
||||||
|
|
||||||
class SubmitDataIdCard extends StatelessWidget {
|
class SubmitDataIdCard extends StatelessWidget {
|
||||||
const SubmitDataIdCard({Key? key}) : super(key: key);
|
const SubmitDataIdCard({Key? key}) : super(key: key);
|
||||||
|
@ -30,7 +31,7 @@ class SubmitDataIdCard extends StatelessWidget {
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.vertical(top: Radius.circular(18))),
|
BorderRadius.vertical(top: Radius.circular(18))),
|
||||||
height: SizeConfig.height * .32,
|
height: SizeConfig.height * .35,
|
||||||
padding: const EdgeInsets.all(16.0),
|
padding: const EdgeInsets.all(16.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
@ -108,14 +109,21 @@ class SubmitDataIdCard extends StatelessWidget {
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: SizeConfig.height * .18,
|
height: SizeConfig.height * .18,
|
||||||
width: SizeConfig.width * .45,
|
width: SizeConfig.width * .45,
|
||||||
child: ClipRRect(
|
child: Transform(
|
||||||
borderRadius: BorderRadius.circular(8),
|
alignment: Alignment.center,
|
||||||
child: Image.file(
|
transform: e.key == 'selfie'
|
||||||
File(e.image),
|
? Matrix4.rotationY(math.pi)
|
||||||
fit: BoxFit.fill,
|
: Matrix4.rotationY(0),
|
||||||
errorBuilder: (context, error, stackTrace) {
|
child: ClipRRect(
|
||||||
return const Icon(Icons.image_not_supported_outlined);
|
borderRadius: BorderRadius.circular(8),
|
||||||
},
|
child: Image.file(
|
||||||
|
File(e.image),
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
errorBuilder: (context, error, stackTrace) {
|
||||||
|
return const Icon(
|
||||||
|
Icons.image_not_supported_outlined);
|
||||||
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -173,11 +181,15 @@ class SubmitDataIdCard extends StatelessWidget {
|
||||||
children: [
|
children: [
|
||||||
const TextCaption(
|
const TextCaption(
|
||||||
title: 'Check your ID card data for accuracy'),
|
title: 'Check your ID card data for accuracy'),
|
||||||
TextFormView(name: 'NIK'),
|
TextFormView(
|
||||||
|
name: 'NIK',
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
),
|
||||||
TextFormView(name: 'Full Name'),
|
TextFormView(name: 'Full Name'),
|
||||||
DatePickerView(
|
DatePickerView(
|
||||||
name: 'Birth Date',
|
name: 'Birth Date',
|
||||||
ctrl: provider.ctrlBirthDate,
|
ctrl: provider.ctrlBirthDate,
|
||||||
|
maxDate: DateTime.now(),
|
||||||
isMultipleSelection: false,
|
isMultipleSelection: false,
|
||||||
enabled: true),
|
enabled: true),
|
||||||
photoDocument(provider),
|
photoDocument(provider),
|
||||||
|
|
|
@ -52,8 +52,8 @@ class SubmissionDataViewModel extends ChangeNotifier {
|
||||||
];
|
];
|
||||||
|
|
||||||
List<ItemSelectForm> listImg = [
|
List<ItemSelectForm> listImg = [
|
||||||
ItemSelectForm('', 'ID Card', image: ''),
|
ItemSelectForm('ktp', 'ID Card', image: ''),
|
||||||
ItemSelectForm('', 'Selfie with ID Card', image: ''),
|
ItemSelectForm('selfie', 'Selfie with ID Card', image: ''),
|
||||||
];
|
];
|
||||||
|
|
||||||
Future<List<CameraDescription>> initCamera() async {
|
Future<List<CameraDescription>> initCamera() async {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import 'package:cims_apps/application/theme/color_palette.dart';
|
import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_account/view/homepage/homepage_view.dart';
|
import 'package:cims_apps/features/dashboard/dashboard_account/view/homepage/homepage_view.dart';
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view/plan_view.dart';
|
import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view/plan_view.dart';
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view_model/plan_view_model.dart';
|
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart';
|
import 'package:cims_apps/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart';
|
||||||
|
import 'package:cims_apps/features/profile/view/profile_view.dart';
|
||||||
|
import 'package:cims_apps/features/transaction/view/transaction_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
|
|
||||||
class BottomNavigationView extends StatefulWidget {
|
class BottomNavigationView extends StatefulWidget {
|
||||||
const BottomNavigationView({Key? key}) : super(key: key);
|
const BottomNavigationView({Key? key}) : super(key: key);
|
||||||
|
@ -18,13 +18,12 @@ class _BottomNavigationViewState extends State<BottomNavigationView> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
///TODO: masukan pagenya dilistWidget ini
|
List<Widget> listWidget = const [
|
||||||
List<Widget> listWidget = [
|
|
||||||
HomeView(),
|
HomeView(),
|
||||||
PlanView(),
|
PlanView(),
|
||||||
Container(),
|
TransactionView(),
|
||||||
PortofolioView(),
|
PortofolioView(),
|
||||||
Container(),
|
ProfileView(),
|
||||||
];
|
];
|
||||||
|
|
||||||
List<BottomNavigationBarItem> listNavigation = const [
|
List<BottomNavigationBarItem> listNavigation = const [
|
||||||
|
|
|
@ -7,7 +7,6 @@ import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/core/route/route.dart';
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
import 'package:cims_apps/core/utils/size_config.dart';
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart';
|
import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart';
|
||||||
import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
|
|
||||||
import 'package:cims_apps/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart';
|
import 'package:cims_apps/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
@ -50,14 +49,22 @@ class _HomeViewState extends State<HomeView> {
|
||||||
InvestType('Sharia', PathAssets.iconPortofolioSharia)
|
InvestType('Sharia', PathAssets.iconPortofolioSharia)
|
||||||
];
|
];
|
||||||
|
|
||||||
StepVerification listStepVerification = StepVerification(0, [
|
StepVerification listStepVerification =
|
||||||
'Registration', 'Verification', 'Complete'
|
StepVerification(0, ['Registration', 'Verification', 'Complete']);
|
||||||
]);
|
|
||||||
|
|
||||||
List<Article> listArticle = [
|
List<Article> listArticle = [
|
||||||
Article('Education', 'Menggali Potensi Pasar: Analisis Sebelum Memulai Investasi', PathAssets.imgArticles),
|
Article(
|
||||||
Article('News', 'Tren Investasi 2024: Peluang dan Risiko yang Perlu Diketahui', PathAssets.imgArticles),
|
'Education',
|
||||||
Article('Education', 'Investasi Berkelanjutan: Mengenal Portofolio Hijau untuk Masa Depan', PathAssets.imgArticles),
|
'Menggali Potensi Pasar: Analisis Sebelum Memulai Investasi',
|
||||||
|
PathAssets.imgArticles),
|
||||||
|
Article(
|
||||||
|
'News',
|
||||||
|
'Tren Investasi 2024: Peluang dan Risiko yang Perlu Diketahui',
|
||||||
|
PathAssets.imgArticles),
|
||||||
|
Article(
|
||||||
|
'Education',
|
||||||
|
'Investasi Berkelanjutan: Mengenal Portofolio Hijau untuk Masa Depan',
|
||||||
|
PathAssets.imgArticles),
|
||||||
];
|
];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -85,22 +92,17 @@ class _HomeViewState extends State<HomeView> {
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
fontWeight: FontWeight.w700
|
fontWeight: FontWeight.w700),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () {},
|
||||||
|
|
||||||
},
|
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
foregroundColor: const Color(0xff2563EB),
|
foregroundColor: const Color(0xff2563EB),
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
shape: const CircleBorder()
|
shape: const CircleBorder()),
|
||||||
),
|
child: const Icon(Icons.notifications_outlined))
|
||||||
child: const Icon(Icons.notifications_outlined)
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -148,7 +150,8 @@ class _HomeViewState extends State<HomeView> {
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Text('Portofolio Value', style: TextStyle(color: Colors.white)),
|
const Text('Portofolio Value',
|
||||||
|
style: TextStyle(color: Colors.white)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 12,
|
width: 12,
|
||||||
),
|
),
|
||||||
|
@ -158,8 +161,11 @@ class _HomeViewState extends State<HomeView> {
|
||||||
seePortofolioValue = !seePortofolioValue;
|
seePortofolioValue = !seePortofolioValue;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
child: const Icon(Icons.visibility_outlined, color: Color(0xff93C5FD))
|
child: Icon(
|
||||||
)
|
seePortofolioValue
|
||||||
|
? Icons.visibility_off_outlined
|
||||||
|
: Icons.visibility_outlined,
|
||||||
|
color: const Color(0xff93C5FD)))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
|
@ -170,24 +176,28 @@ class _HomeViewState extends State<HomeView> {
|
||||||
AnimatedCrossFade(
|
AnimatedCrossFade(
|
||||||
duration: const Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
crossFadeState: seePortofolioValue ? CrossFadeState.showSecond : CrossFadeState.showFirst,
|
crossFadeState: seePortofolioValue
|
||||||
|
? CrossFadeState.showSecond
|
||||||
|
: CrossFadeState.showFirst,
|
||||||
firstChild: RichText(
|
firstChild: RichText(
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
text: 'Rp ',
|
text: 'Rp ',
|
||||||
style: TextStyle(fontSize: 32, color: Color(0xff93C5FD), fontFamily: 'Manrope',),
|
style: TextStyle(
|
||||||
|
fontSize: 32,
|
||||||
|
color: Color(0xff93C5FD),
|
||||||
|
fontFamily: 'Manrope',
|
||||||
|
),
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: '22.500.000',
|
text: '22.500.000',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 32,
|
fontSize: 32,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontFamily: 'Manrope',
|
fontFamily: 'Manrope',
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
]
|
])),
|
||||||
)
|
|
||||||
),
|
|
||||||
secondChild: Padding(
|
secondChild: Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||||
child: Wrap(
|
child: Wrap(
|
||||||
|
@ -197,7 +207,8 @@ class _HomeViewState extends State<HomeView> {
|
||||||
Container(
|
Container(
|
||||||
width: 12,
|
width: 12,
|
||||||
height: 12,
|
height: 12,
|
||||||
decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle),
|
decoration: const BoxDecoration(
|
||||||
|
color: Colors.white, shape: BoxShape.circle),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -219,14 +230,12 @@ class _HomeViewState extends State<HomeView> {
|
||||||
BoxShadow(
|
BoxShadow(
|
||||||
spreadRadius: 2,
|
spreadRadius: 2,
|
||||||
blurRadius: 4,
|
blurRadius: 4,
|
||||||
color: const Color(0xff1E293B).withOpacity(0.04)
|
color: const Color(0xff1E293B).withOpacity(0.04))
|
||||||
)
|
]),
|
||||||
]
|
|
||||||
),
|
|
||||||
child: Wrap(
|
child: Wrap(
|
||||||
spacing: 10,
|
spacing: 10,
|
||||||
children: listPortofolioType.asMap().entries.map((e) {
|
children: listPortofolioType.asMap().entries.map((e) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
routePush(context, page: InvestTypeView(title: e.value.name));
|
routePush(context, page: InvestTypeView(title: e.value.name));
|
||||||
},
|
},
|
||||||
|
@ -235,7 +244,11 @@ class _HomeViewState extends State<HomeView> {
|
||||||
width: SizeConfig.width * .18,
|
width: SizeConfig.width * .18,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
ImageView(image: e.value.iconImage, height: SizeConfig.width * .12, width: SizeConfig.width * .12,),
|
ImageView(
|
||||||
|
image: e.value.iconImage,
|
||||||
|
height: SizeConfig.width * .12,
|
||||||
|
width: SizeConfig.width * .12,
|
||||||
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 8,
|
height: 8,
|
||||||
),
|
),
|
||||||
|
@ -244,9 +257,7 @@ class _HomeViewState extends State<HomeView> {
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12, fontWeight: FontWeight.w600),
|
||||||
fontWeight: FontWeight.w600
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -271,21 +282,22 @@ class _HomeViewState extends State<HomeView> {
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 24,
|
height: 24,
|
||||||
),
|
),
|
||||||
if(listStepVerification.currentStep == 1)...[
|
if (listStepVerification.currentStep == 1) ...[
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
const Row(
|
const Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.verified, size: 18,),
|
Icon(
|
||||||
|
Icons.verified,
|
||||||
|
size: 18,
|
||||||
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 12,
|
width: 12,
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'Verified by PT Gemilang',
|
'Verified by PT Gemilang',
|
||||||
style: TextStyle(
|
style: TextStyle(color: ColorPalette.slate500),
|
||||||
color: ColorPalette.slate500
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -294,9 +306,9 @@ class _HomeViewState extends State<HomeView> {
|
||||||
height: 16,
|
height: 16,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
border: Border.all(color: const Color(0xffCBD5E1), width: 1.5),
|
border: Border.all(
|
||||||
shape: BoxShape.circle
|
color: const Color(0xffCBD5E1), width: 1.5),
|
||||||
),
|
shape: BoxShape.circle),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -309,15 +321,16 @@ class _HomeViewState extends State<HomeView> {
|
||||||
const Row(
|
const Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.verified, size: 18,),
|
Icon(
|
||||||
|
Icons.verified,
|
||||||
|
size: 18,
|
||||||
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 12,
|
width: 12,
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'Verified by KSEI',
|
'Verified by KSEI',
|
||||||
style: TextStyle(
|
style: TextStyle(color: ColorPalette.slate500),
|
||||||
color: ColorPalette.slate500
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -326,9 +339,9 @@ class _HomeViewState extends State<HomeView> {
|
||||||
height: 16,
|
height: 16,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
border: Border.all(color: const Color(0xffCBD5E1), width: 1.5),
|
border: Border.all(
|
||||||
shape: BoxShape.circle
|
color: const Color(0xffCBD5E1), width: 1.5),
|
||||||
),
|
shape: BoxShape.circle),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -339,15 +352,12 @@ class _HomeViewState extends State<HomeView> {
|
||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: ColorPalette.blue50,
|
color: ColorPalette.blue50,
|
||||||
borderRadius: BorderRadius.circular(12)
|
borderRadius: BorderRadius.circular(12)),
|
||||||
),
|
|
||||||
child: const Column(
|
child: const Column(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'Your registration is currently being verified by PT Gemilang',
|
'Your registration is currently being verified by PT Gemilang',
|
||||||
style: TextStyle(
|
style: TextStyle(color: ColorPalette.slate500),
|
||||||
color: ColorPalette.slate500
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 16,
|
height: 16,
|
||||||
|
@ -355,37 +365,32 @@ class _HomeViewState extends State<HomeView> {
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text('Estimated:',
|
Text(
|
||||||
style: TextStyle(
|
'Estimated:',
|
||||||
color: ColorPalette.slate500
|
style: TextStyle(color: ColorPalette.slate500),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'January 30 2024',
|
'January 30 2024',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
color: Color(0xff1E293B)
|
color: Color(0xff1E293B)),
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
]else if(listStepVerification.currentStep == 0)...[
|
] else if (listStepVerification.currentStep == 0) ...[
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: ColorPalette.blue50,
|
color: ColorPalette.blue50,
|
||||||
borderRadius: BorderRadius.circular(12)
|
borderRadius: BorderRadius.circular(12)),
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
"Let's start registering your data to start mutual fund investment at PT Gemilang Indonesia",
|
"Let's start registering your data to start mutual fund investment at PT Gemilang Indonesia",
|
||||||
style: TextStyle(
|
style: TextStyle(color: ColorPalette.slate500),
|
||||||
color: ColorPalette.slate500
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 16,
|
height: 16,
|
||||||
|
@ -416,11 +421,15 @@ class _HomeViewState extends State<HomeView> {
|
||||||
return Row(
|
return Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if(e.key != 0)
|
if (e.key != 0)
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 30,
|
width: 30,
|
||||||
height: 30,
|
height: 30,
|
||||||
child: Divider(color: listStepVerification.currentStep >= e.key ? const Color(0xff2563EB) : const Color(0xffCBD5E1),),
|
child: Divider(
|
||||||
|
color: listStepVerification.currentStep >= e.key
|
||||||
|
? const Color(0xff2563EB)
|
||||||
|
: const Color(0xffCBD5E1),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
|
@ -429,18 +438,31 @@ class _HomeViewState extends State<HomeView> {
|
||||||
height: 30,
|
height: 30,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
color: listStepVerification.currentStep <= e.key ? Colors.white : const Color(0xff2563EB),
|
color: listStepVerification.currentStep <= e.key
|
||||||
|
? Colors.white
|
||||||
|
: const Color(0xff2563EB),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: listStepVerification.currentStep < e.key ? const Color(0xffCBD5E1) : const Color(0xff2563EB),
|
color: listStepVerification.currentStep < e.key
|
||||||
width: 2
|
? const Color(0xffCBD5E1)
|
||||||
)
|
: const Color(0xff2563EB),
|
||||||
),
|
width: 2)),
|
||||||
child: listStepVerification.currentStep <= e.key ? const SizedBox() : const Icon(Icons.done_rounded, color: Colors.white,),
|
child: listStepVerification.currentStep <= e.key
|
||||||
|
? const SizedBox()
|
||||||
|
: const Icon(
|
||||||
|
Icons.done_rounded,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 8,
|
height: 8,
|
||||||
),
|
),
|
||||||
Text(e.value, style: TextStyle(color: listStepVerification.currentStep == e.key ? const Color(0xff2563EB) : Colors.black),)
|
Text(
|
||||||
|
e.value,
|
||||||
|
style: TextStyle(
|
||||||
|
color: listStepVerification.currentStep == e.key
|
||||||
|
? const Color(0xff2563EB)
|
||||||
|
: Colors.black),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -455,15 +477,22 @@ class _HomeViewState extends State<HomeView> {
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
const TextTitle(title: 'Info and Special Promo', color: ColorPalette.slate800,),
|
const TextTitle(
|
||||||
|
title: 'Info and Special Promo',
|
||||||
|
color: ColorPalette.slate800,
|
||||||
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 16,
|
height: 16,
|
||||||
),
|
),
|
||||||
CarouselSlider(
|
CarouselSlider(
|
||||||
items: [1,2,3].map((e) {
|
items: [1, 2, 3].map((e) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
child: ImageView(image: PathAssets.imgCarousel, height: 150, width: SizeConfig.width * .9,),
|
child: ImageView(
|
||||||
|
image: PathAssets.imgCarousel,
|
||||||
|
height: 150,
|
||||||
|
width: SizeConfig.width * .9,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}).toList(),
|
}).toList(),
|
||||||
options: CarouselOptions(
|
options: CarouselOptions(
|
||||||
|
@ -493,14 +522,13 @@ class _HomeViewState extends State<HomeView> {
|
||||||
children: [
|
children: [
|
||||||
const TextTitle(title: 'Article', color: ColorPalette.slate800),
|
const TextTitle(title: 'Article', color: ColorPalette.slate800),
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () {
|
onTap: () {},
|
||||||
|
child: const Text(
|
||||||
},
|
'See More',
|
||||||
child: const Text('See More',
|
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ColorPalette.primary,
|
color: ColorPalette.primary,
|
||||||
fontWeight: FontWeight.bold
|
fontWeight: FontWeight.bold),
|
||||||
),),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -511,10 +539,12 @@ class _HomeViewState extends State<HomeView> {
|
||||||
...listArticle.asMap().entries.map((e) {
|
...listArticle.asMap().entries.map((e) {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
if(e.key != 0)...[
|
if (e.key != 0) ...[
|
||||||
const Padding(
|
const Padding(
|
||||||
padding: EdgeInsets.symmetric(vertical: 12),
|
padding: EdgeInsets.symmetric(vertical: 12),
|
||||||
child: Divider(color: ColorPalette.slate200,),
|
child: Divider(
|
||||||
|
color: ColorPalette.slate200,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
cardArticle(e.value),
|
cardArticle(e.value),
|
||||||
|
@ -531,39 +561,43 @@ class _HomeViewState extends State<HomeView> {
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24),
|
padding: const EdgeInsets.symmetric(horizontal: 24),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
ImageView(image: PathAssets.imgArticles, width: SizeConfig.width * .17, height: SizeConfig.height * .08, borderRadius: 8,),
|
ImageView(
|
||||||
|
image: PathAssets.imgArticles,
|
||||||
|
width: SizeConfig.width * .17,
|
||||||
|
height: SizeConfig.height * .08,
|
||||||
|
borderRadius: 8,
|
||||||
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 16,
|
width: 16,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(article.title,
|
Text(
|
||||||
style: const TextStyle(
|
article.title,
|
||||||
fontWeight: FontWeight.bold,
|
style: const TextStyle(
|
||||||
),
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
const SizedBox(
|
),
|
||||||
height: 8,
|
const SizedBox(
|
||||||
),
|
height: 8,
|
||||||
Container(
|
),
|
||||||
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12),
|
Container(
|
||||||
decoration: BoxDecoration(
|
padding:
|
||||||
|
const EdgeInsets.symmetric(vertical: 4, horizontal: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(30),
|
borderRadius: BorderRadius.circular(30),
|
||||||
color: ColorPalette.green100
|
color: ColorPalette.green100),
|
||||||
),
|
child: Text(
|
||||||
child: Text(
|
article.type,
|
||||||
article.type,
|
style: TextStyle(
|
||||||
style: TextStyle(
|
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
color: ColorPalette.green500
|
color: ColorPalette.green500),
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
)
|
],
|
||||||
)
|
))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,11 +20,25 @@ class InvestTypeView extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _InvestTypeViewState extends State<InvestTypeView> {
|
class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
|
|
||||||
List<Product> listProduct = [
|
List<Product> listProduct = [
|
||||||
Product(name: 'Gemilang Dana Kas Maxima', type: '', yield: 8.17, priceUnit: 2600.79, funds: 6300000),
|
Product(
|
||||||
Product(name: 'Gemilang Dana Likuid', type: '', yield: 6.42, priceUnit: 1600.79, funds: 2340000),
|
name: 'Gemilang Dana Kas Maxima',
|
||||||
Product(name: 'Gemilang Income Fund', type: '', yield: 8.17, priceUnit: 2600.79, funds: 6300000)
|
type: '',
|
||||||
|
yield: 8.17,
|
||||||
|
priceUnit: 2600.79,
|
||||||
|
funds: 6300000),
|
||||||
|
Product(
|
||||||
|
name: 'Gemilang Dana Likuid',
|
||||||
|
type: '',
|
||||||
|
yield: 6.42,
|
||||||
|
priceUnit: 1600.79,
|
||||||
|
funds: 2340000),
|
||||||
|
Product(
|
||||||
|
name: 'Gemilang Income Fund',
|
||||||
|
type: '',
|
||||||
|
yield: 8.17,
|
||||||
|
priceUnit: 2600.79,
|
||||||
|
funds: 6300000)
|
||||||
];
|
];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -36,76 +50,80 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
return e;
|
return e;
|
||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ChangeNotifierProvider<ProductViewModel>(
|
return ChangeNotifierProvider<ProductViewModel>(
|
||||||
create: (context) => ProductViewModel(),
|
create: (context) => ProductViewModel(),
|
||||||
child: Consumer<ProductViewModel>(
|
child: Consumer<ProductViewModel>(builder: (context, provider, child) {
|
||||||
builder: (context, provider, child) {
|
return Scaffold(
|
||||||
return Scaffold(
|
body: SizedBox(
|
||||||
body: SizedBox(
|
width: SizeConfig.width,
|
||||||
width: SizeConfig.width,
|
height: SizeConfig.height,
|
||||||
height: SizeConfig.height,
|
child: Stack(
|
||||||
child: Stack(
|
children: [
|
||||||
children: [
|
const ImageView(image: PathAssets.imgDashboardAccount),
|
||||||
const ImageView(image: PathAssets.imgDashboardAccount),
|
Column(
|
||||||
Column(
|
children: [
|
||||||
children: [
|
SizedBox(
|
||||||
const SizedBox(
|
height: SizeConfig.height * .1,
|
||||||
height: 50,
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 24),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
const BackButtonView(),
|
||||||
|
TextTitle(title: widget.title, color: Colors.white),
|
||||||
|
SizedBox(
|
||||||
|
width: SizeConfig.width * 0.1,
|
||||||
|
)
|
||||||
|
],
|
||||||
),
|
),
|
||||||
Padding(
|
),
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24),
|
const SizedBox(
|
||||||
child: Row(
|
height: 24,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
),
|
||||||
children: [
|
Expanded(
|
||||||
const BackButtonView(),
|
child: Container(
|
||||||
TextTitle(title: widget.title, color: Colors.white),
|
|
||||||
SizedBox(
|
|
||||||
width: SizeConfig.width * 0.1,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
height: 24,
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.all(24),
|
padding: const EdgeInsets.all(24),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
color: Colors.white
|
color: Colors.white),
|
||||||
),
|
child: SingleChildScrollView(
|
||||||
child: Column(
|
scrollDirection: Axis.vertical,
|
||||||
children: [
|
child: Column(
|
||||||
filters(),
|
children: [
|
||||||
ListView(
|
filters(),
|
||||||
shrinkWrap: true,
|
ListView(
|
||||||
children: listProduct.asMap().entries.map((e) {
|
shrinkWrap: true,
|
||||||
return GestureDetector(
|
children: listProduct.asMap().entries.map((e) {
|
||||||
onTap: () {
|
return GestureDetector(
|
||||||
provider.setSelectedProduct(e.value);
|
onTap: () {
|
||||||
routePush(context, page: ProductView(widget.title));
|
provider.setSelectedProduct(e.value);
|
||||||
},
|
routePush(context,
|
||||||
child: Padding(
|
page: ProductView(widget.title));
|
||||||
padding: EdgeInsets.only(top: e.key != 0 ? 24 : 0),
|
},
|
||||||
child: cardProduct(e.value),
|
child: Padding(
|
||||||
),
|
padding: EdgeInsets.only(
|
||||||
);
|
top: e.key != 0 ? 24 : 0),
|
||||||
}).toList(),
|
child: cardProduct(e.value),
|
||||||
)
|
),
|
||||||
],
|
);
|
||||||
|
}).toList(),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
)
|
],
|
||||||
],
|
)
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
}
|
);
|
||||||
),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,9 +133,25 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
segmentFilter(const Icon(Icons.filter_alt_outlined, color: ColorPalette.slate400,), 'Filter', () { }),
|
segmentFilter(
|
||||||
segmentFilter(const RotatedBox(quarterTurns: 1, child: Icon(Icons.compare_arrows, color: ColorPalette.slate400)), 'Sort', () { }),
|
const Icon(
|
||||||
segmentFilter(const Icon(Icons.dashboard_outlined, color: ColorPalette.slate400), 'Compare', () { }),
|
Icons.filter_alt_outlined,
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
),
|
||||||
|
'Filter',
|
||||||
|
() {}),
|
||||||
|
segmentFilter(
|
||||||
|
const RotatedBox(
|
||||||
|
quarterTurns: 1,
|
||||||
|
child:
|
||||||
|
Icon(Icons.compare_arrows, color: ColorPalette.slate400)),
|
||||||
|
'Sort',
|
||||||
|
() {}),
|
||||||
|
segmentFilter(
|
||||||
|
const Icon(Icons.dashboard_outlined,
|
||||||
|
color: ColorPalette.slate400),
|
||||||
|
'Compare',
|
||||||
|
() {}),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -126,12 +160,11 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
Widget segmentFilter(Widget leading, String text, void Function()? onTap) {
|
Widget segmentFilter(Widget leading, String text, void Function()? onTap) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border.all(color: ColorPalette.slate200),
|
border: Border.all(color: ColorPalette.slate200),
|
||||||
borderRadius: BorderRadius.circular(56)
|
borderRadius: BorderRadius.circular(56)),
|
||||||
),
|
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
leading,
|
leading,
|
||||||
|
@ -142,9 +175,7 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
text,
|
text,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: ColorPalette.slate500,
|
color: ColorPalette.slate500, fontWeight: FontWeight.w700),
|
||||||
fontWeight: FontWeight.w700
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -163,7 +194,10 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
ImageView(image: PathAssets.imgProduct, width: SizeConfig.width * .12,),
|
ImageView(
|
||||||
|
image: PathAssets.imgProduct,
|
||||||
|
width: SizeConfig.width * .12,
|
||||||
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 8,
|
width: 8,
|
||||||
),
|
),
|
||||||
|
@ -171,9 +205,7 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
child: Text(
|
child: Text(
|
||||||
product.name ?? '',
|
product.name ?? '',
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold, fontSize: 18),
|
||||||
fontSize: 18
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
@ -187,36 +219,53 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
children: [
|
children: [
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Yield', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),),
|
const Text(
|
||||||
|
'Yield',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600),
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'${product.yield.toString()}%',
|
'${product.yield.toString()}%',
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: ColorPalette.green400,
|
color: ColorPalette.green400,
|
||||||
fontWeight: FontWeight.w600
|
fontWeight: FontWeight.w600),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const Text('/'),
|
const Text('/'),
|
||||||
const Text('3year', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),)
|
const Text(
|
||||||
|
'3year',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Price/unit', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),),
|
const Text(
|
||||||
|
'Price/unit',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600),
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.trending_up_outlined, size: 18, color: ColorPalette.green400,),
|
const Icon(
|
||||||
|
Icons.trending_up_outlined,
|
||||||
|
size: 18,
|
||||||
|
color: ColorPalette.green400,
|
||||||
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 2,
|
width: 2,
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
NumberFormatter.numberCurrency(product.priceUnit, 'Rp', 'id_ID'),
|
NumberFormatter.numberCurrency(
|
||||||
style: const TextStyle(
|
product.priceUnit, 'Rp', 'id_ID'),
|
||||||
fontWeight: FontWeight.w600
|
style: const TextStyle(fontWeight: FontWeight.w600),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -224,14 +273,18 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
),
|
),
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Managed funds', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),),
|
const Text(
|
||||||
|
'Managed funds',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorPalette.slate400,
|
||||||
|
fontWeight: FontWeight.w600),
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
NumberFormatter.compactCurrency(product.funds, 'Rp ', 'id_ID'),
|
NumberFormatter.compactCurrency(
|
||||||
style: const TextStyle(
|
product.funds, 'Rp ', 'id_ID'),
|
||||||
fontWeight: FontWeight.w600
|
style: const TextStyle(fontWeight: FontWeight.w600),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -243,5 +296,4 @@ class _InvestTypeViewState extends State<InvestTypeView> {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:cims_apps/application/assets/path_assets.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/component/image/image_view.dart';
|
||||||
import 'package:cims_apps/application/theme/color_palette.dart';
|
import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
|
@ -70,7 +68,7 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
),
|
),
|
||||||
const Center(
|
const Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
'Portofolio',
|
'Portfolio',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
|
@ -125,20 +123,22 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
),
|
),
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Total Mutual Fund',
|
const Text(
|
||||||
|
'Total Mutual Fund',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
color: ColorPalette.slate400
|
color: ColorPalette.slate400),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Text(listInvestmentType.map((e) => e.mutualFunds).reduce((value, element) => value + element).toString(),
|
Text(
|
||||||
style: const TextStyle(
|
listInvestmentType
|
||||||
fontSize: 44,
|
.map((e) => e.mutualFunds)
|
||||||
fontWeight: FontWeight.w700
|
.reduce(
|
||||||
)
|
(value, element) => value + element)
|
||||||
)
|
.toString(),
|
||||||
,
|
style: const TextStyle(
|
||||||
|
fontSize: 44,
|
||||||
|
fontWeight: FontWeight.w700)),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
|
@ -168,7 +168,7 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Text('Portofolio Value',
|
const Text('Portfolio Value',
|
||||||
style: TextStyle(color: Colors.white)),
|
style: TextStyle(color: Colors.white)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 8,
|
width: 8,
|
||||||
|
@ -179,8 +179,11 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
seePortofolioValue = !seePortofolioValue;
|
seePortofolioValue = !seePortofolioValue;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
child: const Icon(Icons.visibility_outlined,
|
child: Icon(
|
||||||
color: Color(0xff93C5FD)))
|
seePortofolioValue
|
||||||
|
? Icons.visibility_off_outlined
|
||||||
|
: Icons.visibility_outlined,
|
||||||
|
color: const Color(0xff93C5FD)))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
|
@ -197,7 +200,10 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
firstChild: RichText(
|
firstChild: RichText(
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
text: 'Rp ',
|
text: 'Rp ',
|
||||||
style: TextStyle(fontSize: 32, color: Color(0xff93C5FD), fontFamily: 'Manrope'),
|
style: TextStyle(
|
||||||
|
fontSize: 32,
|
||||||
|
color: Color(0xff93C5FD),
|
||||||
|
fontFamily: 'Manrope'),
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: '22.500.000',
|
text: '22.500.000',
|
||||||
|
@ -205,8 +211,7 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
fontSize: 32,
|
fontSize: 32,
|
||||||
fontFamily: 'Manrope',
|
fontFamily: 'Manrope',
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
color: Colors.white
|
color: Colors.white),
|
||||||
),
|
|
||||||
)
|
)
|
||||||
])),
|
])),
|
||||||
secondChild: Padding(
|
secondChild: Padding(
|
||||||
|
@ -276,8 +281,8 @@ class _PortofolioViewState extends State<PortofolioView> {
|
||||||
width: 58,
|
width: 58,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
color: bgContentColor[e.key],
|
color: bgContentColor[e.key],
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
'${e.value.value}%',
|
'${e.value.value}%',
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
class LoginGmailModel {
|
||||||
|
String idToken;
|
||||||
|
String accessToken;
|
||||||
|
|
||||||
|
LoginGmailModel({
|
||||||
|
required this.idToken,
|
||||||
|
required this.accessToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, String> toJson() => {
|
||||||
|
"idToken": idToken,
|
||||||
|
"accessToken": accessToken,
|
||||||
|
};
|
||||||
|
}
|
|
@ -5,9 +5,10 @@ import 'package:cims_apps/application/theme/color_palette.dart';
|
||||||
import 'package:cims_apps/core/route/route.dart';
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
import 'package:cims_apps/core/utils/size_config.dart';
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
import 'package:cims_apps/features/auth/login/view/login_view.dart';
|
import 'package:cims_apps/features/auth/login/view/login_view.dart';
|
||||||
import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart';
|
|
||||||
import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
|
import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
|
||||||
|
import 'package:cims_apps/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class DashboardPublicView extends StatelessWidget {
|
class DashboardPublicView extends StatelessWidget {
|
||||||
static const routeName = '/DashboardPublicView';
|
static const routeName = '/DashboardPublicView';
|
||||||
|
@ -37,88 +38,96 @@ class DashboardPublicView extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return ChangeNotifierProvider(
|
||||||
body: SingleChildScrollView(
|
create: (context) => DashboardPublicViewModel(),
|
||||||
padding: const EdgeInsets.only(
|
builder: (context, child) {
|
||||||
top: 32.0,
|
return Scaffold(
|
||||||
bottom: 8.0,
|
body: SingleChildScrollView(
|
||||||
left: 24.0,
|
padding: const EdgeInsets.only(
|
||||||
right: 24.0,
|
top: 32.0,
|
||||||
),
|
bottom: 8.0,
|
||||||
child: Column(
|
left: 24.0,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
right: 24.0,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
ImageView(
|
|
||||||
image: PathAssets.icon1,
|
|
||||||
width: SizeConfig.width * .35,
|
|
||||||
),
|
|
||||||
Align(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
heightFactor: 1,
|
|
||||||
child: _caption()),
|
|
||||||
Align(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: ImageView(
|
|
||||||
image: PathAssets.imgDashboard,
|
|
||||||
width: SizeConfig.width * .7,
|
|
||||||
),
|
),
|
||||||
|
child: Consumer<DashboardPublicViewModel>(
|
||||||
|
builder: (context, provider, child) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ImageView(
|
||||||
|
image: PathAssets.icon1,
|
||||||
|
width: SizeConfig.width * .35,
|
||||||
|
),
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
heightFactor: 1,
|
||||||
|
child: _caption()),
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: ImageView(
|
||||||
|
image: PathAssets.imgDashboard,
|
||||||
|
width: SizeConfig.width * .7,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ButtonView(
|
||||||
|
name: 'Sign in',
|
||||||
|
isOutlined: true,
|
||||||
|
width: SizeConfig.width * .43,
|
||||||
|
height: SizeConfig.height * .06,
|
||||||
|
onPressed: () {
|
||||||
|
routePush(context, page: const LoginView());
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ButtonView(
|
||||||
|
name: 'Sign Up',
|
||||||
|
width: SizeConfig.width * .43,
|
||||||
|
height: SizeConfig.height * .06,
|
||||||
|
onPressed: () {
|
||||||
|
routePush(context, page: const RegistrationView());
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const ImageView(image: PathAssets.iconConnect),
|
||||||
|
ButtonView(
|
||||||
|
name: 'Google',
|
||||||
|
isSecondaryColor: true,
|
||||||
|
isOutlined: true,
|
||||||
|
prefixIcon: const ImageView(
|
||||||
|
image: PathAssets.iconGoogle,
|
||||||
|
width: 26,
|
||||||
|
),
|
||||||
|
onPressed: () {
|
||||||
|
provider.loginGoogle(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SizedBox(height: SizeConfig.height * .15),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
ImageView(
|
||||||
|
image: PathAssets.iconOjk,
|
||||||
|
width: SizeConfig.width * .20,
|
||||||
|
),
|
||||||
|
ImageView(
|
||||||
|
image: PathAssets.iconInklusi,
|
||||||
|
width: SizeConfig.width * .20,
|
||||||
|
),
|
||||||
|
ImageView(
|
||||||
|
image: PathAssets.iconReksadana,
|
||||||
|
width: SizeConfig.width * .20,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
Row(
|
);
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
});
|
||||||
children: [
|
|
||||||
ButtonView(
|
|
||||||
name: 'Sign in',
|
|
||||||
isOutlined: true,
|
|
||||||
width: SizeConfig.width * .43,
|
|
||||||
height: SizeConfig.height * .06,
|
|
||||||
onPressed: () {
|
|
||||||
routePush(context, page: const LoginView());
|
|
||||||
},
|
|
||||||
),
|
|
||||||
ButtonView(
|
|
||||||
name: 'Sign Up',
|
|
||||||
width: SizeConfig.width * .43,
|
|
||||||
height: SizeConfig.height * .06,
|
|
||||||
onPressed: () {
|
|
||||||
routePush(context, page: const RegistrationView());
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const ImageView(image: PathAssets.iconConnect),
|
|
||||||
ButtonView(
|
|
||||||
name: 'Google',
|
|
||||||
isSecondaryColor: true,
|
|
||||||
isOutlined: true,
|
|
||||||
prefixIcon: const ImageView(
|
|
||||||
image: PathAssets.iconGoogle,
|
|
||||||
width: 26,
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
routePush(context, page: const InitialRegistrationStep());
|
|
||||||
},
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
ImageView(
|
|
||||||
image: PathAssets.iconOjk,
|
|
||||||
width: SizeConfig.width * .20,
|
|
||||||
),
|
|
||||||
ImageView(
|
|
||||||
image: PathAssets.iconInklusi,
|
|
||||||
width: SizeConfig.width * .20,
|
|
||||||
),
|
|
||||||
ImageView(
|
|
||||||
image: PathAssets.iconReksadana,
|
|
||||||
width: SizeConfig.width * .20,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import 'package:cims_apps/core/route/route.dart';
|
||||||
|
import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart';
|
||||||
|
import 'package:cims_apps/features/dashboard/dashboard_public/model/login_gmail_model.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:google_sign_in/google_sign_in.dart';
|
||||||
|
|
||||||
|
class DashboardPublicViewModel extends ChangeNotifier {
|
||||||
|
String emailGoogle = '';
|
||||||
|
final GoogleSignIn googleSignIn = GoogleSignIn(
|
||||||
|
scopes: [
|
||||||
|
'email',
|
||||||
|
'https://www.googleapis.com/auth/contacts.readonly',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
Future<LoginGmailModel?> _getGmail() async {
|
||||||
|
LoginGmailModel? loginGmailModel;
|
||||||
|
try {
|
||||||
|
final signInResult = await googleSignIn.signIn();
|
||||||
|
if (signInResult != null) {
|
||||||
|
emailGoogle = signInResult.email;
|
||||||
|
final signInAuth = await signInResult.authentication;
|
||||||
|
final accessToken = signInAuth.accessToken;
|
||||||
|
final idToken = signInAuth.idToken;
|
||||||
|
if (idToken != null && accessToken != null) {
|
||||||
|
loginGmailModel = LoginGmailModel(
|
||||||
|
accessToken: accessToken,
|
||||||
|
idToken: idToken,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('catch error $e');
|
||||||
|
}
|
||||||
|
return loginGmailModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> loginGoogle(BuildContext context) async {
|
||||||
|
bool loginSuccess = false;
|
||||||
|
loginSuccess = await _getGmail().then((payload) async {
|
||||||
|
bool result = false;
|
||||||
|
if (payload != null) {
|
||||||
|
debugPrint('objectzz ${payload.toJson()}');
|
||||||
|
routePush(context, page: InitialRegistrationStep());
|
||||||
|
googleSignIn.disconnect();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
return loginSuccess;
|
||||||
|
}
|
||||||
|
}
|
14
lib/features/profile/view/profile_view.dart
Normal file
14
lib/features/profile/view/profile_view.dart
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart';
|
||||||
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ProfileView extends StatelessWidget {
|
||||||
|
const ProfileView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: CustomAppBar(height: SizeConfig.height * .1, title: 'Profile'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
15
lib/features/transaction/view/transaction_view.dart
Normal file
15
lib/features/transaction/view/transaction_view.dart
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart';
|
||||||
|
import 'package:cims_apps/core/utils/size_config.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class TransactionView extends StatelessWidget {
|
||||||
|
const TransactionView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar:
|
||||||
|
CustomAppBar(height: SizeConfig.height * .1, title: 'Transaction'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
56
pubspec.lock
56
pubspec.lock
|
@ -264,6 +264,54 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
google_identity_services_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: google_identity_services_web
|
||||||
|
sha256: "0c56c2c5d60d6dfaf9725f5ad4699f04749fb196ee5a70487a46ef184837ccf6"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.0+2"
|
||||||
|
google_sign_in:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: google_sign_in
|
||||||
|
sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.2.1"
|
||||||
|
google_sign_in_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: google_sign_in_android
|
||||||
|
sha256: bfd42c81c30c6faba16e0f62968d5505a87504aaa672b3155ee931461abb0a49
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.1.21"
|
||||||
|
google_sign_in_ios:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: google_sign_in_ios
|
||||||
|
sha256: f3336d9e44d4d28063ac90271f6db5caf99f0480cb07281330e7a432edb95226
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "5.7.3"
|
||||||
|
google_sign_in_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: google_sign_in_platform_interface
|
||||||
|
sha256: "1f6e5787d7a120cc0359ddf315c92309069171306242e181c09472d1b00a2971"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.5"
|
||||||
|
google_sign_in_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: google_sign_in_web
|
||||||
|
sha256: a278ea2d01013faf341cbb093da880d0f2a552bbd1cb6ee90b5bebac9ba69d77
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.12.3+2"
|
||||||
group_button:
|
group_button:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -633,18 +681,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: syncfusion_flutter_core
|
name: syncfusion_flutter_core
|
||||||
sha256: "4eed0d3ae50c16b5e8e4957f3c1917e9bd0315a08dfb49a104ca8fc10244bef3"
|
sha256: "9f98e2726af42967497eaef68f3373261700bbfcd33bd97da4ec85cb56fcdaf7"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "24.2.6"
|
version: "24.2.7"
|
||||||
syncfusion_flutter_signaturepad:
|
syncfusion_flutter_signaturepad:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: syncfusion_flutter_signaturepad
|
name: syncfusion_flutter_signaturepad
|
||||||
sha256: da55bd7d796f2c9b4707f3e063e443f67c355c6098002e446bbf43672952916e
|
sha256: d51d5e346c70b938a8e1f2318a073213172aea7b99e33073c379657b1066c001
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "24.2.6"
|
version: "24.2.7"
|
||||||
synchronized:
|
synchronized:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -52,6 +52,7 @@ dependencies:
|
||||||
dotted_border: ^2.1.0
|
dotted_border: ^2.1.0
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user