Update: 2026-06-13 15:43:50
This commit is contained in:
@@ -37,18 +37,18 @@ try {
|
|||||||
|
|
||||||
if (!empty($driverId)) {
|
if (!empty($driverId)) {
|
||||||
// Driver Invitation Reward Logic
|
// Driver Invitation Reward Logic
|
||||||
$stmt = $con->prepare("SELECT * FROM invit_driver WHERE id = :invite_id AND driverId = :driver_id AND isGiftToken = 0 FOR UPDATE");
|
$stmt = $con->prepare("SELECT * FROM invites WHERE id = :invite_id AND driverId = :driver_id AND isGiftToken = 0 FOR UPDATE");
|
||||||
$stmt->execute([':invite_id' => $inviteId, ':driver_id' => $driverId]);
|
$stmt->execute([':invite_id' => $inviteId, ':driver_id' => $driverId]);
|
||||||
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
|
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
if ($invitation) {
|
if ($invitation) {
|
||||||
$upd = $con->prepare("UPDATE invit_driver SET isGiftToken = 1 WHERE id = :invite_id");
|
$upd = $con->prepare("UPDATE invites SET isGiftToken = 1 WHERE id = :invite_id");
|
||||||
$upd->execute([':invite_id' => $inviteId]);
|
$upd->execute([':invite_id' => $inviteId]);
|
||||||
|
|
||||||
// Reward for current driver
|
// Reward for current driver
|
||||||
addWalletBalance($walletUrl, $driverId, "driver", $rewardAmount);
|
addWalletBalance($walletUrl, $driverId, "driver", $rewardAmount);
|
||||||
// Reward for inviter
|
// Reward for inviter
|
||||||
addWalletBalance($walletUrl, $invitation['driverInviterId'], "driver", $rewardAmount);
|
addWalletBalance($walletUrl, $invitation['driverId'], "driver", $rewardAmount);
|
||||||
|
|
||||||
$con->commit();
|
$con->commit();
|
||||||
echo json_encode(["status" => "success", "message" => "Reward of $rewardAmount $currency claimed successfully."]);
|
echo json_encode(["status" => "success", "message" => "Reward of $rewardAmount $currency claimed successfully."]);
|
||||||
@@ -59,12 +59,12 @@ try {
|
|||||||
|
|
||||||
} elseif (!empty($passengerId)) {
|
} elseif (!empty($passengerId)) {
|
||||||
// Passenger Invitation Reward Logic
|
// Passenger Invitation Reward Logic
|
||||||
$stmt = $con->prepare("SELECT * FROM invit_passenger WHERE id = :invite_id AND passengerInviterId = :passenger_id AND isGiftToken = 0 FOR UPDATE");
|
$stmt = $con->prepare("SELECT * FROM invitesToPassengers WHERE id = :invite_id AND passengerID = :passenger_id AND isGiftToken = 0 FOR UPDATE");
|
||||||
$stmt->execute([':invite_id' => $inviteId, ':passenger_id' => $passengerId]);
|
$stmt->execute([':invite_id' => $inviteId, ':passenger_id' => $passengerId]);
|
||||||
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
|
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
if ($invitation) {
|
if ($invitation) {
|
||||||
$upd = $con->prepare("UPDATE invit_passenger SET isGiftToken = 1 WHERE id = :invite_id");
|
$upd = $con->prepare("UPDATE invitesToPassengers SET isGiftToken = 1 WHERE id = :invite_id");
|
||||||
$upd->execute([':invite_id' => $inviteId]);
|
$upd->execute([':invite_id' => $inviteId]);
|
||||||
|
|
||||||
// Call Wallet Server
|
// Call Wallet Server
|
||||||
|
|||||||
@@ -9,9 +9,6 @@ if (empty($inviteCode) || empty($passengerID)) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🔐 تشفير كود الدعوة قبل البحث
|
|
||||||
$inviteCodeEncrypted = $encryptionHelper->encryptData($inviteCode);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$checkSql = "SELECT `id`, `expirationTime` FROM `invitesToPassengers`
|
$checkSql = "SELECT `id`, `expirationTime` FROM `invitesToPassengers`
|
||||||
WHERE `inviteCode` = :inviteCode
|
WHERE `inviteCode` = :inviteCode
|
||||||
@@ -19,7 +16,7 @@ try {
|
|||||||
AND `isGiftToken` = 0";
|
AND `isGiftToken` = 0";
|
||||||
|
|
||||||
$checkStmt = $con->prepare($checkSql);
|
$checkStmt = $con->prepare($checkSql);
|
||||||
$checkStmt->bindParam(':inviteCode', $inviteCodeEncrypted);
|
$checkStmt->bindParam(':inviteCode', $inviteCode);
|
||||||
$checkStmt->execute();
|
$checkStmt->execute();
|
||||||
|
|
||||||
if ($checkStmt->rowCount() > 0) {
|
if ($checkStmt->rowCount() > 0) {
|
||||||
|
|||||||
@@ -5,6 +5,25 @@
|
|||||||
"storage_bucket": "siro-a6957.firebasestorage.app"
|
"storage_bucket": "siro-a6957.firebasestorage.app"
|
||||||
},
|
},
|
||||||
"client": [
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:caa30eaac3524de51632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.admin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"client_info": {
|
"client_info": {
|
||||||
"mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca",
|
"mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca",
|
||||||
@@ -42,6 +61,63 @@
|
|||||||
"other_platform_oauth_client": []
|
"other_platform_oauth_client": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:be08180beef7d65e1632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.service"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:492d9bc1df6b40c51632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.siro_driver"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:7e9088b719dcb7061632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.siro_rider"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"configuration_version": "1"
|
"configuration_version": "1"
|
||||||
|
|||||||
@@ -31,6 +31,22 @@
|
|||||||
<uses-permission android:name="android.permission.PICTURE_IN_PICTURE" />
|
<uses-permission android:name="android.permission.PICTURE_IN_PICTURE" />
|
||||||
<uses-feature android:name="android.hardware.camera" />
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||||
|
|
||||||
|
<!-- Package visibility declarations for external apps like maps and WhatsApp -->
|
||||||
|
<queries>
|
||||||
|
<package android:name="com.whatsapp" />
|
||||||
|
<package android:name="com.google.android.apps.maps" />
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
</intent>
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<data android:scheme="geo" />
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
|
||||||
<application android:name="${applicationName}" android:icon="@mipmap/launcher_icon"
|
<application android:name="${applicationName}" android:icon="@mipmap/launcher_icon"
|
||||||
android:label="@string/label" android:enableOnBackInvokedCallback="true"
|
android:label="@string/label" android:enableOnBackInvokedCallback="true"
|
||||||
android:allowBackup="false" android:fullBackupContent="false"
|
android:allowBackup="false" android:fullBackupContent="false"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:4525a21b00173d361632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:4002b88e618f0c4e1632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:4525a21b00173d361632ca","ios":"1:825988584191:ios:4002b88e618f0c4e1632ca"}}}}}}
|
{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:492d9bc1df6b40c51632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:a86f1a54f0b1aaa21632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:492d9bc1df6b40c51632ca","ios":"1:825988584191:ios:a86f1a54f0b1aaa21632ca"}}}}}}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<key>PLIST_VERSION</key>
|
<key>PLIST_VERSION</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>BUNDLE_ID</key>
|
<key>BUNDLE_ID</key>
|
||||||
<string>com.siro.driver</string>
|
<string>com.siro.siro-driver</string>
|
||||||
<key>PROJECT_ID</key>
|
<key>PROJECT_ID</key>
|
||||||
<string>siro-a6957</string>
|
<string>siro-a6957</string>
|
||||||
<key>STORAGE_BUCKET</key>
|
<key>STORAGE_BUCKET</key>
|
||||||
@@ -25,6 +25,6 @@
|
|||||||
<key>IS_SIGNIN_ENABLED</key>
|
<key>IS_SIGNIN_ENABLED</key>
|
||||||
<true></true>
|
<true></true>
|
||||||
<key>GOOGLE_APP_ID</key>
|
<key>GOOGLE_APP_ID</key>
|
||||||
<string>1:825988584191:ios:4002b88e618f0c4e1632ca</string>
|
<string>1:825988584191:ios:a86f1a54f0b1aaa21632ca</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -57,6 +57,7 @@
|
|||||||
<array>
|
<array>
|
||||||
<string>googlechromes</string>
|
<string>googlechromes</string>
|
||||||
<string>comgooglemaps</string>
|
<string>comgooglemaps</string>
|
||||||
|
<string>whatsapp</string>
|
||||||
</array>
|
</array>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>12.0</string>
|
<string>12.0</string>
|
||||||
|
|||||||
@@ -17,6 +17,13 @@ class AppLink {
|
|||||||
|
|
||||||
static const String appDomain = 'siromove.com';
|
static const String appDomain = 'siromove.com';
|
||||||
|
|
||||||
|
static String get inviteRedirectUrl {
|
||||||
|
if (currentCountry == 'Syria') {
|
||||||
|
return "https://siromove.com/inviteSyria.php";
|
||||||
|
}
|
||||||
|
return "https://siromove.com/invite.php";
|
||||||
|
}
|
||||||
|
|
||||||
static String get location {
|
static String get location {
|
||||||
switch (currentCountry) {
|
switch (currentCountry) {
|
||||||
case 'Syria': return 'https://api-syria.siromove.com/siro_v3/ride/location';
|
case 'Syria': return 'https://api-syria.siromove.com/siro_v3/ride/location';
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ class InviteController extends GetxController {
|
|||||||
final String shareText =
|
final String shareText =
|
||||||
'''Join Siro as a driver using my referral code!
|
'''Join Siro as a driver using my referral code!
|
||||||
Use code: $driverCouponCode
|
Use code: $driverCouponCode
|
||||||
Download the Siro Driver app now and earn rewards!
|
Download the Siro Driver app now and earn rewards:
|
||||||
|
https://siromove.com/invite.php?code=$driverCouponCode&app=driver
|
||||||
''';
|
''';
|
||||||
await Share.share(shareText);
|
await Share.share(shareText);
|
||||||
}
|
}
|
||||||
@@ -55,7 +56,8 @@ Download the Siro Driver app now and earn rewards!
|
|||||||
if (couponCode != null) {
|
if (couponCode != null) {
|
||||||
final String shareText = '''Get a discount on your first Siro ride!
|
final String shareText = '''Get a discount on your first Siro ride!
|
||||||
Use my referral code: $couponCode
|
Use my referral code: $couponCode
|
||||||
Download the Siro app now and enjoy your ride!
|
Download the Siro app now and enjoy your ride:
|
||||||
|
https://siromove.com/invite.php?code=$couponCode&app=rider
|
||||||
''';
|
''';
|
||||||
await Share.share(shareText);
|
await Share.share(shareText);
|
||||||
}
|
}
|
||||||
@@ -491,15 +493,15 @@ Download the Siro app now and enjoy your ride!
|
|||||||
if (response != 'failure') {
|
if (response != 'failure') {
|
||||||
var d = (response);
|
var d = (response);
|
||||||
mySnackbarSuccess('Invite sent successfully'.tr);
|
mySnackbarSuccess('Invite sent successfully'.tr);
|
||||||
|
String inviteCode = d['message']['inviteCode'].toString();
|
||||||
String message = '${'*Siro DRIVER CODE*'.tr}\n\n'
|
String message = '${'*Siro DRIVER CODE*'.tr}\n\n'
|
||||||
'${"Use this code in registration".tr}\n'
|
'${"Use this code in registration".tr}\n'
|
||||||
'${"To get a gift for both".tr}\n\n'
|
'${"To get a gift for both".tr}\n\n'
|
||||||
'${"The period of this code is 24 hours".tr}\n\n'
|
'${"The period of this code is 24 hours".tr}\n\n'
|
||||||
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
|
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
|
||||||
'_*${d['message']['inviteCode'].toString()}*_\n\n'
|
'_*${inviteCode}*_\n\n'
|
||||||
'${"Install our app:".tr}\n'
|
'${"Quick Invite Link:".tr}\n'
|
||||||
'*Android:* https://play.google.com/store/apps/details?id=com.siro_driver \n\n\n'
|
'${AppLink.inviteRedirectUrl}?code=$inviteCode&app=driver';
|
||||||
'*iOS:* https://apps.apple.com/st/app/siro-driver/id6482995159';
|
|
||||||
|
|
||||||
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
||||||
invitePhoneController.clear();
|
invitePhoneController.clear();
|
||||||
@@ -534,18 +536,16 @@ Download the Siro app now and enjoy your ride!
|
|||||||
if (response != 'failure') {
|
if (response != 'failure') {
|
||||||
var d = response;
|
var d = response;
|
||||||
mySnackbarSuccess('Invite sent successfully'.tr);
|
mySnackbarSuccess('Invite sent successfully'.tr);
|
||||||
|
String inviteCode = d['message']['inviteCode'].toString();
|
||||||
|
|
||||||
String message = '${'*Siro APP CODE*'.tr}\n\n'
|
String message = '${'*Siro APP CODE*'.tr}\n\n'
|
||||||
'${"Use this code in registration".tr}\n\n'
|
'${"Use this code in registration".tr}\n\n'
|
||||||
'${"To get a gift for both".tr}\n\n'
|
'${"To get a gift for both".tr}\n\n'
|
||||||
'${"The period of this code is 24 hours".tr}\n\n'
|
'${"The period of this code is 24 hours".tr}\n\n'
|
||||||
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
|
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
|
||||||
'_*${d['message']['inviteCode'].toString()}*_\n\n'
|
'_*${inviteCode}*_\n\n'
|
||||||
'${"Quick Invite Link:".tr}\n'
|
'${"Quick Invite Link:".tr}\n'
|
||||||
'https://${AppLink.appDomain}/?inviteCode=${d['message']['inviteCode'].toString()}\n\n'
|
'${AppLink.inviteRedirectUrl}?code=$inviteCode&app=rider';
|
||||||
'${"Install our app:".tr}\n'
|
|
||||||
'*Android:* https://play.google.com/store/apps/details?id=com.Siro.siro\n\n\n'
|
|
||||||
'*iOS:* https://apps.apple.com/st/app/siro-rider/id6748075179';
|
|
||||||
|
|
||||||
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
||||||
invitePhoneController.clear();
|
invitePhoneController.clear();
|
||||||
|
|||||||
@@ -51,17 +51,17 @@ class DefaultFirebaseOptions {
|
|||||||
|
|
||||||
static const FirebaseOptions android = FirebaseOptions(
|
static const FirebaseOptions android = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
|
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
|
||||||
appId: '1:825988584191:android:4525a21b00173d361632ca',
|
appId: '1:825988584191:android:492d9bc1df6b40c51632ca',
|
||||||
messagingSenderId: '825988584191',
|
messagingSenderId: '825988584191',
|
||||||
projectId: 'siro-a6957',
|
projectId: 'siro-a6957',
|
||||||
storageBucket: 'siro-a6957.firebasestorage.app',
|
storageBucket: 'siro-a6957.firebasestorage.app',
|
||||||
);
|
);
|
||||||
static const FirebaseOptions ios = FirebaseOptions(
|
static const FirebaseOptions ios = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
|
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
|
||||||
appId: '1:825988584191:ios:4002b88e618f0c4e1632ca',
|
appId: '1:825988584191:ios:a86f1a54f0b1aaa21632ca',
|
||||||
messagingSenderId: '825988584191',
|
messagingSenderId: '825988584191',
|
||||||
projectId: 'siro-a6957',
|
projectId: 'siro-a6957',
|
||||||
storageBucket: 'siro-a6957.firebasestorage.app',
|
storageBucket: 'siro-a6957.firebasestorage.app',
|
||||||
iosBundleId: 'com.siro.driver',
|
iosBundleId: 'com.siro.siro-driver',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:qr_flutter/qr_flutter.dart';
|
|
||||||
import 'package:siro_driver/views/widgets/error_snakbar.dart';
|
import 'package:siro_driver/views/widgets/error_snakbar.dart';
|
||||||
import 'package:siro_driver/views/widgets/my_textField.dart';
|
import 'package:siro_driver/views/widgets/my_textField.dart';
|
||||||
import 'package:siro_driver/views/widgets/elevated_btn.dart'; // Checked import
|
import 'package:siro_driver/views/widgets/elevated_btn.dart'; // Checked import
|
||||||
@@ -40,29 +39,13 @@ class SosConnect extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: Column(
|
child: _buildModernActionButton(
|
||||||
mainAxisSize: MainAxisSize.min,
|
icon: MaterialIcons.warning,
|
||||||
children: [
|
color: Colors.white,
|
||||||
// === SOS Button ===
|
bgColor: AppColor.redColor,
|
||||||
_buildModernActionButton(
|
tooltip: 'EMERGENCY SOS',
|
||||||
icon: MaterialIcons.warning,
|
isPulsing: true,
|
||||||
color: Colors.white,
|
onTap: () => _handleSosCall(controller),
|
||||||
bgColor: AppColor.redColor,
|
|
||||||
tooltip: 'EMERGENCY SOS',
|
|
||||||
isPulsing: true,
|
|
||||||
onTap: () => _handleSosCall(controller),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 8),
|
|
||||||
// === Quick Invite Button ===
|
|
||||||
_buildModernActionButton(
|
|
||||||
icon: Icons.qr_code_rounded,
|
|
||||||
color: Colors.white,
|
|
||||||
bgColor: AppColor.blueColor,
|
|
||||||
tooltip: 'Quick Invite',
|
|
||||||
isPulsing: false,
|
|
||||||
onTap: () => _showQuickInviteDialog(controller),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -140,70 +123,4 @@ class SosConnect extends StatelessWidget {
|
|||||||
launchCommunication('phone', box.read(BoxName.sosPhoneDriver), '');
|
launchCommunication('phone', box.read(BoxName.sosPhoneDriver), '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showQuickInviteDialog(MapDriverController controller) {
|
|
||||||
// In a real scenario, this code would be fetched from the backend (ReferralController)
|
|
||||||
// For now we will use a generated code or driverId. We should use the one from ReferralController
|
|
||||||
// But since we are accessing it globally, we can just use the driverID + 123 for now until it's linked
|
|
||||||
String driverId = box.read(BoxName.driverID).toString();
|
|
||||||
String inviteCode = "SR$driverId"; // Placeholder code
|
|
||||||
String deepLink = "https://${AppLink.appDomain}/invite?ref=$inviteCode";
|
|
||||||
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: "Quick Invite".tr,
|
|
||||||
titleStyle: AppStyle.title.copyWith(fontWeight: FontWeight.bold),
|
|
||||||
content: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"Let the passenger scan this code to sign up".tr,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: const TextStyle(fontSize: 14, color: Colors.grey),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.all(16),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(16),
|
|
||||||
boxShadow: [
|
|
||||||
BoxShadow(
|
|
||||||
color: Colors.black.withOpacity(0.05),
|
|
||||||
blurRadius: 10,
|
|
||||||
offset: const Offset(0, 4),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
child: QrImageView(
|
|
||||||
data: deepLink,
|
|
||||||
version: QrVersions.auto,
|
|
||||||
size: 200.0,
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: AppColor.blueColor.withOpacity(0.1),
|
|
||||||
borderRadius: BorderRadius.circular(12),
|
|
||||||
border: Border.all(color: AppColor.blueColor.withOpacity(0.3)),
|
|
||||||
),
|
|
||||||
child: Text(
|
|
||||||
inviteCode,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 24,
|
|
||||||
fontWeight: FontWeight.w900,
|
|
||||||
color: AppColor.blueColor,
|
|
||||||
letterSpacing: 4,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Done'.tr,
|
|
||||||
onPressed: () => Get.back(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1732,22 +1732,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.0"
|
version: "1.5.0"
|
||||||
qr:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: qr
|
|
||||||
sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.2"
|
|
||||||
qr_flutter:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: qr_flutter
|
|
||||||
sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.1.0"
|
|
||||||
quick_actions:
|
quick_actions:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ dependencies:
|
|||||||
lottie: ^3.3.1
|
lottie: ^3.3.1
|
||||||
shimmer: ^3.0.0
|
shimmer: ^3.0.0
|
||||||
slide_to_act: ^2.0.2
|
slide_to_act: ^2.0.2
|
||||||
qr_flutter: ^4.1.0
|
|
||||||
|
|
||||||
# Services & Hardware
|
# Services & Hardware
|
||||||
battery_plus: ^7.0.0
|
battery_plus: ^7.0.0
|
||||||
|
|||||||
@@ -5,6 +5,44 @@
|
|||||||
"storage_bucket": "siro-a6957.firebasestorage.app"
|
"storage_bucket": "siro-a6957.firebasestorage.app"
|
||||||
},
|
},
|
||||||
"client": [
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:caa30eaac3524de51632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.admin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.driver"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"client_info": {
|
"client_info": {
|
||||||
"mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca",
|
"mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca",
|
||||||
@@ -23,6 +61,44 @@
|
|||||||
"other_platform_oauth_client": []
|
"other_platform_oauth_client": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:be08180beef7d65e1632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.service"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:825988584191:android:7e9088b719dcb7061632ca",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.siro.siro_rider"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"configuration_version": "1"
|
"configuration_version": "1"
|
||||||
|
|||||||
@@ -19,6 +19,21 @@
|
|||||||
<uses-feature android:name="android.hardware.camera" />
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||||
|
|
||||||
|
<!-- Package visibility declarations for external apps like maps and WhatsApp -->
|
||||||
|
<queries>
|
||||||
|
<package android:name="com.whatsapp" />
|
||||||
|
<package android:name="com.google.android.apps.maps" />
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
</intent>
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<data android:scheme="geo" />
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:label="@string/label"
|
android:label="@string/label"
|
||||||
@@ -64,7 +79,7 @@
|
|||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<data android:scheme="siroapp" />
|
<data android:scheme="siromove" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:06782b540c7681ad1632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:1d880fc7fc98b7671632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:06782b540c7681ad1632ca","ios":"1:825988584191:ios:1d880fc7fc98b7671632ca"}}}}}}
|
{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:7e9088b719dcb7061632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:4f60966dd0a69b3f1632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:7e9088b719dcb7061632ca","ios":"1:825988584191:ios:4f60966dd0a69b3f1632ca","macos":"1:825988584191:ios:7b48f585862d5cfc1632ca"}}},"macos":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:7b48f585862d5cfc1632ca","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}}}}}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
platform :ios, '16.1' # This is often set in the generated Podfile section
|
platform :ios, '16.5' # This is often set in the generated Podfile section
|
||||||
|
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
|||||||
@@ -1,68 +1,58 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- app_links (7.0.0):
|
- app_links (7.0.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- AppAuth (2.0.0):
|
|
||||||
- AppAuth/Core (= 2.0.0)
|
|
||||||
- AppAuth/ExternalUserAgent (= 2.0.0)
|
|
||||||
- AppAuth/Core (2.0.0)
|
|
||||||
- AppAuth/ExternalUserAgent (2.0.0):
|
|
||||||
- AppAuth/Core
|
|
||||||
- AppCheckCore (11.2.0):
|
|
||||||
- GoogleUtilities/Environment (~> 8.0)
|
|
||||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
|
||||||
- PromisesObjC (~> 2.4)
|
|
||||||
- audio_session (0.0.1):
|
- audio_session (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- connectivity_plus (0.0.1):
|
- connectivity_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- device_info_plus (0.0.1):
|
- device_info_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Firebase/Auth (12.8.0):
|
- Firebase/Auth (12.14.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseAuth (~> 12.8.0)
|
- FirebaseAuth (~> 12.14.0)
|
||||||
- Firebase/CoreOnly (12.8.0):
|
- Firebase/CoreOnly (12.14.0):
|
||||||
- FirebaseCore (~> 12.8.0)
|
- FirebaseCore (~> 12.14.0)
|
||||||
- Firebase/Messaging (12.8.0):
|
- Firebase/Messaging (12.14.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseMessaging (~> 12.8.0)
|
- FirebaseMessaging (~> 12.14.0)
|
||||||
- firebase_auth (6.1.4):
|
- firebase_auth (6.5.2):
|
||||||
- Firebase/Auth (= 12.8.0)
|
- Firebase/Auth (= 12.14.0)
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- Flutter
|
- Flutter
|
||||||
- firebase_core (4.4.0):
|
- firebase_core (4.10.0):
|
||||||
- Firebase/CoreOnly (= 12.8.0)
|
- Firebase/CoreOnly (= 12.14.0)
|
||||||
- Flutter
|
- Flutter
|
||||||
- firebase_messaging (16.1.1):
|
- firebase_messaging (16.3.0):
|
||||||
- Firebase/Messaging (= 12.8.0)
|
- Firebase/Messaging (= 12.14.0)
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- Flutter
|
- Flutter
|
||||||
- FirebaseAppCheckInterop (12.8.0)
|
- FirebaseAppCheckInterop (12.14.0)
|
||||||
- FirebaseAuth (12.8.0):
|
- FirebaseAuth (12.14.0):
|
||||||
- FirebaseAppCheckInterop (~> 12.8.0)
|
- FirebaseAppCheckInterop (~> 12.14.0)
|
||||||
- FirebaseAuthInterop (~> 12.8.0)
|
- FirebaseAuthInterop (~> 12.14.0)
|
||||||
- FirebaseCore (~> 12.8.0)
|
- FirebaseCore (~> 12.14.0)
|
||||||
- FirebaseCoreExtension (~> 12.8.0)
|
- FirebaseCoreExtension (~> 12.14.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GTMSessionFetcher/Core (< 6.0, >= 3.4)
|
- GTMSessionFetcher/Core (< 6.0, >= 3.4)
|
||||||
- RecaptchaInterop (~> 101.0)
|
- RecaptchaInterop (~> 101.0)
|
||||||
- FirebaseAuthInterop (12.8.0)
|
- FirebaseAuthInterop (12.14.0)
|
||||||
- FirebaseCore (12.8.0):
|
- FirebaseCore (12.14.0):
|
||||||
- FirebaseCoreInternal (~> 12.8.0)
|
- FirebaseCoreInternal (~> 12.14.0)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/Logger (~> 8.1)
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
- FirebaseCoreExtension (12.8.0):
|
- FirebaseCoreExtension (12.14.0):
|
||||||
- FirebaseCore (~> 12.8.0)
|
- FirebaseCore (~> 12.14.0)
|
||||||
- FirebaseCoreInternal (12.8.0):
|
- FirebaseCoreInternal (12.14.0):
|
||||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
- FirebaseInstallations (12.8.0):
|
- FirebaseInstallations (12.14.0):
|
||||||
- FirebaseCore (~> 12.8.0)
|
- FirebaseCore (~> 12.14.0)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
- FirebaseMessaging (12.8.0):
|
- FirebaseMessaging (12.14.0):
|
||||||
- FirebaseCore (~> 12.8.0)
|
- FirebaseCore (~> 12.14.0)
|
||||||
- FirebaseInstallations (~> 12.8.0)
|
- FirebaseInstallations (~> 12.14.0)
|
||||||
- GoogleDataTransport (~> 10.1)
|
- GoogleDataTransport (~> 10.1)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
@@ -87,51 +77,44 @@ PODS:
|
|||||||
- geolocator_apple (1.2.0):
|
- geolocator_apple (1.2.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- google_sign_in_ios (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- FlutterMacOS
|
|
||||||
- GoogleSignIn (~> 9.0)
|
|
||||||
- GTMSessionFetcher (>= 3.4.0)
|
|
||||||
- GoogleDataTransport (10.1.0):
|
- GoogleDataTransport (10.1.0):
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
- GoogleSignIn (9.1.0):
|
- GoogleMLKit/BarcodeScanning (7.0.0):
|
||||||
- AppAuth (~> 2.0)
|
- GoogleMLKit/MLKitCore
|
||||||
- AppCheckCore (~> 11.0)
|
- MLKitBarcodeScanning (~> 6.0.0)
|
||||||
- GTMAppAuth (~> 5.0)
|
- GoogleMLKit/MLKitCore (7.0.0):
|
||||||
- GTMSessionFetcher/Core (~> 3.3)
|
- MLKitCommon (~> 12.0.0)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
- GoogleToolboxForMac/Defines (4.2.1)
|
||||||
|
- GoogleToolboxForMac/Logger (4.2.1):
|
||||||
|
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||||
|
- "GoogleToolboxForMac/NSData+zlib (4.2.1)":
|
||||||
|
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (8.1.1):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Network
|
- GoogleUtilities/Network
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Environment (8.1.0):
|
- GoogleUtilities/Environment (8.1.1):
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Logger (8.1.0):
|
- GoogleUtilities/Logger (8.1.1):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Network (8.1.0):
|
- GoogleUtilities/Network (8.1.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- "GoogleUtilities/NSData+zlib"
|
- "GoogleUtilities/NSData+zlib"
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Reachability
|
- GoogleUtilities/Reachability
|
||||||
- "GoogleUtilities/NSData+zlib (8.1.0)":
|
- "GoogleUtilities/NSData+zlib (8.1.1)":
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Privacy (8.1.0)
|
- GoogleUtilities/Privacy (8.1.1)
|
||||||
- GoogleUtilities/Reachability (8.1.0):
|
- GoogleUtilities/Reachability (8.1.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/UserDefaults (8.1.0):
|
- GoogleUtilities/UserDefaults (8.1.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GTMAppAuth (5.0.0):
|
|
||||||
- AppAuth/Core (~> 2.0)
|
|
||||||
- GTMSessionFetcher/Core (< 4.0, >= 3.3)
|
|
||||||
- GTMSessionFetcher (3.5.0):
|
|
||||||
- GTMSessionFetcher/Full (= 3.5.0)
|
|
||||||
- GTMSessionFetcher/Core (3.5.0)
|
- GTMSessionFetcher/Core (3.5.0)
|
||||||
- GTMSessionFetcher/Full (3.5.0):
|
|
||||||
- GTMSessionFetcher/Core
|
|
||||||
- image_cropper (0.0.4):
|
- image_cropper (0.0.4):
|
||||||
- Flutter
|
- Flutter
|
||||||
- TOCropViewController (~> 2.8.0)
|
- TOCropViewController (~> 2.8.0)
|
||||||
@@ -155,6 +138,26 @@ PODS:
|
|||||||
- maplibre_gl (0.25.0):
|
- maplibre_gl (0.25.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- MapLibre (= 6.19.1)
|
- MapLibre (= 6.19.1)
|
||||||
|
- MLImage (1.0.0-beta6)
|
||||||
|
- MLKitBarcodeScanning (6.0.0):
|
||||||
|
- MLKitCommon (~> 12.0)
|
||||||
|
- MLKitVision (~> 8.0)
|
||||||
|
- MLKitCommon (12.0.0):
|
||||||
|
- GoogleDataTransport (~> 10.0)
|
||||||
|
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
|
||||||
|
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
|
||||||
|
- GoogleUtilities/Logger (~> 8.0)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
|
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
|
||||||
|
- MLKitVision (8.0.0):
|
||||||
|
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
|
||||||
|
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
|
||||||
|
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
|
||||||
|
- MLImage (= 1.0.0-beta6)
|
||||||
|
- MLKitCommon (~> 12.0)
|
||||||
|
- mobile_scanner (6.0.2):
|
||||||
|
- Flutter
|
||||||
|
- GoogleMLKit/BarcodeScanning (~> 7.0.0)
|
||||||
- nanopb (3.30910.0):
|
- nanopb (3.30910.0):
|
||||||
- nanopb/decode (= 3.30910.0)
|
- nanopb/decode (= 3.30910.0)
|
||||||
- nanopb/encode (= 3.30910.0)
|
- nanopb/encode (= 3.30910.0)
|
||||||
@@ -162,13 +165,13 @@ PODS:
|
|||||||
- nanopb/encode (3.30910.0)
|
- nanopb/encode (3.30910.0)
|
||||||
- package_info_plus (0.4.5):
|
- package_info_plus (0.4.5):
|
||||||
- Flutter
|
- Flutter
|
||||||
- permission_handler_apple (9.3.0):
|
- permission_handler_apple (9.4.8):
|
||||||
- Flutter
|
- Flutter
|
||||||
- PromisesObjC (2.4.0)
|
- PromisesObjC (2.4.1)
|
||||||
- quick_actions_ios (0.0.1):
|
- quick_actions_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- RecaptchaInterop (101.0.0)
|
- RecaptchaInterop (101.0.0)
|
||||||
- record_ios (1.2.0):
|
- record_ios (1.2.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- sensors_plus (0.0.1):
|
- sensors_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
@@ -179,66 +182,6 @@ PODS:
|
|||||||
- sqflite_darwin (0.0.4):
|
- sqflite_darwin (0.0.4):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- Stripe (25.6.4):
|
|
||||||
- StripeApplePay (= 25.6.4)
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripeIssuing (= 25.6.4)
|
|
||||||
- StripePayments (= 25.6.4)
|
|
||||||
- StripePaymentsUI (= 25.6.4)
|
|
||||||
- StripeUICore (= 25.6.4)
|
|
||||||
- stripe_ios (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- Stripe (~> 25.6.0)
|
|
||||||
- stripe_ios/stripe_ios (= 0.0.1)
|
|
||||||
- stripe_ios/stripe_objc (= 0.0.1)
|
|
||||||
- StripeApplePay (~> 25.6.0)
|
|
||||||
- StripeFinancialConnections (~> 25.6.0)
|
|
||||||
- StripePayments (~> 25.6.0)
|
|
||||||
- StripePaymentSheet (~> 25.6.0)
|
|
||||||
- StripePaymentsUI (~> 25.6.0)
|
|
||||||
- stripe_ios/stripe_ios (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- Stripe (~> 25.6.0)
|
|
||||||
- stripe_ios/stripe_objc
|
|
||||||
- StripeApplePay (~> 25.6.0)
|
|
||||||
- StripeFinancialConnections (~> 25.6.0)
|
|
||||||
- StripePayments (~> 25.6.0)
|
|
||||||
- StripePaymentSheet (~> 25.6.0)
|
|
||||||
- StripePaymentsUI (~> 25.6.0)
|
|
||||||
- stripe_ios/stripe_objc (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- Stripe (~> 25.6.0)
|
|
||||||
- StripeApplePay (~> 25.6.0)
|
|
||||||
- StripeFinancialConnections (~> 25.6.0)
|
|
||||||
- StripePayments (~> 25.6.0)
|
|
||||||
- StripePaymentSheet (~> 25.6.0)
|
|
||||||
- StripePaymentsUI (~> 25.6.0)
|
|
||||||
- StripeApplePay (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripeCore (25.6.4)
|
|
||||||
- StripeFinancialConnections (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripeUICore (= 25.6.4)
|
|
||||||
- StripeIssuing (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripePayments (= 25.6.4)
|
|
||||||
- StripePaymentsUI (= 25.6.4)
|
|
||||||
- StripePayments (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripePayments/Stripe3DS2 (= 25.6.4)
|
|
||||||
- StripePayments/Stripe3DS2 (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripePaymentSheet (25.6.4):
|
|
||||||
- StripeApplePay (= 25.6.4)
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripePayments (= 25.6.4)
|
|
||||||
- StripePaymentsUI (= 25.6.4)
|
|
||||||
- StripePaymentsUI (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- StripePayments (= 25.6.4)
|
|
||||||
- StripeUICore (= 25.6.4)
|
|
||||||
- StripeUICore (25.6.4):
|
|
||||||
- StripeCore (= 25.6.4)
|
|
||||||
- TOCropViewController (2.8.0)
|
- TOCropViewController (2.8.0)
|
||||||
- url_launcher_ios (0.0.1):
|
- url_launcher_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
@@ -270,7 +213,6 @@ DEPENDENCIES:
|
|||||||
- flutter_tts (from `.symlinks/plugins/flutter_tts/ios`)
|
- flutter_tts (from `.symlinks/plugins/flutter_tts/ios`)
|
||||||
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
||||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
||||||
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/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`)
|
- jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`)
|
||||||
@@ -279,6 +221,7 @@ DEPENDENCIES:
|
|||||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||||
- location (from `.symlinks/plugins/location/ios`)
|
- location (from `.symlinks/plugins/location/ios`)
|
||||||
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
|
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
|
||||||
|
- mobile_scanner (from `.symlinks/plugins/mobile_scanner/ios`)
|
||||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||||
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
|
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
|
||||||
@@ -287,7 +230,6 @@ DEPENDENCIES:
|
|||||||
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
|
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
|
||||||
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
||||||
- stripe_ios (from `.symlinks/plugins/stripe_ios/ios`)
|
|
||||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
- vibration (from `.symlinks/plugins/vibration/ios`)
|
- vibration (from `.symlinks/plugins/vibration/ios`)
|
||||||
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||||
@@ -296,8 +238,6 @@ DEPENDENCIES:
|
|||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
- AppAuth
|
|
||||||
- AppCheckCore
|
|
||||||
- Firebase
|
- Firebase
|
||||||
- FirebaseAppCheckInterop
|
- FirebaseAppCheckInterop
|
||||||
- FirebaseAuth
|
- FirebaseAuth
|
||||||
@@ -308,24 +248,19 @@ SPEC REPOS:
|
|||||||
- FirebaseInstallations
|
- FirebaseInstallations
|
||||||
- FirebaseMessaging
|
- FirebaseMessaging
|
||||||
- GoogleDataTransport
|
- GoogleDataTransport
|
||||||
- GoogleSignIn
|
- GoogleMLKit
|
||||||
|
- GoogleToolboxForMac
|
||||||
- GoogleUtilities
|
- GoogleUtilities
|
||||||
- GTMAppAuth
|
|
||||||
- GTMSessionFetcher
|
- GTMSessionFetcher
|
||||||
- IOSSecuritySuite
|
- IOSSecuritySuite
|
||||||
- MapLibre
|
- MapLibre
|
||||||
|
- MLImage
|
||||||
|
- MLKitBarcodeScanning
|
||||||
|
- MLKitCommon
|
||||||
|
- MLKitVision
|
||||||
- nanopb
|
- nanopb
|
||||||
- PromisesObjC
|
- PromisesObjC
|
||||||
- RecaptchaInterop
|
- RecaptchaInterop
|
||||||
- Stripe
|
|
||||||
- StripeApplePay
|
|
||||||
- StripeCore
|
|
||||||
- StripeFinancialConnections
|
|
||||||
- StripeIssuing
|
|
||||||
- StripePayments
|
|
||||||
- StripePaymentSheet
|
|
||||||
- StripePaymentsUI
|
|
||||||
- StripeUICore
|
|
||||||
- TOCropViewController
|
- TOCropViewController
|
||||||
- WebRTC-SDK
|
- WebRTC-SDK
|
||||||
|
|
||||||
@@ -360,8 +295,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
||||||
geolocator_apple:
|
geolocator_apple:
|
||||||
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
||||||
google_sign_in_ios:
|
|
||||||
:path: ".symlinks/plugins/google_sign_in_ios/darwin"
|
|
||||||
image_cropper:
|
image_cropper:
|
||||||
:path: ".symlinks/plugins/image_cropper/ios"
|
:path: ".symlinks/plugins/image_cropper/ios"
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
@@ -378,6 +311,8 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/location/ios"
|
:path: ".symlinks/plugins/location/ios"
|
||||||
maplibre_gl:
|
maplibre_gl:
|
||||||
:path: ".symlinks/plugins/maplibre_gl/ios"
|
:path: ".symlinks/plugins/maplibre_gl/ios"
|
||||||
|
mobile_scanner:
|
||||||
|
:path: ".symlinks/plugins/mobile_scanner/ios"
|
||||||
package_info_plus:
|
package_info_plus:
|
||||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
@@ -394,8 +329,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/sign_in_with_apple/ios"
|
:path: ".symlinks/plugins/sign_in_with_apple/ios"
|
||||||
sqflite_darwin:
|
sqflite_darwin:
|
||||||
:path: ".symlinks/plugins/sqflite_darwin/darwin"
|
:path: ".symlinks/plugins/sqflite_darwin/darwin"
|
||||||
stripe_ios:
|
|
||||||
:path: ".symlinks/plugins/stripe_ios/ios"
|
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
vibration:
|
vibration:
|
||||||
@@ -409,23 +342,21 @@ EXTERNAL SOURCES:
|
|||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8
|
app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8
|
||||||
AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063
|
|
||||||
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
|
|
||||||
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
|
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
|
||||||
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
||||||
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
|
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
|
||||||
Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d
|
Firebase: 7cc10425300768ec86292688af5cb228f0604bde
|
||||||
firebase_auth: e9031a1dbe04a90d98e8d11ff2302352a1c6d9e8
|
firebase_auth: d4091ec40b52cc2ea56171ea521c30b388844acb
|
||||||
firebase_core: ee30637e6744af8e0c12a6a1e8a9718506ec2398
|
firebase_core: 383e19b49a08df5d7a6cf5017616de6a357ed7af
|
||||||
firebase_messaging: 343de01a8d3e18b60df0c6d37f7174c44ae38e02
|
firebase_messaging: ab03d6090864c0fb8136521231df6a66cb13be49
|
||||||
FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d
|
FirebaseAppCheckInterop: f123c0261a7b46f060e98fc2961651f1ac68f384
|
||||||
FirebaseAuth: 4c289b1a43f5955283244a55cf6bd616de344be5
|
FirebaseAuth: 01a77d472aec77ec008141e7d859d1b9cb8dc2cf
|
||||||
FirebaseAuthInterop: 95363fe96493cb4f106656666a0768b420cba090
|
FirebaseAuthInterop: 63056ef7f9602e79a8f8d756d4cb35f38e2927c3
|
||||||
FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c
|
FirebaseCore: 4939b340b9c598dc1f965d68f8fe57e630b65407
|
||||||
FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2
|
FirebaseCoreExtension: ee3e3697acea1062288b1900bcdcab4d59ab93b4
|
||||||
FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21
|
FirebaseCoreInternal: 090369a5fffd7423cf88006ab4d2ccc2173a8db9
|
||||||
FirebaseInstallations: 6a14ab3d694ebd9f839c48d330da5547e9ca9dc0
|
FirebaseInstallations: 7cdc919e29dc54306edeffdbdc1eed1a40d7d1e7
|
||||||
FirebaseMessaging: 7f42cfd10ec64181db4e01b305a613791c8e782c
|
FirebaseMessaging: 4803888ce3002188f24e19faa8d2326261538426
|
||||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b
|
flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b
|
||||||
flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f
|
flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f
|
||||||
@@ -434,11 +365,10 @@ SPEC CHECKSUMS:
|
|||||||
flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113
|
flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113
|
||||||
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
|
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
|
||||||
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
||||||
google_sign_in_ios: 000870aa06da9b28d1d0bf7ef70ff0213059dd28
|
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleSignIn: fcee2257188d5eda57a5e2b6a715550ffff9206d
|
GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318
|
||||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
|
||||||
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
|
GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da
|
||||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
||||||
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
|
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
|
||||||
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
@@ -450,35 +380,30 @@ SPEC CHECKSUMS:
|
|||||||
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
|
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
|
||||||
MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952
|
MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952
|
||||||
maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2
|
maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2
|
||||||
|
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
|
||||||
|
MLKitBarcodeScanning: 0a3064da0a7f49ac24ceb3cb46a5bc67496facd2
|
||||||
|
MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d
|
||||||
|
MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e
|
||||||
|
mobile_scanner: af8f71879eaba2bbcb4d86c6a462c3c0e7f23036
|
||||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||||
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||||
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
|
permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
|
||||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
|
||||||
quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779
|
quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779
|
||||||
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
|
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
|
||||||
record_ios: 412daca2350b228e698fffcd08f1f94ceb1e3844
|
record_ios: 980fd386a97a35987d0fce3dfda4b26a38c90f4c
|
||||||
sensors_plus: 3c3bac724a2128c895623e03efd82cf0e94fd8e8
|
sensors_plus: 3c3bac724a2128c895623e03efd82cf0e94fd8e8
|
||||||
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
|
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
|
||||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||||
Stripe: 7cb1009980324c6c16b6a4af5843b8ef54549065
|
|
||||||
stripe_ios: eebee52319de946cc0da2d6ddc98a89b04cec95e
|
|
||||||
StripeApplePay: 91000b0927f53c58a2a1f829a4ee246d508bd1c4
|
|
||||||
StripeCore: f6ca805768a7807ec014c0523cd99a3d16d21d6b
|
|
||||||
StripeFinancialConnections: 2cb9bc81468599d1b4b41178f49879a65c8ac52e
|
|
||||||
StripeIssuing: 7ffde774af77d713aff204858fcf765eeb3677d3
|
|
||||||
StripePayments: 4de3976a0d5f626cfc8ad4e010aff1cbda8dc1e5
|
|
||||||
StripePaymentSheet: 29443db7e8635e2d3a00758f1ecebbb17a24ff19
|
|
||||||
StripePaymentsUI: 37551e684263db449368ccac27438947e1b45f84
|
|
||||||
StripeUICore: f1e43a68ab1e1428f8738df821eb64efac1d871a
|
|
||||||
TOCropViewController: 797deaf39c90e6e9ddd848d88817f6b9a8a09888
|
TOCropViewController: 797deaf39c90e6e9ddd848d88817f6b9a8a09888
|
||||||
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||||
vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb
|
vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb
|
||||||
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
|
video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52
|
||||||
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
||||||
WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d
|
WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d
|
||||||
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
|
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
|
||||||
|
|
||||||
PODFILE CHECKSUM: 2ba2e4898a3d9a1615dafa81db0705bd67da92c3
|
PODFILE CHECKSUM: bd6e2f6541b0ca1731e9c8557eb4a4f6036c5508
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "152.png",
|
"filename" : "logo_siro.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "152 1.png",
|
"filename" : "logo_siro 1.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "152 2.png",
|
"filename" : "logo_siro 2.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro 1.png
vendored
Normal file
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro 1.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 MiB |
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro 2.png
vendored
Normal file
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro 2.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 MiB |
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro.png
vendored
Normal file
BIN
siro_rider/ios/RideWidget/Assets.xcassets/SiroIcon.imageset/logo_siro.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 MiB |
@@ -17,7 +17,7 @@ extension LiveActivitiesAppAttributes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3️⃣ Shared App Group
|
// 3️⃣ Shared App Group
|
||||||
let sharedDefault = UserDefaults(suiteName: "group.com.siro.siro_rider")!
|
let sharedDefault = UserDefaults(suiteName: "group.com.Siro.siro")!
|
||||||
|
|
||||||
@available(iOS 16.1, *)
|
@available(iOS 16.1, *)
|
||||||
struct RideWidgetLiveActivity: Widget {
|
struct RideWidgetLiveActivity: Widget {
|
||||||
|
|||||||
@@ -672,7 +672,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -861,7 +861,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -927,7 +927,7 @@
|
|||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
@@ -972,7 +972,7 @@
|
|||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
@@ -1015,7 +1015,7 @@
|
|||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<key>PLIST_VERSION</key>
|
<key>PLIST_VERSION</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>BUNDLE_ID</key>
|
<key>BUNDLE_ID</key>
|
||||||
<string>com.siro.rider</string>
|
<string>com.siroapp.rider</string>
|
||||||
<key>PROJECT_ID</key>
|
<key>PROJECT_ID</key>
|
||||||
<string>siro-a6957</string>
|
<string>siro-a6957</string>
|
||||||
<key>STORAGE_BUCKET</key>
|
<key>STORAGE_BUCKET</key>
|
||||||
@@ -25,6 +25,6 @@
|
|||||||
<key>IS_SIGNIN_ENABLED</key>
|
<key>IS_SIGNIN_ENABLED</key>
|
||||||
<true></true>
|
<true></true>
|
||||||
<key>GOOGLE_APP_ID</key>
|
<key>GOOGLE_APP_ID</key>
|
||||||
<string>1:825988584191:ios:1d880fc7fc98b7671632ca</string>
|
<string>1:825988584191:ios:4f60966dd0a69b3f1632ca</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -48,6 +48,7 @@
|
|||||||
<array>
|
<array>
|
||||||
<string>googlechromes</string>
|
<string>googlechromes</string>
|
||||||
<string>comgooglemaps</string>
|
<string>comgooglemaps</string>
|
||||||
|
<string>whatsapp</string>
|
||||||
</array>
|
</array>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
|||||||
@@ -3,6 +3,14 @@ import 'package:siro_rider/main.dart';
|
|||||||
|
|
||||||
class AppLink {
|
class AppLink {
|
||||||
static const String appDomain = 'siromove.com';
|
static const String appDomain = 'siromove.com';
|
||||||
|
|
||||||
|
static String get inviteRedirectUrl {
|
||||||
|
if (currentCountry == 'Syria') {
|
||||||
|
return "https://siromove.com/inviteSyria.php";
|
||||||
|
}
|
||||||
|
return "https://siromove.com/invite.php";
|
||||||
|
}
|
||||||
|
|
||||||
static String get currentCountry => box.read(BoxName.countryCode) ?? 'Jordan';
|
static String get currentCountry => box.read(BoxName.countryCode) ?? 'Jordan';
|
||||||
|
|
||||||
static String get paymentServer {
|
static String get paymentServer {
|
||||||
|
|||||||
@@ -51,7 +51,8 @@ class InviteController extends GetxController {
|
|||||||
final String shareText = '''
|
final String shareText = '''
|
||||||
${'Join Siro as a driver using my referral code!'.tr}
|
${'Join Siro as a driver using my referral code!'.tr}
|
||||||
${'Use code:'.tr} $driverCouponCode
|
${'Use code:'.tr} $driverCouponCode
|
||||||
${'Download the Siro Driver app now and earn rewards!'.tr}
|
${'Download the Siro Driver app now and earn rewards:'.tr}
|
||||||
|
${AppLink.inviteRedirectUrl}?code=$driverCouponCode&app=driver
|
||||||
''';
|
''';
|
||||||
await Share.share(shareText);
|
await Share.share(shareText);
|
||||||
}
|
}
|
||||||
@@ -62,7 +63,8 @@ ${'Download the Siro Driver app now and earn rewards!'.tr}
|
|||||||
final String shareText = '''
|
final String shareText = '''
|
||||||
${'Get a discount on your first Siro ride!'.tr}
|
${'Get a discount on your first Siro ride!'.tr}
|
||||||
${'Use my referral code:'.tr} $couponCode
|
${'Use my referral code:'.tr} $couponCode
|
||||||
${'Download the Siro app now and enjoy your ride!'.tr}
|
${'Download the Siro app now and enjoy your ride:'.tr}
|
||||||
|
${AppLink.inviteRedirectUrl}?code=$couponCode&app=rider
|
||||||
''';
|
''';
|
||||||
await Share.share(shareText);
|
await Share.share(shareText);
|
||||||
}
|
}
|
||||||
@@ -248,9 +250,8 @@ ${'Download the Siro app now and enjoy your ride!'.tr}
|
|||||||
"${'Your personal invitation code is:'.tr}\n"
|
"${'Your personal invitation code is:'.tr}\n"
|
||||||
"*$inviteCode*\n\n"
|
"*$inviteCode*\n\n"
|
||||||
"⏳ ${'Be sure to use it quickly! This code expires at'.tr} *$expirationTime*.\n\n"
|
"⏳ ${'Be sure to use it quickly! This code expires at'.tr} *$expirationTime*.\n\n"
|
||||||
"📲 ${'Download the app now:'.tr}\n"
|
"🔗 ${'Quick Invite Link:'.tr}\n"
|
||||||
"• *Android:* https://play.google.com/store/apps/details?id=com.Siro.siro\n"
|
"${AppLink.inviteRedirectUrl}?code=$inviteCode&app=rider\n\n"
|
||||||
"• *iOS:* https://apps.apple.com/st/app/siro-rider/id6748075179\n\n"
|
|
||||||
"${'See you on the road!'.tr} 🚗";
|
"${'See you on the road!'.tr} 🚗";
|
||||||
|
|
||||||
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
launchCommunication('whatsapp', formattedPhoneNumber, message);
|
||||||
|
|||||||
@@ -46,22 +46,6 @@ class InvitesRewardsController extends GetxController {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> processScannedQRCode(String code) async {
|
|
||||||
if (code.contains('inviteCode=')) {
|
|
||||||
Uri uri = Uri.parse(code);
|
|
||||||
String? inviteCode = uri.queryParameters['inviteCode'];
|
|
||||||
|
|
||||||
if (inviteCode != null && inviteCode.isNotEmpty) {
|
|
||||||
await linkInviteCode(inviteCode);
|
|
||||||
} else {
|
|
||||||
Get.snackbar("Error".tr, "Invalid QR Code".tr);
|
|
||||||
}
|
|
||||||
} else if (code.length >= 4 && code.length <= 15) {
|
|
||||||
await linkInviteCode(code);
|
|
||||||
} else {
|
|
||||||
Get.snackbar("Error".tr, "Invalid QR Code format".tr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> linkInviteCode(String inviteCode) async {
|
Future<void> linkInviteCode(String inviteCode) async {
|
||||||
Get.dialog(const Center(child: CircularProgressIndicator()), barrierDismissible: false);
|
Get.dialog(const Center(child: CircularProgressIndicator()), barrierDismissible: false);
|
||||||
|
|||||||
@@ -28,10 +28,7 @@ class DefaultFirebaseOptions {
|
|||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
return ios;
|
return ios;
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
throw UnsupportedError(
|
return macos;
|
||||||
'DefaultFirebaseOptions have not been configured for macos - '
|
|
||||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
|
||||||
);
|
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
throw UnsupportedError(
|
throw UnsupportedError(
|
||||||
'DefaultFirebaseOptions have not been configured for windows - '
|
'DefaultFirebaseOptions have not been configured for windows - '
|
||||||
@@ -51,17 +48,25 @@ class DefaultFirebaseOptions {
|
|||||||
|
|
||||||
static const FirebaseOptions android = FirebaseOptions(
|
static const FirebaseOptions android = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
|
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
|
||||||
appId: '1:825988584191:android:06782b540c7681ad1632ca',
|
appId: '1:825988584191:android:7e9088b719dcb7061632ca',
|
||||||
messagingSenderId: '825988584191',
|
messagingSenderId: '825988584191',
|
||||||
projectId: 'siro-a6957',
|
projectId: 'siro-a6957',
|
||||||
storageBucket: 'siro-a6957.firebasestorage.app',
|
storageBucket: 'siro-a6957.firebasestorage.app',
|
||||||
);
|
);
|
||||||
static const FirebaseOptions ios = FirebaseOptions(
|
static const FirebaseOptions ios = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
|
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
|
||||||
appId: '1:825988584191:ios:1d880fc7fc98b7671632ca',
|
appId: '1:825988584191:ios:4f60966dd0a69b3f1632ca',
|
||||||
messagingSenderId: '825988584191',
|
messagingSenderId: '825988584191',
|
||||||
projectId: 'siro-a6957',
|
projectId: 'siro-a6957',
|
||||||
storageBucket: 'siro-a6957.firebasestorage.app',
|
storageBucket: 'siro-a6957.firebasestorage.app',
|
||||||
iosBundleId: 'com.siro.rider',
|
iosBundleId: 'com.siroapp.rider',
|
||||||
|
);
|
||||||
|
static const FirebaseOptions macos = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
|
||||||
|
appId: '1:825988584191:ios:7b48f585862d5cfc1632ca',
|
||||||
|
messagingSenderId: '825988584191',
|
||||||
|
projectId: 'siro-a6957',
|
||||||
|
storageBucket: 'siro-a6957.firebasestorage.app',
|
||||||
|
iosBundleId: 'com.siro.siroRider',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:mobile_scanner/mobile_scanner.dart';
|
|
||||||
import 'package:siro_rider/constant/colors.dart';
|
|
||||||
import 'package:siro_rider/controller/home/profile/invites_rewards_controller.dart';
|
|
||||||
|
|
||||||
class QRScannerPage extends StatefulWidget {
|
|
||||||
@override
|
|
||||||
_QRScannerPageState createState() => _QRScannerPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _QRScannerPageState extends State<QRScannerPage> {
|
|
||||||
final InvitesRewardsController controller = Get.find<InvitesRewardsController>();
|
|
||||||
bool _isScanned = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: Colors.black,
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.black,
|
|
||||||
iconTheme: const IconThemeData(color: Colors.white),
|
|
||||||
title: Text("Scan QR Code".tr, style: const TextStyle(color: Colors.white)),
|
|
||||||
),
|
|
||||||
body: Stack(
|
|
||||||
children: [
|
|
||||||
MobileScanner(
|
|
||||||
onDetect: (capture) {
|
|
||||||
if (_isScanned) return;
|
|
||||||
final List<Barcode> barcodes = capture.barcodes;
|
|
||||||
for (final barcode in barcodes) {
|
|
||||||
if (barcode.rawValue != null) {
|
|
||||||
setState(() => _isScanned = true);
|
|
||||||
Get.back(); // close scanner page
|
|
||||||
controller.processScannedQRCode(barcode.rawValue!);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
Center(
|
|
||||||
child: Container(
|
|
||||||
width: 250,
|
|
||||||
height: 250,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(color: AppColor.primaryColor, width: 3),
|
|
||||||
borderRadius: BorderRadius.circular(12),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Positioned(
|
|
||||||
bottom: 50,
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
"Align QR Code within the frame".tr,
|
|
||||||
style: const TextStyle(color: Colors.white, fontSize: 16),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,8 +7,6 @@ import '../../../constant/links.dart';
|
|||||||
import '../../../constant/style.dart';
|
import '../../../constant/style.dart';
|
||||||
import '../../../controller/home/profile/invit_controller.dart';
|
import '../../../controller/home/profile/invit_controller.dart';
|
||||||
import '../../../controller/home/profile/invites_rewards_controller.dart';
|
import '../../../controller/home/profile/invites_rewards_controller.dart';
|
||||||
import 'package:qr_flutter/qr_flutter.dart';
|
|
||||||
import 'qr_scanner_page.dart';
|
|
||||||
import '../../../print.dart';
|
import '../../../print.dart';
|
||||||
|
|
||||||
class ShareAppPage extends StatelessWidget {
|
class ShareAppPage extends StatelessWidget {
|
||||||
@@ -48,12 +46,6 @@ class ShareAppPage extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
floatingActionButton: FloatingActionButton.extended(
|
|
||||||
backgroundColor: AppColor.primaryColor,
|
|
||||||
onPressed: () => Get.to(() => QRScannerPage()),
|
|
||||||
icon: const Icon(CupertinoIcons.qrcode_viewfinder, color: Colors.white),
|
|
||||||
label: Text("Scan QR".tr, style: const TextStyle(color: Colors.white)),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,8 +53,6 @@ class ShareAppPage extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
_buildQRCodeSection(),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(16),
|
padding: const EdgeInsets.all(16),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@@ -603,51 +593,7 @@ class ShareAppPage extends StatelessWidget {
|
|||||||
// );
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildQRCodeSection() {
|
|
||||||
return GetBuilder<InvitesRewardsController>(
|
|
||||||
builder: (rewardsController) {
|
|
||||||
if (rewardsController.isLoading) {
|
|
||||||
return const Center(child: CupertinoActivityIndicator());
|
|
||||||
}
|
|
||||||
String qrData =
|
|
||||||
'https://${AppLink.appDomain}/?inviteCode=${rewardsController.referralCode ?? ''}';
|
|
||||||
|
|
||||||
return Center(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text("Your QR Code".tr,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
if (rewardsController.referralCode != null)
|
|
||||||
Container(
|
|
||||||
padding: const EdgeInsets.all(12),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(16),
|
|
||||||
),
|
|
||||||
child: QrImageView(
|
|
||||||
data: qrData,
|
|
||||||
version: QrVersions.auto,
|
|
||||||
size: 200.0,
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
if (rewardsController.referralCode != null)
|
|
||||||
Text(
|
|
||||||
rewardsController.referralCode!,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 24,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
letterSpacing: 2),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildUnifiedRewardsList() {
|
Widget _buildUnifiedRewardsList() {
|
||||||
return GetBuilder<InvitesRewardsController>(
|
return GetBuilder<InvitesRewardsController>(
|
||||||
|
|||||||
@@ -240,53 +240,65 @@ class _SnackContentState extends State<_SnackContent>
|
|||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
// Internal dispatcher — single source of truth
|
// Internal dispatcher — single source of truth
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
SnackbarController _show(_SnackVariant variant, String message) {
|
SnackbarController? _show(_SnackVariant variant, String message) {
|
||||||
// Dismiss any existing snackbar first (no stacking)
|
// Prevent crash if Navigator or Overlay context is not yet initialized at early startup
|
||||||
if (Get.isSnackbarOpen) Get.closeCurrentSnackbar();
|
if (Get.context == null || Get.overlayContext == null) {
|
||||||
|
debugPrint("⚠️ Cannot show snackbar: Overlay/Navigator is not ready yet. Message: $message");
|
||||||
switch (variant.haptic) {
|
return null;
|
||||||
case HapticFeedbackType.light:
|
|
||||||
HapticFeedback.lightImpact();
|
|
||||||
case HapticFeedbackType.medium:
|
|
||||||
HapticFeedback.mediumImpact();
|
|
||||||
case HapticFeedbackType.selection:
|
|
||||||
HapticFeedback.selectionClick();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Get.snackbar(
|
try {
|
||||||
'',
|
// Dismiss any existing snackbar first (no stacking)
|
||||||
'',
|
if (Get.isSnackbarOpen) Get.closeCurrentSnackbar();
|
||||||
snackPosition: SnackPosition.TOP,
|
|
||||||
backgroundColor: Colors.transparent,
|
switch (variant.haptic) {
|
||||||
margin: EdgeInsets.zero,
|
case HapticFeedbackType.light:
|
||||||
padding: EdgeInsets.zero,
|
HapticFeedback.lightImpact();
|
||||||
duration: const Duration(seconds: 4),
|
case HapticFeedbackType.medium:
|
||||||
animationDuration: const Duration(milliseconds: 380),
|
HapticFeedback.mediumImpact();
|
||||||
barBlur: 0,
|
case HapticFeedbackType.selection:
|
||||||
overlayBlur: 0,
|
HapticFeedback.selectionClick();
|
||||||
overlayColor: Colors.transparent,
|
}
|
||||||
isDismissible: true,
|
|
||||||
dismissDirection: DismissDirection.up,
|
return Get.snackbar(
|
||||||
forwardAnimationCurve: Curves.easeOutCubic,
|
'',
|
||||||
reverseAnimationCurve: Curves.easeInCubic,
|
'',
|
||||||
snackStyle: SnackStyle.FLOATING,
|
snackPosition: SnackPosition.TOP,
|
||||||
userInputForm: Form(
|
backgroundColor: Colors.transparent,
|
||||||
child: _SnackContent(message: message, variant: variant),
|
margin: EdgeInsets.zero,
|
||||||
),
|
padding: EdgeInsets.zero,
|
||||||
);
|
duration: const Duration(seconds: 4),
|
||||||
|
animationDuration: const Duration(milliseconds: 380),
|
||||||
|
barBlur: 0,
|
||||||
|
overlayBlur: 0,
|
||||||
|
overlayColor: Colors.transparent,
|
||||||
|
isDismissible: true,
|
||||||
|
dismissDirection: DismissDirection.up,
|
||||||
|
forwardAnimationCurve: Curves.easeOutCubic,
|
||||||
|
reverseAnimationCurve: Curves.easeInCubic,
|
||||||
|
snackStyle: SnackStyle.FLOATING,
|
||||||
|
userInputForm: Form(
|
||||||
|
child: _SnackContent(message: message, variant: variant),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint("⚠️ Exception caught showing snackbar: $e");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
// Public API — drop-in replacements for the old functions
|
// Public API — drop-in replacements for the old functions
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
SnackbarController mySnackbarSuccess(String message) =>
|
SnackbarController? mySnackbarSuccess(String message) =>
|
||||||
_show(_SnackVariant.success, message);
|
_show(_SnackVariant.success, message);
|
||||||
|
|
||||||
SnackbarController mySnackeBarError(String message) =>
|
SnackbarController? mySnackeBarError(String message) =>
|
||||||
_show(_SnackVariant.error, message);
|
_show(_SnackVariant.error, message);
|
||||||
|
|
||||||
SnackbarController mySnackbarInfo(String message) =>
|
SnackbarController? mySnackbarInfo(String message) =>
|
||||||
_show(_SnackVariant.info, message);
|
_show(_SnackVariant.info, message);
|
||||||
|
|
||||||
SnackbarController mySnackbarWarning(String message) =>
|
SnackbarController? mySnackbarWarning(String message) =>
|
||||||
_show(_SnackVariant.warning, message);
|
_show(_SnackVariant.warning, message);
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import geolocator_apple
|
|||||||
import just_audio
|
import just_audio
|
||||||
import local_auth_darwin
|
import local_auth_darwin
|
||||||
import location
|
import location
|
||||||
import mobile_scanner
|
|
||||||
import package_info_plus
|
import package_info_plus
|
||||||
import record_macos
|
import record_macos
|
||||||
import share_plus
|
import share_plus
|
||||||
@@ -51,7 +50,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
|
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
|
||||||
LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin"))
|
LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin"))
|
||||||
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
|
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
|
||||||
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
|
|
||||||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||||
RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin"))
|
RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin"))
|
||||||
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
/* End PBXAggregateTarget section */
|
/* End PBXAggregateTarget section */
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
16396FA43926BDE6F011EC7C /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 37E101A228C86107D9AA7AE3 /* GoogleService-Info.plist */; };
|
||||||
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
|
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
|
||||||
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
|
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
|
||||||
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
|
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
|
||||||
@@ -64,7 +65,7 @@
|
|||||||
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
||||||
33CC10ED2044A3C60003C045 /* siro_rider.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "siro_rider.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
33CC10ED2044A3C60003C045 /* siro_rider.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = siro_rider.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
||||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
@@ -76,6 +77,7 @@
|
|||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
||||||
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
||||||
|
37E101A228C86107D9AA7AE3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
@@ -125,6 +127,7 @@
|
|||||||
331C80D6294CF71000263BE5 /* RunnerTests */,
|
331C80D6294CF71000263BE5 /* RunnerTests */,
|
||||||
33CC10EE2044A3C60003C045 /* Products */,
|
33CC10EE2044A3C60003C045 /* Products */,
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
||||||
|
37E101A228C86107D9AA7AE3 /* GoogleService-Info.plist */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -285,6 +288,7 @@
|
|||||||
files = (
|
files = (
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
|
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
|
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
|
||||||
|
16396FA43926BDE6F011EC7C /* GoogleService-Info.plist in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
30
siro_rider/macos/Runner/GoogleService-Info.plist
Normal file
30
siro_rider/macos/Runner/GoogleService-Info.plist
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>API_KEY</key>
|
||||||
|
<string>AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA</string>
|
||||||
|
<key>GCM_SENDER_ID</key>
|
||||||
|
<string>825988584191</string>
|
||||||
|
<key>PLIST_VERSION</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>BUNDLE_ID</key>
|
||||||
|
<string>com.siro.siroRider</string>
|
||||||
|
<key>PROJECT_ID</key>
|
||||||
|
<string>siro-a6957</string>
|
||||||
|
<key>STORAGE_BUCKET</key>
|
||||||
|
<string>siro-a6957.firebasestorage.app</string>
|
||||||
|
<key>IS_ADS_ENABLED</key>
|
||||||
|
<false></false>
|
||||||
|
<key>IS_ANALYTICS_ENABLED</key>
|
||||||
|
<false></false>
|
||||||
|
<key>IS_APPINVITE_ENABLED</key>
|
||||||
|
<true></true>
|
||||||
|
<key>IS_GCM_ENABLED</key>
|
||||||
|
<true></true>
|
||||||
|
<key>IS_SIGNIN_ENABLED</key>
|
||||||
|
<true></true>
|
||||||
|
<key>GOOGLE_APP_ID</key>
|
||||||
|
<string>1:825988584191:ios:7b48f585862d5cfc1632ca</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -340,10 +340,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd
|
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.4.0"
|
version: "12.3.0"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1333,14 +1333,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
mobile_scanner:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: mobile_scanner
|
|
||||||
sha256: d234581c090526676fd8fab4ada92f35c6746e3fb4f05a399665d75a399fb760
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "5.2.3"
|
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1581,22 +1573,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.0"
|
version: "1.5.0"
|
||||||
qr:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: qr
|
|
||||||
sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.2"
|
|
||||||
qr_flutter:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: qr_flutter
|
|
||||||
sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.1.0"
|
|
||||||
quick_actions:
|
quick_actions:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ dependencies:
|
|||||||
# share: ^2.0.4
|
# share: ^2.0.4
|
||||||
sign_in_with_apple: ^7.0.1
|
sign_in_with_apple: ^7.0.1
|
||||||
firebase_auth: ^6.1.4
|
firebase_auth: ^6.1.4
|
||||||
device_info_plus: ^12.1.0
|
device_info_plus: 12.3.0
|
||||||
# uni_links: ^0.5.1
|
# uni_links: ^0.5.1
|
||||||
flutter_confetti: ^0.5.1
|
flutter_confetti: ^0.5.1
|
||||||
# intl_phone_field: ^3.1.0
|
# intl_phone_field: ^3.1.0
|
||||||
@@ -82,10 +82,9 @@ dependencies:
|
|||||||
app_links: ^7.0.0
|
app_links: ^7.0.0
|
||||||
intaleq_maps: ^2.2.0
|
intaleq_maps: ^2.2.0
|
||||||
socket_io_client: 1.0.2
|
socket_io_client: 1.0.2
|
||||||
mobile_scanner: ^5.2.3
|
|
||||||
qr_flutter: ^4.1.0
|
|
||||||
# home_widget: ^0.7.0+1
|
# home_widget: ^0.7.0+1
|
||||||
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
86
siromove.com/invite.php
Normal file
86
siromove.com/invite.php
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Siro Unified Redirect Gateway (One-Click Redirect for non-Syrian countries)
|
||||||
|
* URL Format: https://siromove.com/invite.php?code=REF_CODE&app=rider|driver
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 1. Core Config & Links
|
||||||
|
$config = [
|
||||||
|
'rider' => [
|
||||||
|
'ios_store' => 'https://apps.apple.com/st/app/siro-rider/id6748075179',
|
||||||
|
'android_store' => 'https://play.google.com/store/apps/details?id=com.Siro.siro'
|
||||||
|
],
|
||||||
|
'driver' => [
|
||||||
|
'ios_store' => 'https://apps.apple.com/st/app/siro-driver/id6482995159',
|
||||||
|
'android_store' => 'https://play.google.com/store/apps/details?id=com.siro_driver'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$code = htmlspecialchars($_GET['code'] ?? '', ENT_QUOTES, 'UTF-8');
|
||||||
|
$appType = ($_GET['app'] ?? 'rider') === 'driver' ? 'driver' : 'rider';
|
||||||
|
$appConfig = $config[$appType];
|
||||||
|
|
||||||
|
// 2. Helper Functions
|
||||||
|
function getVisitorCountry() {
|
||||||
|
if (!empty($_SERVER['HTTP_CF_IPCOUNTRY'])) {
|
||||||
|
return strtoupper($_SERVER['HTTP_CF_IPCOUNTRY']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session_status() === PHP_SESSION_NONE) {
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
if (!empty($_SESSION['visitor_country'])) {
|
||||||
|
return $_SESSION['visitor_country'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$ip = $_SERVER['REMOTE_ADDR'];
|
||||||
|
if ($ip === '127.0.0.1' || $ip === '::1' || filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
|
||||||
|
return 'JO'; // Default Jordan
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$ctx = stream_context_create(['http' => ['timeout' => 2]]);
|
||||||
|
$apiResponse = @file_get_contents("http://ip-api.com/json/{$ip}", false, $ctx);
|
||||||
|
if ($apiResponse) {
|
||||||
|
$data = json_decode($apiResponse, true);
|
||||||
|
if (!empty($data['countryCode'])) {
|
||||||
|
$_SESSION['visitor_country'] = strtoupper($data['countryCode']);
|
||||||
|
return $_SESSION['visitor_country'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
// Fallback
|
||||||
|
}
|
||||||
|
return 'JO';
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeviceOS() {
|
||||||
|
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
|
||||||
|
if (strpos($userAgent, 'iphone') !== false || strpos($userAgent, 'ipad') !== false || strpos($userAgent, 'ipod') !== false) {
|
||||||
|
return 'ios';
|
||||||
|
}
|
||||||
|
if (strpos($userAgent, 'android') !== false) {
|
||||||
|
return 'android';
|
||||||
|
}
|
||||||
|
return 'desktop';
|
||||||
|
}
|
||||||
|
|
||||||
|
$country = getVisitorCountry();
|
||||||
|
$os = getDeviceOS();
|
||||||
|
|
||||||
|
// 3. Fallback Handoff for Syrian Users
|
||||||
|
if ($country === 'SY') {
|
||||||
|
header("Location: https://siromove.com/inviteSyria.php?code=" . urlencode($code) . "&app=" . urlencode($appType));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. One-Click Instant Redirection (Jordan / Egypt / others)
|
||||||
|
if ($os === 'ios') {
|
||||||
|
header("Location: " . $appConfig['ios_store']);
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
// Android or Desktop default
|
||||||
|
header("Location: " . $appConfig['android_store']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
?>
|
||||||
351
siromove.com/inviteSyria.php
Normal file
351
siromove.com/inviteSyria.php
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Siro Syria Redirect Gateway
|
||||||
|
* URL Format: https://siromove.com/inviteSyria.php?code=REF_CODE&app=rider|driver
|
||||||
|
*/
|
||||||
|
|
||||||
|
$config = [
|
||||||
|
'rider' => [
|
||||||
|
'ios_store' => 'https://apps.apple.com/st/app/siro-rider/id6748075179',
|
||||||
|
'android_store' => 'https://play.google.com/store/apps/details?id=com.Siro.siro',
|
||||||
|
'direct_apk' => 'https://api-syria.siromove.com/downloads/siro_rider.apk',
|
||||||
|
'app_name' => 'Siro Rider',
|
||||||
|
'app_name_ar' => 'سيرو الراكب'
|
||||||
|
],
|
||||||
|
'driver' => [
|
||||||
|
'ios_store' => 'https://apps.apple.com/st/app/siro-driver/id6482995159',
|
||||||
|
'android_store' => 'https://play.google.com/store/apps/details?id=com.siro_driver',
|
||||||
|
'direct_apk' => 'https://api-syria.siromove.com/downloads/siro_driver.apk',
|
||||||
|
'app_name' => 'Siro Driver',
|
||||||
|
'app_name_ar' => 'سيرو الكابتن'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$code = htmlspecialchars($_GET['code'] ?? '', ENT_QUOTES, 'UTF-8');
|
||||||
|
$appType = ($_GET['app'] ?? 'rider') === 'driver' ? 'driver' : 'rider';
|
||||||
|
$appConfig = $config[$appType];
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ar" dir="rtl">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>تحميل تطبيق <?php echo $appConfig['app_name_ar']; ?></title>
|
||||||
|
<!-- Tailwind CSS -->
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<!-- Fonts -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;700;900&family=Outfit:wght@400;600;800;900&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
tailwind.config = {
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
primary: '#00E5FF',
|
||||||
|
secondary: '#9C27B0',
|
||||||
|
bg: '#0F172A',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Cairo', 'Outfit', sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Smart Highlight Animations & Classes */
|
||||||
|
.highlight-btn {
|
||||||
|
border-color: rgba(0, 229, 255, 0.5);
|
||||||
|
background-color: rgba(0, 229, 255, 0.08);
|
||||||
|
transform: scale(1.02);
|
||||||
|
box-shadow: 0 0 20px rgba(0, 229, 255, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dimmed-btn {
|
||||||
|
opacity: 0.4;
|
||||||
|
filter: grayscale(0.8);
|
||||||
|
}
|
||||||
|
.dimmed-btn:hover {
|
||||||
|
opacity: 1;
|
||||||
|
filter: none;
|
||||||
|
transform: scale(1.01);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clipboard confirmation bubble animation */
|
||||||
|
@keyframes scaleIn {
|
||||||
|
from { transform: scale(0.9) translateY(5px); opacity: 0; }
|
||||||
|
to { transform: scale(1) translateY(0); opacity: 1; }
|
||||||
|
}
|
||||||
|
.toast-active {
|
||||||
|
animation: scaleIn 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="bg-[#0F172A] text-slate-100 min-h-screen relative overflow-x-hidden selection:bg-cyan-500 selection:text-white flex items-center justify-center p-4">
|
||||||
|
|
||||||
|
<!-- Ambient Glowing Background Elements -->
|
||||||
|
<div class="fixed inset-0 z-0 overflow-hidden pointer-events-none">
|
||||||
|
<div class="absolute -top-[10%] -left-[10%] w-[60%] h-[60%] bg-cyan-500/10 rounded-full filter blur-[120px] animate-pulse"></div>
|
||||||
|
<div class="absolute bottom-[5%] -right-[10%] w-[50%] h-[50%] bg-purple-500/8 rounded-full filter blur-[120px] animate-pulse" style="animation-delay: 2s;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Language Toggle Button -->
|
||||||
|
<div class="absolute top-5 left-5 z-50">
|
||||||
|
<button id="lang-toggle" class="px-5 py-2 text-sm font-bold bg-white/5 hover:bg-white/10 hover:border-white/20 backdrop-blur-md rounded-full transition duration-300 border border-white/10 shadow-lg cursor-pointer">
|
||||||
|
English
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Card Container -->
|
||||||
|
<div class="relative z-10 w-full max-w-lg bg-slate-900/60 backdrop-blur-xl border border-white/10 rounded-3xl p-8 shadow-2xl flex flex-col items-center">
|
||||||
|
|
||||||
|
<!-- Animated Glow Header -->
|
||||||
|
<header class="text-center mb-8">
|
||||||
|
<h1 class="text-4xl font-black tracking-widest mb-3 bg-gradient-to-r from-cyan-400 to-purple-500 bg-clip-text text-transparent" id="logo">
|
||||||
|
SIRO
|
||||||
|
</h1>
|
||||||
|
<h2 class="text-2xl font-bold mb-2 text-slate-100" id="welcome-title">مرحباً بك في سيرو</h2>
|
||||||
|
<p class="text-sm text-slate-400 max-w-sm mx-auto leading-relaxed" id="tagline">
|
||||||
|
تمت دعوتك للانضمام إلى منصة التوصيل الأسرع والأوفر. يرجى اتباع التعليمات بالأسفل لتحميل التطبيق.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- Floating Device Message Badge -->
|
||||||
|
<div id="device-message" class="hidden mt-4 inline-block px-4 py-1.5 rounded-full bg-cyan-500/10 border border-cyan-500/30 text-cyan-300 text-xs font-bold animate-bounce">
|
||||||
|
<!-- JS Populated -->
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- Referral Code Section -->
|
||||||
|
<?php if (!empty($code)): ?>
|
||||||
|
<div class="w-full bg-slate-950/40 border border-dashed border-cyan-500/30 rounded-2xl p-5 mb-8 flex flex-col items-center gap-3">
|
||||||
|
<span class="text-xs font-semibold tracking-wider text-slate-400 uppercase" id="referral-label">كود الإحالة الخاص بك</span>
|
||||||
|
<span class="text-3xl font-black tracking-widest text-cyan-400" id="refCode"><?php echo $code; ?></span>
|
||||||
|
<button class="px-5 py-2 text-xs font-bold bg-cyan-400/10 text-cyan-300 border border-cyan-400/20 hover:bg-cyan-400 hover:text-slate-950 rounded-full transition duration-300 cursor-pointer" onclick="copyReferralCode()" id="copy-btn">نسخ كود الإحالة</button>
|
||||||
|
<div id="copy-toast" class="hidden text-xs text-green-400 font-bold mt-1"></div>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<!-- Dynamic Action Cards -->
|
||||||
|
<main class="w-full space-y-4">
|
||||||
|
|
||||||
|
<!-- iOS App Card -->
|
||||||
|
<div class="ios-card bg-slate-800/30 border border-white/5 rounded-2xl p-5 text-right transition duration-300 flex flex-col">
|
||||||
|
<div class="flex items-center gap-3 mb-2 justify-end">
|
||||||
|
<span class="text-xs text-slate-400" id="ios-info">المتجر الرسمي</span>
|
||||||
|
<h3 class="text-md font-bold text-slate-100" id="ios-title">🔒 متجر التطبيقات محظور</h3>
|
||||||
|
</div>
|
||||||
|
<p class="text-xs text-slate-400 leading-relaxed mb-4" id="ios-desc">
|
||||||
|
نظراً للقيود الجغرافية، يرجى تفعيل تطبيق الـ VPN على هاتفك أولاً، ثم الضغط على الزر بالأسفل للانتقال لصفحة التحميل الرسمية على متجر آبل.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo $appConfig['ios_store']; ?>" target="_blank" class="w-full py-3 bg-slate-800 border border-white/10 hover:bg-slate-700/80 text-slate-100 text-sm font-bold rounded-xl transition duration-300 flex items-center justify-center gap-2" id="ios-btn">
|
||||||
|
<!-- Apple SVG -->
|
||||||
|
<svg class="w-4 h-4 fill-current" viewBox="0 0 24 24"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-4.2 14.33-1.38 18.82zM15.97 4.17c.66-.81 1.11-1.93.99-3.06-1 .04-2.2.67-2.92 1.49-.62.71-1.16 1.85-1.01 2.96 1.1.09 2.22-.57 2.94-1.39z"/></svg>
|
||||||
|
<span>التحميل من App Store</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Android Direct APK Card -->
|
||||||
|
<div class="android-card bg-slate-800/30 border border-white/5 rounded-2xl p-5 text-right transition duration-300 flex flex-col">
|
||||||
|
<div class="flex items-center gap-3 mb-2 justify-end">
|
||||||
|
<span class="text-xs text-green-400 font-bold" id="apk-info">✅ لا يحتاج VPN</span>
|
||||||
|
<h3 class="text-md font-bold text-slate-100" id="apk-title">🚀 تحميل مباشر (APK) - بدون VPN</h3>
|
||||||
|
</div>
|
||||||
|
<p class="text-xs text-slate-400 leading-relaxed mb-4" id="apk-desc">
|
||||||
|
يمكنك تحميل وتثبيت التطبيق مباشرة كملف تثبيت أندرويد دون الحاجة لمتجر جوجل بلاي أو تفعيل VPN.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo $appConfig['direct_apk']; ?>" class="w-full py-3 bg-cyan-400 text-slate-950 hover:bg-cyan-300 text-slate-950 text-sm font-bold rounded-xl transition duration-300 flex items-center justify-center gap-2" id="apk-btn">
|
||||||
|
<!-- Download SVG -->
|
||||||
|
<svg class="w-4 h-4 fill-none stroke-current" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg>
|
||||||
|
<span>تحميل تطبيق APK مباشرة</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Android Play Store Card -->
|
||||||
|
<div class="android-card bg-slate-800/30 border border-white/5 rounded-2xl p-5 text-right transition duration-300 flex flex-col">
|
||||||
|
<div class="flex items-center gap-3 mb-2 justify-end">
|
||||||
|
<span class="text-xs text-yellow-500 font-bold" id="play-info">⚠️ قد يحتاج VPN</span>
|
||||||
|
<h3 class="text-md font-bold text-slate-100" id="play-title">🤖 التحميل من Google Play</h3>
|
||||||
|
</div>
|
||||||
|
<p class="text-xs text-slate-400 leading-relaxed mb-4" id="play-desc">
|
||||||
|
إذا كنت تستخدم شبكة VPN نشطة على جهازك، يمكنك التحميل من متجر جوجل بلاي الرسمي.
|
||||||
|
</p>
|
||||||
|
<a href="<?php echo $appConfig['android_store']; ?>" target="_blank" class="w-full py-3 bg-slate-800 border border-white/10 hover:bg-slate-700/80 text-slate-100 text-sm font-bold rounded-xl transition duration-300 flex items-center justify-center gap-2" id="play-btn">
|
||||||
|
<!-- Play Store SVG -->
|
||||||
|
<svg class="w-4 h-4 fill-current" viewBox="0 0 24 24"><path d="M5.223 2.013a1.5 1.5 0 00-1.31 1.782l3.29 5.637-3.29 5.637a1.5 1.5 0 001.31 1.782l10.99-6.419c.75-.447.75-1.58 0-2.027L5.223 2.013z"/></svg>
|
||||||
|
<span>التحميل من Google Play</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="mt-8 text-center text-xs text-slate-500" id="footer-text">
|
||||||
|
حقوق النشر © <?php echo date('Y'); ?> سيرو. جميع الحقوق محفوظة.
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Bilingual content JSON -->
|
||||||
|
<script>
|
||||||
|
const content = {
|
||||||
|
ar: {
|
||||||
|
appName: "سيرو",
|
||||||
|
welcome: "مرحباً بك في سيرو",
|
||||||
|
tagline: "تمت دعوتك للانضمام إلى منصة التوصيل الأسرع والأوفر. يرجى اتباع التعليمات بالأسفل لتحميل التطبيق.",
|
||||||
|
referralLabel: "كود الإحالة الخاص بك",
|
||||||
|
copyBtn: "نسخ كود الإحالة",
|
||||||
|
copiedMsg: "تم نسخ كود الإحالة: ",
|
||||||
|
iosTitle: "🔒 متجر التطبيقات محظور",
|
||||||
|
iosDesc: "نظراً للقيود الجغرافية، يرجى تفعيل تطبيق الـ VPN على هاتفك أولاً، ثم الضغط على الزر بالأسفل للانتقال لصفحة التحميل الرسمية على متجر آبل.",
|
||||||
|
iosBtn: "التحميل من App Store",
|
||||||
|
iosInfo: "المتجر الرسمي",
|
||||||
|
apkTitle: "🚀 تحميل مباشر (APK) - بدون VPN",
|
||||||
|
apkDesc: "يمكنك تحميل وتثبيت التطبيق مباشرة كملف تثبيت أندرويد دون الحاجة لمتجر جوجل بلاي أو تفعيل VPN.",
|
||||||
|
apkBtn: "تحميل تطبيق APK مباشرة",
|
||||||
|
apkInfo: "✅ لا يحتاج VPN",
|
||||||
|
playTitle: "🤖 التحميل من Google Play",
|
||||||
|
playDesc: "إذا كنت تستخدم شبكة VPN نشطة على جهازك، يمكنك التحميل من متجر جوجل بلاي الرسمي.",
|
||||||
|
playBtn: "التحميل من Google Play",
|
||||||
|
playInfo: "⚠️ قد يحتاج VPN",
|
||||||
|
footer: "حقوق النشر © 2026 سيرو. جميع الحقوق محفوظة.",
|
||||||
|
msgAndroid: "تم اكتشاف جهاز أندرويد 🤖 - تم تظليل الروابط المباشرة",
|
||||||
|
msgIos: "تم اكتشاف جهاز آيفون 🍎 - تم تظليل متجر التطبيقات"
|
||||||
|
},
|
||||||
|
en: {
|
||||||
|
appName: "SIRO",
|
||||||
|
welcome: "Welcome to Siro",
|
||||||
|
tagline: "You have been invited to join the fastest and most affordable delivery platform. Please follow the instructions below to download the app.",
|
||||||
|
referralLabel: "Your Referral Code",
|
||||||
|
copyBtn: "Copy Referral Code",
|
||||||
|
copiedMsg: "Referral code copied: ",
|
||||||
|
iosTitle: "🔒 App Store is Geo-Restricted",
|
||||||
|
iosDesc: "Due to local network restrictions, please enable a VPN on your device first, then click below to download from the Apple App Store.",
|
||||||
|
iosBtn: "Download from App Store",
|
||||||
|
iosInfo: "Official Store",
|
||||||
|
apkTitle: "🚀 Direct APK Download - No VPN Required",
|
||||||
|
apkDesc: "You can download and install the app directly as an Android package (APK) without needing a VPN or the Play Store.",
|
||||||
|
apkBtn: "Download APK Directly",
|
||||||
|
apkInfo: "✅ No VPN Required",
|
||||||
|
playTitle: "🤖 Download from Google Play",
|
||||||
|
playDesc: "If you have an active VPN connection on your device, you can download the app from the official Google Play Store.",
|
||||||
|
playBtn: "Download from Google Play",
|
||||||
|
playInfo: "⚠️ May Require VPN",
|
||||||
|
footer: "Copyright © 2026 Siro. All rights reserved.",
|
||||||
|
msgAndroid: "Android Device Detected 🤖 - Direct APK links highlighted",
|
||||||
|
msgIos: "iOS Device Detected 🍎 - Apple Store highlighted"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let currentLang = 'ar';
|
||||||
|
|
||||||
|
function detectOS() {
|
||||||
|
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
|
||||||
|
const androidCards = document.querySelectorAll('.android-card');
|
||||||
|
const iosCards = document.querySelectorAll('.ios-card');
|
||||||
|
const deviceMessage = document.getElementById('device-message');
|
||||||
|
|
||||||
|
// Reset highlight/dimmed states
|
||||||
|
[...androidCards, ...iosCards].forEach(card => {
|
||||||
|
card.classList.remove('highlight-btn', 'dimmed-btn');
|
||||||
|
});
|
||||||
|
deviceMessage.classList.add('hidden');
|
||||||
|
|
||||||
|
if (/android/i.test(userAgent)) {
|
||||||
|
androidCards.forEach(c => c.classList.add('highlight-btn'));
|
||||||
|
iosCards.forEach(c => c.classList.add('dimmed-btn'));
|
||||||
|
|
||||||
|
deviceMessage.textContent = content[currentLang].msgAndroid;
|
||||||
|
deviceMessage.classList.remove('hidden');
|
||||||
|
} else if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
|
||||||
|
iosCards.forEach(c => c.classList.add('highlight-btn'));
|
||||||
|
androidCards.forEach(c => c.classList.add('dimmed-btn'));
|
||||||
|
|
||||||
|
deviceMessage.textContent = content[currentLang].msgIos;
|
||||||
|
deviceMessage.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLanguage(lang) {
|
||||||
|
currentLang = lang;
|
||||||
|
const t = content[lang];
|
||||||
|
const isAr = lang === 'ar';
|
||||||
|
|
||||||
|
document.documentElement.setAttribute('dir', isAr ? 'rtl' : 'ltr');
|
||||||
|
document.documentElement.setAttribute('lang', lang);
|
||||||
|
|
||||||
|
// Update DOM text contents
|
||||||
|
document.getElementById('logo').textContent = t.appName;
|
||||||
|
document.getElementById('welcome-title').textContent = t.welcome;
|
||||||
|
document.getElementById('tagline').textContent = t.tagline;
|
||||||
|
|
||||||
|
const refLabel = document.getElementById('referral-label');
|
||||||
|
if (refLabel) refLabel.textContent = t.referralLabel;
|
||||||
|
|
||||||
|
const copyBtn = document.getElementById('copy-btn');
|
||||||
|
if (copyBtn) copyBtn.textContent = t.copyBtn;
|
||||||
|
|
||||||
|
document.getElementById('ios-title').textContent = t.iosTitle;
|
||||||
|
document.getElementById('ios-desc').textContent = t.iosDesc;
|
||||||
|
document.querySelector('#ios-btn span').textContent = t.iosBtn;
|
||||||
|
document.getElementById('ios-info').textContent = t.iosInfo;
|
||||||
|
|
||||||
|
document.getElementById('apk-title').textContent = t.apkTitle;
|
||||||
|
document.getElementById('apk-desc').textContent = t.apkDesc;
|
||||||
|
document.querySelector('#apk-btn span').textContent = t.apkBtn;
|
||||||
|
document.getElementById('apk-info').textContent = t.apkInfo;
|
||||||
|
|
||||||
|
document.getElementById('play-title').textContent = t.playTitle;
|
||||||
|
document.getElementById('play-desc').textContent = t.playDesc;
|
||||||
|
document.querySelector('#play-btn span').textContent = t.playBtn;
|
||||||
|
document.getElementById('play-info').textContent = t.playInfo;
|
||||||
|
|
||||||
|
document.getElementById('footer-text').textContent = t.footer;
|
||||||
|
|
||||||
|
// Toggle language button text
|
||||||
|
document.getElementById('lang-toggle').textContent = isAr ? 'English' : 'العربية';
|
||||||
|
|
||||||
|
detectOS();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('lang-toggle').addEventListener('click', () => {
|
||||||
|
updateLanguage(currentLang === 'ar' ? 'en' : 'ar');
|
||||||
|
});
|
||||||
|
|
||||||
|
function copyReferralCode() {
|
||||||
|
const codeText = document.getElementById("refCode").innerText;
|
||||||
|
const toast = document.getElementById("copy-toast");
|
||||||
|
|
||||||
|
navigator.clipboard.writeText(codeText).then(() => {
|
||||||
|
showToast(content[currentLang].copiedMsg + codeText);
|
||||||
|
}, () => {
|
||||||
|
// Fallback
|
||||||
|
const dummy = document.createElement("textarea");
|
||||||
|
document.body.appendChild(dummy);
|
||||||
|
dummy.value = codeText;
|
||||||
|
dummy.select();
|
||||||
|
document.execCommand("copy");
|
||||||
|
document.body.removeChild(dummy);
|
||||||
|
showToast(content[currentLang].copiedMsg + codeText);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showToast(message) {
|
||||||
|
const toast = document.getElementById("copy-toast");
|
||||||
|
toast.textContent = message;
|
||||||
|
toast.classList.remove('hidden');
|
||||||
|
toast.classList.add('toast-active');
|
||||||
|
setTimeout(() => {
|
||||||
|
toast.classList.add('hidden');
|
||||||
|
toast.classList.remove('toast-active');
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
updateLanguage('ar');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user