Files
intaleq/lib/views/home/map_widget.dart/searching_captain_window.dart
Hamza-Ayed 3742d5b417 25-7-26-1
2025-07-26 10:30:10 +03:00

284 lines
9.7 KiB
Dart

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<SearchingCaptainWindow> createState() => _SearchingCaptainWindowState();
}
class _SearchingCaptainWindowState extends State<SearchingCaptainWindow>
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<MapPassengerController>(
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<double>(begin: 1.0, end: 0.0).animate(
CurvedAnimation(
parent: _animationController,
curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut),
),
),
child: ScaleTransition(
scale: Tween<double>(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<int>(
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(),
),
],
);
}