import 'dart:developer'; import 'package:wanisclient/config/AppSnackbar.dart'; import 'package:wanisclient/config/custom_text.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../config/enum/ride_enum.dart'; import '../providers/ride_providers.dart'; import '../services/SystemInsetsService.dart'; import '../utils/colors.dart'; import 'TimeSheet.dart'; import 'dow.dart'; import 'monthGrid.dart'; class SchedulePickupWidget extends StatefulWidget { const SchedulePickupWidget({super.key}); @override State createState() => _SchedulePickupWidgetState(); } class _SchedulePickupWidgetState extends State { DateTime selectedDate = DateTime.now(); TimeOfDay selectedTime = const TimeOfDay(hour: 6, minute: 0); double _systembottompadding = 0; final dfHeader = DateFormat('MMMM'); // month title final dfTime = DateFormat('hh:mm a'); @override void initState() { super.initState(); final rideprovider = Provider.of(context, listen: false); if (rideprovider.ridestartdatetime != null) { selectedDate = rideprovider.ridestartdatetime!; selectedTime = TimeOfDay.fromDateTime(rideprovider.ridestartdatetime!); } WidgetsBinding.instance.addPostFrameCallback((_) { _loadSystemPadding(); }); } Future _loadSystemPadding() async { final pad = await SystemInsetsService.instance.bottomPadding(context); log("pad :_loadSystemPadding() $pad"); if (mounted) setState(() => _systembottompadding = pad); } @override Widget build(BuildContext context) { final rideprovider = context.watch(); final now = DateTime.now(); return Scaffold( backgroundColor: Colors.white, appBar: AppBar( backgroundColor: Colors.white, elevation: 0, leading: IconButton( onPressed: () { rideprovider.updateCurrentstate(RideEnum.idle); rideprovider.updateCoupon(""); }, icon: const Icon(Icons.arrow_back), style: IconButton.styleFrom( backgroundColor: AppNewColors.backgroundPurpleColor2, // circle bg foregroundColor: Colors.black, // icon color shape: const CircleBorder(), // make it round fixedSize: const Size(40, 40), // exact size padding: EdgeInsets.zero, // tight touch target ), ), ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // title const Padding( padding: EdgeInsets.fromLTRB(16, 4, 16, 10), child: Txt( text: 'When are you going?', style: TextStyle(fontSize: 35, fontWeight: FontWeight.w700), ), ), // days of week (mon..sun) const Padding( padding: EdgeInsets.symmetric(horizontal: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ dow('MON'), dow('TUE'), dow('WED'), dow('THU'), dow('FRI'), dow('SAT'), dow('SUN'), ], ), ), const SizedBox(height: 6), // months list Expanded( child: ListView.builder( padding: const EdgeInsets.symmetric(horizontal: 16,), itemCount: 12, // show next 6 months; adjust if needed itemBuilder: (_, i) { final firstOfMonth = DateTime(now.year, now.month + i, 1); return monthGrid( monthStart: firstOfMonth, selected: selectedDate, onSelect: (d) { final today = DateTime(now.year, now.month, now.day); // Prevent selection if the date is in the past if (d.isBefore(today)) { return; } setState(() => selectedDate = d); _openTimeSheet(context, rideprovider,_systembottompadding); }, ); }, ), ), ], ), ); } // ===== modal ===== Future _openTimeSheet(BuildContext context, RidesProvider rideprovider,double systembottompadding) async { await showModalBottomSheet( context: context, isScrollControlled: false, backgroundColor: Colors.transparent, builder: (_) { return TimeSheet( systembottompadding:systembottompadding, initialTime: selectedTime, onPickTime: (t) async { // pick via native time picker final picked = await showTimePicker(context: context, initialTime: t); return picked ?? t; }, onConfirm: (t) { final combined = DateTime( selectedDate.year, selectedDate.month, selectedDate.day, t.hour, t.minute, ); // Check if the combined date and time is in the past if (combined.isBefore(DateTime.now())) { AppSnackbar.showInfo("Info", "You cannot select a date or time in the past."); return; // Exit without saving } // If valid, update everything setState(() => selectedTime = t); rideprovider.updateridestartdatetime(combined); rideprovider.updateCurrentstate(RideEnum.choose_ride); Navigator.of(context).maybePop(); // close sheet Navigator.of(context).maybePop(); // leave scheduler }, formatter: (t) => dfTime.format(DateTime(0, 1, 1, t.hour, t.minute)), ); }, ); } }