Merge pull request #70 from WDI-Ideas/jayeshjain25

Jayeshjain25
This commit is contained in:
Jayesh jain
2024-06-20 17:27:11 +05:30
committed by GitHub
13 changed files with 391 additions and 202 deletions

View File

@@ -0,0 +1,27 @@
import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'invest_payment_event.dart';
import 'invest_payment_state.dart';
class InvestPaymentBloc extends Bloc<InvestPaymentEvent, InvestPaymentState> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
TextEditingController amountController = TextEditingController();
GlobalKey<FormState> getFormKey() {
return formKey;
}
InvestPaymentBloc() : super(const InvestPaymentState(isFormValid: false)) {
on<FormTextChanged>((event, emit) {
emit(state.copyWith(isFormValid: event.text.isNotEmpty));
});
}
@override
Future<void> close() {
amountController.dispose();
return super.close();
}
}

View File

@@ -0,0 +1,17 @@
import 'package:equatable/equatable.dart';
abstract class InvestPaymentEvent extends Equatable {
const InvestPaymentEvent();
@override
List<Object> get props => [];
}
class FormTextChanged extends InvestPaymentEvent {
final String text;
const FormTextChanged({required this.text});
@override
List<Object> get props => [text];
}

View File

@@ -0,0 +1,16 @@
import 'package:equatable/equatable.dart';
class InvestPaymentState extends Equatable {
final bool isFormValid;
const InvestPaymentState({required this.isFormValid});
InvestPaymentState copyWith({bool? isFormValid}) {
return InvestPaymentState(
isFormValid: isFormValid ?? this.isFormValid,
);
}
@override
List<Object> get props => [isFormValid];
}

View File

@@ -11,6 +11,10 @@ class InvestPaymentLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
// bottomNavigationBar: const Padding(
// padding: EdgeInsets.all(8.0),
// child: InvestPayBottomSection(),
// ),
backgroundColor: AppColor.plainWhite,
body: ListView(
children: const [

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_bloc.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
@@ -27,7 +29,15 @@ class InvestPaymentScreen extends StatelessWidget {
),
),
),
body: InvestPaymentLayout(),
body: MultiBlocProvider(
providers: [
BlocProvider(
// Create an instance of the OnboardingBloc
create: (context) => InvestPaymentBloc(),
),
],
child: const InvestPaymentLayout(),
),
);
}
}

View File

@@ -15,6 +15,7 @@ class KeyInvestmentSection extends StatelessWidget {
Widget build(BuildContext context) {
return Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 5),
decoration: BoxDecoration(
color: AppColor.documentCardBgColor,
borderRadius: const BorderRadius.all(Radius.circular(20.0)),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/routes/route_name.dart';
@@ -7,6 +8,8 @@ import '../../../../../../core/routes/routes.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../../../core/styles/app_text.dart';
import '../../../../../../shared/components/button_widget.dart';
import '../../bloc/payment/invest_payment_bloc.dart';
import '../../bloc/payment/invest_payment_state.dart';
class InvestPayBottomSection extends StatelessWidget {
const InvestPayBottomSection({super.key});
@@ -16,19 +19,29 @@ class InvestPayBottomSection extends StatelessWidget {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
function: () {
goRouter.pushNamed(RouteName.confirmInvestScreen);
},
text: AppText.nextText,
clr: AppColor.primaryColor2),
BlocBuilder<InvestPaymentBloc, InvestPaymentState>(
builder: (context, state) {
return Container(
margin: const EdgeInsets.symmetric(
horizontal: 16,
),
width: 1.sw,
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: state.isFormValid
? AppColor.plainWhite
: AppColor.inactiveBtnTxtColor,
function: () {
if (state.isFormValid) {
goRouter.pushNamed(RouteName.confirmInvestScreen);
}
},
text: AppText.nextText,
clr: state.isFormValid
? AppColor.primaryColor2
: AppColor.inactiveBtnColor),
);
},
),
const Gap(5),
ButtonWidget().textBorderBtn(

View File

@@ -92,46 +92,36 @@ class InvestPayMethodSection extends StatelessWidget {
clr: AppColor.textLabelColor),
],
),
Container(
decoration: const BoxDecoration(
border: Border(
bottom: BorderSide(
width: 1,
color: Colors.grey,
Row(
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balanceText}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.0,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: 'SAR 178,000',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.0,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
child: Row(
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balanceText}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.0,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: 'SAR 178,000',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.0,
fontWeight: FontWeight.bold,
),
),
],
),
),
const Icon(
Icons.arrow_forward,
color: Colors.grey,
size: 15,
)
],
),
const Icon(
Icons.arrow_forward,
color: Colors.grey,
size: 15,
)
],
),
],
),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
@@ -7,13 +8,16 @@ import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../shared/components/text_from_field_widget.dart';
import '../../bloc/payment/invest_payment_bloc.dart';
import '../../bloc/payment/invest_payment_event.dart';
class InvestPayTopSection extends StatelessWidget {
const InvestPayTopSection({super.key});
@override
Widget build(BuildContext context) {
TextEditingController amountController = TextEditingController();
final investPaymentBloc = context.read<InvestPaymentBloc>();
return Padding(
padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0.0),
child: Column(
@@ -92,24 +96,37 @@ class InvestPayTopSection extends StatelessWidget {
),
const Gap(12),
Expanded(
child: Column(
children: [
textFormField(
txtAlign: TextAlign.center,
readonly: false,
validator: (value) {
if (amountController.text.isEmpty) {
return AppText
.pleaseEnterAmountText;
}
return null;
},
texttype: TextInputType.number,
textEditingController: amountController,
hintText: AppText.enterAmountText,
suffixIcon: const SizedBox(),
),
],
child: Form(
child: Column(
children: [
textFormField(
txtAlign: TextAlign.center,
readonly: false,
validator: (value) {
if (investPaymentBloc
.amountController
.text
.isEmpty) {
return AppText
.pleaseEnterAmountText;
}
return null;
},
onInput: (value) {
context
.read<InvestPaymentBloc>()
.add(FormTextChanged(
text: value));
},
texttype: TextInputType.number,
textEditingController:
investPaymentBloc
.amountController,
hintText: AppText.enterAmountText,
suffixIcon: const SizedBox(),
),
],
),
),
),
],

View File

@@ -2,17 +2,14 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/routes/route_name.dart';
import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/features/countrySelection/presentation/bloc/choose_country_bloc.dart';
import 'package:tanami_app/features/countrySelection/presentation/bloc/choose_country_event.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../widgets/deposit_pay_method_section.dart';
class DepositScreen extends StatefulWidget {
const DepositScreen({super.key});
@@ -273,131 +270,7 @@ class _DepositScreenState extends State<DepositScreen> {
),
),
const Gap(30),
TextWidget().text15W700(AppText.choosePaymentMethodText,
clr: AppColor.plainBlack),
const Gap(16),
GestureDetector(
onTap: () {
radioBloc.add(const RadioSelected(0));
},
child: Container(
padding: const EdgeInsets.all(12),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
side: const BorderSide(color: Color(0xFFD8D8D8)),
borderRadius: BorderRadius.circular(22),
),
shadows: const [
BoxShadow(
color: Color(0x14000000),
blurRadius: 8,
offset: Offset(-2, -2),
spreadRadius: 0.50,
),
BoxShadow(
color: Color(0x3391978E),
blurRadius: 8,
offset: Offset(2, 2),
spreadRadius: 1,
)
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Radio<int>(
activeColor: AppColor.radioActiveColor,
value: 0,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
SvgPicture.asset(AppImages.walletIcon),
const Gap(5),
TextWidget().text14W700(AppText.bankTransfer,
clr: AppColor.textLabelColor),
],
),
TextWidget().text14W500(
"Directly transfer funds from your bank account into your Tanami wallet.",
clr: AppColor.textLabelColor,
txtAlign: TextAlign.left,
),
const Gap(12),
],
),
),
),
const Gap(12),
GestureDetector(
onTap: () {
radioBloc.add(const RadioSelected(1));
},
child: Container(
padding: const EdgeInsets.all(12),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
side: const BorderSide(color: Color(0xFFD8D8D8)),
borderRadius: BorderRadius.circular(22),
),
shadows: const [
BoxShadow(
color: Color(0x14000000),
blurRadius: 8,
offset: Offset(-2, -2),
spreadRadius: 0.2,
),
BoxShadow(
color: Color(0x3391978E),
blurRadius: 8,
offset: Offset(2, 2),
spreadRadius: 1,
)
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Radio<int>(
activeColor: AppColor.radioActiveColor,
value: 1,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
SvgPicture.asset(AppImages.applePayIcon),
const Gap(5),
TextWidget().text14W700(AppText.applePayText,
clr: AppColor.textLabelColor),
],
),
],
),
TextWidget().text14W500(
AppText.instantTransferFundsApplePayText,
clr: AppColor.textLabelColor,
txtAlign: TextAlign.left,
),
const Gap(12),
],
),
),
),
const DepositPayMethodSection(),
const Gap(16),
],
),

View File

@@ -0,0 +1,217 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../../../../../core/styles/app_color.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_bloc.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_event.dart';
import '../../../../countrySelection/presentation/bloc/choose_country_state.dart';
class DepositPayMethodSection extends StatelessWidget {
const DepositPayMethodSection({super.key});
@override
Widget build(BuildContext context) {
final radioBloc = context.read<RadioBloc>();
return BlocBuilder<RadioBloc, RadioState>(
builder: (context, state) {
int selectedIndex = 0;
if (state is RadioSelectionChanged) {
selectedIndex = state.selectedIndex;
}
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
TextWidget().text15W700(AppText.choosePaymentMethodText,
clr: AppColor.plainBlack),
const Gap(16),
GestureDetector(
onTap: () {
radioBloc.add(const RadioSelected(0));
},
child: Container(
clipBehavior: Clip.antiAlias,
// padding: const EdgeInsets.all(12),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
side: const BorderSide(color: Color(0xFFD8D8D8)),
borderRadius: BorderRadius.circular(22),
),
shadows: const [
BoxShadow(
color: Color(0x14000000),
blurRadius: 8,
offset: Offset(-2, -2),
spreadRadius: 0.50,
),
BoxShadow(
color: Color(0x3391978E),
blurRadius: 8,
offset: Offset(2, 2),
spreadRadius: 1,
)
],
),
child: Column(
children: [
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: selectedIndex == 0
? const Color(0xFFE4F5E9)
: const Color(0xCCE2E2E2),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Radio<int>(
activeColor: AppColor.radioActiveColor,
value: 0,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
const Gap(5),
SvgPicture.asset(AppImages.walletIcon),
const Gap(5),
TextWidget().text14W700(AppText.walletText,
clr: AppColor.textLabelColor),
],
),
Row(
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: '${AppText.balanceText}: ',
style: GoogleFonts.dmSans(
color: Colors.grey,
fontSize: 12.0,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: 'SAR 178,000',
style: GoogleFonts.dmSans(
color: Colors.black,
fontSize: 14.0,
fontWeight: FontWeight.bold,
),
),
],
),
),
// const Icon(
// Icons.arrow_forward,
// color: Colors.grey,
// size: 15,
// )
],
),
],
),
),
Padding(
padding: const EdgeInsets.all(12),
child: TextWidget().text14W500(
"condimentum ac, vestibulum eu nisl.torquent per conubia nostra, per inceptos himenaeos.",
clr: AppColor.textLabelColor,
txtAlign: TextAlign.start,
),
),
const Gap(12),
],
),
),
),
const Gap(12),
GestureDetector(
onTap: () {
radioBloc.add(const RadioSelected(1));
},
child: Container(
clipBehavior: Clip.antiAlias,
// padding: const EdgeInsets.all(12),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
side: const BorderSide(color: Color(0xFFD8D8D8)),
borderRadius: BorderRadius.circular(22),
),
shadows: const [
BoxShadow(
color: Color(0x14000000),
blurRadius: 8,
offset: Offset(-2, -2),
spreadRadius: 0.2,
),
BoxShadow(
color: Color(0x3391978E),
blurRadius: 8,
offset: Offset(2, 2),
spreadRadius: 1,
)
],
),
child: Column(
children: [
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: selectedIndex == 1
? const Color(0xFFE4F5E9)
: const Color(0xCCE2E2E2),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Radio<int>(
activeColor: AppColor.radioActiveColor,
value: 1,
groupValue: selectedIndex,
onChanged: (int? value) {
if (value != null) {
radioBloc.add(RadioSelected(value));
}
},
),
const Gap(5),
SvgPicture.asset(AppImages.applePayIcon),
const Gap(5),
TextWidget().text14W700(AppText.applePayText,
clr: AppColor.textLabelColor),
],
),
],
),
),
Padding(
padding: const EdgeInsets.all(12.0),
child: TextWidget().text14W500(
AppText.instantTransferFundsApplePayText,
clr: AppColor.textLabelColor),
),
const Gap(12),
],
),
),
),
// const Gap(16),
]);
},
);
}
}

View File

@@ -25,9 +25,11 @@ class OtpFillSection extends StatelessWidget {
return BlocConsumer<OtpBloc, OtpState>(
listener: (context, state) {
if (state is OtpSubmitting) {
FocusScope.of(context).unfocus();
Loader.loader(context);
} else if (state is OtpSubmissionSuccess) {
goRouter.pop();
successToastMessage(
context,
AppText.otpVerifiedSucessfully,