This commit is contained in:
Hamza-Ayed
2024-10-05 10:25:13 +03:00
parent 7fbfefdcb2
commit 3e88059166
9 changed files with 103 additions and 55 deletions

View File

@@ -133,30 +133,19 @@ class FirebaseMessagesController extends GetxController {
isLoading = true; isLoading = true;
try { try {
var res = await http.post( var res = await http.post(
Uri.parse(AppLink.getAllTokenDrivers), Uri.parse(AppLink.getAllTokenPassengers),
headers: { headers: {
'Authorization': 'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
}, },
body: { body: {},
'page': page.toString(),
},
); );
var jsonResponse = jsonDecode(res.body); var jsonResponse = jsonDecode(res.body);
if (jsonResponse['status'] == 'success') { if (jsonResponse['status'] == 'success') {
var newData = jsonResponse['data'] as List; box.write(BoxName.tokensPassengers, jsonResponse);
if (page == 1) { // Log.print(
dataTokensPassenger.clear(); // 'box.write(BoxName.tokensPassenger: ${box.read(BoxName.tokensPassengers)}');
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);
} else { } else {
Get.defaultDialog( Get.defaultDialog(
title: "Warning", middleText: "No more data available"); title: "Warning", middleText: "No more data available");
@@ -195,15 +184,15 @@ class FirebaseMessagesController extends GetxController {
isSendingNotificationsPassenger = true; isSendingNotificationsPassenger = true;
currentPage = 1; currentPage = 1;
while (currentPagePassenger <= totalPagesPassenger) { // while (currentPagePassenger <= totalPagesPassenger) {
await getAllTokenPassenger(page: currentPagePassenger); await getAllTokenPassenger();
await NotificationController().sendNotificationPassengers(); await NotificationController().sendNotificationPassengers();
print(tokensPassengers); // print(tokensPassengers);
if (currentPagePassenger < totalPagesPassenger) { // if (currentPagePassenger < totalPagesPassenger) {
await Future.delayed(const Duration(seconds: 3)); // await Future.delayed(const Duration(seconds: 3));
} // }
currentPagePassenger++; // currentPagePassenger++;
} // }
isSendingNotificationsPassenger = false; isSendingNotificationsPassenger = false;
Get.snackbar("Success", "All notifications sent!"); Get.snackbar("Success", "All notifications sent!");
@@ -224,7 +213,7 @@ class FirebaseMessagesController extends GetxController {
for (var i = 0; i < dataTokens.length; i++) { for (var i = 0; i < dataTokens.length; i++) {
tokensPassengers.add(jsonResponse['data'][i]['token']); tokensPassengers.add(jsonResponse['data'][i]['token']);
} }
box.write(BoxName.tokensPassengers, tokensPassengers); box.write(BoxName.tokensPassengers, jsonResponse['data']);
} else { } else {
Get.defaultDialog(title: "Warning", middleText: "Server Error"); Get.defaultDialog(title: "Warning", middleText: "Server Error");
} }
@@ -638,6 +627,7 @@ class FirebaseMessagesController extends GetxController {
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
SnackBar(content: Text('${response.statusCode}'));
print( print(
'Notification sent successfully. Status code: ${response.statusCode}'); 'Notification sent successfully. Status code: ${response.statusCode}');
// print('Response body: ${response.body}'); // print('Response body: ${response.body}');

View File

@@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@@ -284,30 +285,41 @@ class CRUD {
required String link, required String link,
Map<String, dynamic>? payload, Map<String, dynamic>? payload,
}) async { }) async {
// String? basicAuthCredentials = try {
// await storage.read(key: BoxName.basicAuthCredentials); var url = Uri.parse(link);
var url = Uri.parse( var response = await http.post(
link, url,
); body: payload,
var response = await http.post( headers: {
url, "Content-Type": "application/x-www-form-urlencoded",
body: payload, 'Authorization':
headers: { 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
"Content-Type": "application/x-www-form-urlencoded", },
'Authorization': );
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') { if (response.statusCode == 200) {
return response.body; if (jsonData['status'] == 'success') {
return response.body;
} else {
return jsonData['status'];
}
} else { } 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 { } catch (e, stackTrace) {
return response.statusCode; // Log error to Crashlytics
await FirebaseCrashlytics.instance
.recordError(e, stackTrace, reason: 'Exception in post request');
return 'Error occurred';
} }
} }

View File

@@ -126,12 +126,37 @@ class NotificationController extends GetxController {
confirm: MyElevatedButton( confirm: MyElevatedButton(
title: 'send'.tr, title: 'send'.tr,
onPressed: () async { onPressed: () async {
tokensPassengers = box.read(BoxName.tokensPassengers); // tokensPassengers = box.read(BoxName.tokensPassengers);
for (var i = 0; i < tokensPassengers.length; i++) { var tokensPassengersData =
if (formKey.currentState!.validate()) { box.read(BoxName.tokensPassengers)['data'];
FirebaseMessagesController().sendNotificationToAnyWithoutData(
title.text, body.text, tokensPassengers[i], 'order.wav'); // 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( cancel: MyElevatedButton(

BIN
lib/env.zip Normal file

Binary file not shown.

View File

@@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -46,7 +47,8 @@ void main() async {
DeviceOrientation.portraitUp, DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown, DeviceOrientation.portraitDown,
]); ]);
} } // Enable Crashlytics collection
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
runApp(const MainApp()); runApp(const MainApp());
} }

View File

@@ -232,8 +232,8 @@ class StaticDash extends StatelessWidget {
isStepLineChart: true, isStepLineChart: true,
spots: staticController.chartDataRides, spots: staticController.chartDataRides,
isCurved: true, isCurved: true,
color: Colors color: const Color.fromARGB(
.deepPurpleAccent, // Custom color 255, 84, 181, 182), // Custom color
barWidth: 3, // Thinner line barWidth: 3, // Thinner line
dotData: const FlDotData( dotData: const FlDotData(
show: show:

View File

@@ -7,6 +7,7 @@ import Foundation
import file_selector_macos import file_selector_macos
import firebase_core import firebase_core
import firebase_crashlytics
import firebase_messaging import firebase_messaging
import flutter_secure_storage_macos import flutter_secure_storage_macos
import google_sign_in_ios import google_sign_in_ios
@@ -17,6 +18,7 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin"))

View File

@@ -313,6 +313,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.17.2" 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: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -61,6 +61,7 @@ dependencies:
url_launcher: ^6.2.6 url_launcher: ^6.2.6
# webview_flutter: ^4.7.0 # webview_flutter: ^4.7.0
googleapis_auth: ^1.6.0 googleapis_auth: ^1.6.0
firebase_crashlytics: ^3.5.7
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: