diff --git a/assets/images/png/Nointernet.png b/assets/images/png/Nointernet.png new file mode 100644 index 0000000..90c31b3 Binary files /dev/null and b/assets/images/png/Nointernet.png differ diff --git a/lib/Utils/Common/CustomTextFormField.dart b/lib/Utils/Common/CustomTextFormField.dart index cda073d..5744920 100644 --- a/lib/Utils/Common/CustomTextFormField.dart +++ b/lib/Utils/Common/CustomTextFormField.dart @@ -57,10 +57,10 @@ class _CustomTextFormFieldState extends State { Widget build(BuildContext context) { return GlassmorphicContainer( width: double.infinity, - height: 50, + height: 50.h, borderRadius: 8, blur: 10, - alignment: Alignment.bottomCenter, + alignment: Alignment.center, border: 0.8, linearGradient: LinearGradient( begin: Alignment.topLeft, @@ -82,6 +82,7 @@ class _CustomTextFormFieldState extends State { ], ), child: TextFormField( + textAlignVertical: TextAlignVertical.center, cursorColor: Colors.red, initialValue: widget.value, readOnly: widget.readonly, @@ -127,7 +128,8 @@ class _CustomTextFormFieldState extends State { ? null : widget.suffixIcon!, border: InputBorder.none, - contentPadding: const EdgeInsets.symmetric(horizontal: 10), + contentPadding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 20), ), style: const TextStyle(color: Colors.white), keyboardType: widget.texttype, diff --git a/lib/Utils/Common/custom_drop_down.dart b/lib/Utils/Common/custom_drop_down.dart index 11ecc49..1fd63cb 100644 --- a/lib/Utils/Common/custom_drop_down.dart +++ b/lib/Utils/Common/custom_drop_down.dart @@ -1,12 +1,19 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:traderscircuit/controller/risk_profile_controller.dart'; import '../text.dart'; class CustomDropDownWidget extends StatefulWidget { const CustomDropDownWidget( - {super.key, required this.header, required this.listData}); + {super.key, + required this.header, + required this.title, + required this.listData}); final String header; + final String title; final List listData; @override @@ -16,6 +23,27 @@ class CustomDropDownWidget extends StatefulWidget { class _CustomDropDownWidgetState extends State { RxBool onDropTap = false.obs; RxString selectedValue = "".obs; + RiskProfileController riskProfileController = + Get.put(RiskProfileController()); + + void updateOrAddData(String key, String value) { + bool keyExists = false; + for (int i = 0; i < riskProfileController.selectedData.length; i++) { + Map item = riskProfileController.selectedData[i]; + if (item.containsKey(key)) { + riskProfileController.selectedData[i][key] = + value; // Update existing value + keyExists = true; + break; + } + } + + if (!keyExists) { + // Add new key-value pair + riskProfileController.selectedData.add({key: value}); + } + } + @override Widget build(BuildContext context) { return Obx( @@ -146,6 +174,8 @@ class _CustomDropDownWidgetState extends State { onTap: () { selectedValue.value = widget.listData[index]; onDropTap.value = !onDropTap.value; + updateOrAddData( + widget.title, widget.listData[index]); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/Utils/Common/noInternet.dart b/lib/Utils/Common/noInternet.dart index b931c95..536f873 100644 --- a/lib/Utils/Common/noInternet.dart +++ b/lib/Utils/Common/noInternet.dart @@ -1,6 +1,9 @@ +// ignore_for_file: file_names, sized_box_for_whitespace + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:traderscircuit/Utils/Common/sized_box.dart'; +import 'package:traderscircuit/Utils/text.dart'; class NoInternet extends StatefulWidget { const NoInternet({super.key}); @@ -13,6 +16,7 @@ class _NoInternetState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Colors.black, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( @@ -22,15 +26,11 @@ class _NoInternetState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - 'No Internet !', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20), - ), - sizedBoxHeight(15.h), - Text( - 'Please Check Your Internet\nConnection', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20), - ), + Image.asset('assets/images/png/Nointernet.png'), + // sizedBoxHeight(50.h), + // text18W800('No Internet !'), + // sizedBoxHeight(15.h), + // text15W600('Please Check Your Internet\nConnection') ], ), ), diff --git a/lib/Utils/api_urls.dart b/lib/Utils/api_urls.dart index 4c6f38b..c73a34b 100644 --- a/lib/Utils/api_urls.dart +++ b/lib/Utils/api_urls.dart @@ -4,7 +4,16 @@ class ApiUrls { static const String pieBase = "https://app.piadvisors.in/"; //Base URL - static const base = "http://192.168.50.117/Trader_circuit/api/"; + static const base = "http://192.168.50.82/Trader_circuit/api/"; + + //send otp + static String sendOtp = "${base}sendOTP"; + + //verify otp + static String OTPVerify = "${base}OTPVerify"; + + //add details + static String AddDetails = "${base}userDetails"; // About API static String aboutUsApi = "${base}aboutUs"; @@ -20,6 +29,5 @@ class ApiUrls { //RISK PROFILE API static String getRiskProfileQuestionAnswerApi = "${base}riskProfileQueAns"; - static String addRiskProfileQuestionAnswerApi = - "${base}getRiskProfileQuestionAnswerApi"; + static String addRiskProfileQuestionAnswerApi = "${base}addUserRiskProfile"; } diff --git a/lib/Utils/base_manager.dart b/lib/Utils/base_manager.dart index a8bae41..0e60b88 100644 --- a/lib/Utils/base_manager.dart +++ b/lib/Utils/base_manager.dart @@ -15,4 +15,6 @@ enum ResponseStatus { FAILED, PRIVATE, + + ERROR } diff --git a/lib/Utils/dialogs.dart b/lib/Utils/dialogs.dart new file mode 100644 index 0000000..c9991a3 --- /dev/null +++ b/lib/Utils/dialogs.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:get/get.dart'; + +class utils { + static showToast(String? msg) { + if (msg != null && msg != "null" && msg.isNotEmpty) { + Fluttertoast.showToast(msg: msg); + } + } + + static loader() { + Get.dialog( + Dialog( + elevation: 0, + backgroundColor: Colors.transparent, + child: WillPopScope( + child: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator( + color: Colors.red, + ), + ], + ), + onWillPop: () async => false), + ), + barrierDismissible: false, + ); + } +} diff --git a/lib/controller/risk_profile_controller.dart b/lib/controller/risk_profile_controller.dart new file mode 100644 index 0000000..732e1cb --- /dev/null +++ b/lib/controller/risk_profile_controller.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; + +import '../model/RiskProfileModel/risk_profile_ques_answer_model.dart'; + +class RiskProfileController extends GetxController { + RiskProfileQuestionAnswerModel riskProfileQuestionAnswerModel = + RiskProfileQuestionAnswerModel(); + List> selectedData = []; +} diff --git a/lib/data/network/network_api_services.dart b/lib/data/network/network_api_services.dart index fc04396..513c5d0 100644 --- a/lib/data/network/network_api_services.dart +++ b/lib/data/network/network_api_services.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:developer'; import 'package:flutter/foundation.dart'; @@ -11,7 +12,9 @@ import 'base_api_services.dart'; class NetworkApiServices extends BaseApiServices { Dio dio = Dio(); - + String basicAuth = 'Basic ' + + base64.encode( + utf8.encode('traderCircuitUser:71%@L%es^bUX94`J9XT*@bh,._WWM{')); @override Future getApi(String url, {bool isAuth = false}) async { if (kDebugMode) { @@ -19,13 +22,20 @@ class NetworkApiServices extends BaseApiServices { } Response response; SharedPreferences prefs = await SharedPreferences.getInstance(); - String? token = prefs.getString('token').toString(); + String? token = prefs.getString('accessToken').toString(); log(token); try { response = await dio.get(url, - options: Options(headers: { - isAuth ? 'authorization' : "Bearer $token": "", - })); + options: (token == null || token == "") + ? Options( + headers: { + "Authorization": basicAuth, + }, + ) + : Options(headers: { + "Authorization": basicAuth, + 'access-token': token, + })); if (response.statusCode == 200) { return ResponseData( @@ -62,13 +72,20 @@ class NetworkApiServices extends BaseApiServices { Response response; SharedPreferences prefs = await SharedPreferences.getInstance(); - String? token = prefs.getString('token'); + String? token = prefs.getString('accessToken'); try { response = await dio.post(url, data: data, - options: Options(headers: { - isAuth ? 'authorization' : "Bearer $token": "", - })); + options: (token == null || token == "") + ? Options( + headers: { + "Authorization": basicAuth, + }, + ) + : Options(headers: { + "Authorization": basicAuth, + 'access-token': token, + })); } on Exception catch (e) { if (e is DioException) { log(e.response.toString()); @@ -109,7 +126,7 @@ class NetworkApiServices extends BaseApiServices { } Response response; SharedPreferences prefs = await SharedPreferences.getInstance(); - String? token = prefs.getString('token').toString(); + String? token = prefs.getString('accessToken').toString(); log(token); try { response = await dio.delete(url, diff --git a/lib/main.dart b/lib/main.dart index 3f67750..9624b71 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -54,59 +54,59 @@ class _MyAppState extends State with WidgetsBindingObserver { late StreamSubscription subscription; Connectivity connectivity = Connectivity(); - // @override - // void initState() { - // super.initState(); - // WidgetsBinding.instance.addObserver(this); + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); - // connectivity = Connectivity(); - // checkInternet(); - // subscription = - // connectivity.onConnectivityChanged.listen((ConnectivityResult result) { - // _connectionStatus = result.toString(); - // if (result == ConnectivityResult.wifi || - // result == ConnectivityResult.mobile) { - // setState(() { - // _connectionStatus = result.toString(); + connectivity = Connectivity(); + checkInternet(); + subscription = + connectivity.onConnectivityChanged.listen((ConnectivityResult result) { + _connectionStatus = result.toString(); + if (result == ConnectivityResult.wifi || + result == ConnectivityResult.mobile) { + setState(() { + _connectionStatus = result.toString(); - // Get.back(result: true); - // }); - // } else { - // setState(() { - // _connectionStatus = result.toString(); - // Get.toNamed(RouteName.nointernet); - // }); - // } - // }); - // // print(_connectionStatus); - // } + Get.back(result: true); + }); + } else { + setState(() { + _connectionStatus = result.toString(); + Get.toNamed(RouteName.nointernet); + }); + } + }); + // print(_connectionStatus); + } - // Future checkInternet() async { - // final connectivityResult = await (Connectivity().checkConnectivity()); + Future checkInternet() async { + final connectivityResult = await (Connectivity().checkConnectivity()); - // if (connectivityResult == ConnectivityResult.wifi || - // connectivityResult == ConnectivityResult.mobile) { - // setState(() { - // _connectionStatus = connectivityResult.toString(); - // }); - // } else { - // setState(() { - // _connectionStatus = connectivityResult.toString(); - // print(_connectionStatus.toString()); - // Get.toNamed(RouteName.nointernet); + if (connectivityResult == ConnectivityResult.wifi || + connectivityResult == ConnectivityResult.mobile) { + setState(() { + _connectionStatus = connectivityResult.toString(); + }); + } else { + setState(() { + _connectionStatus = connectivityResult.toString(); + print(_connectionStatus.toString()); + Get.toNamed(RouteName.nointernet); - // // Navigator.pushReplacementNamed(context, "/noInternet"); - // }); - // } - // } + // Navigator.pushReplacementNamed(context, "/noInternet"); + }); + } + } - // @override - // void dispose() { - // super.dispose(); - // WidgetsBinding.instance.removeObserver(this); + @override + void dispose() { + super.dispose(); + WidgetsBinding.instance.removeObserver(this); - // subscription.cancel(); - // } + subscription.cancel(); + } // This widget is the root of your application. @override diff --git a/lib/model/RiskProfileModel/risk_profile_ques_answer_model.dart b/lib/model/RiskProfileModel/risk_profile_ques_answer_model.dart new file mode 100644 index 0000000..e3382fa --- /dev/null +++ b/lib/model/RiskProfileModel/risk_profile_ques_answer_model.dart @@ -0,0 +1,123 @@ +class RiskProfileQuestionAnswerModel { + String? status; + int? statusCode; + String? message; + List? data; + + RiskProfileQuestionAnswerModel( + {this.status, this.statusCode, this.message, this.data}); + + RiskProfileQuestionAnswerModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['status'] = status; + data['status_code'] = statusCode; + data['message'] = message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + String? question; + String? isActive; + + String? createdAt; + String? updatedAt; + List? answer; + + Data( + {this.id, + this.question, + this.isActive, + this.createdAt, + this.updatedAt, + this.answer}); + + Data.fromJson(Map json) { + id = json['id']; + question = json['question']; + isActive = json['is_active']; + + createdAt = json['created_at']; + updatedAt = json['updated_at']; + if (json['answer'] != null) { + answer = []; + json['answer'].forEach((v) { + answer!.add(Answer.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['question'] = question; + data['is_active'] = isActive; + + data['created_at'] = createdAt; + data['updated_at'] = updatedAt; + if (answer != null) { + data['answer'] = answer!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Answer { + int? id; + int? questionId; + String? answer; + int? points; + String? isActive; + + String? createdAt; + String? updatedAt; + + Answer( + {this.id, + this.questionId, + this.answer, + this.points, + this.isActive, + this.createdAt, + this.updatedAt}); + + Answer.fromJson(Map json) { + id = json['id']; + questionId = json['question_id']; + answer = json['answer']; + points = json['points']; + isActive = json['is_active']; + + createdAt = json['created_at']; + updatedAt = json['updated_at']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['question_id'] = questionId; + data['answer'] = answer; + data['points'] = points; + data['is_active'] = isActive; + + data['created_at'] = createdAt; + data['updated_at'] = updatedAt; + return data; + } +} diff --git a/lib/view/MainScreen/ExploreUnseen.dart b/lib/view/MainScreen/ExploreUnseen.dart index 387302c..4bb377a 100644 --- a/lib/view/MainScreen/ExploreUnseen.dart +++ b/lib/view/MainScreen/ExploreUnseen.dart @@ -62,23 +62,10 @@ class _ExploreUnseenState extends State { child: ListView(physics: BouncingScrollPhysics(), children: [ text22W600('Explore The Unseen'), sizedBoxHeight(35.h), - DefaultTabController( - length: 2, - initialIndex: 1, - child: Column( - children: [ - MyTabBar(), - SizedBox( - height: 700.h, - child: TabBarView( - children: [ - ActiveCallsTab(), - ExitedCallsTab(), - ], - ), - ), - ], - ), + Column( + children: [ + ActiveCallsTab(), + ], ), ])) ]) @@ -176,47 +163,6 @@ class _ExploreUnseenState extends State { ); } - Widget ExitedCallsTab() { - List> cardcall = [ - { - 'text': 'Trident Ltd', - 'amount': '₹ 453 - ₹234', - 'pdfname': 'Download Pdf', - }, - { - 'text': 'Trident Ltd', - 'amount': '₹ 453 - ₹234', - 'pdfname': 'Download Pdf', - }, - { - 'text': 'Trident Ltd', - 'amount': '₹ 453 - ₹234', - 'pdfname': 'Download Pdf', - }, - ]; - - return SingleChildScrollView( - child: Column( - children: [ - sizedBoxHeight(25.h), - Column( - children: List.generate(cardcall.length, (index) { - return Column( - children: [ - cardcallWidget( - text: cardcall[index]['text']!, - amount: cardcall[index]['amount']!, - pdfname: cardcall[index]['pdfname']!), - sizedBoxHeight(20.h) - ], - ); - }), - ), - ], - ), - ); - } - Widget cardcallWidget( {required String text, required String amount, required String pdfname}) { return commonGlassContainer( diff --git a/lib/view/Sidemenu/contactUs/create_ticket_bottom_sheet.dart b/lib/view/Sidemenu/contactUs/create_ticket_bottom_sheet.dart index ddbef8c..15ec852 100644 --- a/lib/view/Sidemenu/contactUs/create_ticket_bottom_sheet.dart +++ b/lib/view/Sidemenu/contactUs/create_ticket_bottom_sheet.dart @@ -68,6 +68,7 @@ class CreateTicketBottomSheet { "Content Buytes", "Market Insights" ], + title: "", ), const Gap(14), Stack( diff --git a/lib/view/login/AddDetails.dart b/lib/view/login/AddDetails.dart index 225ee81..b024933 100644 --- a/lib/view/login/AddDetails.dart +++ b/lib/view/login/AddDetails.dart @@ -3,12 +3,16 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; import 'package:traderscircuit/Utils/Common/CustomTextFormField.dart'; import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/Utils/utils.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import 'package:traderscircuit/view_model/Login/add_details_api.dart'; class AddDetails extends StatefulWidget { const AddDetails({super.key}); @@ -18,7 +22,12 @@ class AddDetails extends StatefulWidget { } class _AddDetailsState extends State { + final GlobalKey _adddetailsform = GlobalKey(); TextEditingController pincode = TextEditingController(); + TextEditingController fullName = TextEditingController(); + TextEditingController email = TextEditingController(); + TextEditingController phone = TextEditingController(); + TextEditingController city = TextEditingController(); TextEditingController dobcontroller = TextEditingController(); Color primaryColor = Colors.transparent.withOpacity(0.2); Color secondaryColor = Colors.grey.shade800; @@ -69,6 +78,53 @@ class _AddDetailsState extends State { } } + _addDetails() async { + final isValid = _adddetailsform.currentState?.validate(); + if (isValid!) { + Utils.loader(); + Map updata = { + "full_name": fullName.text, + "email_address": email.text, + "mobile_number": phone.text, + "date_of_birth": dobcontroller.text, + "city": city.text, + "whatsapp_update": isSwitched == false ? 0 : 1, + }; + final resp = await AddDetailsAPI(updata).adddetailsApi(); + if (resp.status == ResponseStatus.SUCCESS) { + Get.back(); + Get.toNamed(RouteName.kyc); + // SharedPreferences prefs = await SharedPreferences.getInstance(); + // await prefs.setString('accessToken', resp.data["data"]["access-token"]); + // await prefs.setString('productType', + // resp.data["data"]["nature_of_business_id"].toString()); + // naturebusiness = + // resp.data["data"]["nature_of_business_id"].toString(); + + // ProfileApi().GetProfileApi().then( + // (value) { + + // Get.toNamed(RouteName.mainscreen); + // }, + // ); + + // Get.to(() => CustomBottomBar(pageIndex: 0)); + } else if (resp.status == ResponseStatus.PRIVATE) { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } else if (resp.status == ResponseStatus.ERROR) { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } else { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -83,129 +139,140 @@ class _AddDetailsState extends State { children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: ListView( - physics: BouncingScrollPhysics(), - // mainAxisAlignment: MainAxisAlignment.start, - // crossAxisAlignment: CrossAxisAlignment.start, + child: Form( + key: _adddetailsform, + child: ListView( + physics: BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - text18W400("Full Name"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Email Address"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField( - texttype: TextInputType.emailAddress, - ), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("Phone Number"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField( - texttype: TextInputType.phone, - ), - 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: [ + Row( + children: [ + text18W400("Full Name"), + ], ), - readonly: true, - onTap: () { - _selectDate(context); - }, - ), - SizedBox( - height: 30.h, - ), - Row( - children: [ - text18W400("City"), - ], - ), - SizedBox( - height: 15.h, - ), - CustomTextFormField(), - SizedBox( - height: 40.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Image.asset( - "assets/images/png/whatsapp.png", - height: 34.h, - width: 34.w, - ), - SizedBox( - width: 10.w, - ), - text18W600("Get Updates on WhatsApp"), - ], + SizedBox( + height: 15.h, + ), + CustomTextFormField( + textEditingController: fullName, + ), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Email Address"), + ], + ), + SizedBox( + height: 15.h, + ), + CustomTextFormField( + textEditingController: email, + texttype: TextInputType.emailAddress, + ), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Phone Number"), + ], + ), + SizedBox( + height: 15.h, + ), + CustomTextFormField( + textEditingController: phone, + texttype: TextInputType.phone, + ), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("Date Of Birth"), + ], + ), + SizedBox( + height: 15.h, + ), + CustomTextFormField( + textEditingController: dobcontroller, + suffixIcon: Icon( + Icons.calendar_month_outlined, + color: Colors.white, ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Switch( - value: isSwitched, - onChanged: _toggleSwitch, - activeTrackColor: Colors.green, - activeColor: Colors.white, - inactiveTrackColor: Colors.white, - inactiveThumbColor: Colors.black, - ), - ], - ), - ], - ), - SizedBox( - height: 70.h, - ), - CommonBtn( - text: "Next", - onTap: () { - Get.toNamed(RouteName.kyc); - }, - ), - SizedBox( - height: 10.h, - ), - ], + readonly: true, + onTap: () { + _selectDate(context); + }, + ), + SizedBox( + height: 30.h, + ), + Row( + children: [ + text18W400("City"), + ], + ), + SizedBox( + height: 15.h, + ), + CustomTextFormField( + textEditingController: city, + ), + SizedBox( + height: 40.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/png/whatsapp.png", + height: 34.h, + width: 34.w, + ), + SizedBox( + width: 10.w, + ), + text18W600("Get Updates on WhatsApp"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Switch( + value: isSwitched, + onChanged: _toggleSwitch, + activeTrackColor: Colors.green, + activeColor: Colors.white, + inactiveTrackColor: Colors.white, + inactiveThumbColor: Colors.black, + ), + ], + ), + ], + ), + SizedBox( + height: 70.h, + ), + CommonBtn( + text: "Next", + onTap: () { + _addDetails(); + // Get.toNamed(RouteName.kyc); + }, + ), + SizedBox( + height: 10.h, + ), + ], + ), ), ), ], diff --git a/lib/view/login/Kyc.dart b/lib/view/login/Kyc.dart index aea9845..6257951 100644 --- a/lib/view/login/Kyc.dart +++ b/lib/view/login/Kyc.dart @@ -14,6 +14,7 @@ import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; import '../../controller/kyc_controller.dart'; +import '../../view_model/RiskProfileApi/risk_profile_api.dart'; class Kyc extends StatefulWidget { const Kyc({super.key}); diff --git a/lib/view/login/LoginScreen.dart b/lib/view/login/LoginScreen.dart index 4622fe0..7345b86 100644 --- a/lib/view/login/LoginScreen.dart +++ b/lib/view/login/LoginScreen.dart @@ -7,9 +7,13 @@ 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/base_manager.dart'; import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/Utils/utils.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import 'package:traderscircuit/view_model/Login/send_otp_api.dart'; +import 'package:traderscircuit/Utils/Dialogs.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @@ -19,6 +23,7 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { + final GlobalKey _sendotpform = GlobalKey(); TextEditingController phonecontroller = TextEditingController(); bool isValidPhoneNumber(String phoneNumber) { final RegExp phoneNumberExpression = RegExp(r"^0{10}$"); @@ -40,289 +45,329 @@ class _LoginScreenState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: ListView( - physics: const BouncingScrollPhysics(), - // mainAxisAlignment: MainAxisAlignment.start, - // crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 20.h, - ), - const Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Traders Circuit", - style: TextStyle( - fontFamily: 'hiragino', - color: Colors.white, - fontSize: 25, - fontWeight: FontWeight.w600), - ), - ], - ), - SizedBox( - height: 42.h, - ), - const Text( - "Lets get started ", - style: TextStyle( - fontFamily: 'hiragino', - color: Colors.white, - fontSize: 24, - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 10.h, - ), - text18W800("Enter your mobile number to get otp"), - SizedBox( - height: 35.h, - ), - Row( - children: [ - Expanded( - child: GlassmorphicContainer( - width: 60, - height: 50, - borderRadius: 8, - blur: 10, - alignment: Alignment.center, - border: 0.8, - linearGradient: LinearGradient( + child: Form( + key: _sendotpform, + child: ListView( + physics: const BouncingScrollPhysics(), + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 20.h, + ), + const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Traders Circuit", + style: TextStyle( + fontFamily: 'hiragino', + color: Colors.white, + fontSize: 25, + fontWeight: FontWeight.w600), + ), + ], + ), + SizedBox( + height: 42.h, + ), + const Text( + "Lets get started ", + style: TextStyle( + fontFamily: 'hiragino', + color: Colors.white, + fontSize: 24, + fontWeight: FontWeight.w700), + ), + SizedBox( + height: 10.h, + ), + text18W800("Enter your mobile number to get otp"), + SizedBox( + height: 35.h, + ), + Row( + children: [ + 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), - const Color(0xFFFFFFFF).withOpacity(0.05), + const Color(0xff9A0000).withOpacity(0.5), + const Color(0xFFffffff).withOpacity(0.5), ], - stops: const [ - 0.1, - 1, - ]), - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - const Color(0xff9A0000).withOpacity(0.5), - const 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, - ), - const SizedBox( - width: 2, - ), - const Text( - "+91", - style: TextStyle( - fontFamily: 'hiragino', - 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( + fontFamily: 'hiragino', + fontSize: 15, + color: Colors.white, + ), + ) + ], + ), ), ), - ), - const SizedBox( - width: 10, - ), - SizedBox( - width: 285.w, - child: CustomTextFormField( - texttype: TextInputType.phone, - textEditingController: phonecontroller, - // validator: (value) { - // if (value.isEmpty) { - // return 'Enter your phone number'; - // } else if (!RegExp(r'(^(?:[+0]9)?[0-9]{10}$)') - // .hasMatch(value)) { - // return 'Enter a valid phone number'; - // } else if (!isValidPhoneNumber(value)) { - // return 'Phone number cannot contain 10 zeros'; - // } - // return null; - // }, - inputFormatters: [ - LengthLimitingTextInputFormatter(10), - FilteringTextInputFormatter.allow( - RegExp('[0-9]')), + const SizedBox( + width: 10, + ), + SizedBox( + width: 285.w, + child: CustomTextFormField( + texttype: TextInputType.phone, + textEditingController: phonecontroller, + // validator: (value) { + // if (value.isEmpty) { + // return 'Enter your phone number'; + // } else if (!RegExp(r'(^(?:[+0]9)?[0-9]{10}$)') + // .hasMatch(value)) { + // return 'Enter a valid phone number'; + // } else if (!isValidPhoneNumber(value)) { + // return 'Phone number cannot contain 10 zeros'; + // } + // return null; + // }, + inputFormatters: [ + LengthLimitingTextInputFormatter(10), + FilteringTextInputFormatter.allow( + RegExp('[0-9]')), + ], + ), + ) + ], + ), + const SizedBox( + height: 10, + ), + text14W300( + "We’ll send six digit code to the registered number. Standard data rates may apply"), + SizedBox( + height: 65.h, + ), + CommonBtn( + text: "Login/Signup", + onTap: () async { + final isValid = + _sendotpform.currentState?.validate(); + if (isValid!) { + utils.loader(); + FocusManager.instance.primaryFocus?.unfocus(); + + Map myLoginData = { + "mobile_number": phonecontroller.text, + }; + + var resp = + await SendOtpAPI(myLoginData).sendOtpApi(); + print(resp.status); + print('Api msg : ${resp.message}'); + + if (resp.status == ResponseStatus.SUCCESS) { + Get.back(); + print("api response is ${resp.data}"); + Utils.showToast("OTP sent successfully"); + + Map res = resp.data; + print(res); + + Get.toNamed(RouteName.verifyotp, arguments: { + "phonenumber": phonecontroller.text + }); + } else { + Get.back(); + Utils.showToast(resp.message); + print('Api msg : ${resp.message}'); + } + } else { + Get.snackbar( + "Error", "Please Enter Login Credentials", + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM); + } + }), + SizedBox( + height: 10.h, + ), + text14W300( + "By continuing, you agree to our Terms & Conditions"), + SizedBox( + height: 45.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 0.2.h, + width: 108.w, + color: Colors.white, + ), + SizedBox( + width: 22.w, + ), + text18W600("OR"), + SizedBox( + width: 22.w, + ), + Container( + height: 0.2.h, + width: 108.w, + color: Colors.white, + ), + ], + ), + SizedBox( + height: 40.h, + ), + GlassmorphicContainer( + width: double.infinity, + height: 55.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.3, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFAF2E89).withOpacity(0.2), + const Color(0xFFA23E31).withOpacity(0.2), + const Color(0xFF0000).withOpacity(0.2), + ], + stops: const [ + 0.3, + 0.6, + 1, + ]), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + "assets/images/png/apple.png", + height: 30.h, + width: 30.w, + ), + SizedBox( + width: 7.h, + ), + text16W400("Continue with apple"), ], ), - ) - ], - ), - const SizedBox( - height: 10, - ), - text14W300( - "We’ll send six digit code to the registered number. Standard data rates may apply"), - SizedBox( - height: 65.h, - ), - CommonBtn( - text: "Login/Signup", - onTap: () { - Get.toNamed(RouteName.verifyotp); - }), - SizedBox( - height: 10.h, - ), - text14W300( - "By continuing, you agree to our Terms & Conditions"), - SizedBox( - height: 45.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - height: 0.2.h, - width: 108.w, - color: Colors.white, - ), - SizedBox( - width: 22.w, - ), - text18W600("OR"), - SizedBox( - width: 22.w, - ), - Container( - height: 0.2.h, - width: 108.w, - color: Colors.white, - ), - ], - ), - SizedBox( - height: 40.h, - ), - GlassmorphicContainer( - width: double.infinity, - height: 55.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.3, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - const Color(0xFFAF2E89).withOpacity(0.2), - const Color(0xFFA23E31).withOpacity(0.2), - const Color(0xFF0000).withOpacity(0.2), - ], - stops: const [ - 0.3, - 0.6, - 1, - ]), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - "assets/images/png/apple.png", - height: 30.h, - width: 30.w, - ), - SizedBox( - width: 7.h, - ), - text16W400("Continue with apple"), - ], ), ), - ), - SizedBox( - height: 15.h, - ), - GlassmorphicContainer( - width: double.infinity, - height: 55.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.5, - blur: 10, - borderGradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - const Color(0xFFAF2E89).withOpacity(0.2), - const Color(0xFFA23E31).withOpacity(0.2), - const Color(0xFF0000).withOpacity(0.2), - ], - stops: const [ - 0.3, - 0.6, - 1, - ]), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - "assets/images/png/google.png", - height: 30.h, - width: 30.w, - ), - SizedBox( - width: 7.h, - ), - text16W400( - "Continue with google", - ), - ], - ), + SizedBox( + height: 15.h, ), - ), - SizedBox( - height: 45.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - InkWell( - onTap: () { - Get.toNamed(RouteName.mainscreen); - }, - child: text16W700( - "Continue as guest", + GlassmorphicContainer( + width: double.infinity, + height: 55.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.5, + blur: 10, + borderGradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFAF2E89).withOpacity(0.2), + const Color(0xFFA23E31).withOpacity(0.2), + const Color(0xFF0000).withOpacity(0.2), + ], + stops: const [ + 0.3, + 0.6, + 1, + ]), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + "assets/images/png/google.png", + height: 30.h, + width: 30.w, + ), + SizedBox( + width: 7.h, + ), + text16W400( + "Continue with google", + ), + ], ), ), - ], - ) - ], + ), + SizedBox( + height: 45.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () { + Get.toNamed(RouteName.mainscreen); + }, + child: text16W700( + "Continue as guest", + ), + ), + ], + ) + ], + ), ), ), ], diff --git a/lib/view/login/UpdateRiskProfile.dart b/lib/view/login/UpdateRiskProfile.dart index c1bfd49..e06be40 100644 --- a/lib/view/login/UpdateRiskProfile.dart +++ b/lib/view/login/UpdateRiskProfile.dart @@ -1,15 +1,21 @@ -import 'dart:ui'; +import 'dart:convert'; +import 'dart:developer'; +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide FormData; import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; -import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/dialogs.dart'; import 'package:traderscircuit/Utils/text.dart'; -import 'package:traderscircuit/resources/routes/route_name.dart'; +import 'package:traderscircuit/controller/risk_profile_controller.dart'; +import 'package:traderscircuit/model/RiskProfileModel/risk_profile_ques_answer_model.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import '../../Utils/Common/commonBotton.dart'; import '../../Utils/Common/custom_drop_down.dart'; +import '../../resources/routes/route_name.dart'; +import '../../view_model/RiskProfileApi/risk_profile_api.dart'; class UpdateRiskProfile extends StatefulWidget { const UpdateRiskProfile({super.key}); @@ -19,6 +25,34 @@ class UpdateRiskProfile extends StatefulWidget { } class _UpdateRiskProfileState extends State { + RxBool isLoading = true.obs; + RiskProfileController riskProfileController = + Get.put(RiskProfileController()); + List questionIdList = []; + List answerIdList = []; + List>> dropHeader = []; + + @override + void initState() { + RiskProfileApi().getRiskProfileData().then((value) { + riskProfileController.riskProfileQuestionAnswerModel = + RiskProfileQuestionAnswerModel.fromJson(value.data); + for (var a + in riskProfileController.riskProfileQuestionAnswerModel.data!) { + List titleTxt = []; + titleTxt.clear(); + for (var b in a.answer!) { + titleTxt.add(b.answer!); + } + dropHeader.add({a.question!: titleTxt}); + } + + log(dropHeader.toString()); + isLoading.value = false; + }); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -28,125 +62,151 @@ class _UpdateRiskProfileState extends State { ), 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: [ - 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: "Submit", - onTap: () { - Get.toNamed(RouteName.mainscreen); - }, - ), - SizedBox( - height: 10.h, - ), - ], + body: Obx( + () => isLoading.value + ? const Center( + child: CircularProgressIndicator( + color: Color(0xFF9A0000), ), + ) + : Stack( + children: [ + const CommonBlurLeft(), + const CommonBlurRight(), + Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 16), + child: ListView.builder( + itemCount: riskProfileController + .riskProfileQuestionAnswerModel + .data! + .length + + 1, + itemBuilder: (ctx, index) { + return riskProfileController + .riskProfileQuestionAnswerModel + .data! + .length <= + index + ? Column( + children: [ + SizedBox( + height: 70.h, + ), + CommonBtn( + text: "Submit", + onTap: () { + questionIdList.clear(); + answerIdList.clear(); + if (riskProfileController + .riskProfileQuestionAnswerModel + .data! + .length != + riskProfileController + .selectedData.length) { + utils.showToast( + "All Fields Required"); + } else { + // Iterate through selected data and match with provided data + for (var entry + in riskProfileController + .selectedData) { + String question = + entry.keys.first; + String answer = + entry.values.first; + + // Find matching question + var questionMatch = + riskProfileController + .riskProfileQuestionAnswerModel + .data! + .firstWhere( + (item) => + item.question == + question, + ); + if (questionMatch != null) { + questionIdList + .add(questionMatch.id!); + } + + // Find matching answer + if (questionMatch != null) { + var answerMatch = + questionMatch.answer! + .firstWhere( + (ans) => + ans.answer == answer, + ); + if (answerMatch != null) { + answerIdList + .add(answerMatch.id!); + } + } + } + + RiskProfileApi() + .addRiskProfileData( + FormData.fromMap({ + "question_ids": jsonEncode( + questionIdList), + "answer_ids": + jsonEncode(answerIdList), + })) + .then((value) { + Map + responseData = + Map.from( + value.data); + utils.showToast( + responseData["message"]); + Get.toNamed( + RouteName.mainscreen); + }); + } + }, + ), + SizedBox( + height: 10.h, + ), + ], + ) + : updateRiskProfileData( + riskProfileController + .riskProfileQuestionAnswerModel + .data![index] + .question!, + "Select your goal", + index); + })), + ], + ), + ], ), - ], - ), - ], ), ); } -} -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, - ), - ], - ); + Widget updateRiskProfileData(String tilte, String headerText, int index) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text18W400(tilte), + SizedBox( + height: 15.h, + ), + CustomDropDownWidget( + header: headerText, + listData: dropHeader[index][tilte]!, + title: tilte, + ), + SizedBox( + height: 35.h, + ), + ], + ); + } } - -Map> 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", - ], -}; diff --git a/lib/view/login/VerifyOtp.dart b/lib/view/login/VerifyOtp.dart index da0d00a..b697264 100644 --- a/lib/view/login/VerifyOtp.dart +++ b/lib/view/login/VerifyOtp.dart @@ -3,11 +3,20 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:traderscircuit/Utils/Common/CommonAppbar.dart'; import 'package:traderscircuit/Utils/Common/commonBotton.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; import 'package:traderscircuit/Utils/text.dart'; +import 'package:traderscircuit/Utils/utils.dart'; import 'package:traderscircuit/resources/routes/route_name.dart'; import 'package:traderscircuit/view/onBoarding/splashScreen1.dart'; +import 'package:traderscircuit/view_model/Login/verify_number_api.dart'; + +bool? isVendorExist; +int? isProfileUpdated; +int? isriskProfileUpdated; +int? isKycUpdated; class VerifyOTP extends StatefulWidget { const VerifyOTP({super.key}); @@ -21,6 +30,73 @@ class _VerifyOTPState extends State { TextEditingController pincode = TextEditingController(); Color primaryColor = Colors.transparent.withOpacity(0.2); Color secondaryColor = Colors.grey.shade800; + String? phonenumber; + + @override + void initState() { + super.initState(); + phonenumber = Get.arguments["phonenumber"]; + } + + _verifycheck() async { + final isValid = _otpform.currentState?.validate(); + if (isValid!) { + Utils.loader(); + Map updata = { + "mobile_number": phonenumber.toString(), + "otp": pincode.text, + }; + final resp = await VerifyNumberAPI(updata).verifynumberApi(); + if (resp.status == ResponseStatus.SUCCESS) { + Get.back(); + isVendorExist = resp.data["data"]["vendor_account_exist"]; + isProfileUpdated = resp.data["data"]["user_data"]["profile_updated"]; + isriskProfileUpdated = + resp.data["data"]["user_data"]["risk_profile_updated"]; + isKycUpdated = resp.data["data"]["user_data"]["kyc_updated"]; + if (isVendorExist!) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.setString( + 'accessToken', resp.data["data"]["access-token"]); + // await prefs.setString('productType', + // resp.data["data"]["nature_of_business_id"].toString()); + // naturebusiness = + // resp.data["data"]["nature_of_business_id"].toString(); + + // ProfileApi().GetProfileApi().then( + // (value) { + + isProfileUpdated == 0 + ? Get.toNamed(RouteName.adddetails) + : isKycUpdated == 0 + ? Get.toNamed(RouteName.kyc) + : isriskProfileUpdated == 0 + ? Get.toNamed(RouteName.updateriskprofile) + : Get.toNamed(RouteName.mainscreen); + // Get.toNamed(RouteName.mainscreen); + // }, + // ); + + // Get.to(() => CustomBottomBar(pageIndex: 0)); + } else { + Get.toNamed(RouteName.loginscreen); + } + } else if (resp.status == ResponseStatus.PRIVATE) { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } else if (resp.status == ResponseStatus.ERROR) { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } else { + Get.back(); + String? message = resp.data['message']; + Utils.showToast("$message"); + } + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -113,7 +189,8 @@ class _VerifyOTPState extends State { CommonBtn( text: "Verify OTP", onTap: () { - Get.toNamed(RouteName.secureaccess); + _verifycheck(); + // Get.toNamed(RouteName.secureaccess); }, ) ], diff --git a/lib/view_model/Login/add_details_api.dart b/lib/view_model/Login/add_details_api.dart new file mode 100644 index 0000000..4f1c4fc --- /dev/null +++ b/lib/view_model/Login/add_details_api.dart @@ -0,0 +1,27 @@ +import 'package:traderscircuit/Utils/api_urls.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; +import 'package:traderscircuit/data/network/network_api_services.dart'; + +class AddDetailsAPI { + AddDetailsAPI(this.data); + var data; + Future> adddetailsApi() async { + final response = await NetworkApiServices().postApi( + // optionalpar: true, + data, + ApiUrls.AddDetails, + ); + + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + print("token is $response"); + } else { + return ResponseData( + responseData['message'], ResponseStatus.FAILED); + } + } + return response; + } +} diff --git a/lib/view_model/Login/send_otp_api.dart b/lib/view_model/Login/send_otp_api.dart new file mode 100644 index 0000000..1a1c9f5 --- /dev/null +++ b/lib/view_model/Login/send_otp_api.dart @@ -0,0 +1,28 @@ +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:traderscircuit/Utils/api_urls.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; +import 'package:traderscircuit/data/network/network_api_services.dart'; + +class SendOtpAPI { + SendOtpAPI(this.data); + var data; + Future> sendOtpApi() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final response = await NetworkApiServices().postApi( + data, + ApiUrls.sendOtp, + ); + + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + print("OTP sent successfully"); + } else { + return ResponseData( + responseData['message'], ResponseStatus.FAILED); + } + } + return response; + } +} diff --git a/lib/view_model/Login/verify_number_api.dart b/lib/view_model/Login/verify_number_api.dart new file mode 100644 index 0000000..527ac54 --- /dev/null +++ b/lib/view_model/Login/verify_number_api.dart @@ -0,0 +1,27 @@ +import 'package:traderscircuit/Utils/api_urls.dart'; +import 'package:traderscircuit/Utils/base_manager.dart'; +import 'package:traderscircuit/data/network/network_api_services.dart'; + +class VerifyNumberAPI { + VerifyNumberAPI(this.data); + var data; + Future> verifynumberApi() async { + final response = await NetworkApiServices().postApi( + // optionalpar: true, + data, + ApiUrls.OTPVerify, + ); + + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + print("token is $response"); + } else { + return ResponseData( + responseData['message'], ResponseStatus.FAILED); + } + } + return response; + } +} diff --git a/lib/view_model/RiskProfileApi/risk_profile_api.dart b/lib/view_model/RiskProfileApi/risk_profile_api.dart index fe5bcfb..3726185 100644 --- a/lib/view_model/RiskProfileApi/risk_profile_api.dart +++ b/lib/view_model/RiskProfileApi/risk_profile_api.dart @@ -28,7 +28,6 @@ class RiskProfileApi { final response = await NetworkApiServices().postApi( data, ApiUrls.addRiskProfileQuestionAnswerApi, - isAuth: true, ); log(response.data.toString()); if (response.status == ResponseStatus.SUCCESS) { diff --git a/pubspec.yaml b/pubspec.yaml index 3d37689..1f9325b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,4 +65,4 @@ flutter: - family: hiragino fonts: - - asset: assets/fonts/hiragino/Hiragino Sans GB W6.TTF + - asset: assets/fonts/hiragino/HiraginoInterface.ttc