From 7951d16f87f102f7eebc3bdd5bdd034fffe1046a Mon Sep 17 00:00:00 2001 From: Priya Chetiwal Date: Fri, 7 Feb 2025 01:29:03 +0530 Subject: [PATCH] latest code here --- lib/components/styles/app_strings.dart | 3 +- .../view/sub_views/generate_fright_bill.dart | 46 ++---- .../view/sub_views/pending_generation.dart | 14 +- .../view/sub_views/view_freight_bill.dart | 40 ++--- .../view_model/transport_controller.dart | 150 +++++------------- .../widgets/custom_pagination.dart | 4 +- lib/services/network/ApiUrls.dart | 42 +---- lib/services/network/post_request.dart | 38 ++++- 8 files changed, 116 insertions(+), 221 deletions(-) diff --git a/lib/components/styles/app_strings.dart b/lib/components/styles/app_strings.dart index 3ffbc6d..de982fd 100644 --- a/lib/components/styles/app_strings.dart +++ b/lib/components/styles/app_strings.dart @@ -57,8 +57,7 @@ class AppStrings { static const String cCNDate = "CCN Date"; static const String miroStatus = "Micro Status"; static const String gstHold = "GST Hold"; - static const String gstRelease = "If GST release this invoice" - " than required GST Payment Due & UTN Number"; + static const String gstRelease = "If GST release this invoice\nthan required GST Payment Due & UTN Number"; static const String utrNo = "UTR No."; static const String utrDate = "UTR Date"; static const String amount = "Amount"; diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart b/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart index ac2eaff..982305e 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart @@ -299,32 +299,9 @@ class GenerateFrightBill extends StatelessWidget { height: 30, width: 100, text: AppStrings.submit, - // clickAction: () { - // // controller.postData(); - // controller.handleFilterSubmit(); - // }, clickAction: () => controller .handleFilterSubmitGenerateFreight(), ), - // CommonButton( - // borderRadius: 4, - // height: 30, - // width: 100, - // text: AppStrings.submit, - // clickAction: () { - // controller.validateFields(); - // - // if (controller.showPlantError.value || - // controller.showProductError.value || - // controller.showTransactionError.value - // ) { - // print('controller.showProductError.value ${controller.showProductError.value}'); - // - // } else { - // controller.postData(); - // } - // }, - // ), ], ), ), @@ -349,14 +326,12 @@ class GenerateFrightBill extends StatelessWidget { color: AppColors.primaryClr, ))); } - if (controller.errorMessage.isNotEmpty) { return SizedBox( height: MediaQuery.sizeOf(context).height * 0.6, width: MediaQuery.sizeOf(context).width, child: Center(child: Text(controller.errorMessage.value))); } - if (controller.grnDetails.isEmpty) { return SizedBox( height: controller.isFilterVisibleGenerateFreight.value @@ -443,7 +418,7 @@ class GenerateFrightBill extends StatelessWidget { scrollDirection: Axis.horizontal, controller: controller.horizontalScrollController, child: Container( - margin: EdgeInsets.only(bottom: 24, right: 24), + margin: EdgeInsets.only(bottom: 24), decoration: BoxDecoration( border: Border.all( color: Colors.grey.shade400, @@ -469,17 +444,15 @@ class GenerateFrightBill extends StatelessWidget { DataColumn( label: Transform.scale( scale: 0.80, - // Adjust this scale to make the checkbox bigger or smaller child: Checkbox( value: controller.selectAllField.value, - onChanged: (value) { controller.selectAll(value ?? false); }, activeColor: AppColors.primaryClr, checkColor: Colors.white, materialTapTargetSize: MaterialTapTargetSize - .shrinkWrap, // Avoids large tap area + .shrinkWrap, ), ), ), @@ -502,7 +475,6 @@ class GenerateFrightBill extends StatelessWidget { rows: List.generate( controller.grnDetails.length, (index) { final stoppage = controller.grnDetails[index]; - return DataRow( selected: stoppage.isSelected, cells: [ @@ -565,16 +537,16 @@ class GenerateFrightBill extends StatelessWidget { ), ), ), + CustomPagination( + currentPage: controller.currentPageViewFreight.value + 1, + totalPages: controller.totalPagesViewFreight.value, + onPageChanged: (page) { + controller.viewFreightView(page: page - 1); + }, + ), ], ); }), - CustomPagination( - currentPage: controller.currentPage.value, - totalPages: controller.totalPages.value, - onPageChanged: (int page) { - controller.onPageChanged(page); - }, - ), ], ); } diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart b/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart index 4a36bad..9756129 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart @@ -524,13 +524,13 @@ class PendingGeneration extends StatelessWidget { ], ); }), - CustomPagination( - currentPage: controller.currentPage.value, - totalPages: controller.totalPages.value, - onPageChanged: (int page) { - controller.onPageChanged(page); - }, - ), + // CustomPagination( + // currentPage: controller.currentPage.value, + // totalPages: controller.totalPages.value, + // onPageChanged: (int page) { + // // controller.onPageChanged(page); + // }, + // ), ], ); } diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart b/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart index ac69d75..770e344 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart @@ -22,10 +22,12 @@ class ViewFreightBill extends StatelessWidget { @override Widget build(BuildContext context) { return Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, children: [ Obx(() => controller.isFilterVisibleViewFreight.value ? Container( - padding: EdgeInsets.all(16), + padding: EdgeInsets.symmetric(vertical: 10,horizontal: 16), color: AppColors.clrF2, child: Column( mainAxisAlignment: MainAxisAlignment.start, @@ -144,7 +146,7 @@ class ViewFreightBill extends StatelessWidget { ), Padding( padding: - const EdgeInsets.only(top: 16.0, left: 0, right: 8), + const EdgeInsets.only(top: 0.0, left: 0, right: 8), child: Row( children: [ Expanded( @@ -306,7 +308,7 @@ class ViewFreightBill extends StatelessWidget { Obx(() { if (controller.freightViewLoader.value) { return SizedBox( - height: MediaQuery.sizeOf(context).height * 0.6, + height: MediaQuery.sizeOf(context).height * 0.64, width: MediaQuery.sizeOf(context).width, child: Center( child: CircularProgressIndicator( @@ -318,7 +320,7 @@ class ViewFreightBill extends StatelessWidget { if (controller.errorMessage.isNotEmpty) { return SizedBox( - height: MediaQuery.sizeOf(context).height * 0.6, + height: MediaQuery.sizeOf(context).height * 0.64, width: MediaQuery.sizeOf(context).width, child: Center(child: Text(controller.errorMessage.value))); } @@ -328,7 +330,7 @@ class ViewFreightBill extends StatelessWidget { return SizedBox( height: controller.isFilterVisibleViewFreight.value ? MediaQuery.sizeOf(context).height * 0.4 - : MediaQuery.sizeOf(context).height * 0.6, + : MediaQuery.sizeOf(context).height * 0.64, width: MediaQuery.sizeOf(context).width, child: Center( child: Text( @@ -344,7 +346,7 @@ class ViewFreightBill extends StatelessWidget { Container( margin: EdgeInsets.only(bottom: 16, top: 16), height: controller.isFilterVisibleViewFreight.value == true - ? MediaQuery.of(context).size.height * 0.4 + ? MediaQuery.of(context).size.height * 0.36 : MediaQuery.of(context).size.height * 0.64, child: RawScrollbar( thumbColor: AppColors.clrD9, @@ -366,7 +368,7 @@ class ViewFreightBill extends StatelessWidget { scrollDirection: Axis.horizontal, controller: controller.horizontalScrollController, child: Container( - margin: EdgeInsets.only(bottom: 24, right: 24), + margin: EdgeInsets.only(bottom: 24), decoration: BoxDecoration( border: Border.all( color: Colors.grey.shade400, @@ -440,10 +442,10 @@ class ViewFreightBill extends StatelessWidget { freightBill.freightbillCode ?? ""; return DataRow( cells: [ - editableCell( - index, "${freightBill.plantCode}-${freightBill.plantDesc}"), - editableCell( - index, "${freightBill.materialCode}-${freightBill.materialDescription}"), + editableCell(index, + "${freightBill.plantCode}-${freightBill.plantDesc}"), + editableCell(index, + "${freightBill.materialCode}-${freightBill.materialDescription}"), editableCell( index, freightBill.freightbillCode ?? "-", @@ -535,16 +537,16 @@ class ViewFreightBill extends StatelessWidget { ), ), ), + CustomPagination( + currentPage: controller.currentPageViewFreight.value + 1, + totalPages: controller.totalPagesViewFreight.value, + onPageChanged: (page) { + controller.viewFreightView(page: page - 1); + }, + ), ], ); }), - CustomPagination( - currentPage: controller.currentPage.value, - totalPages: controller.totalPages.value, - onPageChanged: (int page) { - controller.onPageChanged(page); - }, - ), ], ); } @@ -739,5 +741,3 @@ class ViewFreightBill extends StatelessWidget { ); } } - - diff --git a/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart b/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart index a85187f..92420e3 100644 --- a/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart +++ b/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:shayog/components/styles/app_images.dart'; @@ -7,7 +5,6 @@ import 'package:shayog/feature/presentation/screens/transporter/model/sub_freigh import 'package:shayog/services/network/get_requests.dart'; import '../../../../../../components/common/common_model.dart'; import '../../../../../../components/styles/app_strings.dart'; - import '../../../../../../services/model/generate_freight_model.dart'; import '../../../../../../services/network/post_request.dart'; import '../model/freightbill_res_model.dart'; @@ -45,7 +42,6 @@ class TransportController extends GetxController { var selectTransactionTypePending = ''.obs; // for view FreightBill - RxString selectPlantViewFreight = ''.obs; var selectProductViewFreight = ''.obs; var selectLocationViewFreight = ''.obs; @@ -165,28 +161,24 @@ class TransportController extends GetxController { postData(); } - getInvoiceView() async { try { invoiceViewLoader.value = true; Map requestBody = { - "invoice_id":"", - "freightBillNo":"", - "invFromDate":"", - "invToDate":"", - "freightFromDate":"", - "freightToDate":"" + "invoice_id": "", + "freightBillNo": "", + "invFromDate": "", + "invToDate": "", + "freightFromDate": "", + "freightToDate": "" }; var response = await PostRequests.getInvoice(requestBody); if (response != null) { List flattenedContent = - response.content!.expand((list) => list).toList(); + response.content.expand((list) => list).toList(); getInvoiceData.assignAll(flattenedContent); - // print("response from${getInvoiceData[0].freightbillCode.runtimeType} view freight bill ${freightBillData[0].plantCode.runtimeType} and ${freightBillData[0].materialCode.runtimeType} and}"); - totalPages.value = response.totalPages ?? 0; - totalElements.value = response.totalElements ?? 0; print('res from invoice ${response.toString()}'); } } finally { @@ -226,7 +218,6 @@ class TransportController extends GetxController { postData() async { try { isLoading.value = true; - Map requestBody = { "plant": "", "productNane": "", @@ -235,7 +226,6 @@ class TransportController extends GetxController { "grnFromDate": "", "grnToDate": "" }; - var response = await PostRequests.addFreightBill(requestBody); if (response != null) { List flattenedContent = @@ -291,17 +281,6 @@ class TransportController extends GetxController { } } - // void handleFilterSubmit() { - // validateFieldsGenerateFreight(); - // - // if (showPlantError.value || - // showProductError.value || - // showTransactionError.value) { - // print('show errr'); - // } else { - // postData(); - // } - // } void handleFilterSubmitGenerateFreight() { validateFieldsGenerateFreight(); if (selectPlantFreight.value.isEmpty || @@ -387,8 +366,6 @@ class TransportController extends GetxController { getSubFreightBillsView() async { try { isLoading.value = true; - print('Getting details for freight bill: ${freightBillCode.value}'); - var response = await GetRequests.subViewFreightDialog(freightBillCode.value); if (response != null) { @@ -462,12 +439,7 @@ class TransportController extends GetxController { "status_id": grn.statusId }) .toList(); - - // Only send the selected data in the request body var response = await PostRequests.freightBill(selectedGrns); - - print("Selected GRNs>>>$selectedGrns"); - if (response != null) { freightBillNo.value = response.freightBillNo ?? ""; grnList.assignAll(response.grn ?? []); @@ -480,16 +452,17 @@ class TransportController extends GetxController { ////////////////////////////////////////// PRIYA /////////////////////////////////////////////// var freightBillData = [].obs; - var totalElements = 0.obs; + var totalElementsViewFreight = 0.obs; var pageSize = 2.obs; var sortField = "grn_date".obs; var sortDirection = "desc".obs; - RxInt currentPage = 1.obs; - RxInt totalPages = 3.obs; + RxInt currentPageViewFreight = 1.obs; + RxInt totalPagesViewFreight = 3.obs; final int limit = 10; - viewFreightView() async { + + viewFreightView({int page = 0}) async { try { freightViewLoader.value = true; @@ -503,40 +476,22 @@ class TransportController extends GetxController { "grnToDate": "", }; - var response = await PostRequests.viewFreightBill(requestBody); + var response = await PostRequests.viewFreightBill( + page: page, size: 4, requestBody: requestBody); + if (response != null) { List flattenedContent = response.content!.expand((list) => list).toList(); freightBillData.assignAll(flattenedContent); - print( - "response from${freightBillData[0].freightbillCode.runtimeType} view freight bill ${freightBillData[0].plantCode.runtimeType} and ${freightBillData[0].materialCode.runtimeType} and}"); - totalPages.value = response.totalPages ?? 0; - totalElements.value = response.totalElements ?? 0; + totalPagesViewFreight.value = response.totalPages ?? 0; + totalElementsViewFreight.value = response.totalElements ?? 0; + currentPageViewFreight.value = page; } } finally { freightViewLoader.value = false; } } - void nextPage() { - if (currentPage.value < totalPages.value) { - currentPage.value++; - viewFreightView(); // Fetch data for the next page - } - } - - void previousPage() { - if (currentPage.value > 1) { - currentPage.value--; - viewFreightView(); // Fetch data for the previous page - } - } - - void onPageChanged(int page) { - currentPage.value = page; - viewFreightView(); // Fetch data for the selected page - } - void changeSort(String field) { if (field == sortField.value) { sortDirection.value = sortDirection.value == "asc" ? "desc" : "asc"; @@ -544,7 +499,6 @@ class TransportController extends GetxController { sortField.value = field; sortDirection.value = "desc"; } - } var grnPendingData = [].obs; @@ -577,9 +531,10 @@ class TransportController extends GetxController { } } - void displayFilteredDataFromViewFreight() async { + void displayFilteredDataFromViewFreight({int page = 0, int size = 4}) async { try { freightViewLoader.value = true; + Map requestBody = { "plant": selectPlantViewFreight.value, "productNane": selectProductViewFreight.value, @@ -590,66 +545,37 @@ class TransportController extends GetxController { "grnToDate": "", }; - print("Filter request - Plant: ${selectPlantViewFreight.value}, " - "Product: ${selectProductViewFreight.value}, " - "Freight Bill: ${selectFreightBillValidate.value}"); + print("🔎 Filter Request - Page: $page, Size: $size, Plant: ${selectPlantViewFreight.value}, " + "Product: ${selectProductViewFreight.value}, Freight Bill: ${selectFreightBillValidate.value}"); - var response = await PostRequests.viewFreightBill(requestBody); + var response = await PostRequests.viewFreightBill( + page: page, size: size, requestBody: requestBody); // Pass pagination - if (response != null) { + if (response != null && response.content != null) { List flattenedContent = - response.content!.expand((list) => list).toList(); + response.content!.expand((list) => list).toList(); - print("Total records before filtering: ${flattenedContent.length}"); + print("📌 Total records received: ${flattenedContent.length}"); - // Log sample data for debugging if available - if (flattenedContent.isNotEmpty) { - print("Sample data - Plant: ${flattenedContent[0].plantCode}, " - "Material: ${flattenedContent[0].materialCode}, " - "Freight Bill: ${flattenedContent[0].freightbillCode}"); + if (page == 0) { + freightBillData.assignAll(flattenedContent); // First page: Replace data + } else { + freightBillData.addAll(flattenedContent); // Next pages: Append data } - List filteredData = flattenedContent.where((item) { - // Plant filter - bool plantMatch = selectPlantViewFreight.value.isEmpty || - item.plantCode.toString().toLowerCase() == - selectPlantViewFreight.value.toLowerCase(); + // Update pagination details + totalPagesViewFreight.value = response.totalPages ?? 0; + totalElementsViewFreight.value = response.totalElements ?? 0; + currentPageViewFreight.value = page; - // Product filter - bool productMatch = selectProductViewFreight.value.isEmpty || - item.materialCode.toString().toLowerCase() == - selectProductViewFreight.value.toLowerCase(); - - // Freight bill filter - bool freightBillMatch = selectFreightBillValidate.value.isEmpty || - item.freightbillCode.toString().toLowerCase() == - selectFreightBillValidate.value.toLowerCase(); - - // Debug logging for filter matches - print("Filter matches for item ${item.freightbillCode}:" - "\nPlant Match: $plantMatch (${item.plantCode} vs ${selectPlantViewFreight.value})" - "\nProduct Match: $productMatch (${item.materialCode} vs ${selectProductViewFreight.value})" - "\nFreight Bill Match: $freightBillMatch (${item.freightbillCode} vs ${selectFreightBillValidate.value})"); - - return plantMatch && productMatch && freightBillMatch; - }).toList(); - - print("Filtered records count: ${filteredData.length}"); - - freightBillData.assignAll(filteredData); - - // Update pagination values - totalPages.value = response.totalPages ?? 0; - totalElements.value = response.totalElements ?? 0; - - print("✅ Freight bill data filtered successfully"); + print("✅ Freight bill data filtered & paginated successfully"); } else { print("❌ No response received from API"); - freightBillData.clear(); + if (page == 0) freightBillData.clear(); } } catch (e) { print("❌ Error in displayFilteredDataFromViewFreight: $e"); - freightBillData.clear(); + if (page == 0) freightBillData.clear(); } finally { freightViewLoader.value = false; } diff --git a/lib/feature/presentation/widgets/custom_pagination.dart b/lib/feature/presentation/widgets/custom_pagination.dart index cf43ff4..89c132f 100644 --- a/lib/feature/presentation/widgets/custom_pagination.dart +++ b/lib/feature/presentation/widgets/custom_pagination.dart @@ -3,7 +3,8 @@ import 'package:shayog/components/styles/textStyles.dart'; import 'dart:math' as math; import '../../../components/styles/app_colors.dart'; -class CustomPagination extends StatelessWidget { +class +CustomPagination extends StatelessWidget { final int currentPage; final int totalPages; final Function(int) onPageChanged; @@ -18,7 +19,6 @@ class CustomPagination extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.symmetric(vertical: 2.0), decoration: BoxDecoration( color: AppColors.clrF2, diff --git a/lib/services/network/ApiUrls.dart b/lib/services/network/ApiUrls.dart index 226d85b..b81a163 100644 --- a/lib/services/network/ApiUrls.dart +++ b/lib/services/network/ApiUrls.dart @@ -1,8 +1,6 @@ class ApiUrls { ApiUrls._(); - static const String baseUrl = "http://46.28.44.130:9092/"; - static const addFreightBill = 'bill/grndetails?page=0&size=20&sort=grn_date,desc'; static const getFreightBills = 'bill/dropdown'; @@ -15,7 +13,7 @@ class ApiUrls { static const getAllUser = 'http://46.28.44.130:9093/api/users/userdetails?page='; static const viewFreightBill = - 'http://46.28.44.130:9092/bill/freightbill?page=0&size=15&sort=last_updated_on,desc'; + 'http://46.28.44.130:9092/bill/freightbill?page='; static const addUserType = 'http://46.28.44.130:9093/api/user-types/createUserType'; static const dropDownList = @@ -38,40 +36,4 @@ class ApiUrls { static const viewSubDetailsOfViewFreightBill = "http://46.28.44.130:9092/bill/grndetailsByFreightBill?freightBillCode="; static const getInvoiceDetails = "http://46.28.44.130:9092/invoice/getInvoice"; } -// class ApiUrls { -// ApiUrls._(); -// -// static const String baseUrl = "http://localhost:9092/"; -// -// static const addFreightBill = -// 'bill/grndetails?page=0&size=20&sort=grn_date,desc'; -// static const getFreightBills = 'bill/dropdown'; -// static const generateFreightBill = -// 'http://localhost:9092/bill/addFreightBill'; -// static const createUser = 'http://localhost:9093/api/users/createUser'; -// static const editUser = -// 'http://localhost:9093/api/users/update?userEmpTransCode='; -// static const getAllUser = -// 'http://localhost:9093/api/users/userdetails?page='; -// static const viewFreightBill = -// 'http://localhost:9092/bill/freightbill?page'; -// static const addUserType = -// 'http://localhost:9093/api/user-types/createUserType'; -// static const dropDownList = -// 'http://localhost:9093/api/user-roles/userrole_dropdown'; -// static const plantMapping = 'http://localhost:9093/userplant/fetchPlants'; -// static const checkStatus = -// 'http://localhost:9093/api/user-types/update-status/'; -// static const getInternalUserDropdown = -// 'http://localhost:9093/api/user-roles/userrole_dropdown'; -// static const fetchEmailsAndEmpCode = -// 'http://localhost:9093/api/user-roles/fetchRoles'; -// static const selectAndAssignRole = -// "http://localhost:9093/api/user-roles/assignRoles"; -// static const assignPlantRole = -// "http://localhost:9093/userplant/assignPlants"; -// static const userTypeDetails = -// "http://localhost:9093/api/user-types/usertypedetails?page=0&size=15&sort=last_updated_on,desc"; -// static const grnPendingDetails = -// "http://localhost:9092/bill/grndetailsPanding?page=0&size=20&sort=grn_date,desc"; -// } + diff --git a/lib/services/network/post_request.dart b/lib/services/network/post_request.dart index cc88f6f..99bcec9 100644 --- a/lib/services/network/post_request.dart +++ b/lib/services/network/post_request.dart @@ -20,6 +20,8 @@ class PostRequests { PostRequests._(); static Future addFreightBill( + + Map requestBody) async { var apiResponse = await RemoteService.simplePost(requestBody, ApiUrls.addFreightBill); @@ -103,7 +105,7 @@ class PostRequests { } } - static Future viewFreightBill( + static Future viewFreightBillF( Map requestBody, ) async { var apiResponse = await RemoteService.postUser(requestBody, @@ -115,6 +117,40 @@ class PostRequests { return null; } } + static Future viewFreightBill({ + int page = 0, + int size = 15, + String sort = 'last_updated_on,desc', + Map? requestBody, + }) async { + // Construct dynamic URL with query parameters + String url = 'http://46.28.44.130:9092/bill/freightbill' + '?page=$page&size=$size&sort=$sort'; + + try { + var apiResponse = await RemoteService.postUser( + requestBody ?? {}, // Use empty map if no request body + url + ); + + if (apiResponse == null) return null; + if (apiResponse.response == null || apiResponse.response!.isEmpty) { + print('Empty response received'); + return null; + } + + try { + return viewFreightBillResModelFromJson(apiResponse.response!); + } catch (e) { + print('JSON Parsing Error: $e'); + print('Problematic JSON: ${apiResponse.response}'); + return null; + } + } catch (e) { + print('API Call Error: $e'); + return null; + } + } static Future addUserType( Map requestBody) async {