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 0000000..40fa5d2 Binary files /dev/null and b/lib/env.zip differ 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: