import 'dart:io'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/controller/home/captin/map_driver_controller.dart'; import 'package:sefer_driver/views/notification/available_rides_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:sefer_driver/views/home/Captin/home_captain/drawer_captain.dart'; import 'package:sefer_driver/views/widgets/mycircular.dart'; import 'package:bubble_head/bubble.dart'; import '../../../../constant/colors.dart'; import '../../../../constant/info.dart'; import '../../../../constant/style.dart'; import '../../../../controller/functions/location_controller.dart'; import '../../../../controller/functions/overlay_permisssion.dart'; import '../../../../controller/functions/package_info.dart'; import '../../../../controller/home/captin/home_captain_controller.dart'; import '../../../../print.dart'; import '../../../widgets/circle_container.dart'; import '../driver_map_page.dart'; import 'widget/connect.dart'; import 'widget/left_menu_map_captain.dart'; import '../../../../main.dart'; // الويدجت الرئيسية للصفحة بعد تنظيمها class HomeCaptain extends StatelessWidget { HomeCaptain({super.key}); // تم الإبقاء على تعريف الـ Controllers كما هو في الكود الأصلي final LocationController locationController = Get.put(LocationController()); final HomeCaptainController homeCaptainController = Get.put(HomeCaptainController()); @override Widget build(BuildContext context) { // لم يتم تغيير أي شيء في هذه الأوامر Get.put(HomeCaptainController()); WidgetsBinding.instance.addPostFrameCallback((_) async { closeOverlayIfFound(); checkForUpdate(context); getPermissionOverlay(); showDriverGiftClaim(context); }); // التصميم الجديد: أصبح الـ build الرئيسي نظيفاً وواضحاً جداً return Scaffold( appBar: const _HomeAppBar(), // 1. تم فصل الـ AppBar في ويدجت خاصة drawer: AppDrawer(), body: Stack( children: [ // كل جزء من الواجهة أصبح ويدجت منفصلة const _MapView(), // 2. تم فصل الخريطة const _DriverStatsOverlay(), // 3. تم فصل كارت الإحصائيات العلوي const _DriverDurationOverlay(), // 4. تم فصل كارت مدة العمل const _FloatingActionButtons(), // 5. تم فصل الأزرار الجانبية العائمة const _ConnectButtonOverlay(), // 6. تم فصل زر الاتصال السفلي leftMainMenuCaptainIcons(), // هذه بقيت كما هي ], ), ); } } // ================================================================== // الأجزاء الصغيرة التي تم فصلها (Helper Widgets) // هذه الويدجتس تحتوي على نفس كود التصميم الأصلي الخاص بك تماماً، ولكنها منظمة بشكل أفضل // ================================================================== /// 1. ويدجت الـ AppBar class _HomeAppBar extends StatelessWidget implements PreferredSizeWidget { const _HomeAppBar(); @override Widget build(BuildContext context) { // نفس الكود الأصلي للـ AppBar final homeCaptainController = Get.find(); return AppBar( elevation: 2, flexibleSpace: Container( decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.white, Colors.grey.shade50], begin: Alignment.topLeft, end: Alignment.bottomRight, ), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.1), spreadRadius: 1, blurRadius: 4, ), ], ), ), title: Row( children: [ Image.asset( 'assets/images/logo.gif', height: 32, width: 35, ), const SizedBox(width: 8), Text( AppInformation.appName.split(' ')[0].toString().tr, style: AppStyle.title.copyWith( fontSize: 22, fontWeight: FontWeight.w600, color: AppColor.blueColor, ), ), ], ), actions: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: MyCircleContainer( child: Text( homeCaptainController.countRefuse.toString(), style: AppStyle.title, ), ), ), Container( margin: const EdgeInsets.symmetric(horizontal: 4), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.1), spreadRadius: 1, blurRadius: 4, ), ], ), child: Row( children: [ _MapControlButton( icon: Icons.satellite_alt, tooltip: 'Change Map Type'.tr, onPressed: homeCaptainController.changeMapType, ), _MapControlButton( icon: Icons.streetview_sharp, tooltip: 'Toggle Traffic'.tr, onPressed: homeCaptainController.changeMapTraffic, ), _MapControlButton( icon: Icons.my_location, // Changed for clarity tooltip: 'Center on Me'.tr, onPressed: () { if (homeCaptainController.mapHomeCaptainController != null) { homeCaptainController.mapHomeCaptainController! .animateCamera(CameraUpdate.newLatLngZoom( Get.find().myLocation, 17.5, )); } }, ), ], ), ), const SizedBox(width: 8), ], ); } @override Size get preferredSize => const Size.fromHeight(kToolbarHeight); } /// 2. ويدجت الخريطة class _MapView extends StatelessWidget { const _MapView(); @override Widget build(BuildContext context) { final locationController = Get.find(); // نفس الكود الأصلي للخريطة return GetBuilder(builder: (controller) { return controller.isLoading ? const MyCircularProgressIndicator() : GoogleMap( padding: EdgeInsets.only(bottom: 50, top: 300), fortyFiveDegreeImageryEnabled: true, onMapCreated: controller.onMapCreated, minMaxZoomPreference: const MinMaxZoomPreference(6, 18), initialCameraPosition: CameraPosition( target: locationController.myLocation, zoom: 15, ), onCameraMove: (position) { CameraPosition( target: locationController.myLocation, zoom: 17.5, tilt: 50.0, bearing: locationController.heading, ); }, markers: { Marker( markerId: MarkerId('MyLocation'.tr), position: locationController.myLocation, rotation: locationController.heading, flat: true, anchor: const Offset(0.5, 0.5), icon: controller.carIcon, ) }, mapType: controller.mapType ? MapType.satellite : MapType.terrain, myLocationButtonEnabled: false, myLocationEnabled: false, trafficEnabled: controller.mapTrafficON, buildingsEnabled: true, mapToolbarEnabled: true, compassEnabled: true, zoomControlsEnabled: false, ); }); } } /// 3. ويدجت كارت الإحصائيات العلوي class _DriverStatsOverlay extends StatelessWidget { const _DriverStatsOverlay(); @override Widget build(BuildContext context) { // نفس الكود الأصلي لكارت الإحصائيات return Positioned( top: 5, right: Get.width * .05, left: Get.width * .05, child: GetBuilder( builder: (homeCaptainController) { return Container( decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Colors.white, Colors.white70], ), borderRadius: BorderRadius.circular(15), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.2), spreadRadius: 2, blurRadius: 8, offset: const Offset(0, 2), ), ], ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), width: Get.width * .8, height: 120, child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColor.greenColor.withOpacity(0.1), borderRadius: BorderRadius.circular(10), ), child: Row( children: [ const Icon( Entypo.wallet, color: AppColor.greenColor, size: 20, ), const SizedBox(width: 8), Text( '${"Today".tr}: ${(homeCaptainController.totalMoneyToday)}', style: AppStyle.title.copyWith( color: AppColor.greenColor, fontWeight: FontWeight.bold, ), ), ], ), ), Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColor.yellowColor.withOpacity(0.1), borderRadius: BorderRadius.circular(10), ), child: Row( children: [ const Icon( Entypo.wallet, color: AppColor.yellowColor, size: 20, ), const SizedBox(width: 8), Text( '${AppInformation.appName}: ${(homeCaptainController.totalMoneyInSEFER)}', style: AppStyle.title.copyWith( color: AppColor.yellowColor, fontWeight: FontWeight.bold, ), ), ], ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '${'Total Points is'.tr}: ${(homeCaptainController.totalPoints)}', style: AppStyle.title.copyWith( fontSize: 16, fontWeight: FontWeight.w600, ), ), Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6), decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), color: int.parse( (homeCaptainController.countRideToday)) < 5 ? AppColor.accentColor : int.parse((homeCaptainController .countRideToday)) > 5 && int.parse((homeCaptainController .countRideToday)) < 10 ? AppColor.yellowColor : AppColor.greenColor, ), child: Row( children: [ const Icon( Icons.directions_car_rounded, color: Colors.white, size: 18, ), const SizedBox(width: 4), Text( '${"Ride Today : ".tr}: ${(homeCaptainController.countRideToday)}', style: AppStyle.title.copyWith( color: Colors.white, fontWeight: FontWeight.bold, ), ), ], ), ), ], ), ]), ); }, ), ); } } /// 4. ويدجت كارت مدة العمل class _DriverDurationOverlay extends StatelessWidget { const _DriverDurationOverlay(); @override Widget build(BuildContext context) { // نفس الكود الأصلي لكارت المدة return Positioned( bottom: 65, right: Get.width * .1, left: Get.width * .1, child: GetBuilder( builder: (homeCaptainController) => Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.2), spreadRadius: 2, blurRadius: 8, offset: const Offset(0, 2), ), ], ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.timer_outlined, color: AppColor.greenColor), const SizedBox(width: 8), Text( 'Active Duration:'.tr, style: AppStyle.title, ), const SizedBox(width: 4), Text( (homeCaptainController.stringActiveDuration), style: AppStyle.title.copyWith( fontWeight: FontWeight.bold, color: AppColor.greenColor, ), ), ], ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.access_time, color: AppColor.accentColor), const SizedBox(width: 8), Text( 'Total Connection Duration:'.tr, style: AppStyle.title, ), const SizedBox(width: 4), Text( (homeCaptainController.totalDurationToday), style: AppStyle.title.copyWith( fontWeight: FontWeight.bold, color: AppColor.accentColor, ), ), ], ), ], ), ), ), ); } } /// 5. ويدجت الأزرار الجانبية العائمة class _FloatingActionButtons extends StatelessWidget { const _FloatingActionButtons(); @override Widget build(BuildContext context) { // نفس الكود الأصلي للأزرار return Positioned( bottom: Get.height * .2, right: 6, child: GetBuilder(builder: (homeCaptainController) { return Column( children: [ Platform.isAndroid ? AnimatedContainer( duration: const Duration(microseconds: 200), width: homeCaptainController.widthMapTypeAndTraffic, decoration: BoxDecoration( border: Border.all(color: AppColor.blueColor), color: AppColor.secondaryColor, borderRadius: BorderRadius.circular(15)), child: IconButton( onPressed: () async { Bubble().startBubbleHead(sendAppToBackground: true); }, icon: Image.asset( 'assets/images/logo1.png', fit: BoxFit.cover, width: 35, height: 35, ), ), ) : const SizedBox(), const SizedBox( height: 5, ), AnimatedContainer( duration: const Duration(microseconds: 200), width: homeCaptainController.widthMapTypeAndTraffic, decoration: BoxDecoration( border: Border.all(color: AppColor.blueColor), color: AppColor.secondaryColor, borderRadius: BorderRadius.circular(15)), child: IconButton( onPressed: () { Get.to(() => const AvailableRidesPage()); }, icon: const Icon( Icons.train_sharp, size: 29, color: AppColor.blueColor, ), ), ), const SizedBox( height: 5, ), box.read(BoxName.rideStatus) == 'Applied' || box.read(BoxName.rideStatus) == 'Begin' ? Positioned( bottom: Get.height * .2, right: 6, child: AnimatedContainer( duration: const Duration(microseconds: 200), width: homeCaptainController.widthMapTypeAndTraffic, decoration: BoxDecoration( border: Border.all(color: AppColor.blueColor), color: AppColor.secondaryColor, borderRadius: BorderRadius.circular(15)), child: GestureDetector( onLongPress: () { box.write(BoxName.rideStatus, 'delete'); homeCaptainController.update(); }, child: IconButton( onPressed: () { box.read(BoxName.rideStatus) == 'Applied' ? { Get.to(() => PassengerLocationMapPage(), arguments: box.read(BoxName.rideArguments)), Get.put(MapDriverController()) .changeRideToBeginToPassenger() } : { Get.to(() => PassengerLocationMapPage(), arguments: box.read(BoxName.rideArguments)), Get.put(MapDriverController()) .startRideFromStartApp() }; }, icon: const Icon( Icons.directions_rounded, size: 29, color: AppColor.blueColor, ), ), ), ), ) : const SizedBox() ], ); }), ); } } /// 6. ويدجت زر الاتصال السفلي class _ConnectButtonOverlay extends StatelessWidget { const _ConnectButtonOverlay(); @override Widget build(BuildContext context) { // نفس الكود الأصلي لزر الاتصال return Positioned( bottom: 10, right: Get.width * .1, left: Get.width * .1, child: const ConnectWidget()); } } // هذه الويدجت المساعدة بقيت كما هي class _MapControlButton extends StatelessWidget { final IconData icon; final VoidCallback onPressed; final String tooltip; const _MapControlButton({ required this.icon, required this.onPressed, required this.tooltip, }); @override Widget build(BuildContext context) { return Tooltip( message: tooltip, child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(12), onTap: onPressed, child: Container( padding: const EdgeInsets.all(8), child: Icon( icon, size: 24, color: AppColor.blueColor, ), ), ), ), ); } } // الدوال المساعدة الأخرى تبقى كما هي في ملفك... // showFirstTimeOfferNotification(BuildContext context) async { ... } // bool _checkIfFirstTime() { ... } // void _markAsNotFirstTime() { ... }