From 3e880591666b0cb27f69b346860585a9544afdd4 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sat, 5 Oct 2024 10:25:13 +0300 Subject: [PATCH] 10/5/1 --- lib/controller/firebase/firbase_messge.dart | 42 ++++++-------- lib/controller/functions/crud.dart | 54 +++++++++++------- lib/controller/notification_controller.dart | 35 ++++++++++-- lib/env.zip | Bin 0 -> 38706 bytes lib/main.dart | 4 +- lib/views/admin/static/static.dart | 4 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 16 ++++++ pubspec.yaml | 1 + 9 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 lib/env.zip diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index ba1e7ed..ab8e7fd 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -133,30 +133,19 @@ class FirebaseMessagesController extends GetxController { isLoading = true; try { var res = await http.post( - Uri.parse(AppLink.getAllTokenDrivers), + Uri.parse(AppLink.getAllTokenPassengers), headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, - body: { - 'page': page.toString(), - }, + body: {}, ); var jsonResponse = jsonDecode(res.body); if (jsonResponse['status'] == 'success') { - var newData = jsonResponse['data'] as List; - if (page == 1) { - dataTokensPassenger.clear(); - tokensPassengers.clear(); - } - dataTokensPassenger.addAll(newData); - for (var item in newData) { - tokensPassengers.add(item['token']); - } - currentPagePassenger = int.parse(jsonResponse['currentPage']); - totalPagesPassenger = jsonResponse['totalPages']; - box.write(BoxName.tokensPassengers, tokensPassengers); + box.write(BoxName.tokensPassengers, jsonResponse); + // Log.print( + // 'box.write(BoxName.tokensPassenger: ${box.read(BoxName.tokensPassengers)}'); } else { Get.defaultDialog( title: "Warning", middleText: "No more data available"); @@ -195,15 +184,15 @@ class FirebaseMessagesController extends GetxController { isSendingNotificationsPassenger = true; currentPage = 1; - while (currentPagePassenger <= totalPagesPassenger) { - await getAllTokenPassenger(page: currentPagePassenger); - await NotificationController().sendNotificationPassengers(); - print(tokensPassengers); - if (currentPagePassenger < totalPagesPassenger) { - await Future.delayed(const Duration(seconds: 3)); - } - currentPagePassenger++; - } + // while (currentPagePassenger <= totalPagesPassenger) { + await getAllTokenPassenger(); + await NotificationController().sendNotificationPassengers(); + // print(tokensPassengers); + // if (currentPagePassenger < totalPagesPassenger) { + // await Future.delayed(const Duration(seconds: 3)); + // } + // currentPagePassenger++; + // } isSendingNotificationsPassenger = false; Get.snackbar("Success", "All notifications sent!"); @@ -224,7 +213,7 @@ class FirebaseMessagesController extends GetxController { for (var i = 0; i < dataTokens.length; i++) { tokensPassengers.add(jsonResponse['data'][i]['token']); } - box.write(BoxName.tokensPassengers, tokensPassengers); + box.write(BoxName.tokensPassengers, jsonResponse['data']); } else { Get.defaultDialog(title: "Warning", middleText: "Server Error"); } @@ -638,6 +627,7 @@ class FirebaseMessagesController extends GetxController { ); if (response.statusCode == 200) { + SnackBar(content: Text('${response.statusCode}')); print( 'Notification sent successfully. Status code: ${response.statusCode}'); // print('Response body: ${response.body}'); diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index ea41bfe..2bb3f26 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -284,30 +285,41 @@ class CRUD { required String link, Map? payload, }) async { - // String? basicAuthCredentials = - // await storage.read(key: BoxName.basicAuthCredentials); - var url = Uri.parse( - link, - ); - var response = await http.post( - url, - body: payload, - headers: { - "Content-Type": "application/x-www-form-urlencoded", - 'Authorization': - 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', - }, - ); + try { + var url = Uri.parse(link); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); - var jsonData = jsonDecode(response.body); - if (response.statusCode == 200) { - if (jsonData['status'] == 'success') { - return response.body; + var jsonData = jsonDecode(response.body); + + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + return response.body; + } else { + return jsonData['status']; + } } else { - return (jsonData['status']); + // Log non-fatal errors to Crashlytics + await FirebaseCrashlytics.instance.log("Failed API request :$link"); + FirebaseCrashlytics.instance.recordError( + Exception('Error: ${response.statusCode}'), + null, + reason: 'Failed HTTP POST request', + ); + return response.statusCode; } - } else { - return response.statusCode; + } catch (e, stackTrace) { + // Log error to Crashlytics + await FirebaseCrashlytics.instance + .recordError(e, stackTrace, reason: 'Exception in post request'); + return 'Error occurred'; } } diff --git a/lib/controller/notification_controller.dart b/lib/controller/notification_controller.dart index 143ca3d..a8a693e 100644 --- a/lib/controller/notification_controller.dart +++ b/lib/controller/notification_controller.dart @@ -126,12 +126,37 @@ class NotificationController extends GetxController { confirm: MyElevatedButton( title: 'send'.tr, onPressed: () async { - tokensPassengers = box.read(BoxName.tokensPassengers); - for (var i = 0; i < tokensPassengers.length; i++) { - if (formKey.currentState!.validate()) { - FirebaseMessagesController().sendNotificationToAnyWithoutData( - title.text, body.text, tokensPassengers[i], 'order.wav'); + // tokensPassengers = box.read(BoxName.tokensPassengers); + var tokensPassengersData = + box.read(BoxName.tokensPassengers)['data']; + +// Debug print to check structure of the 'data' field + print('Tokens Passengers Data: $tokensPassengersData'); + + if (tokensPassengersData is List) { + for (var i = 0; i < tokensPassengersData.length; i++) { + if (formKey.currentState!.validate()) { + var res = await CRUD() + .post(link: AppLink.addNotificationPassenger, payload: { + "passenger_id": tokensPassengersData[i]['id'].toString(), + "title": title.text, + "body": body.text, + }); + Log.print('res: ${res}'); + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + title.text, + body.text, + tokensPassengersData[i]['token'] + .toString(), // Access token correctly + 'order.wav', + ); + } } + Get.back(); + } else { + // Handle the case where 'data' is not a list + print('Data is not a list: $tokensPassengersData'); } }), cancel: MyElevatedButton( diff --git a/lib/env.zip b/lib/env.zip new file mode 100644 index 0000000000000000000000000000000000000000..40fa5d232984485d0e712e8ff27ce61883b5b10d GIT binary patch literal 38706 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index 27ebffc..b7bd733 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -46,7 +47,8 @@ void main() async { DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); - } + } // Enable Crashlytics collection + FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; runApp(const MainApp()); } diff --git a/lib/views/admin/static/static.dart b/lib/views/admin/static/static.dart index 64e8ace..850f56b 100644 --- a/lib/views/admin/static/static.dart +++ b/lib/views/admin/static/static.dart @@ -232,8 +232,8 @@ class StaticDash extends StatelessWidget { isStepLineChart: true, spots: staticController.chartDataRides, isCurved: true, - color: Colors - .deepPurpleAccent, // Custom color + color: const Color.fromARGB( + 255, 84, 181, 182), // Custom color barWidth: 3, // Thinner line dotData: const FlDotData( show: diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index b949163..92f8ef3 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import file_selector_macos import firebase_core +import firebase_crashlytics import firebase_messaging import flutter_secure_storage_macos import google_sign_in_ios @@ -17,6 +18,7 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 3efa288..f7b2fa2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -313,6 +313,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.17.2" + firebase_crashlytics: + dependency: "direct main" + description: + name: firebase_crashlytics + sha256: "9897c01efaa950d2f6da8317d12452749a74dc45f33b46390a14cfe28067f271" + url: "https://pub.dev" + source: hosted + version: "3.5.7" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + sha256: "16a71e08fbf6e00382816e1b13397898c29a54fa0ad969c2c2a3b82a704877f0" + url: "https://pub.dev" + source: hosted + version: "3.6.35" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 2bf0255..bbb7e24 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,6 +61,7 @@ dependencies: url_launcher: ^6.2.6 # webview_flutter: ^4.7.0 googleapis_auth: ^1.6.0 + firebase_crashlytics: ^3.5.7 dev_dependencies: flutter_test: