import 'dart:io'; import 'package:wanisdriver/config/custom_loader.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; import '../Provider/RideOptionProvider.dart'; import '../Provider/SignUp_provider.dart'; import '../Provider/TaxiOptionProvider.dart'; import '../config/AppSnackbar.dart'; import '../services/pickSingleImage.dart'; import '../utils/colors.dart'; import '../widgets/AllowedItemsSelectorWidget.dart'; import '../widgets/CustomTextFieldWidget.dart'; import '../widgets/TaxiTypeSelectorWidget.dart'; import '../widgets/SingleImagePickerWidget.dart'; import '../widgets/MultipleImagePickerWidget.dart'; import '../widgets/custom_button.dart'; import '../widgets/custom_text.dart'; import 'SignUpScreenCommerciale.dart'; class SignUpScreenVehicle extends StatefulWidget { const SignUpScreenVehicle({super.key}); @override State createState() => _SignUpScreenVehicleState(); } class _SignUpScreenVehicleState extends State { // Lists that would come from API // final List _allowedItems = [ // 'Pets', // 'Large Baggage', // 'Small Baggage', // 'Food & Drinks', // 'Musical Instruments', // 'Sports Equipment', // 'Child Seats Available', // 'Wheelchair Accessible' // ]; final plateNumberFirstPartController = TextEditingController(); final plateNumberLastPartController = TextEditingController(); final taxiIdTwoController = TextEditingController(); final taxiIdForeController = TextEditingController(); Future _pickMultipleImages(int index, SignUpProvider provider) async { final ImagePicker picker = ImagePicker(); final XFile? pickedFile = await picker.pickImage(source: ImageSource.gallery); if (pickedFile != null) { provider.setVehicleImage(index, File(pickedFile.path)); } } // Single image picker function for documents /* Future ImagePickerService().pickSingleImage({ required SignUpProvider provider, required String type, }) async { final ImagePicker picker = ImagePicker(); final XFile? pickedFile = await picker.pickImage(source: ImageSource.gallery); if (pickedFile != null) { final file = File(pickedFile.path); switch (type) { case 'insurance': provider.setInsuranceFile(file); break; case 'plateNumber': provider.setPlateNumberFile(file); break; case 'idTaxi': provider.setIdTaxiFile(file); break; } } } */ Widget buildSectionTitle(String title) { return Text( title, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w600, ), ); } @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of(context, listen: false).loadTaxiOption(); Provider.of(context, listen: false).loadRideOption(); }); } @override Widget build(BuildContext context) { final taxiOptionProvider = context.watch(); final rideOptionProvider = context.watch(); final provider = Provider.of(context, listen: false); plateNumberFirstPartController.text = provider.plateNumberfirstPart ?? ''; plateNumberLastPartController.text = provider.plateNumberLastPart ?? ''; taxiIdTwoController.text = provider.taxiIdFirst ?? ''; taxiIdForeController.text = provider.taxiIdLast ?? ''; return Consumer( builder: (context, provider, child) { return Scaffold( appBar: AppBar( title: const Txt(text: 'Taxi Information', style: TextStyle()), elevation: 0.5, ), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTextFieldWidget( controller: plateNumberFirstPartController, label: '123', icon: Icons.abc, isPassword: false, keybordType: TextInputType.number, isRequired: true, ), ), const Text( "TN", style: TextStyle(fontSize: 19, fontWeight: FontWeight.bold), ), Expanded( child: CustomTextFieldWidget( controller: plateNumberLastPartController, label: '1234', icon: Icons.abc_outlined, isPassword: false, keybordType: TextInputType.number, isRequired: true, ), ), ], ), /*SingleImagePicker( image: provider.plateNumberFile, onImagePick: () => ImagePickerService().pickSingleImage( provider: provider, type: 'plateNumber', ), title: 'Taxi Plate Number', subtitle: 'Upload a clear photo of your license plate', ),*/ const SizedBox(height: 24), SingleImagePicker( image: provider.carLicenseFile, onImagePick: () => ImagePickerService().pickSingleImage( provider: provider, type: 'carlicense', ), title: 'Car license', subtitle: 'Upload a clear photo of your car license document', required: true, ), const SizedBox(height: 24), Row( children: [ Flexible( flex: 2, child: CustomTextFieldWidget( controller: taxiIdTwoController, label: '12', icon: Icons.security_sharp, isPassword: false, keybordType: TextInputType.number, isRequired: true, ), ), Flexible( flex: 3, child: CustomTextFieldWidget( controller: taxiIdForeController, label: '1234', icon: Icons.security_sharp, isPassword: false, keybordType: TextInputType.number, isRequired: true, ), ), ], ), const SizedBox(height: 24), SingleImagePicker( image: provider.taxiIdpictureFile, onImagePick: () => ImagePickerService().pickSingleImage( provider: provider, type: 'taxiIdPicture', ), title: 'Taxi id Picture', subtitle: 'Upload a clear photo of your taxi id document', required: true, ), const SizedBox(height: 24), MultipleImagePicker( images: provider.vehicleImages, onImagePick: (index) => _pickMultipleImages(index, provider), onImageRemove: (index) => provider.setVehicleImage(index, null), title: 'Taxi Photos', subtitle: 'Add photos of your vehicle from different angles', maxImages: 4, ), const SizedBox(height: 24), SingleImagePicker( image: provider.insuranceFile, onImagePick: () => ImagePickerService().pickSingleImage( provider: provider, type: 'insurance', ), title: 'Taxi Insurance', subtitle: 'Upload a clear photo of your insurance document', required: true, ), const SizedBox(height: 24), SingleImagePicker( image: provider.idTaxiFile, onImagePick: () => ImagePickerService().pickSingleImage( provider: provider, type: 'idTaxi', ), title: 'Taxi ID Document', subtitle: 'Upload a clear photo of your taxi ID/license', required: true, ), const SizedBox(height: 32), buildSectionTitle('Taxi Type'), const SizedBox(height: 16), rideOptionProvider.isLoading ? const Center( child: CustomLoader(), ) : TaxiTypeSelector( taxiTypes: rideOptionProvider.rideOption, selectedType: provider.selectedTaxiType, onTypeSelect: (type) { provider.setTaxiType(type.id); }, ), const SizedBox(height: 32), buildSectionTitle('Allowed Items'), const SizedBox(height: 16), taxiOptionProvider.isLoading ? const Center( child: CustomLoader(), ) : Center( child: AllowedItemsSelector( items: taxiOptionProvider.taxiOptions, selectedItems: provider.selectedAllowedItems, onItemToggle: (item) { provider.toggleAllowedItem(item.id); }, ), ), const SizedBox(height: 32), Center( child: CustomButton( borderRadius: 25, height: 55, onClick: () { if (plateNumberFirstPartController.text.trim().isEmpty || plateNumberLastPartController.text.trim().isEmpty) { AppSnackbar.showError( "Error", "Please put your plate number."); return; } else { provider.setPlateNumberfirstPart(plateNumberFirstPartController.text.trim()); provider.setPlateNumberLastPart(plateNumberLastPartController.text.trim()); provider.setPlateNumber( "${plateNumberFirstPartController.text.trim()} TN ${plateNumberLastPartController.text.trim()}"); } if (taxiIdTwoController.text.trim().isEmpty || taxiIdForeController.text.trim().isEmpty) { //_showError("Phone number must be digits only."); AppSnackbar.showError( "Error", "Please put your taxi id number."); return; } else { provider .setTaxiIdFirst(taxiIdTwoController.text.trim()); provider .setTaxiIdLast(taxiIdForeController.text.trim()); provider.setTaxiId( "${taxiIdTwoController.text.trim()}${taxiIdForeController.text.trim()}"); } if (provider.selectedTaxiType == null) { //_showError("Phone number must be digits only."); AppSnackbar.showError( "Error", "Please select your Taxi type."); return; } if (provider.selectedAllowedItems == []) { //_showError("Phone number must be digits only."); AppSnackbar.showError( "Error", "Please select at least one allowed item"); return; } if (provider.vehicleImages.every((image) => image == null)) { AppSnackbar.showError("Error", "Please upload at least one vehicle image."); return ; } if (provider.idTaxiFile == null) { AppSnackbar.showError("Error", "Please upload the ID Taxi document."); return ; } if (provider.insuranceFile == null) { AppSnackbar.showError("Error", "Please upload the insurance document."); return ; } if (provider.taxiIdpictureFile == null) { AppSnackbar.showError("Error", "Please upload a picture of your Taxi ID."); return ; } if (provider.carLicenseFile == null) { AppSnackbar.showError("Error", "Please upload your car license document."); return ; } // Navigate to next screen Navigator.push( context, MaterialPageRoute( builder: (context) => const SignUpScreenCommercial()), ); }, title: 'Continue', width: MediaQuery.of(context).size.width , backgroundColor: Theme.of(context).brightness == Brightness.dark ?AppColors.darkPrimaryColor:AppColors.primaryColor, ), ), ], ), ), ); }, ); } bool _canProceed(SignUpProvider provider) { return provider.vehicleImages.any((image) => image != null) && //provider.vehicleImages.length <= 3 && provider.selectedTaxiType != null && provider.idTaxiFile != null && provider.insuranceFile != null && provider.taxiIdpictureFile != null && provider.carLicenseFile != null; } }