import 'dart:io'; 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:google_maps_flutter/google_maps_flutter.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 '../../../widgets/circle_container.dart'; import '../driver_map_page.dart'; import 'widget/connect.dart'; import 'widget/left_menu_map_captain.dart'; import '../../../../controller/home/payment/captain_wallet_controller.dart'; import '../../../../main.dart'; class HomeCaptain extends StatelessWidget { HomeCaptain({super.key}); final LocationController locationController = Get.put(LocationController()); final HomeCaptainController homeCaptainController = Get.put(HomeCaptainController()); @override Widget build(BuildContext context) { // Get.put(OrderRequestController()); Get.put(HomeCaptainController()); // Get.put(CaptainWalletController()); WidgetsBinding.instance.addPostFrameCallback((_) async { closeOverlayIfFound(); checkForUpdate(context); getPermissionOverlay(); showDriverGiftClaim(context); // getPermissionLocation1(); // await showFirstTimeOfferNotification(context); }); return Scaffold( appBar: 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.png', height: 32), const SizedBox(width: 8), Text( 'SEFER'.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.location_on, tooltip: 'My Location'.tr, onPressed: () { homeCaptainController.mapHomeCaptainController! .animateCamera(CameraUpdate.newLatLng(LatLng( Get.find().myLocation.latitude, Get.find().myLocation.longitude, ))); }, ), ], ), ), const SizedBox(width: 8), ], ), drawer: CupertinoDrawerCaptain(), // Add this widget at the bottom of the file body: Stack( children: [ GetBuilder(builder: (homeCaptainController) { return homeCaptainController.isLoading ? const MyCircularProgressIndicator() : GoogleMap( onMapCreated: homeCaptainController.onMapCreated, // cameraTargetBounds: CameraTargetBounds(controller.boundsdata), minMaxZoomPreference: const MinMaxZoomPreference(6, 18), initialCameraPosition: CameraPosition( target: locationController.myLocation, zoom: 15, ), markers: { Marker( markerId: MarkerId('MyLocation'.tr), position: locationController.myLocation, draggable: false, icon: homeCaptainController.carIcon, rotation: locationController.heading) }, mapType: homeCaptainController.mapType ? MapType.satellite : MapType.terrain, myLocationButtonEnabled: true, // liteModeEnabled: true, tiltGesturesEnabled: false, // indoorViewEnabled: true, trafficEnabled: homeCaptainController.mapTrafficON, buildingsEnabled: true, mapToolbarEnabled: true, myLocationEnabled: false, // liteModeEnabled: true, ); }), Positioned( bottom: 10, right: Get.width * .1, left: Get.width * .1, child: const ConnectWidget()), 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, ), ), ], ), ), ], ), ], ), ); }, ), ), 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, ), ), ], ), ], ), ), ), ), // Positioned( // bottom: Get.height * .17, // right: Get.width * .01, // child: AnimatedContainer( // duration: const Duration(microseconds: 200), // width: Get.width * .12, // decoration: BoxDecoration( // color: AppColor.secondaryColor, // border: Border.all(), // borderRadius: BorderRadius.circular(15)), // child: IconButton( // onPressed: () async { // CRUD().sendEmail(AppLink.sendEmailToPassengerForTripDetails, { // 'startLocation': Get.find() // .passengerLocation // .toString(), // 'endLocation': Get.find() // .passengerDestination // .toString(), // 'name': Get.find().name.toString(), // 'timeOfTrip': // Get.find().timeOfOrder.toString(), // 'fee': Get.find() // .totalPassenger // .toString(), // 'duration': // Get.find().duration.toString(), // 'phone': Get.find().phone.toString(), // 'email': Get.find().email.toString(), // }); // }, // icon: const Icon( // MaterialCommunityIcons.map_marker_radius, // size: 45, // color: AppColor.blueColor, // ), // ), // ), // ), Positioned( bottom: Get.height * .2, right: 6, child: 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 { // final Bubble _bubble = Bubble(showCloseButton: false); // try { // await _bubble.startBubbleHead( // sendAppToBackground: false); // } on PlatformException { // print('Failed to call startBubbleHead'); // } 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, ), GetBuilder( builder: (homeCaptainController) { return 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.rice_bowl, size: 29, color: AppColor.blueColor, ), ), ), ), ) : const SizedBox(); }) ], ), ), leftMainMenuCaptainIcons(), // callPage(), // Positioned( // top: Get.height * .2, // // left: 20, // // right: 20, // bottom: Get.height * .4, // child: IconButton( // onPressed: () { // homeCaptainController.getCountRideToday(); // }, // icon: const Icon(Icons.call), // ), // ), ], ), ); } } showFirstTimeOfferNotification(BuildContext context) async { bool isFirstTime = _checkIfFirstTime(); if (isFirstTime) { WidgetsBinding.instance.addPostFrameCallback((_) { showDialog( context: context, builder: (BuildContext context) { return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), elevation: 0, backgroundColor: Colors.transparent, child: Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( shape: BoxShape.rectangle, color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: const [ BoxShadow( color: Colors.black26, blurRadius: 10.0, offset: Offset(0.0, 10.0), ), ], ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( 'Welcome Offer!'.tr, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w700, ), ), const SizedBox(height: 15), Text( 'As a new driver, you\'re eligible for a special offer!'.tr, textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), const SizedBox(height: 20), Stack( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.green, borderRadius: BorderRadius.circular(15), ), child: Text( '300 LE'.tr, style: const TextStyle( color: Colors.white, fontSize: 25, fontWeight: FontWeight.bold, ), ), ), Positioned( right: -10, top: -10, child: Container( padding: const EdgeInsets.all(5), decoration: const BoxDecoration( color: Colors.red, shape: BoxShape.circle, ), child: const Icon( Icons.attach_money, color: Colors.white, size: 20, ), ), ), ], ), const SizedBox(height: 20), Text( 'for your first registration!'.tr, style: const TextStyle(fontSize: 16), ), const SizedBox(height: 20), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.green, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), child: Padding( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 10), child: Text( "Get it Now!".tr, style: const TextStyle(fontSize: 18, color: Colors.white), ), ), onPressed: () { _markAsNotFirstTime(); Navigator.of(context).pop(); }, ), ], ), ), ); }, ); }); } } bool _checkIfFirstTime() { if (box.read(BoxName.isFirstTime).toString() == '') { return true; } else { return false; } } void _markAsNotFirstTime() { box.write(BoxName.isFirstTime, 'false'); } 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, ), ), ), ), ); } }