import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:Intaleq/constant/colors.dart'; import 'package:Intaleq/constant/style.dart'; import 'package:Intaleq/controller/home/map_passenger_controller.dart'; import 'package:Intaleq/views/widgets/elevated_btn.dart'; import 'package:Intaleq/views/widgets/my_textField.dart'; // --- الويدجت الرئيسية بالتصميم الجديد --- class SearchingCaptainWindow extends StatefulWidget { const SearchingCaptainWindow({super.key}); @override State createState() => _SearchingCaptainWindowState(); } class _SearchingCaptainWindowState extends State with SingleTickerProviderStateMixin { late AnimationController _animationController; @override void initState() { super.initState(); _animationController = AnimationController( vsync: this, duration: const Duration(seconds: 2), )..repeat(); } @override void dispose() { _animationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return GetBuilder( builder: (controller) { return AnimatedPositioned( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, bottom: controller.isSearchingWindow ? 0 : -Get.height * 0.4, left: 0, right: 0, child: Container( padding: const EdgeInsets.fromLTRB(20, 20, 20, 16), decoration: BoxDecoration( color: AppColor.secondaryColor, borderRadius: const BorderRadius.only( topLeft: Radius.circular(24), topRight: Radius.circular(24), ), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.2), blurRadius: 20, offset: const Offset(0, -5), ), ], ), child: Column( mainAxisSize: MainAxisSize.min, children: [ // --- 1. أنيميشن الرادار --- _buildRadarAnimation(controller), const SizedBox(height: 20), // --- 2. زر الإلغاء --- SizedBox( width: double.infinity, child: OutlinedButton( onPressed: () { // --- نفس منطقك للإلغاء --- controller.cancelRide(); }, style: OutlinedButton.styleFrom( foregroundColor: AppColor.writeColor, side: BorderSide( color: AppColor.writeColor.withOpacity(0.3)), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12)), padding: const EdgeInsets.symmetric(vertical: 12), ), child: Text('Cancel Search'.tr), ), ), ], ), ), ); }, ); } // --- ويدجت بناء أنيميشن الرادار --- Widget _buildRadarAnimation(MapPassengerController controller) { return SizedBox( height: 180, // ارتفاع ثابت لمنطقة الأنيميشن child: Stack( alignment: Alignment.center, children: [ // --- دوائر الرادار المتحركة --- ...List.generate(3, (index) { return FadeTransition( opacity: Tween(begin: 1.0, end: 0.0).animate( CurvedAnimation( parent: _animationController, curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), ), ), child: ScaleTransition( scale: Tween(begin: 0.3, end: 1.0).animate( CurvedAnimation( parent: _animationController, curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), ), ), child: Container( decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( color: AppColor.primaryColor.withOpacity(0.7), width: 2, ), ), ), ), ); }), // --- المحتوى في المنتصف --- Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( controller.driversStatusForSearchWindow, style: AppStyle.headTitle.copyWith(fontSize: 20), textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( 'Searching for the nearest captain...'.tr, style: AppStyle.subtitle .copyWith(color: AppColor.writeColor.withOpacity(0.7)), textAlign: TextAlign.center, ), const SizedBox(height: 16), // --- استدعاء نفس دالة المؤقت الخاصة بك --- buildTimerForIncrease(controller), ], ), ], ), ); } } // --- نفس دالة المؤقت الخاصة بك مع تعديلات شكلية بسيطة --- Widget buildTimerForIncrease(MapPassengerController mapPassengerController) { return StreamBuilder( stream: Stream.periodic(const Duration(seconds: 1)) .map((_) => ++mapPassengerController.currentTimeSearchingCaptainWindow), initialData: 0, builder: (context, snapshot) { if (snapshot.hasData && snapshot.data! > 30) { // --- عرض زر زيادة الأجرة بنفس منطقك القديم --- return TextButton( onPressed: () => _showIncreaseFeeDialog(context, mapPassengerController), child: Text( "No one accepted? Try increasing the fare.".tr, style: AppStyle.title.copyWith( color: AppColor.primaryColor, decoration: TextDecoration.underline), textAlign: TextAlign.center, ), ); } final double progress = (snapshot.data ?? 0).toDouble() / 30.0; return SizedBox( height: 40, width: 40, child: Stack( fit: StackFit.expand, children: [ CircularProgressIndicator( value: progress, strokeWidth: 3, color: AppColor.primaryColor, backgroundColor: AppColor.primaryColor.withOpacity(0.2), ), Center( child: Text( '${snapshot.data ?? 0}', style: AppStyle.title.copyWith( color: AppColor.writeColor, fontWeight: FontWeight.bold), ), ), ], ), ); }, ); } // --- دالة لعرض نافذة زيادة الأجرة (مأخوذة من منطقك القديم) --- void _showIncreaseFeeDialog( BuildContext context, MapPassengerController mapPassengerController) { Get.defaultDialog( barrierDismissible: false, title: "Increase Your Trip Fee (Optional)".tr, titleStyle: AppStyle.title, content: Column( children: [ Text( "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers." .tr, style: AppStyle.subtitle, textAlign: TextAlign.center, ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( onPressed: () { mapPassengerController.increasFeeFromPassenger.text = (mapPassengerController.totalPassenger + 3) .toStringAsFixed(1); mapPassengerController.update(); }, icon: const Icon(Icons.add_circle, size: 40, color: AppColor.greenColor), ), SizedBox( width: 100, child: Form( key: mapPassengerController.increaseFeeFormKey, child: MyTextForm( controller: mapPassengerController.increasFeeFromPassenger, label: mapPassengerController.totalPassenger.toStringAsFixed(2), hint: mapPassengerController.totalPassenger.toStringAsFixed(2), type: TextInputType.number, ), ), ), IconButton( onPressed: () { mapPassengerController.increasFeeFromPassenger.text = (mapPassengerController.totalPassenger - 3) .toStringAsFixed(1); mapPassengerController.update(); }, icon: const Icon(Icons.remove_circle, size: 40, color: AppColor.redColor), ), ], ), ], ), actions: [ TextButton( child: Text("No, thanks".tr, style: const TextStyle(color: AppColor.redColor)), onPressed: () { Get.back(); mapPassengerController.cancelRide(); }, ), ElevatedButton( style: ElevatedButton.styleFrom(backgroundColor: AppColor.greenColor), child: Text("Increase Fee".tr), onPressed: () => mapPassengerController.increaseFeeByPassengerAndReOrder(), ), ], ); }