Merge pull request #10 from WDI-Ideas/jayeshjain25

update risk profile screen, kyc screen and image picker package added
This commit is contained in:
Jayesh jain
2024-03-21 17:59:27 +05:30
committed by GitHub
19 changed files with 1610 additions and 531 deletions

View File

@@ -7,7 +7,7 @@ import 'package:traderscircuit/Utils/text.dart';
class CommonAppbar extends StatelessWidget implements PreferredSizeWidget {
@override
Size get preferredSize => Size.fromHeight(height);
Size get preferredSize => Size.fromHeight(height!);
const CommonAppbar(
{Key? key,
required this.titleTxt,
@@ -27,11 +27,11 @@ class CommonAppbar extends StatelessWidget implements PreferredSizeWidget {
final String? backPageName;
final Widget? customActionWidget;
final VoidCallback? onCustomActionPressed;
final double height;
final double? height;
@override
Widget build(BuildContext context) {
return PreferredSize(
preferredSize: Size.fromHeight(130),
preferredSize: Size.fromHeight(height ?? 130),
child: AppBar(
scrolledUnderElevation: 0.0,
backgroundColor: Colors.black,

View File

@@ -0,0 +1,36 @@
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
class ImagePickerMethod {
Future<String> getImage(ImageSource imgSource) async {
final ImagePicker picker = ImagePicker();
final XFile? pickedImg = await picker.pickImage(source: imgSource);
if (pickedImg != null) {
final croppedImg = await ImageCropper().cropImage(
sourcePath: pickedImg.path,
aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1),
compressFormat: ImageCompressFormat.jpg,
maxHeight: 512,
maxWidth: 512,
uiSettings: [
IOSUiSettings(
rotateButtonsHidden: true,
rotateClockwiseButtonHidden: true,
)
],
compressQuality: 100,
aspectRatioPresets: [
CropAspectRatioPreset.square,
],
);
if (croppedImg != null) {
return croppedImg.path;
} else {
return "";
}
} else {
return "";
}
}
}

View File

@@ -23,3 +23,40 @@ Widget CommonBtn({void Function()? onTap, required String text}) {
),
));
}
Widget kycBtn({
void Function()? onTap,
required String text,
required Color bgClr,
required Color borderClr,
}) {
return InkWell(
onTap: onTap,
child: Container(
width: 191,
height: 50,
decoration: ShapeDecoration(
color: bgClr,
shape: RoundedRectangleBorder(
side: BorderSide(
width: 1,
color: borderClr,
),
borderRadius: BorderRadius.circular(8),
),
),
child: Center(
child: Text(
text,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 20.sp,
fontFamily: 'Cambria',
fontWeight: FontWeight.w400,
),
),
),
),
);
}

View File

@@ -0,0 +1,192 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../text.dart';
class CustomDropDownWidget extends StatefulWidget {
const CustomDropDownWidget(
{super.key, required this.header, required this.listData});
final String header;
final List<String> listData;
@override
State<CustomDropDownWidget> createState() => _CustomDropDownWidgetState();
}
class _CustomDropDownWidgetState extends State<CustomDropDownWidget> {
RxBool onDropTap = false.obs;
RxString selectedValue = "".obs;
@override
Widget build(BuildContext context) {
return Obx(
() => SizedBox(
width: Get.width,
// height: onDropTap.value ? 350 : 55,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InkWell(
onTap: () {
onDropTap.value = !onDropTap.value;
},
child: SizedBox(
width: 398,
height: 55,
child: Stack(
children: [
Positioned(
left: 398,
top: 55,
child: Opacity(
opacity: 0.50,
child: Transform(
transform: Matrix4.identity()
..translate(0.0, 0.0)
..rotateZ(-3.14),
child: Container(
width: 398,
height: 55,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: const Alignment(0.98, -0.21),
end: const Alignment(-0.98, 0.21),
colors: [
Colors.white
.withOpacity(0.03999999910593033),
Colors.white
.withOpacity(0.05999999865889549)
],
),
border: Border(
top: onDropTap.value
? const BorderSide(
width: 0, color: Color(0xFF393939))
: const BorderSide(
width: 0.50,
color: Color(0xFF393939)),
bottom: const BorderSide(
width: 0.50, color: Color(0xFF393939)),
left: const BorderSide(
width: 0.50,
color: Color(0xFF393939),
),
right: const BorderSide(
width: 0.50,
color: Color(0xFF393939),
),
)),
),
),
),
),
Positioned(
left: 14,
top: 16,
child: Text(
selectedValue.isNotEmpty
? selectedValue.value
: widget.header,
style: const TextStyle(
color: Color(0xFFADADAD),
fontSize: 16,
fontFamily: 'Manrope',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
Positioned(
right: 14,
top: 16,
child: onDropTap.value
? const Icon(
Icons.keyboard_arrow_up_rounded,
color: Colors.white,
)
: const Icon(
Icons.keyboard_arrow_down_rounded,
color: Colors.white,
)),
],
),
),
),
!onDropTap.value
? const SizedBox()
: Opacity(
opacity: 0.50,
child: Container(
width: Get.width,
// height: 216,
decoration: ShapeDecoration(
gradient: LinearGradient(
begin: const Alignment(0.98, -0.21),
end: const Alignment(-0.98, 0.21),
colors: [
Colors.white.withOpacity(0.03999999910593033),
Colors.white.withOpacity(0.05999999865889549)
],
),
shape: const RoundedRectangleBorder(
side:
BorderSide(width: 0.50, color: Color(0xFF393939)),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(8),
bottomRight: Radius.circular(8),
),
),
),
child: ListView.builder(
shrinkWrap: true,
itemCount: widget.listData.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () {
selectedValue.value = widget.listData[index];
onDropTap.value = !onDropTap.value;
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: EdgeInsets.only(
left: 14,
top: index == 0 ? 16 : 0,
bottom: index ==
widget.listData.length - 1
? 16
: 0),
child:
text16W400(widget.listData[index])),
index == widget.listData.length - 1
? const SizedBox()
: Container(
width: Get.width,
margin: const EdgeInsets.only(
top: 16, bottom: 16),
decoration: const ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(
width: 0.60,
strokeAlign: BorderSide
.strokeAlignCenter,
color: Color(0xFF393939),
),
),
),
),
],
),
);
}),
),
),
],
),
),
);
}
}

View File

@@ -56,6 +56,19 @@ Widget text18W400(String text) {
);
}
Widget text24W500(String text) {
return Text(
text,
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,
fontWeight: FontWeight.w500,
fontFamily: 'manrope'),
maxLines: 2,
softWrap: true,
);
}
Widget text16W400(String text) {
return Text(
text,
@@ -231,8 +244,8 @@ Widget text14W300(String text) {
);
}
Widget text14W400(String text) { return Text(
Widget text14W400(String text) {
return Text(
text,
style: TextStyle(
fontSize: 14.sp,
@@ -243,13 +256,11 @@ Widget text14W400(String text) { return Text(
}
Widget text14W500(String text) {
return Text(
text,
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
fontWeight: FontWeight.w500,
fontFamily: 'manrope'),
);
@@ -261,13 +272,11 @@ Widget text16W400_DADADA(String text) {
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFFDADADA),
fontWeight: FontWeight.w400,
fontFamily: 'manrope'),
);
}
Widget text14W400_979797(String text) {
return Text(
text,
@@ -311,4 +320,3 @@ Widget text14W500_black(String text) {
fontFamily: 'manrope'),
);
}

View File

@@ -0,0 +1,8 @@
import 'package:get/get.dart';
class KYCController extends GetxController {
RxString panFrontImage = "".obs;
RxString panBackImage = "".obs;
RxString aadharFrontImage = "".obs;
RxString aadharBackImage = "".obs;
}

View File

@@ -97,7 +97,7 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
fontFamily: 'manrope',
),
debugShowCheckedModeBanner: false,
initialRoute: RouteName.mainscreen,
initialRoute: RouteName.splashScreen,
getPages: AppRoutes.appRoutes(),
),
designSize: const Size(390, 844),

View File

@@ -31,6 +31,7 @@ class RouteName {
//kyc
static const String kyc = '/kyc';
static const String kycImage = "/kycImage";
//update risk profile
static const String updateriskprofile = '/updateriskprofile';

View File

@@ -27,6 +27,8 @@ import 'package:traderscircuit/view/secureAccess.dart/Fingerprint.dart';
import 'package:traderscircuit/view/secureAccess.dart/Pin.dart';
import 'package:traderscircuit/view/secureAccess.dart/SecureAccess.dart';
import '../../view/login/uploadKycImage.dart';
class AppRoutes {
static appRoutes() => [
GetPage(
@@ -114,6 +116,10 @@ class AppRoutes {
name: RouteName.kyc,
page: () => const Kyc(),
),
GetPage(
name: RouteName.kycImage,
page: () => const UploadKYCImage(),
),
//update risk profile
GetPage(
@@ -130,7 +136,7 @@ class AppRoutes {
name: RouteName.privacypolicy,
page: () => const PrivacyPolicy(),
),
GetPage(
GetPage(
name: RouteName.aboutus,
page: () => const AboutUs(),
),

View File

@@ -1,7 +1,9 @@
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/CommonAppbar.dart';
@@ -12,6 +14,8 @@ import 'package:traderscircuit/Utils/text.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
import '../../controller/kyc_controller.dart';
class Kyc extends StatefulWidget {
const Kyc({super.key});
@@ -25,372 +29,554 @@ class _KycState extends State<Kyc> {
Color primaryColor = Colors.transparent.withOpacity(0.2);
Color secondaryColor = Colors.grey.shade800;
bool isSwitched = false;
KYCController kycController = Get.put(KYCController());
void _toggleSwitch(bool value) {
setState(() {
isSwitched = value;
});
}
// DateTime timebackPressed = DateTime.now();
DateTime timebackPressed = DateTime.now();
// Future<void> _selectDate(BuildContext context) async {
// final DateTime? picked = await showDatePicker(
// context: context,
// initialDate: DateTime.now(),
// firstDate: DateTime(1900),
// lastDate: DateTime.now(),
// builder: (context, child) {
// return Theme(
// data: Theme.of(context).copyWith(
// colorScheme: const ColorScheme.light(
// surface: Colors.black,
// onSurface: Colors.white,
// primary: Color(0xff9A0000),
// onPrimary: Colors.white,
// ),
// textButtonTheme: TextButtonThemeData(
// style: TextButton.styleFrom(
// foregroundColor: Colors.white,
// ),
// ),
// ),
// child: child!);
// });
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime.now(),
builder: (context, child) {
return Theme(
data: Theme.of(context).copyWith(
colorScheme: ColorScheme.light(
surface: Colors.black,
onSurface: Colors.white,
primary: Color(0xff9A0000),
onPrimary: Colors.white,
),
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: Colors.white,
),
),
),
child: child!);
});
if (picked != null && picked != DateTime.now()) {
setState(() {
dobcontroller.text = "${picked.toLocal()}".split(' ')[0];
final birthDate = DateTime(
picked.year,
picked.month,
picked.day,
);
});
}
}
// if (picked != null && picked != DateTime.now()) {
// setState(() {
// dobcontroller.text = "${picked.toLocal()}".split(' ')[0];
// final birthDate = DateTime(
// picked.year,
// picked.month,
// picked.day,
// );
// });
// }
// }
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CommonAppbar(
titleTxt: "KYC",
customActionWidget: text16W400("skip"),
),
backgroundColor: Colors.black,
extendBody: true,
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
Stack(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: BouncingScrollPhysics(),
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.start,
return Obx(
() => Scaffold(
appBar: CommonAppbar(
titleTxt: "KYC",
customActionWidget: text16W400(""),
),
backgroundColor: Colors.black,
extendBody: true,
body: Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: const BouncingScrollPhysics(),
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
// CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]),
Row(
children: [
text18W400("Full Name"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Email Address"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Phone Number"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Date Of Birth"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(
suffixIcon: Icon(
Icons.calendar_month_outlined,
color: Colors.white,
children: [
// CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]),
// Row(
// children: [
// text18W400("Full Name"),
// ],
// ),
// SizedBox(
// height: 15.h,
// ),
// CustomTextFormField(),
// SizedBox(
// height: 30.h,
// ),
// Row(
// children: [
// text18W400("Email Address"),
// ],
// ),
// SizedBox(
// height: 15.h,
// ),
// CustomTextFormField(),
// SizedBox(
// height: 30.h,
// ),
// Row(
// children: [
// text18W400("Phone Number"),
// ],
// ),
// SizedBox(
// height: 15.h,
// ),
// CustomTextFormField(),
// SizedBox(
// height: 30.h,
// ),
// Row(
// children: [
// text18W400("Date Of Birth"),
// ],
// ),
// SizedBox(
// height: 15.h,
// ),
// CustomTextFormField(
// suffixIcon: Icon(
// Icons.calendar_month_outlined,
// color: Colors.white,
// ),
// readonly: true,
// onTap: () {
// _selectDate(context);
// },
// ),
// SizedBox(
// height: 30.h,
// ),
// Row(
// children: [
// text18W400("City"),
// ],
// ),
// SizedBox(
// height: 15.h,
// ),
// CustomTextFormField(),
Row(
children: [
text18W500("Step 1 : Personal Information"),
],
),
readonly: true,
onTap: () {
_selectDate(context);
},
),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("City"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Upload pan card image"),
],
),
SizedBox(
height: 15.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xff9A0000).withOpacity(0.5),
Color(0xFFffffff).withOpacity(0.5),
],
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Front Side")
],
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Upload pan card image"),
],
),
SizedBox(
height: 15.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
if (kycController.panFrontImage.isEmpty) {
Get.toNamed(RouteName.kycImage, arguments: {
"type": "pan front",
});
}
},
child: GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: const [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xff9A0000).withOpacity(0.5),
const Color(0xFFffffff).withOpacity(0.5),
],
),
child: (kycController.panFrontImage.isNotEmpty)
? Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 40),
child: Image(
image: FileImage(
File(
kycController
.panFrontImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 50.h,
),
),
Positioned(
top: 6,
right: 10,
child: InkWell(
onTap: () {
kycController
.panFrontImage.value = "";
},
child: SvgPicture.asset(
"assets/images/svg/cancel.svg",
width: 18,
height: 18,
),
),
)
],
)
: Center(
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
const Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Front Side")
],
),
),
),
),
),
GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xff9A0000).withOpacity(0.5),
Color(0xFFffffff).withOpacity(0.5),
],
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Back Side")
],
InkWell(
onTap: () {
if (kycController.panBackImage.isEmpty) {
Get.toNamed(RouteName.kycImage, arguments: {
"type": "pan back",
});
}
},
child: GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: const [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xff9A0000).withOpacity(0.5),
const Color(0xFFffffff).withOpacity(0.5),
],
),
child: (kycController.panBackImage.isNotEmpty)
? Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 40),
child: Image(
image: FileImage(
File(
kycController
.panBackImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 50.h,
),
),
Positioned(
top: 6,
right: 10,
child: InkWell(
onTap: () {
kycController.panBackImage.value =
"";
},
child: SvgPicture.asset(
"assets/images/svg/cancel.svg",
width: 18,
height: 18,
),
),
)
],
)
: Center(
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
const Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Back Side")
],
),
),
),
)
],
),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Aadhar Number"),
],
),
SizedBox(
height: 15.h,
),
const CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Upload Aadhar card image"),
],
),
SizedBox(
height: 15.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: () {
if (kycController.aadharFrontImage.isEmpty) {
Get.toNamed(RouteName.kycImage, arguments: {
"type": "aadhar front",
});
}
},
child: GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: const [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xff9A0000).withOpacity(0.5),
const Color(0xFFffffff).withOpacity(0.5),
],
),
child: (kycController.aadharFrontImage.isNotEmpty)
? Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 40),
child: Image(
image: FileImage(
File(
kycController
.aadharFrontImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 50.h,
),
),
Positioned(
top: 6,
right: 10,
child: InkWell(
onTap: () {
kycController
.aadharFrontImage.value = "";
},
child: SvgPicture.asset(
"assets/images/svg/cancel.svg",
width: 18,
height: 18,
),
),
)
],
)
: Center(
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
const Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Front Side")
],
),
),
),
),
)
],
),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Aadhaar Number"),
],
),
SizedBox(
height: 15.h,
),
CustomTextFormField(),
SizedBox(
height: 30.h,
),
Row(
children: [
text18W400("Upload Aadhaar card image"),
],
),
SizedBox(
height: 15.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xff9A0000).withOpacity(0.5),
Color(0xFFffffff).withOpacity(0.5),
],
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Front Side")
],
InkWell(
onTap: () {
if (kycController.aadharBackImage.isEmpty) {
Get.toNamed(RouteName.kycImage, arguments: {
"type": "aadhar back",
});
}
},
child: GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: const [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
const Color(0xff9A0000).withOpacity(0.5),
const Color(0xFFffffff).withOpacity(0.5),
],
),
child: (kycController.aadharBackImage.isNotEmpty)
? Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 40),
child: Image(
image: FileImage(
File(
kycController
.aadharBackImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 50.h,
),
),
Positioned(
top: 6,
right: 10,
child: InkWell(
onTap: () {
kycController
.aadharBackImage.value = "";
},
child: SvgPicture.asset(
"assets/images/svg/cancel.svg",
width: 18,
height: 18,
),
),
)
],
)
: Center(
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
const Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Back Side")
],
),
),
),
),
),
GlassmorphicContainer(
width: 170.w,
height: 105.h,
borderRadius: 8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
0.1,
1,
]),
border: 0.8,
blur: 10,
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xff9A0000).withOpacity(0.5),
Color(0xFFffffff).withOpacity(0.5),
],
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.file_upload_outlined,
size: 42,
color: Colors.white,
),
SizedBox(
height: 10.h,
),
text14W400("Back Side")
],
),
),
)
],
),
SizedBox(
height: 70.h,
),
CommonBtn(
text: "Next",
onTap: () {
Get.toNamed(RouteName.updateriskprofile);
},
),
SizedBox(
height: 10.h,
),
],
)
],
),
SizedBox(
height: 70.h,
),
CommonBtn(
text: "Next",
onTap: () {
Get.toNamed(RouteName.updateriskprofile);
},
),
SizedBox(
height: 10.h,
),
],
),
),
),
],
),
],
],
),
],
),
),
);
}

View File

@@ -3,13 +3,11 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart';
import 'package:traderscircuit/Utils/Common/commonBotton.dart';
import 'package:traderscircuit/Utils/text.dart';
import 'package:traderscircuit/main.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
@@ -35,14 +33,15 @@ class _LoginScreenState extends State<LoginScreen> {
extendBody: true,
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: BouncingScrollPhysics(),
physics: const BouncingScrollPhysics(),
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -80,59 +79,61 @@ class _LoginScreenState extends State<LoginScreen> {
),
Row(
children: [
GlassmorphicContainer(
width: 60,
height: 50,
borderRadius: 8,
blur: 10,
alignment: Alignment.center,
border: 0.8,
linearGradient: LinearGradient(
Expanded(
child: GlassmorphicContainer(
width: 60,
height: 50,
borderRadius: 8,
blur: 10,
alignment: Alignment.center,
border: 0.8,
linearGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: const [
0.1,
1,
]),
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.white.withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xff9A0000).withOpacity(0.5),
const Color(0xFFffffff).withOpacity(0.5),
],
stops: [
0.1,
1,
]),
borderGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xff9A0000).withOpacity(0.5),
Color(0xFFffffff).withOpacity(0.5),
],
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
// SvgPicture.asset("assets/images/svg/india.svg"),
Image.asset(
"assets/images/png/india.png",
height: 25.h,
width: 25.h,
),
SizedBox(
width: 2,
),
Text(
"+91",
style: TextStyle(
fontSize: 15,
color: Colors.white,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
// SvgPicture.asset("assets/images/svg/india.svg"),
Image.asset(
"assets/images/png/india.png",
height: 25.h,
width: 25.h,
),
)
],
const SizedBox(
width: 2,
),
const Text(
"+91",
style: TextStyle(
fontSize: 15,
color: Colors.white,
),
)
],
),
),
),
SizedBox(
const SizedBox(
width: 10,
),
Container(
SizedBox(
width: 285.w,
child: CustomTextFormField(
texttype: TextInputType.phone,
@@ -157,7 +158,7 @@ class _LoginScreenState extends State<LoginScreen> {
)
],
),
SizedBox(
const SizedBox(
height: 10,
),
text14W300(
@@ -211,10 +212,10 @@ class _LoginScreenState extends State<LoginScreen> {
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
stops: const [
0.1,
1,
]),
@@ -224,11 +225,11 @@ class _LoginScreenState extends State<LoginScreen> {
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFAF2E89).withOpacity(0.2),
Color(0xFFA23E31).withOpacity(0.2),
Color(0xFF0000).withOpacity(0.2),
const Color(0xFFAF2E89).withOpacity(0.2),
const Color(0xFFA23E31).withOpacity(0.2),
const Color(0xFF0000).withOpacity(0.2),
],
stops: [
stops: const [
0.3,
0.6,
1,
@@ -261,10 +262,10 @@ class _LoginScreenState extends State<LoginScreen> {
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFffffff).withOpacity(0.1),
Color(0xFFFFFFFF).withOpacity(0.05),
const Color(0xFFffffff).withOpacity(0.1),
const Color(0xFFFFFFFF).withOpacity(0.05),
],
stops: [
stops: const [
0.1,
1,
]),
@@ -274,11 +275,11 @@ class _LoginScreenState extends State<LoginScreen> {
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFAF2E89).withOpacity(0.2),
Color(0xFFA23E31).withOpacity(0.2),
Color(0xFF0000).withOpacity(0.2),
const Color(0xFFAF2E89).withOpacity(0.2),
const Color(0xFFA23E31).withOpacity(0.2),
const Color(0xFF0000).withOpacity(0.2),
],
stops: [
stops: const [
0.3,
0.6,
1,

View File

@@ -3,15 +3,14 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:glassmorphism/glassmorphism.dart';
import 'package:traderscircuit/Utils/Common/CommonAppbar.dart';
import 'package:traderscircuit/Utils/Common/CommonDropdown.dart';
import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart';
import 'package:traderscircuit/Utils/Common/commonBotton.dart';
import 'package:traderscircuit/Utils/text.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
import '../../Utils/Common/custom_drop_down.dart';
class UpdateRiskProfile extends StatefulWidget {
const UpdateRiskProfile({super.key});
@@ -25,27 +24,54 @@ class _UpdateRiskProfileState extends State<UpdateRiskProfile> {
return Scaffold(
appBar: CommonAppbar(
titleTxt: "Update Risk Profile",
customActionWidget: text16W400("skip"),
customActionWidget: text16W400(""),
),
backgroundColor: Colors.black,
extendBody: true,
body: Stack(
children: [
CommonBlurLeft(),
CommonBlurRight(),
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: ListView(
physics: BouncingScrollPhysics(),
physics: const BouncingScrollPhysics(),
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
// CommonDropdownBtn(hint: "hint", items: ["hi", "hii"]),
updateRiskProfileData(
"What is your investment goal?",
"Select your goal",
),
updateRiskProfileData(
"Add Investment Experience field",
"Select your Experience",
),
updateRiskProfileData(
"What types of stocks do you prefer?",
"Select types of stock",
),
updateRiskProfileData(
"What is your Risk Perception?",
"Select your Perception",
),
updateRiskProfileData(
"What is your favoured Market Condition?",
"Select Condition",
),
updateRiskProfileData(
"What is your Emotional Response to Market Volatility?",
"Choose your query",
),
SizedBox(
height: 70.h,
),
CommonBtn(
text: "Next",
text: "Submit",
onTap: () {
Get.toNamed(RouteName.mainscreen);
},
@@ -63,3 +89,64 @@ class _UpdateRiskProfileState extends State<UpdateRiskProfile> {
);
}
}
Widget updateRiskProfileData(
String tilte,
String headerText,
) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
text18W400(tilte),
SizedBox(
height: 15.h,
),
CustomDropDownWidget(
header: headerText,
listData: dropHeader[headerText]!,
),
SizedBox(
height: 35.h,
),
],
);
}
Map<String, List<String>> dropHeader = {
"Select your goal": [
"Wealth Preservation",
"Capital Growth",
"Income Generation",
"Retirement Planning"
],
"Select your Experience": [
"No Experience",
"Beginner (0 - 3 months)",
"Intermediate (3 - 12 months)",
"Expert ( > 12 months)",
"Professional ( 3 - 5 years )"
],
"Select types of stock": [
"Swing Trade",
"Options",
"Multibagger",
"Long term",
],
"Select your Perception": [
"Very Conservative",
"Conservative",
"Moderate",
"Aggressive",
],
"Select Condition": [
"Bullish",
"Neutral",
"Bearish",
],
"Choose your query": [
"Calm",
"Neutral",
"Anxious",
"Stressed",
],
};

View File

@@ -0,0 +1,384 @@
import 'dart:io';
import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:traderscircuit/controller/kyc_controller.dart';
import '../../Utils/Common/ImagePicker.dart';
import '../../Utils/Common/commonBotton.dart';
import '../../Utils/text.dart';
import '../onBoarding/splashScreen1.dart';
class UploadKYCImage extends StatefulWidget {
const UploadKYCImage({super.key});
@override
State<UploadKYCImage> createState() => _UploadKYCImageState();
}
class _UploadKYCImageState extends State<UploadKYCImage> {
KYCController kycController = Get.put(KYCController());
String type = Get.arguments["type"];
@override
Widget build(BuildContext context) {
return Obx(
() => WillPopScope(
onWillPop: () async {
type == "pan front"
? kycController.panFrontImage.value = ""
: type == "pan back"
? kycController.panBackImage.value = ""
: type == "aadhar front"
? kycController.aadharFrontImage.value = ""
: kycController.aadharBackImage.value = "";
await Future.delayed(const Duration(milliseconds: 210));
return true;
},
child: Scaffold(
bottomNavigationBar: (type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)
? Padding(
padding:
const EdgeInsets.symmetric(horizontal: 17, vertical: 100),
child: Row(
children: [
Expanded(
child: SizedBox(
width: 191.w,
child: kycBtn(
text: "Retake",
onTap: () {
if (type == "pan front") {
kycController.panFrontImage.value = "";
} else if (type == "pan back") {
kycController.panBackImage.value = "";
} else if (type == "aadhar front") {
kycController.aadharFrontImage.value = "";
} else {
kycController.aadharBackImage.value = "";
}
},
bgClr: const Color(0xFF111313),
borderClr: const Color(0xFF990000),
),
),
),
const Gap(16),
Expanded(
child: SizedBox(
width: 191.w,
child: kycBtn(
text: "Submit",
onTap: () {
Get.back();
},
bgClr: const Color(0xFF6C0000),
borderClr: const Color(0xFF990000),
),
),
),
],
),
)
: const SizedBox(),
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
toolbarHeight: 80,
leadingWidth: 56.w,
leading: Padding(
padding: EdgeInsets.only(left: 16.w, top: 20.h),
child: GestureDetector(
onTap: () async {
type == "pan front"
? kycController.panFrontImage.value = ""
: type == "pan back"
? kycController.panBackImage.value = ""
: type == "aadhar front"
? kycController.aadharFrontImage.value = ""
: kycController.aadharBackImage.value = "";
await Future.delayed(const Duration(milliseconds: 210));
Get.back(result: false);
},
child: Padding(
padding: EdgeInsets.only(left: 8.w),
child: Icon(
Icons.arrow_back_ios,
color: Colors.white,
size: 25.r,
),
),
),
),
),
backgroundColor: Colors.black,
extendBody: true,
body: Stack(
children: [
const CommonBlurLeft(),
const CommonBlurRight(),
Stack(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
child: ListView(
physics: const NeverScrollableScrollPhysics(),
children: [
(type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)
? text24W500("Preview")
: text24W500(type.contains("pan")
? "Upload Image of pan card"
: "Upload Image of Aadhar card"),
(type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)
? const SizedBox()
: const Gap(14),
(type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)
? const SizedBox()
: text18W400(
type.contains("front") ? "Front" : " Back"),
const Gap(40),
InkWell(
onTap: () async {
if ((type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)) {
} else {
var result = await ImagePickerMethod()
.getImage(ImageSource.gallery);
if (type == "pan front") {
kycController.panFrontImage.value = result;
} else if (type == "pan back") {
kycController.panBackImage.value = result;
} else if (type == "aadhar front") {
kycController.aadharFrontImage.value = result;
} else {
kycController.aadharBackImage.value = result;
}
}
},
child: DottedBorder(
radius: const Radius.circular(10),
borderType: BorderType.RRect,
color: const Color(0xFF393939),
strokeWidth: 1,
child: Container(
width: Get.width,
height: 170,
decoration: ShapeDecoration(
gradient: LinearGradient(
begin: const Alignment(0.98, -0.21),
end: const Alignment(-0.98, 0.21),
colors: [
Colors.white
.withOpacity(0.03999999910593033),
Colors.white
.withOpacity(0.05999999865889549)
],
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
child: (type == "pan front" &&
kycController.panFrontImage.isNotEmpty)
? Padding(
padding: const EdgeInsets.symmetric(
vertical: 17, horizontal: 30),
child: Image(
image: FileImage(
File(
kycController.panFrontImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 150.h,
),
)
: (type == "pan back" &&
kycController.panBackImage.isNotEmpty)
? Padding(
padding: const EdgeInsets.symmetric(
vertical: 17, horizontal: 30),
child: Image(
image: FileImage(
File(
kycController
.panBackImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 150.h,
),
)
: (type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty)
? Padding(
padding:
const EdgeInsets.symmetric(
vertical: 17,
horizontal: 30),
child: Image(
image: FileImage(
File(
kycController
.aadharFrontImage.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 150.h,
),
)
: (type == "aadhar back" &&
kycController.aadharBackImage
.isNotEmpty)
? Padding(
padding: const EdgeInsets
.symmetric(
vertical: 17,
horizontal: 30),
child: Image(
image: FileImage(
File(
kycController
.aadharBackImage
.value,
),
),
fit: BoxFit.cover,
width: Get.width,
height: 150.h,
),
)
: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
SvgPicture.asset(
"assets/images/svg/upload-cloud.svg"),
text16W400(
"Upload from gallery")
],
),
),
),
),
const Gap(20),
(type == "pan front" &&
kycController.panFrontImage.isNotEmpty) ||
(type == "pan back" &&
kycController.panBackImage.isNotEmpty) ||
(type == "aadhar front" &&
kycController
.aadharFrontImage.isNotEmpty) ||
(type == "aadhar back" &&
kycController.aadharBackImage.isNotEmpty)
? const SizedBox()
: InkWell(
onTap: () async {
var result = await ImagePickerMethod()
.getImage(ImageSource.camera);
if (type == "pan front") {
kycController.panFrontImage.value = result;
} else if (type == "pan back") {
kycController.panBackImage.value = result;
} else if (type == "aadhar front") {
kycController.aadharFrontImage.value =
result;
} else {
kycController.aadharBackImage.value =
result;
}
},
child: Container(
width: Get.width,
height: 47,
decoration: ShapeDecoration(
gradient: LinearGradient(
begin: const Alignment(0.98, -0.21),
end: const Alignment(-0.98, 0.21),
colors: [
Colors.white
.withOpacity(0.03999999910593033),
Colors.white
.withOpacity(0.05999999865889549)
],
),
shape: RoundedRectangleBorder(
side: const BorderSide(
width: 1, color: Color(0xFF393939)),
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
SvgPicture.asset(
"assets/images/svg/camera.svg"),
const Gap(10),
text16W400('Click an image')
],
),
),
),
],
),
),
],
)
],
),
),
),
);
}
}