From f241bbc784904767fd312845e66e6daf3c01cfd8 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 6 Aug 2025 11:03:19 +0200 Subject: [PATCH] use country copde picker and set contatc no field to number only --- .../components/mih_business_info_card.dart | 3 +- .../package_tools/mih_business_details.dart | 163 +++++++++++++----- .../profile_business_add.dart | 96 ++++++++--- 3 files changed, 193 insertions(+), 69 deletions(-) diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart index 6ef8bbdc..3ca50400 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart @@ -40,7 +40,8 @@ class _MihBusinessCardState extends State { } Future _makePhoneCall(String phoneNumber) async { - final Uri url = Uri(scheme: 'tel', path: phoneNumber); + String formattedNumber = phoneNumber.replaceAll("-", ""); + final Uri url = Uri(scheme: 'tel', path: formattedNumber); if (await canLaunchUrl(url)) { await launchUrl(url); } else { diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart index 73a5b163..db5e6c5f 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart @@ -1,3 +1,4 @@ +import 'package:country_code_picker/country_code_picker.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; @@ -44,6 +45,7 @@ class _MihBusinessDetailsState extends State { final typeController = TextEditingController(); final practiceNoController = TextEditingController(); final vatNoController = TextEditingController(); + final countryCodeController = TextEditingController(); final contactController = TextEditingController(); final emailController = TextEditingController(); final locationController = TextEditingController(); @@ -65,7 +67,8 @@ class _MihBusinessDetailsState extends State { practiceNoController.text, vatNoController.text, emailController.text, - contactController.text, + getNumberWithCountryCode(), + // contactController.text, locationController.text, fileNameController.text, websiteController.text, @@ -196,6 +199,34 @@ class _MihBusinessDetailsState extends State { } } + void setContactNumberControllers() { + if (widget.arguments.business!.contact_no[0] == "+") { + List contactDetails = + widget.arguments.business!.contact_no.split("-"); + setState(() { + countryCodeController.text = contactDetails[0]; + contactController.text = contactDetails[1]; + }); + } else { + setState(() { + countryCodeController.text = "+27"; + contactController.text = widget.arguments.business!.contact_no; + }); + } + } + + String getNumberWithCountryCode() { + String numberWithoutBeginingZero = ""; + if (contactController.text[0] == "0") { + numberWithoutBeginingZero = contactController.text + .replaceAll(" ", "") + .substring(1, contactController.text.length); + } else { + numberWithoutBeginingZero = contactController.text.replaceAll("-", " "); + } + return "${countryCodeController.text}-$numberWithoutBeginingZero"; + } + void editBizProfileWindow(double width) { showDialog( context: context, @@ -204,6 +235,7 @@ class _MihBusinessDetailsState extends State { windowTitle: 'Edit Profile', onWindowTapClose: () { Navigator.of(context).pop(); + resetControllers(); }, windowBody: MihSingleChildScroll( child: Padding( @@ -302,20 +334,61 @@ class _MihBusinessDetailsState extends State { }, ), const SizedBox(height: 10), - MihTextFormField( - fillColor: MzansiInnovationHub.of(context)! - .theme - .secondaryColor(), - inputColor: MzansiInnovationHub.of(context)! - .theme - .primaryColor(), - controller: contactController, - multiLineInput: false, - requiredText: true, - hintText: "Contact Number", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, + Container( + width: 300, + alignment: Alignment.topLeft, + child: const Text( + "Contact Number:", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + CountryCodePicker( + padding: EdgeInsetsGeometry.all(0), + onChanged: (selectedCode) { + setState(() { + countryCodeController.text = + selectedCode.toString(); + }); + debugPrint( + "Selected Country Code: ${countryCodeController.text}"); + }, + initialSelection: countryCodeController.text, + showDropDownButton: false, + pickerStyle: PickerStyle.bottomSheet, + dialogBackgroundColor: + MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + barrierColor: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + ), + Expanded( + child: MihTextFormField( + fillColor: MzansiInnovationHub.of(context)! + .theme + .secondaryColor(), + inputColor: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + controller: contactController, + numberMode: true, + multiLineInput: false, + requiredText: true, + hintText: null, + validator: (value) { + return MihValidationServices() + .isEmpty(value); + }, + ), + ), + ], ), const SizedBox(height: 10), MihTextFormField( @@ -395,7 +468,8 @@ class _MihBusinessDetailsState extends State { requiredText: false, hintText: "Registration No.", validator: (value) { - return MihValidationServices().isEmpty(value); + // return MihValidationServices().isEmpty(value); + return null; }, ), const SizedBox(height: 10), @@ -427,7 +501,8 @@ class _MihBusinessDetailsState extends State { requiredText: false, hintText: "VAT Number", validator: (value) { - return MihValidationServices().isEmpty(value); + // return MihValidationServices().isEmpty(value); + return null; }, ), const SizedBox(height: 10), @@ -535,6 +610,34 @@ class _MihBusinessDetailsState extends State { } } + void resetControllers() { + setState(() { + fileNameController.text = + widget.arguments.business!.logo_path.split("/").last; + regController.text = widget.arguments.business!.registration_no; + nameController.text = widget.arguments.business!.Name; + typeController.text = widget.arguments.business!.type; + practiceNoController.text = widget.arguments.business!.practice_no; + vatNoController.text = widget.arguments.business!.vat_no; + emailController.text = widget.arguments.business!.bus_email; + locationController.text = widget.arguments.business!.gps_location; + websiteController.text = widget.arguments.business!.website; + ratingController.text = widget.arguments.business!.rating; + missionVisionController.text = widget.arguments.business!.mission_vision; + }); + setContactNumberControllers(); + if (AppEnviroment.getEnv() == "Prod") { + env = "Prod"; + } else { + env = "Dev"; + } + missionVisionController.addListener(() { + setState(() { + _counter.value = missionVisionController.text.characters.length; + }); + }); + } + @override void dispose() { super.dispose(); @@ -556,31 +659,7 @@ class _MihBusinessDetailsState extends State { @override void initState() { super.initState(); - setState(() { - fileNameController.text = - widget.arguments.business!.logo_path.split("/").last; - regController.text = widget.arguments.business!.registration_no; - nameController.text = widget.arguments.business!.Name; - typeController.text = widget.arguments.business!.type; - practiceNoController.text = widget.arguments.business!.practice_no; - vatNoController.text = widget.arguments.business!.vat_no; - contactController.text = widget.arguments.business!.contact_no; - emailController.text = widget.arguments.business!.bus_email; - locationController.text = widget.arguments.business!.gps_location; - websiteController.text = widget.arguments.business!.website; - ratingController.text = widget.arguments.business!.rating; - missionVisionController.text = widget.arguments.business!.mission_vision; - }); - if (AppEnviroment.getEnv() == "Prod") { - env = "Prod"; - } else { - env = "Dev"; - } - missionVisionController.addListener(() { - setState(() { - _counter.value = missionVisionController.text.characters.length; - }); - }); + resetControllers(); } @override diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/profile_business_add.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/profile_business_add.dart index 316b7614..90997c3a 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/profile_business_add.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/profile_business_add.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:country_code_picker/country_code_picker.dart'; import 'package:http/http.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; @@ -51,6 +52,7 @@ class _ProfileBusinessAddState extends State { final titleController = TextEditingController(); final signtureController = TextEditingController(); final accessController = TextEditingController(); + final countryCodeController = TextEditingController(); final contactController = TextEditingController(); final emailController = TextEditingController(); final locationController = TextEditingController(); @@ -124,7 +126,8 @@ class _ProfileBusinessAddState extends State { practiceNoController.text, vatNoController.text, emailController.text, - contactController.text, + getNumberWithCountryCode(), + // "${countryCodeController.text}-${contactController.text}", locationController.text, logonameController.text, websiteController.text, @@ -141,6 +144,18 @@ class _ProfileBusinessAddState extends State { } } + String getNumberWithCountryCode() { + String numberWithoutBeginingZero = ""; + if (contactController.text[0] == "0") { + numberWithoutBeginingZero = contactController.text + .replaceAll(" ", "") + .substring(1, contactController.text.length); + } else { + numberWithoutBeginingZero = contactController.text.replaceAll("-", " "); + } + return "${countryCodeController.text}-$numberWithoutBeginingZero"; + } + void internetConnectionPopUp() { showDialog( context: context, @@ -319,17 +334,6 @@ class _ProfileBusinessAddState extends State { return MihValidationServices().isEmpty(value); }, ), - // MihDropdownField( - // controller: typeController, - // hintText: "Business Type", - // dropdownOptions: const ["Doctors Office", "Other"], - // editable: true, - // enableSearch: true, - // validator: (value) { - // return MihValidationServices().isEmpty(value); - // }, - // requiredText: true, - // ), const SizedBox(height: 10.0), MihTextFormField( fillColor: MzansiInnovationHub.of(context)! @@ -347,20 +351,60 @@ class _ProfileBusinessAddState extends State { }, ), const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MzansiInnovationHub.of(context)! - .theme - .secondaryColor(), - inputColor: MzansiInnovationHub.of(context)! - .theme - .primaryColor(), - controller: contactController, - multiLineInput: false, - requiredText: true, - hintText: "Contact Number", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, + Container( + width: 300, + alignment: Alignment.topLeft, + child: const Text( + "Contact Number:", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + CountryCodePicker( + padding: EdgeInsetsGeometry.all(0), + onChanged: (selectedCode) { + setState(() { + countryCodeController.text = + selectedCode.toString(); + }); + debugPrint( + "Selected Country Code: ${countryCodeController.text}"); + }, + initialSelection: '+27', + showDropDownButton: false, + pickerStyle: PickerStyle.bottomSheet, + dialogBackgroundColor: + MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + barrierColor: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + ), + Expanded( + child: MihTextFormField( + fillColor: MzansiInnovationHub.of(context)! + .theme + .secondaryColor(), + inputColor: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + controller: contactController, + numberMode: true, + multiLineInput: false, + requiredText: true, + hintText: null, + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + ), + ], ), const SizedBox(height: 10.0), MihTextFormField(