feat: flow subscribe product

This commit is contained in:
2024-02-19 19:58:29 +07:00
parent 0762a8ab0c
commit 99db140a0c
31 changed files with 1170 additions and 372 deletions

View File

@@ -1,6 +1,7 @@
import 'package:cims_apps/application/component/button/button_view.dart';
import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart';
import 'package:cims_apps/application/component/goal_investing_view.dart';
import 'package:cims_apps/application/component/subscribe/goal_investing_view.dart';
import 'package:cims_apps/application/component/subscribe/input_investment_view.dart';
import 'package:cims_apps/application/component/numeric_pad/numeric_pad.dart';
import 'package:cims_apps/application/component/risk_profile.dart';
import 'package:cims_apps/application/component/text_form/text_form_view.dart';
@@ -22,6 +23,13 @@ class PlanView extends StatefulWidget {
class _PlanViewState extends State<PlanView> {
TextEditingController inputController = TextEditingController();
@override
void initState() {
// TODO: implement initState
inputController.text = 'Rp 0';
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
@@ -103,101 +111,13 @@ class _PlanViewState extends State<PlanView> {
),
),
Divider(color: ColorPalette.slate200, height: 1),
Padding(
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(text,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
),
),
Row(
children: [
Icon(Icons.change_circle_outlined, color: ColorPalette.primary, size: 20),
SizedBox(width: 4),
Text('Change',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: ColorPalette.primary
),
)
],
)
],
),
TextField(
controller: inputController,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 28,
fontWeight: FontWeight.w600,
color: ColorPalette.slate800
),
keyboardType: TextInputType.number,
onChanged: (value) {
value = value.replaceAll('Rp ', '').replaceAll('.', '');
double parseValue = double.parse(value);
if(value.isNotEmpty){
inputController.text = NumberFormatter.numberCurrency(parseValue, 'Rp ', 'id_ID', decimalDigits: 0);
}else{
inputController.text = NumberFormatter.numberCurrency(0, 'Rp ', 'id_ID', decimalDigits: 0);
}
},
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: ColorPalette.primary,
width: 2
),
)
),
),
SizedBox(height: 12),
Text('Minimum Budget Rp1,000,000',
style: TextStyle(
color: ColorPalette.slate400,
fontSize: 16,
fontWeight: FontWeight.w600
),
),
SizedBox(height: 16),
NumericPad(onNumberSelected: (p0) {
String checkIsZeroInput = inputController.text.replaceAll('Rp ', '').replaceAll(',', '');
String getNumeric = p0;
if(p0.isNotEmpty){
if(checkIsZeroInput != '0'){
getNumeric = checkIsZeroInput + getNumeric;
}
}else{
getNumeric = checkIsZeroInput.substring(0, checkIsZeroInput.length - 1);
}
String formatNumeric = NumberFormatter.numberCurrency(
double.parse(getNumeric), 'Rp ', 'id_ID', decimalDigits: 0).replaceAll('.', ',');
inputController.text = formatNumeric;
}),
SizedBox(height: 8),
ButtonView(
name: 'Next',
onPressed: () {
Navigator.pop(context);
int formatIntParse = int.parse(inputController.text.replaceAll('Rp ', '').replaceAll(',', ''));
showModalBottomSheet(context: context, builder: (context) => OptionsStartingInvest(totalInvest: formatIntParse));
},
width: SizeConfig.width,
heightWrapContent: true,
contentPadding: EdgeInsets.symmetric(vertical: 16),
marginVertical: 0,
)
],
),
InputInvestmentView(
selectedPlan: text,
nextMove: (value) {
Navigator.pop(context);
int formatIntParse = int.parse(value.replaceAll('Rp ', '').replaceAll(',', ''));
showModalBottomSheet(context: context, builder: (context) => OptionsStartingInvest(totalInvest: formatIntParse));
},
),
],
),

View File

@@ -1,17 +1,12 @@
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/application/component/subscribe/total_payment_view.dart';
import 'package:cims_apps/application/theme/color_palette.dart';
import 'package:cims_apps/core/utils/size_config.dart';
import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view/step_invest_plan/result_total_product.dart';
import 'package:cims_apps/features/dashboard/dashboard_account/view/product/view_model/product_view_model.dart';
import 'package:flutter/material.dart';
class Product {
String name, type;
double totalPercent;
Product(this.name, this.type, this.totalPercent);
}
class ResultOptionsProduct extends StatelessWidget {
final int totalInvest;
const ResultOptionsProduct({super.key, required this.totalInvest});
@@ -19,9 +14,9 @@ class ResultOptionsProduct extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<Product> listProduct = [
Product('Gemilang Dana Kas Maxima', 'Money Market', 0.7),
Product('Gemilang Dana Likuid', 'Bonds', 0.2),
Product('Gemilang Kas 2 Kelas A', 'Shares', 0.1)
Product(name: 'Gemilang Dana Kas Maxima', type: 'Money Market', totalPercent: 0.7),
Product(name: 'Gemilang Dana Likuid', type: 'Bonds', totalPercent: 0.2),
Product(name: 'Gemilang Kas 2 Kelas A', type: 'Shares', totalPercent: 0.1)
];
return Container(
@@ -44,7 +39,7 @@ class ResultOptionsProduct extends StatelessWidget {
color: ColorPalette.slate800
),
),
const Icon(Icons.close_rounded, color: ColorPalette.slate400)
Icon(Icons.close_rounded, color: ColorPalette.slate400)
],
),
const SizedBox(height: 32),
@@ -58,8 +53,8 @@ class ResultOptionsProduct extends StatelessWidget {
color: Colors.white,
border: Border.all(color: ColorPalette.slate200),
borderRadius: BorderRadius.circular(12),
boxShadow: [
const BoxShadow(
boxShadow: const [
BoxShadow(
color: Color(0XFF1E293B0A)
)
]
@@ -76,10 +71,10 @@ class ResultOptionsProduct extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(e.value.name,
Text(e.value.name ?? '',
style: const TextStyle(
fontWeight: FontWeight.w700,
color: ColorPalette.slate800
fontWeight: FontWeight.w700,
color: ColorPalette.slate800,
),
),
const SizedBox(height: 4,),
@@ -90,17 +85,18 @@ class ResultOptionsProduct extends StatelessWidget {
color: ColorPalette.investTypeBgColor[e.value.type],
borderRadius: BorderRadius.circular(40)
),
child: Text(e.value.type,
child: Text(e.value.type ?? '',
style: TextStyle(
color: ColorPalette.investTypeColor[e.value.type],
fontWeight: FontWeight.w600
color: ColorPalette.investTypeColor[e.value.type],
fontWeight: FontWeight.w600,
fontSize: 12
),
),
)
],
),
),
Text('${(e.value.totalPercent * 100).toInt()} %',
Text('${(e.value.totalPercent! * 100).toInt()} %',
style: const TextStyle(
fontWeight: FontWeight.w700,
fontSize: 16,
@@ -135,11 +131,14 @@ class ResultOptionsProduct extends StatelessWidget {
ButtonView(
name: 'Next',
onPressed: () {
Navigator.pop(context);
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) => ResultTotalProduct(listProduct: listProduct, totalInvest: totalInvest)
builder: (context) =>
TotalPaymentView(
listProduct: listProduct,
totalInvest: totalInvest,
)
);
},
width: SizeConfig.width,

View File

@@ -1,221 +0,0 @@
import 'package:cims_apps/application/component/button/button_view.dart';
import 'package:cims_apps/application/theme/color_palette.dart';
import 'package:cims_apps/core/utils/number_formatter.dart';
import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view/step_invest_plan/result_options_product.dart';
import 'package:flutter/material.dart';
class ResultTotalProduct extends StatelessWidget {
final int totalInvest;
final List<Product> listProduct;
const ResultTotalProduct({super.key, required this.listProduct, required this.totalInvest});
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16)
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.all(24.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Your Investment Today',
style: TextStyle(
color: ColorPalette.slate800,
fontWeight: FontWeight.w600,
fontSize: 16
),
),
GestureDetector(
onTap: () => Navigator.pop(context),
child: Icon(Icons.close_rounded)
)
],
),
),
...listProduct.asMap().entries.map((e) {
return Container(
padding: EdgeInsets.only(left: 16, right: 24, bottom: 16, top: 16),
decoration: BoxDecoration(
border: Border(
left: BorderSide(
color: ColorPalette.investTypeColor[e.value.type]!,
width: 8,
)
)
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 5,
child: Text(e.value.name,
style: TextStyle(
color: ColorPalette.slate400,
fontWeight: FontWeight.w600,
fontSize: 16
),
)
),
Expanded(
flex: 7,
child: Text(
NumberFormatter.numberCurrency(totalInvest / e.value.totalPercent, 'Rp ', 'id_ID'),
textAlign: TextAlign.end,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 18,
color: ColorPalette.slate800
),
)
)
],
),
);
}).toList(),
SizedBox(height: 16),
Padding(
padding: const 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
),
)
],
),
),
SizedBox(height: 16,),
Container(
color: ColorPalette.slate200.withOpacity(0.5),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Total',
style: TextStyle(
color: ColorPalette.slate400,
fontWeight: FontWeight.w600,
fontSize: 16
),
),
Text(NumberFormatter.numberCurrency(totalInvest, 'Rp ', 'id_ID'),
textAlign: TextAlign.end,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 18,
color: ColorPalette.slate800
),
)
],
),
),
buttonAgreement(),
Container(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Total Payment',
style: TextStyle(
color: ColorPalette.slate400,
fontWeight: FontWeight.w600,
fontSize: 16
),
),
Text(NumberFormatter.numberCurrency(totalInvest, 'Rp ', 'id_ID'),
textAlign: TextAlign.end,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 18,
color: ColorPalette.slate800
),
)
],
),
),
ButtonView(
disabled: true,
name: 'Subscribe Now',
onPressed: () {
},
disabledBgColor: ColorPalette.slate200.withOpacity(0.5),
textColor: ColorPalette.slate400,
textWeight: FontWeight.w700,
textSize: 20,
backgroundColor: ColorPalette.primary,
)
],
),
);
}
Widget buttonAgreement() {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 24,
width: 24,
child: Radio(
value: false,
groupValue: false,
onChanged: (value) {
},
activeColor: ColorPalette.primary,
),
),
SizedBox(width: 12,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
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: Text('Read More',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
decoration: TextDecoration.underline,
color: ColorPalette.primary
),
)
)
],
)
)
],
),
);
}
}

View File

@@ -1,11 +1,6 @@
import 'package:cims_apps/features/dashboard/dashboard_account/view/product/view_model/product_view_model.dart';
import 'package:flutter/material.dart';
class PlanViewModel extends ChangeNotifier {
bool isAgreement = false;
void setAgreement() {
isAgreement = !isAgreement;
notifyListeners();
}
List<Product> listProduct = [];
}