import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:generp/Utils/commonServices.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../Models/crmModels/LeadDetailsResponse.dart'; import '../../Utils/app_colors.dart'; import '../../services/api_calling.dart'; import '../HomeScreenNotifier.dart'; class crmLeadDetailsProvider extends ChangeNotifier { bool _isLoading = false; bool _showMoreDetails = false; var _showEditButton; TextEditingController nameController = TextEditingController(); TextEditingController designationController = TextEditingController(); TextEditingController mobileNumberController = TextEditingController(); TextEditingController alternativeMobileController = TextEditingController(); TextEditingController telephoneController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController editNameController = TextEditingController(); TextEditingController editDesignationController = TextEditingController(); TextEditingController editMobileNumberController = TextEditingController(); TextEditingController editAlternativeMobileController = TextEditingController(); TextEditingController editTelephoneController = TextEditingController(); TextEditingController editEmailController = TextEditingController(); TextEditingController dateController = TextEditingController(); TextEditingController noteController = TextEditingController(); String? _nameError; String? _designationError; String? _mobileNumError; String? _altMobError; String? _teleError; String? _emailError; String? _noteError; String? _editNameError; String? _editDesignationError; String? _editMobileNumError; String? _editAltMobError; String? _editTeleError; String? _editEmailError; String? _dateError; LeadDetails _leadDetails = LeadDetails(); AccountDetails _accountDetails = AccountDetails(); List _leadProducts = []; List _contactDetails = []; List _followupDetails = []; List _appointmentDetails = []; List _quotationsDetails = []; List _visitTypes = []; String? _selectedVisitType; List _headings = []; List _subHeadings = []; DateTime? _date; String? _formattedDate; String? _visitTypeError = ""; get showEditButton => _showEditButton; String? get nameError => _nameError; String? get designationError => _designationError; String? get mobileNumError => _mobileNumError; String? get altMobError => _altMobError; String? get teleError => _teleError; String? get emailError => _emailError; String? get noteError => _noteError; String? get visitTypeError => _visitTypeError; String? get editNameError => _editNameError; String? get editDesignationError => _editDesignationError; String? get editMobileNumError => _editMobileNumError; String? get editAltMobError => _editAltMobError; String? get editTeleError => _editTeleError; String? get editEmailError => _editEmailError; String? get dateError => _dateError; bool get isLoading => _isLoading; bool get showMoreDetails => _showMoreDetails; List get visitTypes => _visitTypes; String? get selectedVisitType => _selectedVisitType; LeadDetails get leadDetails => _leadDetails; AccountDetails get accountDetails => _accountDetails; List get leadProducts => _leadProducts; List get contactDetails => _contactDetails; List get followupDetails => _followupDetails; List get appointmentDetails => _appointmentDetails; List get quotationsDetails => _quotationsDetails; // List get Headings => _headings; // // List get subHeadings => _subHeadings; String? get formattedDate => _formattedDate; set selectedVisitType(String? value){ _selectedVisitType = value; _visitTypeError = ""; notifyListeners(); } set nameError(String? value){ _nameError = value; notifyListeners(); } set designationError(String? value){ _designationError = value; notifyListeners(); } set mobileNumError(String? value){ _mobileNumError = value; notifyListeners(); } set altMobError(String? value){ _altMobError = value; notifyListeners(); } set teleError(String? value){ _teleError = value; notifyListeners(); } set emailError(String? value){ _emailError = value; notifyListeners(); } set noteError(String? value){ _noteError = value; notifyListeners(); } set editNameError(String? value){ _editNameError = value; notifyListeners(); } set editDesignationError(String? value){ _editDesignationError = value; notifyListeners(); } set editMobileNumError(String? value){ _editMobileNumError = value; notifyListeners(); } set editAltMobError(String? value){ _editAltMobError = value; notifyListeners(); } set editTeleError(String? value){ _editTeleError = value; notifyListeners(); } set editEmailError(String? value){ _editEmailError = value; notifyListeners(); } set isLoading(bool value){ _isLoading = value; notifyListeners(); } set showMoreDetails(bool value){ _showMoreDetails = value; notifyListeners(); } set formattedDate(String? value) { _formattedDate = value; dateController.text = _formattedDate!; _dateError = null; notifyListeners(); } set dateError(value){ _dateError = value; notifyListeners(); } void setDate(DateTime newDate) { _date = newDate; _formattedDate = DateFormat('yyyy-MM-dd').format(newDate); dateController.text = _formattedDate!; _dateError = null; notifyListeners(); } Future crmLeadDetailsAPIFunction(context, leadID, mode) async { try { var HomeProv = Provider.of(context, listen: false); final data = await ApiCalling.crmLeadDetailsAPI( HomeProv.empId, HomeProv.session, leadID, mode, ); _isLoading = true; notifyListeners(); if (data != null) { if(data.sessionExists==1){ if (data.error == "0") { print("calling"); _leadDetails = data.leadDetails!; _accountDetails = data.accountDetails!; _leadProducts = data.leadProducts!; _contactDetails = data.contactDetails!; _followupDetails = data.followupDetails!; _appointmentDetails = data.appointmentDetails!; _quotationsDetails = data.quotationsDetails!; _showEditButton = data.showEditAccountButton; _visitTypes = ["Phone","Visit"]; _isLoading = false; notifyListeners(); }else{ _isLoading = false; notifyListeners(); } }else{ sessionDoesNotExist(context); } }else{ _isLoading = false; notifyListeners(); } } catch (e, s) { _isLoading = false; notifyListeners(); } } Future crmLeadDetailsAddContactAPIFunction(context, accID) async { try { var prov = Provider.of(context, listen: false); final data = await ApiCalling.crmLeadDetailsAddContactAPI(prov.empId, prov.session, accID, nameController.text, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text); _isLoading = true; notifyListeners(); if (data != null) { if (data.error == "0") { Navigator.pop(context,true); resetAll(); _isLoading = false; notifyListeners(); }else{ _isLoading = false; notifyListeners(); } }else{ _isLoading = false; notifyListeners(); } } catch (e, s) { _isLoading = false; notifyListeners(); } } Future crmLeadDetailsEditContactAPIFunction(context,contactID) async { try { var prov = Provider.of(context, listen: false); final data = await ApiCalling.crmLeadDetailsEditContactAPI(prov.empId, prov.session, contactID, nameController.text, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text); _isLoading = true; notifyListeners(); if (data != null) { if (data.error == "0") { _isLoading = false; Navigator.pop(context,true); resetAll(); _isLoading = false; notifyListeners(); }else{ _isLoading = false; notifyListeners(); } }else{ _isLoading = false; notifyListeners(); } } catch (e, s) { _isLoading = false; notifyListeners(); } } Future crmCheckFields(context,value,type) async { try { var prov = Provider.of(context, listen: false); final data = await ApiCalling.crmCheckAccountFieldsApi(prov.empId, prov.session,value,type); if (data != null) { if (data.error == "0") { nameError = null; mobileNumError = null; altMobError = null; notifyListeners(); }else if(data.error=="1"){ if(type=="name"){ nameError = data.message!; }else if(type == 'mob1'){ mobileNumError = data.message!; }else if(type == 'mob2'){ altMobError = data.message!; } notifyListeners(); } }else{ notifyListeners(); } } catch (e, s) { notifyListeners(); } } Future crmLeadDetailsAddAppointmentAPIFunction(context, leadID, appointmentDate, appointmentType, note) async { try { var prov = Provider.of(context, listen: false); final data = await ApiCalling.crmLeadDetailsAddAppointmentAPI(prov.empId, prov.session, leadID, appointmentDate, appointmentType, note); _isLoading = true; notifyListeners(); if (data != null) { if (data.error == "0") { _isLoading = false; Navigator.pop(context,true); resetAll(); _isLoading = false; notifyListeners(); }else{ _isLoading = false; notifyListeners(); } }else{ _isLoading = false; notifyListeners(); } } catch (e, s) { _isLoading = false; notifyListeners(); } } void showDatePickerDialog(BuildContext context) { showCupertinoModalPopup( context: context, builder: (BuildContext context) => Container( height: 216, padding: const EdgeInsets.only(top: 6.0), margin: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom, ), color: CupertinoColors.systemBackground.resolveFrom(context), child: SafeArea( top: false, child: Column( children: [ Expanded( flex: 1, child: SizedBox( height: 40, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CupertinoButton( child: Text( 'Cancel', style: TextStyle(fontFamily: "JakartaMedium",color: AppColors.app_blue), ), onPressed: () { Navigator.pop(context); }, ), CupertinoButton( child: Text( 'Done', style: TextStyle(fontFamily: "JakartaMedium",color: AppColors.app_blue), ), onPressed: () { setDate(_date ?? DateTime.now() ); Navigator.pop(context); }, ), ], ), ), ), Expanded( flex: 3, child: CupertinoDatePicker( dateOrder: DatePickerDateOrder.dmy, initialDateTime: _date ?? DateTime.now(), mode: CupertinoDatePickerMode.date, use24hFormat: true, showDayOfWeek: true, onDateTimeChanged: (DateTime newDate) { setDate(newDate); }, ), ), ], ), ), ), ); } List> prepareExportData() { final headers = [ 'Company Name:', 'Contact Person Name:', 'Mobile Number:', 'Alternate Mobile Number:', 'Email ID:', 'Address:', 'Product:', 'Lead Received Date:', ]; final rows = [ leadDetails.name??"-", leadDetails.contName??"-", leadDetails.mob1??"-", leadDetails.mob2??"-", leadDetails.email??"-", leadDetails.address??"-", leadDetails.prod??"-", leadDetails.createdDatetime??"-", ].toList(); return [headers, rows]; } void copyToClipboard(BuildContext context) async { try { if (leadDetails == null) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("No data to copy")), ); return; } final data = prepareExportData(); // if (data.isEmpty || data[1].every((element) => element == "-")) { // ScaffoldMessenger.of(context).showSnackBar( // SnackBar(content: Text("No valid data to copy")), // ); // return; // } String raw = data.map((row) => row.join('\t')).join('\n'); print('Clipboard data: $raw'); await Clipboard.setData(ClipboardData(text: raw)); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Copied to Clipboard")), ); } catch (e) { print('Error copying to clipboard: $e'); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Failed to copy to clipboard")), ); } } void onChangeName(value){ _nameError = ""; notifyListeners(); } void onChangeDesignation(value){ _designationError = ""; notifyListeners(); } void onChangeMobile(value){ _mobileNumError = ""; notifyListeners(); } void onChangeAltMobile(value){ _altMobError = ""; notifyListeners(); } void onChangeTelephone(value){ _teleError = ""; notifyListeners(); } void onChangeEmailId(value){ _emailError = ""; notifyListeners(); } void onChangeEditName(value){ _editNameError = ""; notifyListeners(); } void onChangeEditDesignation(value){ _editDesignationError = ""; notifyListeners(); } void onChangeEditMobile(value){ _editMobileNumError = ""; notifyListeners(); } void onChangeEditAltMobile(value){ _editAltMobError = ""; notifyListeners(); } void onChangeEditTelephone(value){ _editTeleError = ""; notifyListeners(); } void onChangeEditEmailId(value){ _editEmailError = ""; notifyListeners(); } void onChangeNote(value){ _noteError = ""; notifyListeners(); } void resetAll(){ nameController.clear(); designationController.clear(); mobileNumberController.clear(); alternativeMobileController.clear(); telephoneController.clear(); emailController.clear(); editNameController.clear(); editDesignationController.clear(); editMobileNumberController.clear(); editAlternativeMobileController.clear(); editTelephoneController.clear(); editEmailController.clear(); _nameError = ""; _designationError = ""; _mobileNumError = ""; _altMobError = ""; _teleError = ""; _emailError = ""; _editNameError = ""; _editDesignationError = ""; _editMobileNumError = ""; _editAltMobError = ""; _editTeleError = ""; _editEmailError = ""; notifyListeners(); } }