Update: 2026-06-28 19:52:45
This commit is contained in:
89
backend/auth/Tester/create_tester_driver.php
Normal file
89
backend/auth/Tester/create_tester_driver.php
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
// ============================================================
|
||||||
|
// create_tester_driver.php
|
||||||
|
// Script to seed/register a pre-verified tester driver.
|
||||||
|
// ============================================================
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../core/bootstrap.php';
|
||||||
|
|
||||||
|
$email = 'driver_tester@siromove.com';
|
||||||
|
$phone = '+962790000002';
|
||||||
|
$password = 'SiroDriver2026!';
|
||||||
|
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
|
||||||
|
|
||||||
|
$encryptedEmail = $encryptionHelper->encryptData($email);
|
||||||
|
$encryptedPhone = $encryptionHelper->encryptData($phone);
|
||||||
|
$encryptedFirstName = $encryptionHelper->encryptData('Driver');
|
||||||
|
$encryptedLastName = $encryptionHelper->encryptData('Tester');
|
||||||
|
$encryptedGender = $encryptionHelper->encryptData('Male');
|
||||||
|
$encryptedBirthdate = $encryptionHelper->encryptData('1990-01-01');
|
||||||
|
$encryptedSite = $encryptionHelper->encryptData('Jordan');
|
||||||
|
|
||||||
|
try {
|
||||||
|
$con = Database::get('main');
|
||||||
|
|
||||||
|
// 1. Check if driver exists
|
||||||
|
$stmt = $con->prepare("SELECT id FROM driver WHERE email = :email LIMIT 1");
|
||||||
|
$stmt->bindParam(':email', $encryptedEmail);
|
||||||
|
$stmt->execute();
|
||||||
|
$driver = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if ($driver) {
|
||||||
|
$driverId = $driver['id'];
|
||||||
|
$update = $con->prepare("UPDATE driver SET password = :password, phone = :phone WHERE id = :id");
|
||||||
|
$update->bindParam(':password', $hashedPassword);
|
||||||
|
$update->bindParam(':phone', $encryptedPhone);
|
||||||
|
$update->bindParam(':id', $driverId);
|
||||||
|
$update->execute();
|
||||||
|
echo "Driver tester updated successfully.\n";
|
||||||
|
} else {
|
||||||
|
$driverId = bin2hex(random_bytes(10)); // 20 chars unique id
|
||||||
|
$insert = $con->prepare("INSERT INTO driver (id, phone, email, password, gender, birthdate, site, first_name, last_name)
|
||||||
|
VALUES (:id, :phone, :email, :password, :gender, :birthdate, :site, :first_name, :last_name)");
|
||||||
|
$insert->bindParam(':id', $driverId);
|
||||||
|
$insert->bindParam(':phone', $encryptedPhone);
|
||||||
|
$insert->bindParam(':email', $encryptedEmail);
|
||||||
|
$insert->bindParam(':password', $hashedPassword);
|
||||||
|
$insert->bindParam(':gender', $encryptedGender);
|
||||||
|
$insert->bindParam(':birthdate', $encryptedBirthdate);
|
||||||
|
$insert->bindParam(':site', $encryptedSite);
|
||||||
|
$insert->bindParam(':first_name', $encryptedFirstName);
|
||||||
|
$insert->bindParam(':last_name', $encryptedLastName);
|
||||||
|
$insert->execute();
|
||||||
|
echo "Driver tester created successfully with ID: $driverId\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Ensure phone_verification row exists
|
||||||
|
$stmtPhone = $con->prepare("SELECT * FROM phone_verification WHERE phone_number = :phone LIMIT 1");
|
||||||
|
$stmtPhone->bindParam(':phone', $encryptedPhone);
|
||||||
|
$stmtPhone->execute();
|
||||||
|
if ($stmtPhone->fetch()) {
|
||||||
|
$updatePhone = $con->prepare("UPDATE phone_verification SET is_verified = 1 WHERE phone_number = :phone");
|
||||||
|
$updatePhone->bindParam(':phone', $encryptedPhone);
|
||||||
|
$updatePhone->execute();
|
||||||
|
} else {
|
||||||
|
$insertPhone = $con->prepare("INSERT INTO phone_verification (phone_number, is_verified) VALUES (:phone, 1)");
|
||||||
|
$insertPhone->bindParam(':phone', $encryptedPhone);
|
||||||
|
$insertPhone->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Ensure CarRegistration row exists
|
||||||
|
$stmtCar = $con->prepare("SELECT * FROM CarRegistration WHERE driverID = :driverID LIMIT 1");
|
||||||
|
$stmtCar->bindParam(':driverID', $driverId);
|
||||||
|
$stmtCar->execute();
|
||||||
|
if ($stmtCar->fetch()) {
|
||||||
|
$updateCar = $con->prepare("UPDATE CarRegistration SET make = 'Toyota', model = 'Prius', year = '2020' WHERE driverID = :driverID");
|
||||||
|
$updateCar->bindParam(':driverID', $driverId);
|
||||||
|
$updateCar->execute();
|
||||||
|
} else {
|
||||||
|
$insertCar = $con->prepare("INSERT INTO CarRegistration (driverID, make, model, year) VALUES (:driverID, 'Toyota', 'Prius', '2020')");
|
||||||
|
$insertCar->bindParam(':driverID', $driverId);
|
||||||
|
$insertCar->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Verification and Car Registration configured.\n";
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo "Error: " . $e->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -104,16 +104,12 @@ PODS:
|
|||||||
- GoogleUtilities/UserDefaults (8.1.1):
|
- GoogleUtilities/UserDefaults (8.1.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GTMSessionFetcher/Core (3.5.0)
|
- GTMSessionFetcher/Core (5.3.0)
|
||||||
- image_cropper (0.0.4):
|
- image_cropper (0.0.4):
|
||||||
- Flutter
|
- Flutter
|
||||||
- TOCropViewController (~> 2.8.0)
|
- TOCropViewController (~> 2.8.0)
|
||||||
- image_picker_ios (0.0.1):
|
- image_picker_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- IOSSecuritySuite (1.9.11)
|
|
||||||
- jailbreak_root_detection (1.0.1):
|
|
||||||
- Flutter
|
|
||||||
- IOSSecuritySuite (~> 1.9.10)
|
|
||||||
- just_audio (0.0.1):
|
- just_audio (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@@ -185,7 +181,6 @@ DEPENDENCIES:
|
|||||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
||||||
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`)
|
|
||||||
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
|
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
|
||||||
- live_activities (from `.symlinks/plugins/live_activities/ios`)
|
- live_activities (from `.symlinks/plugins/live_activities/ios`)
|
||||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||||
@@ -219,7 +214,6 @@ SPEC REPOS:
|
|||||||
- GoogleDataTransport
|
- GoogleDataTransport
|
||||||
- GoogleUtilities
|
- GoogleUtilities
|
||||||
- GTMSessionFetcher
|
- GTMSessionFetcher
|
||||||
- IOSSecuritySuite
|
|
||||||
- MapLibre
|
- MapLibre
|
||||||
- nanopb
|
- nanopb
|
||||||
- PromisesObjC
|
- PromisesObjC
|
||||||
@@ -262,8 +256,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/image_cropper/ios"
|
:path: ".symlinks/plugins/image_cropper/ios"
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
jailbreak_root_detection:
|
|
||||||
:path: ".symlinks/plugins/jailbreak_root_detection/ios"
|
|
||||||
just_audio:
|
just_audio:
|
||||||
:path: ".symlinks/plugins/just_audio/darwin"
|
:path: ".symlinks/plugins/just_audio/darwin"
|
||||||
live_activities:
|
live_activities:
|
||||||
@@ -328,11 +320,9 @@ SPEC CHECKSUMS:
|
|||||||
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da
|
GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da
|
||||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
GTMSessionFetcher: 127211aeec0b1e904fc49f4f6f895dcc535b0ecf
|
||||||
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
|
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
|
||||||
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
IOSSecuritySuite: b51056d5411aee567153ca86ce7f6edfdc5d2654
|
|
||||||
jailbreak_root_detection: 9201e1dfd51dc23069cbfb8d4f4a2d18305170bf
|
|
||||||
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
|
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
|
||||||
live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b
|
live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b
|
||||||
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
import 'package:firebase_auth/firebase_auth.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
|
|
||||||
|
|
||||||
class AuthController extends GetxController {
|
|
||||||
final FirebaseAuth _auth = FirebaseAuth.instance;
|
|
||||||
|
|
||||||
Future<User?> signInWithApple() async {
|
|
||||||
try {
|
|
||||||
final appleCredential = await SignInWithApple.getAppleIDCredential(
|
|
||||||
scopes: [
|
|
||||||
AppleIDAuthorizationScopes.email,
|
|
||||||
AppleIDAuthorizationScopes.fullName,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
final oAuthProvider = OAuthProvider('apple.com');
|
|
||||||
final credential = oAuthProvider.credential(
|
|
||||||
idToken: appleCredential.identityToken,
|
|
||||||
accessToken: appleCredential.authorizationCode,
|
|
||||||
);
|
|
||||||
|
|
||||||
UserCredential userCredential =
|
|
||||||
await _auth.signInWithCredential(credential);
|
|
||||||
|
|
||||||
return userCredential.user;
|
|
||||||
} catch (error) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> signOut() async {
|
|
||||||
try {
|
|
||||||
await _auth.signOut();
|
|
||||||
} catch (error) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,6 @@ import 'package:device_info_plus/device_info_plus.dart';
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jailbreak_root_detection/jailbreak_root_detection.dart';
|
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
import '../../constant/box_name.dart';
|
import '../../constant/box_name.dart';
|
||||||
@@ -188,130 +187,6 @@ void showUpdateDialog(BuildContext context) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class SecurityHelper {
|
|
||||||
/// Performs security checks and handles potential risks
|
|
||||||
static Future<void> performSecurityChecks() async {
|
|
||||||
bool isNotTrust = false;
|
|
||||||
bool isJailBroken = false;
|
|
||||||
bool isRealDevice = true;
|
|
||||||
bool isOnExternalStorage = false;
|
|
||||||
bool checkForIssues = false;
|
|
||||||
bool isDevMode = false;
|
|
||||||
bool isTampered = false;
|
|
||||||
String bundleId = "";
|
|
||||||
|
|
||||||
try {
|
|
||||||
isNotTrust = await JailbreakRootDetection.instance.isNotTrust;
|
|
||||||
isJailBroken = await JailbreakRootDetection.instance.isJailBroken;
|
|
||||||
isRealDevice = await JailbreakRootDetection.instance.isRealDevice;
|
|
||||||
isOnExternalStorage =
|
|
||||||
await JailbreakRootDetection.instance.isOnExternalStorage;
|
|
||||||
|
|
||||||
List<JailbreakIssue> issues =
|
|
||||||
await JailbreakRootDetection.instance.checkForIssues;
|
|
||||||
checkForIssues = issues.isNotEmpty;
|
|
||||||
|
|
||||||
isDevMode = await JailbreakRootDetection.instance.isDevMode;
|
|
||||||
|
|
||||||
// Get Bundle ID
|
|
||||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
||||||
bundleId = packageInfo.packageName;
|
|
||||||
if (bundleId.isNotEmpty) {
|
|
||||||
// Pass the CORRECT bundle ID to isTampered
|
|
||||||
isTampered = await JailbreakRootDetection.instance.isTampered(bundleId);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
debugPrint("Error during security checks: $e");
|
|
||||||
// Consider handling specific exceptions, not just general errors.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save values to storage (using GetStorage)
|
|
||||||
await box.write('isNotTrust', isNotTrust); // Use await for write operations
|
|
||||||
await box.write('isTampered', isTampered); // Use await
|
|
||||||
await box.write('isJailBroken', isJailBroken); // Use await
|
|
||||||
|
|
||||||
debugPrint("Security Check Results:");
|
|
||||||
debugPrint("isNotTrust: $isNotTrust");
|
|
||||||
debugPrint("isJailBroken: $isJailBroken");
|
|
||||||
debugPrint("isRealDevice: $isRealDevice");
|
|
||||||
debugPrint("isOnExternalStorage: $isOnExternalStorage");
|
|
||||||
debugPrint("checkForIssues: $checkForIssues");
|
|
||||||
debugPrint("isDevMode: $isDevMode");
|
|
||||||
debugPrint("isTampered: $isTampered");
|
|
||||||
debugPrint("Bundle ID: $bundleId"); //Log.print the bundle ID
|
|
||||||
|
|
||||||
// Check for security risks and potentially show a warning
|
|
||||||
if (isJailBroken || isRealDevice == false || isTampered) {
|
|
||||||
// Log.print("security_warning".tr); //using easy_localization
|
|
||||||
// Use a more robust approach to show a warning, like a dialog:
|
|
||||||
_showSecurityWarning();
|
|
||||||
} else {
|
|
||||||
box.write(BoxName.security_check, 'passed');
|
|
||||||
Log.print('Security checks passed successfully.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Deletes all app data
|
|
||||||
static void _showSecurityWarning() {
|
|
||||||
// Use an RxInt to track the remaining seconds. This is the KEY!
|
|
||||||
final secondsRemaining = RxInt(10);
|
|
||||||
|
|
||||||
Get.dialog(
|
|
||||||
CupertinoAlertDialog(
|
|
||||||
title: Text("Security Warning".tr),
|
|
||||||
content: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
Obx(() => Text(
|
|
||||||
"Potential security risks detected. The application will close in @seconds seconds."
|
|
||||||
.trParams({
|
|
||||||
// Use trParams for placeholders
|
|
||||||
'seconds': secondsRemaining.value.toString(),
|
|
||||||
}),
|
|
||||||
// Wrap the Text widget in Obx
|
|
||||||
)),
|
|
||||||
SizedBox(height: 24), // More spacing before the progress bar
|
|
||||||
Obx(() => SizedBox(
|
|
||||||
width: double.infinity, // Make progress bar full width
|
|
||||||
child: CupertinoActivityIndicator(
|
|
||||||
// in case of loading
|
|
||||||
radius: 15,
|
|
||||||
animating: true,
|
|
||||||
))),
|
|
||||||
SizedBox(height: 8),
|
|
||||||
Obx(() => ClipRRect(
|
|
||||||
borderRadius: BorderRadius.circular(8), // Rounded corners
|
|
||||||
child: LinearProgressIndicator(
|
|
||||||
value: secondsRemaining.value / 10,
|
|
||||||
backgroundColor: Colors.grey.shade300, // Lighter background
|
|
||||||
valueColor: AlwaysStoppedAnimation<Color>(
|
|
||||||
CupertinoColors.systemRed), // iOS-style red
|
|
||||||
minHeight: 8, // Slightly thicker progress bar
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
barrierDismissible: false,
|
|
||||||
);
|
|
||||||
|
|
||||||
Timer.periodic(Duration(seconds: 1), (timer) {
|
|
||||||
secondsRemaining.value--;
|
|
||||||
if (secondsRemaining.value <= 0) {
|
|
||||||
timer.cancel();
|
|
||||||
// Get.back();
|
|
||||||
_clearDataAndExit();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<void> _clearDataAndExit() async {
|
|
||||||
await storage.deleteAll();
|
|
||||||
await box.erase();
|
|
||||||
exit(0); // Exit the app
|
|
||||||
Log.print('exit');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DeviceHelper {
|
class DeviceHelper {
|
||||||
static Future<String> getDeviceFingerprint() async {
|
static Future<String> getDeviceFingerprint() async {
|
||||||
|
|||||||
@@ -1085,14 +1085,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "1.0.5"
|
||||||
jailbreak_root_detection:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: jailbreak_root_detection
|
|
||||||
sha256: "5000177b9a27428e9c47d2b98f21ab707bef5869c036f9bda4f4f95f4ad67d72"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.2.0+1"
|
|
||||||
jni:
|
jni:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1305,10 +1297,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
|
sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.19"
|
version: "0.12.18"
|
||||||
material_color_utilities:
|
material_color_utilities:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1321,10 +1313,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
|
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.17.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -1909,10 +1901,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
|
sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.11"
|
version: "0.7.9"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ name: siro_rider
|
|||||||
description: "A new Flutter project."
|
description: "A new Flutter project."
|
||||||
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
version: 1.0.0+2
|
version: 1.0.0+3
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.5 <4.0.0"
|
sdk: ">=3.0.5 <4.0.0"
|
||||||
@@ -58,8 +58,6 @@ dependencies:
|
|||||||
webview_flutter_android: ^3.16.2
|
webview_flutter_android: ^3.16.2
|
||||||
webview_flutter_wkwebview: ^3.14.0
|
webview_flutter_wkwebview: ^3.14.0
|
||||||
just_audio: ^0.10.5
|
just_audio: ^0.10.5
|
||||||
# share: ^2.0.4
|
|
||||||
sign_in_with_apple: ^7.0.1
|
|
||||||
firebase_auth: ^6.1.4
|
firebase_auth: ^6.1.4
|
||||||
device_info_plus: 12.3.0
|
device_info_plus: 12.3.0
|
||||||
# uni_links: ^0.5.1
|
# uni_links: ^0.5.1
|
||||||
@@ -72,7 +70,6 @@ dependencies:
|
|||||||
live_activities: ^2.4.7
|
live_activities: ^2.4.7
|
||||||
quick_actions: ^1.1.0
|
quick_actions: ^1.1.0
|
||||||
jwt_decoder: ^2.0.1
|
jwt_decoder: ^2.0.1
|
||||||
jailbreak_root_detection: ^1.2.0+1
|
|
||||||
share_plus: ^12.0.1
|
share_plus: ^12.0.1
|
||||||
dotted_line: ^3.2.3
|
dotted_line: ^3.2.3
|
||||||
shimmer: ^3.0.0
|
shimmer: ^3.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user