import 'dart:convert'; import 'dart:io'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:ride/controller/functions/crud.dart'; import 'package:ride/controller/functions/toast.dart'; import 'package:ride/views/widgets/elevated_btn.dart'; import '../../constant/api_key.dart'; import '../../constant/box_name.dart'; import '../../constant/colors.dart'; import '../../constant/links.dart'; import '../../constant/style.dart'; import '../../main.dart'; import '../../views/Rate/rate_captain.dart'; import '../../views/home/Captin/home_captain/home_captin.dart'; import '../../views/home/map_page_passenger.dart'; import '../../views/home/profile/promos_passenger_page.dart'; import '../../views/home/Captin/orderCaptin/order_request_page.dart'; import '../home/map_passenger_controller.dart'; import '../home/payment/captain_wallet_controller.dart'; import '../payment/payment_controller.dart'; class FirebaseMessagesController extends GetxController { final fcmToken = FirebaseMessaging.instance; List tokens = []; List dataTokens = []; late String driverID; late String driverToken; NotificationSettings? notificationSettings; Future getNotificationSettings() async { // Get the current notification settings NotificationSettings? notificationSettings = await FirebaseMessaging.instance.getNotificationSettings(); print( 'Notification authorization status: ${notificationSettings.authorizationStatus}'); // Call the update function if needed update(); } Future requestFirebaseMessagingPermission() async { FirebaseMessaging messaging = FirebaseMessaging.instance; // Check if the platform is Android if (Platform.isAndroid) { // Request permission for Android await messaging.requestPermission(); } else if (Platform.isIOS) { // Request permission for iOS NotificationSettings settings = await messaging.requestPermission( alert: true, announcement: true, badge: true, carPlay: true, criticalAlert: true, provisional: false, sound: true, ); print('User granted permission: ${settings.authorizationStatus}'); messaging.setForegroundNotificationPresentationOptions( alert: true, badge: true, sound: true); } } Future getTokens() async { String? basicAuthCredentials = await storage.read(key: BoxName.basicAuthCredentials); var res = await http.post( Uri.parse(AppLink.getTokens), headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, body: {}, ); // print(res.body); var jsonResponse = jsonDecode(res.body); // print(jsonResponse); if (jsonResponse['status'] == 'success') { dataTokens = jsonResponse['data']; for (var i = 0; i < dataTokens.length; i++) { tokens.add(jsonResponse['data'][i]['token']); } box.write(BoxName.tokens, tokens); print(box.read(BoxName.tokens)); } else { Get.defaultDialog(title: "Warning", middleText: "Server Error"); } } Future getToken() async { fcmToken.getToken().then((token) { if (box.read(BoxName.email) == null) { box.write(BoxName.tokenDriver, token); } else { box.write(BoxName.tokenFCM, token); } print(token); }); FirebaseMessaging.onMessage.listen((RemoteMessage message) { // if (message.notification != null && message.data.isNotEmpty) { // fireBaseTitles(message); // } // If the app is in the background or terminated, show a system tray message RemoteNotification? notification = message.notification; AndroidNotification? android = notification?.android; // if (notification != null && android != null) { if (message.data.isNotEmpty && message.notification != null) { fireBaseTitles(message); } }); // FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { // // print( // // 'onMessageOpenedApp: ${message.notification!.title} ${message.notification!.body}'); // RemoteNotification? notification = message.notification; // fireBaseTitles(message); // }); } void fireBaseTitles(RemoteMessage message) { if (message.notification!.title! == 'Order') { var myListString = message.data['DriverList']; // print(myListString); // print('9999999999999myListString999999999999999'); var myList = jsonDecode(myListString) as List; driverToken = myList[14].toString(); update(); // print('driverToken==============$driverToken'); Get.to(() => OrderRequestPage(), arguments: { 'myListString': myListString, 'DriverList': myList, 'body': message.notification!.body }); } else if (message.notification!.title! == 'Apply Ride') { var passengerList = message.data['passengerList']; // print(passengerList); // print('9999999999999my Apply Ride 999999999999999'); var myList = jsonDecode(passengerList) as List; driverID = myList[2].toString(); driverAppliedTripSnakBar(); } else if (message.notification!.title! == 'Promo') { Get.to(const PromosPassengerPage()); } else if (message.notification!.title == 'Cancel Trip') { cancelTripDialog(); } else if (message.notification!.title! == 'DriverIsGoingToPassenger') { Get.snackbar('Driver is Going To Passenger', '', backgroundColor: AppColor.greenColor); } else if (message.notification!.title! == 'RideIsBegin') { Get.snackbar('RideIsBegin', '', backgroundColor: AppColor.greenColor); update(); } else if (message.notification!.title! == 'Hi ,I will go now') { Get.snackbar('Hi ,I will go now', '', backgroundColor: AppColor.greenColor); update(); } else if (message.notification!.title! == 'Hi ,I Arrive your site') { driverArrivePassengerDialoge(); update(); } else if (message.notification!.title! == 'Driver Finish Trip') { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; if (Get.find().isCashChecked == false && Get.find().isWalletChecked == true) { driverFinishTripDialoge(driverList); } else { Get.to(() => RateDriverFromPassenger(), arguments: { 'driverId': driverList[0].toString(), 'rideId': driverList[1].toString(), }); } } else if (message.notification!.title! == 'Driver Cancel Your Trip') { // Get.snackbar( // 'You will be pay the cost to driver or we will get it from you on next trip' // .tr, // 'message', // backgroundColor: AppColor.redColor); Get.find().restCounter(); Get.offAll(const MapPagePassenger()); } } SnackbarController driverAppliedTripSnakBar() { return Get.snackbar( 'Driver Applied the Ride for You'.tr, 'message', colorText: AppColor.greenColor, duration: const Duration(seconds: 3), snackPosition: SnackPosition.TOP, titleText: Text( 'Applied'.tr, style: const TextStyle(color: AppColor.redColor), ), messageText: Text( 'Driver Applied the Ride for You'.tr, style: AppStyle.title, ), icon: const Icon(Icons.approval), shouldIconPulse: true, margin: const EdgeInsets.all(16), padding: const EdgeInsets.all(16), ); } Future cancelTripDialog() { return Get.defaultDialog( title: 'Passenger Cancel Trip'.tr, middleText: '', confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () { Get.offAll(HomeCaptain()); })); } Future driverArrivePassengerDialoge() { return Get.defaultDialog( barrierDismissible: false, title: 'Hi ,I Arrive your site'.tr, middleText: 'Please go to Car Driver'.tr, confirm: MyElevatedButton( title: 'Ok I will go now.'.tr, onPressed: () { FirebaseMessagesController().sendNotificationToPassengerToken( 'Hi ,I will go now'.tr, 'I will go now'.tr, Get.find().driverToken, []); Get.back(); })); } Future driverFinishTripDialoge(List driverList) { return Get.defaultDialog( title: 'Driver Finish Trip'.tr, content: const DriverTipWidget(), confirm: MyElevatedButton( title: 'Yes'.tr, onPressed: () async { var tip = (Get.find().totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString()))); var res = await CRUD().post(link: AppLink.addTips, payload: { 'passengerID': box.read(BoxName.passengerID), 'driverID': driverList[0].toString(), 'rideID': driverList[1].toString(), 'tipAmount': tip.toString(), }); await CRUD().post(link: AppLink.addPassengersWallet, payload: { 'passenger_id': box.read(BoxName.passengerID).toString(), 'balance': ((-1) * tip).toString() }); await CRUD().post(link: AppLink.addDriversWalletPoints, payload: { 'driverID': driverList[0].toString(), 'paymentID': '${Get.find().rideId}tip', 'amount': (tip * 100).toString(), 'paymentMethod': 'visa-tip', }); if (res != 'failure') { FirebaseMessagesController().sendNotificationToAnyWithoutData( 'You Have Tips', '${tip.toString()}\$ tips\nTotal is ${tip + (Get.find().totalPassenger)}', driverList[2].toString(), ); } Get.to(() => RateDriverFromPassenger(), arguments: { 'driverId': driverList[0].toString(), 'rideId': driverList[1].toString(), }); }, kolor: AppColor.greenColor, ), cancel: MyElevatedButton( title: 'No,I want'.tr, onPressed: () { Get.to(() => RateDriverFromPassenger(), arguments: { 'driverId': driverList[0].toString(), 'rideId': driverList[1].toString(), }); }, kolor: AppColor.redColor, )); } void sendNotificationAll(String title, body) async { // Get the token you want to subtract. String token = box.read(BoxName.tokenFCM); tokens = box.read(BoxName.tokens); // Subtract the token from the list of tokens. tokens.remove(token); // Save the list of tokens back to the box. // box.write(BoxName.tokens, tokens); tokens = box.read(BoxName.tokens); // print(tokens); for (var i = 0; i < tokens.length; i++) { http .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, 'sound': 'tone2.wav' }, 'priority': 'high', 'data': { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'id': '1', 'status': 'done' }, 'to': tokens[i], })) .whenComplete(() {}) .catchError((e) { print('sendNotification() error: $e'); }); } } // for (var i = 0; i < tokens.length; i++) { // http // .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), // headers: { // 'Content-Type': 'application/json', // 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}' // }, // body: jsonEncode({ // 'notification': { // 'title': title, // 'body': body, // 'sound': 'true' // }, // 'priority': 'high', // 'data': { // 'click_action': 'FLUTTER_NOTIFICATION_CLICK', // 'id': '1', // 'status': 'done' // }, // 'to': tokens[i], // })) // .whenComplete(() {}) // .catchError((e) { // print('sendNotification() error: $e'); // }); // } // } void sendNotificationToPassengerToken( String title, body, token, List map) async { try { final response = await http.post( Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, 'sound': 'tone2.wav' }, 'data': { 'passengerList': map, }, 'priority': 'high', 'to': token, }), ); if (response.statusCode == 200) { // Notification sent successfully print('Notification sent successfully'); } else { // Handle error response print( 'Failed to send notification. Status code: ${response.statusCode}'); } } catch (e) { // Handle other exceptions print('sendNotification() error: $e'); } } void sendNotificationToAnyWithoutData( String title, String body, String token) async { try { final response = await http.post( Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, 'sound': 'tone2.wav' }, 'data': { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'id': '1', 'status': 'done' }, 'priority': 'high', 'to': token, }), ); if (response.statusCode == 200) { // Notification sent successfully print('Notification sent successfully'); } else { // Handle error response print( 'Failed to send notification. Status code: ${response.statusCode}'); } } catch (e) { // Handle other exceptions print('sendNotification() error: $e'); } } void sendNotificationToDriverMAP( String title, String body, String token, List data) async { try { final response = await http.post( Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=${AK.serverAPI}' }, body: jsonEncode({ 'notification': { 'title': title, 'body': body, // 'sound': 'tone2.wav', 'sound': 'order.wav' }, 'data': { 'DriverList': data, }, 'priority': 'high', 'to': token, }), ); if (response.statusCode == 200) { // Notification sent successfully print('Notification sent successfully'); } else { // Handle error response print( 'Failed to send notification. Status code: ${response.statusCode}'); } } catch (e) { // Handle other exceptions print('sendNotification() error: $e'); } } } class DriverTipWidget extends StatelessWidget { const DriverTipWidget({ super.key, }); @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Your fee is ${Get.find().totalPassenger.toStringAsFixed(2)}'), Text('Do you want to pay Tips for this Driver'.tr), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.05'); Toast.show( context, 'Tip is ${(Get.find().totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Padding( padding: EdgeInsets.all(4), child: Center( child: Text('5%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.10'); Toast.show( context, 'Tip is ${(Get.find().totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('10%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.15'); Toast.show( context, 'Tip is ${(Get.find().totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('15%'), ), ), ), ), InkWell( onTap: () { box.write(BoxName.tipPercentage, '0.20'); Toast.show( context, 'Tip is ${(Get.find().totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', AppColor.blueColor); }, child: Container( decoration: BoxDecoration(border: Border.all()), child: const Center( child: Padding( padding: EdgeInsets.all(5), child: Text('20%'), ), ), ), ), ], ) ], ); } }