// public_provider.dart import 'dart:developer'; import 'package:wanisclient/models/CityModel.dart'; import 'package:flutter/foundation.dart'; import 'package:intl/intl.dart'; import '../models/OfferModel.dart'; import '../models/ride_options.dart'; import '../services/public_service.dart'; class PublicProvider extends ChangeNotifier { static final PublicProvider _publicProvider = PublicProvider._internal(); factory PublicProvider() { return _publicProvider; } final PublicService _service = PublicService(); List _options = []; List _offers = []; List _citys = []; List get options => _options; List get offers => _offers; List get citys => _citys; // public_provider.dart List get cityNames { final canonical = _citys .map((e) => e.city.trim().toLowerCase()) // canonical key .toSet() // ► removes duplicates .toList() ..sort(); // optional // back to “Title Case” return canonical .map((c) => toBeginningOfSentenceCase(c)) .toList(growable: false); } bool _isLoading = false; bool _isLoadingOffer = false; bool _isLoadingRideOption = false; bool get isLoading => _isLoading; bool get isLoadingOffer => _isLoadingOffer; bool get isLoadingRideOption => _isLoadingRideOption; updateoptions(List data) { _options = data; notifyListeners(); } /// Call this from your UI to load (or reload) the ride options Future fetchRideOptions(String codecoupon, String startTime, String startlocation, String tripgeomhash) async { _isLoadingRideOption = true; notifyListeners(); log("*** ===> fetchRideOptions -codecoupon- $codecoupon -startTime- $startTime -startlocation- $startlocation -tripgeomhash- $tripgeomhash"); try { final apiResponse = await _service.getAllRideOption( codecoupon, startTime, startlocation, tripgeomhash); if (apiResponse.statusCode == 200 || apiResponse.statusCode == 201) { _options = apiResponse.data; } } catch (e, stacktrace) { log('Error in fetch ride option: $e'); log('Stacktrace: $stacktrace'); } finally { _isLoadingRideOption = false; notifyListeners(); } } Future fetchOffer() async { _isLoadingOffer = true; notifyListeners(); try { final apiResponse = await _service.getAllOffer("ALL"); if (apiResponse.statusCode == 200 || apiResponse.statusCode == 201) { _offers = apiResponse.data ?? []; } } catch (e, stacktrace) { log('Error in fetchOffer : $e'); log('Stacktrace: $stacktrace'); } finally { _isLoadingOffer = false; notifyListeners(); } } /// Call this from your UI to load (or reload) the ride options Future fetchtunisiancity() async { try { final apiResponse = await _service.getAllTunisianCity(); if (apiResponse.statusCode == 200 || apiResponse.statusCode == 201) { log('E++++++++++++++++++++++++++++++++: ${apiResponse.data}'); _citys = apiResponse.data; } } catch (e, stacktrace) { log('Error in fetch ride option: $e'); log('Stacktrace: $stacktrace'); } finally { notifyListeners(); } } /// Resets all data in the provider to its initial empty state. void clear() { // Clear all data lists _options.clear(); _offers.clear(); _citys.clear(); // Reset all loading flags _isLoading = false; _isLoadingOffer = false; _isLoadingRideOption = false; // Notify listeners to rebuild the UI with the cleared state notifyListeners(); } PublicProvider._internal(); } final PublicProviderSingleton = PublicProvider();