import 'package:wanisclient/config/custom_loader.dart'; import 'package:wanisclient/config/custom_text.dart'; import 'package:wanisclient/utils/colors.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../models/ride_model.dart'; import '../providers/language_provider.dart'; import '../providers/ride_providers.dart'; import '../widgets/RideCard.dart'; import 'rideDetails_screen.dart'; enum RideTab { booked, scheduled } class MyRides extends StatefulWidget { const MyRides({super.key}); @override State createState() => _MyRidesState(); } class _MyRidesState extends State with SingleTickerProviderStateMixin { late final TabController _tab; bool _firstLoadDone = false; @override void initState() { super.initState(); _tab = TabController(length: 2, vsync: this); // <– only 2 tabs now _tab.addListener(() { if (_tab.indexIsChanging) return; _loadForTab(currentTab, loadMore: false); }); WidgetsBinding.instance.addPostFrameCallback((_) async { await _loadForTab(currentTab, loadMore: false); _firstLoadDone = true; }); } @override void dispose() { _tab.dispose(); super.dispose(); } RideTab get currentTab => RideTab.values[_tab.index]; Future _loadForTab(RideTab tab, {required bool loadMore}) async { final p = context.read(); switch (tab) { case RideTab.booked: await p.fetchMyRides(loadMore: loadMore); // INSTANT/BOOKED break; case RideTab.scheduled: await p.fetchSCHEDULEMyRides(loadMore: loadMore); // SCHEDULED break; } } @override Widget build(BuildContext context) { final prov = context.watch(); final isBookedTab = currentTab == RideTab.booked; final items = isBookedTab ? prov.rides : prov.scheduledrides; final hasMore = isBookedTab ? prov.hasMore : prov.hasMoreschudle; final languageProvider = context.watch(); return Scaffold( backgroundColor: Colors.white, // <- screen background body: Column( children: [ const SizedBox(height: 50), Container( padding: const EdgeInsets.symmetric(horizontal: 16), color: Colors.white, child: TabBar( controller: _tab, labelPadding: const EdgeInsets.symmetric(horizontal: 16), indicatorColor: AppNewColors.primaryBtnColor, indicatorWeight: 3, labelColor: AppNewColors.primaryBtnColor, unselectedLabelColor: const Color(0xFF8D8D8D), tabs: [ Tab(text: languageProvider.translate('Booked')), Tab(text: languageProvider.translate('Scheduled')), ], ), ), const SizedBox(height: 8), Expanded( child: NotificationListener( onNotification: (n) { if (n.metrics.pixels >= n.metrics.maxScrollExtent - 64 && hasMore && !prov.isLoading) { _loadForTab(currentTab, loadMore: true); } return false; }, child: RefreshIndicator( onRefresh: () => _loadForTab(currentTab, loadMore: false), child: prov.isLoading && !_firstLoadDone ? const Center(child: CustomLoader()) : ListView.builder( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 8), itemCount: items.length + (hasMore ? 1 : 0), itemBuilder: (ctx, i) { if (i == items.length) { return const Padding( padding: EdgeInsets.symmetric(vertical: 24), child: Center(child: CircularProgressIndicator()), ); } final ride = items[i]; return Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: RideCard(ride: ride), ); }, ), ), ), ), ], ), ); } }