Update: 2026-06-13 15:43:50

This commit is contained in:
Hamza-Ayed
2026-06-13 15:43:50 +03:00
parent bfc530b013
commit 55970712cc
43 changed files with 891 additions and 544 deletions

View File

@@ -37,18 +37,18 @@ try {
if (!empty($driverId)) {
// 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]);
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
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]);
// Reward for current driver
addWalletBalance($walletUrl, $driverId, "driver", $rewardAmount);
// Reward for inviter
addWalletBalance($walletUrl, $invitation['driverInviterId'], "driver", $rewardAmount);
addWalletBalance($walletUrl, $invitation['driverId'], "driver", $rewardAmount);
$con->commit();
echo json_encode(["status" => "success", "message" => "Reward of $rewardAmount $currency claimed successfully."]);
@@ -59,12 +59,12 @@ try {
} elseif (!empty($passengerId)) {
// 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]);
$invitation = $stmt->fetch(PDO::FETCH_ASSOC);
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]);
// Call Wallet Server

View File

@@ -9,9 +9,6 @@ if (empty($inviteCode) || empty($passengerID)) {
exit;
}
// 🔐 تشفير كود الدعوة قبل البحث
$inviteCodeEncrypted = $encryptionHelper->encryptData($inviteCode);
try {
$checkSql = "SELECT `id`, `expirationTime` FROM `invitesToPassengers`
WHERE `inviteCode` = :inviteCode
@@ -19,7 +16,7 @@ try {
AND `isGiftToken` = 0";
$checkStmt = $con->prepare($checkSql);
$checkStmt->bindParam(':inviteCode', $inviteCodeEncrypted);
$checkStmt->bindParam(':inviteCode', $inviteCode);
$checkStmt->execute();
if ($checkStmt->rowCount() > 0) {

View File

@@ -5,6 +5,25 @@
"storage_bucket": "siro-a6957.firebasestorage.app"
},
"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",
@@ -42,6 +61,63 @@
"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"

View File

@@ -31,6 +31,22 @@
<uses-permission android:name="android.permission.PICTURE_IN_PICTURE" />
<uses-feature android:name="android.hardware.camera" />
<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"
android:label="@string/label" android:enableOnBackInvokedCallback="true"
android:allowBackup="false" android:fullBackupContent="false"

View File

@@ -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"}}}}}}

View File

@@ -9,7 +9,7 @@
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.siro.driver</string>
<string>com.siro.siro-driver</string>
<key>PROJECT_ID</key>
<string>siro-a6957</string>
<key>STORAGE_BUCKET</key>
@@ -25,6 +25,6 @@
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:825988584191:ios:4002b88e618f0c4e1632ca</string>
<string>1:825988584191:ios:a86f1a54f0b1aaa21632ca</string>
</dict>
</plist>

View File

@@ -57,6 +57,7 @@
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>whatsapp</string>
</array>
<key>LSMinimumSystemVersion</key>
<string>12.0</string>

View File

@@ -17,6 +17,13 @@ class AppLink {
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 {
switch (currentCountry) {
case 'Syria': return 'https://api-syria.siromove.com/siro_v3/ride/location';

View File

@@ -45,7 +45,8 @@ class InviteController extends GetxController {
final String shareText =
'''Join Siro as a driver using my referral code!
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);
}
@@ -55,7 +56,8 @@ Download the Siro Driver app now and earn rewards!
if (couponCode != null) {
final String shareText = '''Get a discount on your first Siro ride!
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);
}
@@ -491,15 +493,15 @@ Download the Siro app now and enjoy your ride!
if (response != 'failure') {
var d = (response);
mySnackbarSuccess('Invite sent successfully'.tr);
String inviteCode = d['message']['inviteCode'].toString();
String message = '${'*Siro DRIVER CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n'
'${"To get a gift for both".tr}\n\n'
'${"The period of this code is 24 hours".tr}\n\n'
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
'_*${d['message']['inviteCode'].toString()}*_\n\n'
'${"Install our app:".tr}\n'
'*Android:* https://play.google.com/store/apps/details?id=com.siro_driver \n\n\n'
'*iOS:* https://apps.apple.com/st/app/siro-driver/id6482995159';
'_*${inviteCode}*_\n\n'
'${"Quick Invite Link:".tr}\n'
'${AppLink.inviteRedirectUrl}?code=$inviteCode&app=driver';
launchCommunication('whatsapp', formattedPhoneNumber, message);
invitePhoneController.clear();
@@ -534,18 +536,16 @@ Download the Siro app now and enjoy your ride!
if (response != 'failure') {
var d = response;
mySnackbarSuccess('Invite sent successfully'.tr);
String inviteCode = d['message']['inviteCode'].toString();
String message = '${'*Siro APP CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n\n'
'${"To get a gift for both".tr}\n\n'
'${"The period of this code is 24 hours".tr}\n\n'
'${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n'
'_*${d['message']['inviteCode'].toString()}*_\n\n'
'_*${inviteCode}*_\n\n'
'${"Quick Invite Link:".tr}\n'
'https://${AppLink.appDomain}/?inviteCode=${d['message']['inviteCode'].toString()}\n\n'
'${"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';
'${AppLink.inviteRedirectUrl}?code=$inviteCode&app=rider';
launchCommunication('whatsapp', formattedPhoneNumber, message);
invitePhoneController.clear();

View File

@@ -51,17 +51,17 @@ class DefaultFirebaseOptions {
static const FirebaseOptions android = FirebaseOptions(
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
appId: '1:825988584191:android:4525a21b00173d361632ca',
appId: '1:825988584191:android:492d9bc1df6b40c51632ca',
messagingSenderId: '825988584191',
projectId: 'siro-a6957',
storageBucket: 'siro-a6957.firebasestorage.app',
);
static const FirebaseOptions ios = FirebaseOptions(
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
appId: '1:825988584191:ios:4002b88e618f0c4e1632ca',
appId: '1:825988584191:ios:a86f1a54f0b1aaa21632ca',
messagingSenderId: '825988584191',
projectId: 'siro-a6957',
storageBucket: 'siro-a6957.firebasestorage.app',
iosBundleId: 'com.siro.driver',
iosBundleId: 'com.siro.siro-driver',
);
}

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.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/my_textField.dart';
import 'package:siro_driver/views/widgets/elevated_btn.dart'; // Checked import
@@ -40,29 +39,13 @@ class SosConnect extends StatelessWidget {
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// === SOS Button ===
_buildModernActionButton(
icon: MaterialIcons.warning,
color: Colors.white,
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),
),
],
child: _buildModernActionButton(
icon: MaterialIcons.warning,
color: Colors.white,
bgColor: AppColor.redColor,
tooltip: 'EMERGENCY SOS',
isPulsing: true,
onTap: () => _handleSosCall(controller),
),
);
},
@@ -140,70 +123,4 @@ class SosConnect extends StatelessWidget {
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(),
),
);
}
}

View File

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

View File

@@ -41,7 +41,6 @@ dependencies:
lottie: ^3.3.1
shimmer: ^3.0.0
slide_to_act: ^2.0.2
qr_flutter: ^4.1.0
# Services & Hardware
battery_plus: ^7.0.0

View File

@@ -5,6 +5,44 @@
"storage_bucket": "siro-a6957.firebasestorage.app"
},
"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": {
"mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca",
@@ -23,6 +61,44 @@
"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"

View File

@@ -19,6 +19,21 @@
<uses-feature android:name="android.hardware.camera" />
<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:label="@string/label"
@@ -64,7 +79,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="siroapp" />
<data android:scheme="siromove" />
</intent-filter>
<intent-filter>

View File

@@ -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"}}}}}

View File

@@ -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'

View File

@@ -1,68 +1,58 @@
PODS:
- app_links (7.0.0):
- 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):
- Flutter
- connectivity_plus (0.0.1):
- Flutter
- device_info_plus (0.0.1):
- Flutter
- Firebase/Auth (12.8.0):
- Firebase/Auth (12.14.0):
- Firebase/CoreOnly
- FirebaseAuth (~> 12.8.0)
- Firebase/CoreOnly (12.8.0):
- FirebaseCore (~> 12.8.0)
- Firebase/Messaging (12.8.0):
- FirebaseAuth (~> 12.14.0)
- Firebase/CoreOnly (12.14.0):
- FirebaseCore (~> 12.14.0)
- Firebase/Messaging (12.14.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 12.8.0)
- firebase_auth (6.1.4):
- Firebase/Auth (= 12.8.0)
- FirebaseMessaging (~> 12.14.0)
- firebase_auth (6.5.2):
- Firebase/Auth (= 12.14.0)
- firebase_core
- Flutter
- firebase_core (4.4.0):
- Firebase/CoreOnly (= 12.8.0)
- firebase_core (4.10.0):
- Firebase/CoreOnly (= 12.14.0)
- Flutter
- firebase_messaging (16.1.1):
- Firebase/Messaging (= 12.8.0)
- firebase_messaging (16.3.0):
- Firebase/Messaging (= 12.14.0)
- firebase_core
- Flutter
- FirebaseAppCheckInterop (12.8.0)
- FirebaseAuth (12.8.0):
- FirebaseAppCheckInterop (~> 12.8.0)
- FirebaseAuthInterop (~> 12.8.0)
- FirebaseCore (~> 12.8.0)
- FirebaseCoreExtension (~> 12.8.0)
- FirebaseAppCheckInterop (12.14.0)
- FirebaseAuth (12.14.0):
- FirebaseAppCheckInterop (~> 12.14.0)
- FirebaseAuthInterop (~> 12.14.0)
- FirebaseCore (~> 12.14.0)
- FirebaseCoreExtension (~> 12.14.0)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1)
- GTMSessionFetcher/Core (< 6.0, >= 3.4)
- RecaptchaInterop (~> 101.0)
- FirebaseAuthInterop (12.8.0)
- FirebaseCore (12.8.0):
- FirebaseCoreInternal (~> 12.8.0)
- FirebaseAuthInterop (12.14.0)
- FirebaseCore (12.14.0):
- FirebaseCoreInternal (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/Logger (~> 8.1)
- FirebaseCoreExtension (12.8.0):
- FirebaseCore (~> 12.8.0)
- FirebaseCoreInternal (12.8.0):
- FirebaseCoreExtension (12.14.0):
- FirebaseCore (~> 12.14.0)
- FirebaseCoreInternal (12.14.0):
- "GoogleUtilities/NSData+zlib (~> 8.1)"
- FirebaseInstallations (12.8.0):
- FirebaseCore (~> 12.8.0)
- FirebaseInstallations (12.14.0):
- FirebaseCore (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/UserDefaults (~> 8.1)
- PromisesObjC (~> 2.4)
- FirebaseMessaging (12.8.0):
- FirebaseCore (~> 12.8.0)
- FirebaseInstallations (~> 12.8.0)
- FirebaseMessaging (12.14.0):
- FirebaseCore (~> 12.14.0)
- FirebaseInstallations (~> 12.14.0)
- GoogleDataTransport (~> 10.1)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1)
@@ -87,51 +77,44 @@ PODS:
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- google_sign_in_ios (0.0.1):
- Flutter
- FlutterMacOS
- GoogleSignIn (~> 9.0)
- GTMSessionFetcher (>= 3.4.0)
- GoogleDataTransport (10.1.0):
- nanopb (~> 3.30910.0)
- PromisesObjC (~> 2.4)
- GoogleSignIn (9.1.0):
- AppAuth (~> 2.0)
- AppCheckCore (~> 11.0)
- GTMAppAuth (~> 5.0)
- GTMSessionFetcher/Core (~> 3.3)
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
- GoogleMLKit/BarcodeScanning (7.0.0):
- GoogleMLKit/MLKitCore
- MLKitBarcodeScanning (~> 6.0.0)
- GoogleMLKit/MLKitCore (7.0.0):
- MLKitCommon (~> 12.0.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/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (8.1.0):
- GoogleUtilities/Environment (8.1.1):
- GoogleUtilities/Privacy
- GoogleUtilities/Logger (8.1.0):
- GoogleUtilities/Logger (8.1.1):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- GoogleUtilities/Network (8.1.0):
- GoogleUtilities/Network (8.1.1):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (8.1.0)":
- "GoogleUtilities/NSData+zlib (8.1.1)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (8.1.0)
- GoogleUtilities/Reachability (8.1.0):
- GoogleUtilities/Privacy (8.1.1)
- GoogleUtilities/Reachability (8.1.1):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (8.1.0):
- GoogleUtilities/UserDefaults (8.1.1):
- GoogleUtilities/Logger
- 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/Full (3.5.0):
- GTMSessionFetcher/Core
- image_cropper (0.0.4):
- Flutter
- TOCropViewController (~> 2.8.0)
@@ -155,6 +138,26 @@ PODS:
- maplibre_gl (0.25.0):
- Flutter
- 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/decode (= 3.30910.0)
- nanopb/encode (= 3.30910.0)
@@ -162,13 +165,13 @@ PODS:
- nanopb/encode (3.30910.0)
- package_info_plus (0.4.5):
- Flutter
- permission_handler_apple (9.3.0):
- permission_handler_apple (9.4.8):
- Flutter
- PromisesObjC (2.4.0)
- PromisesObjC (2.4.1)
- quick_actions_ios (0.0.1):
- Flutter
- RecaptchaInterop (101.0.0)
- record_ios (1.2.0):
- record_ios (1.2.1):
- Flutter
- sensors_plus (0.0.1):
- Flutter
@@ -179,66 +182,6 @@ PODS:
- sqflite_darwin (0.0.4):
- Flutter
- 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)
- url_launcher_ios (0.0.1):
- Flutter
@@ -270,7 +213,6 @@ DEPENDENCIES:
- flutter_tts (from `.symlinks/plugins/flutter_tts/ios`)
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
- 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_picker_ios (from `.symlinks/plugins/image_picker_ios/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`)
- location (from `.symlinks/plugins/location/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`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
@@ -287,7 +230,6 @@ DEPENDENCIES:
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
- 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`)
- vibration (from `.symlinks/plugins/vibration/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
@@ -296,8 +238,6 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- AppAuth
- AppCheckCore
- Firebase
- FirebaseAppCheckInterop
- FirebaseAuth
@@ -308,24 +248,19 @@ SPEC REPOS:
- FirebaseInstallations
- FirebaseMessaging
- GoogleDataTransport
- GoogleSignIn
- GoogleMLKit
- GoogleToolboxForMac
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
- IOSSecuritySuite
- MapLibre
- MLImage
- MLKitBarcodeScanning
- MLKitCommon
- MLKitVision
- nanopb
- PromisesObjC
- RecaptchaInterop
- Stripe
- StripeApplePay
- StripeCore
- StripeFinancialConnections
- StripeIssuing
- StripePayments
- StripePaymentSheet
- StripePaymentsUI
- StripeUICore
- TOCropViewController
- WebRTC-SDK
@@ -360,8 +295,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_webrtc/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/darwin"
google_sign_in_ios:
:path: ".symlinks/plugins/google_sign_in_ios/darwin"
image_cropper:
:path: ".symlinks/plugins/image_cropper/ios"
image_picker_ios:
@@ -378,6 +311,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/location/ios"
maplibre_gl:
:path: ".symlinks/plugins/maplibre_gl/ios"
mobile_scanner:
:path: ".symlinks/plugins/mobile_scanner/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
permission_handler_apple:
@@ -394,8 +329,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/sign_in_with_apple/ios"
sqflite_darwin:
:path: ".symlinks/plugins/sqflite_darwin/darwin"
stripe_ios:
:path: ".symlinks/plugins/stripe_ios/ios"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
vibration:
@@ -409,23 +342,21 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8
AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d
firebase_auth: e9031a1dbe04a90d98e8d11ff2302352a1c6d9e8
firebase_core: ee30637e6744af8e0c12a6a1e8a9718506ec2398
firebase_messaging: 343de01a8d3e18b60df0c6d37f7174c44ae38e02
FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d
FirebaseAuth: 4c289b1a43f5955283244a55cf6bd616de344be5
FirebaseAuthInterop: 95363fe96493cb4f106656666a0768b420cba090
FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c
FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2
FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21
FirebaseInstallations: 6a14ab3d694ebd9f839c48d330da5547e9ca9dc0
FirebaseMessaging: 7f42cfd10ec64181db4e01b305a613791c8e782c
Firebase: 7cc10425300768ec86292688af5cb228f0604bde
firebase_auth: d4091ec40b52cc2ea56171ea521c30b388844acb
firebase_core: 383e19b49a08df5d7a6cf5017616de6a357ed7af
firebase_messaging: ab03d6090864c0fb8136521231df6a66cb13be49
FirebaseAppCheckInterop: f123c0261a7b46f060e98fc2961651f1ac68f384
FirebaseAuth: 01a77d472aec77ec008141e7d859d1b9cb8dc2cf
FirebaseAuthInterop: 63056ef7f9602e79a8f8d756d4cb35f38e2927c3
FirebaseCore: 4939b340b9c598dc1f965d68f8fe57e630b65407
FirebaseCoreExtension: ee3e3697acea1062288b1900bcdcab4d59ab93b4
FirebaseCoreInternal: 090369a5fffd7423cf88006ab4d2ccc2173a8db9
FirebaseInstallations: 7cdc919e29dc54306edeffdbdc1eed1a40d7d1e7
FirebaseMessaging: 4803888ce3002188f24e19faa8d2326261538426
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b
flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f
@@ -434,11 +365,10 @@ SPEC CHECKSUMS:
flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
google_sign_in_ios: 000870aa06da9b28d1d0bf7ef70ff0213059dd28
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleSignIn: fcee2257188d5eda57a5e2b6a715550ffff9206d
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
@@ -450,35 +380,30 @@ SPEC CHECKSUMS:
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952
maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
MLKitBarcodeScanning: 0a3064da0a7f49ac24ceb3cb46a5bc67496facd2
MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d
MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e
mobile_scanner: af8f71879eaba2bbcb4d86c6a462c3c0e7f23036
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
record_ios: 412daca2350b228e698fffcd08f1f94ceb1e3844
record_ios: 980fd386a97a35987d0fce3dfda4b26a38c90f4c
sensors_plus: 3c3bac724a2128c895623e03efd82cf0e94fd8e8
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
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
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
PODFILE CHECKSUM: 2ba2e4898a3d9a1615dafa81db0705bd67da92c3
PODFILE CHECKSUM: bd6e2f6541b0ca1731e9c8557eb4a4f6036c5508
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

View File

@@ -1,17 +1,17 @@
{
"images" : [
{
"filename" : "152.png",
"filename" : "logo_siro.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "152 1.png",
"filename" : "logo_siro 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "152 2.png",
"filename" : "logo_siro 2.png",
"idiom" : "universal",
"scale" : "3x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

View File

@@ -17,7 +17,7 @@ extension LiveActivitiesAppAttributes {
}
// 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, *)
struct RideWidgetLiveActivity: Widget {

View File

@@ -672,7 +672,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -861,7 +861,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -887,7 +887,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -927,7 +927,7 @@
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -972,7 +972,7 @@
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -1015,7 +1015,7 @@
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget;
PRODUCT_BUNDLE_IDENTIFIER = com.siroapp.rider.RideWidgetExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;

View File

@@ -9,7 +9,7 @@
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.siro.rider</string>
<string>com.siroapp.rider</string>
<key>PROJECT_ID</key>
<string>siro-a6957</string>
<key>STORAGE_BUCKET</key>
@@ -25,6 +25,6 @@
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:825988584191:ios:1d880fc7fc98b7671632ca</string>
<string>1:825988584191:ios:4f60966dd0a69b3f1632ca</string>
</dict>
</plist>

View File

@@ -48,6 +48,7 @@
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>whatsapp</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>

View File

@@ -3,6 +3,14 @@ import 'package:siro_rider/main.dart';
class AppLink {
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 paymentServer {

View File

@@ -51,7 +51,8 @@ class InviteController extends GetxController {
final String shareText = '''
${'Join Siro as a driver using my referral code!'.tr}
${'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);
}
@@ -62,7 +63,8 @@ ${'Download the Siro Driver app now and earn rewards!'.tr}
final String shareText = '''
${'Get a discount on your first Siro ride!'.tr}
${'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);
}
@@ -248,9 +250,8 @@ ${'Download the Siro app now and enjoy your ride!'.tr}
"${'Your personal invitation code is:'.tr}\n"
"*$inviteCode*\n\n"
"${'Be sure to use it quickly! This code expires at'.tr} *$expirationTime*.\n\n"
"📲 ${'Download the app now:'.tr}\n"
"• *Android:* https://play.google.com/store/apps/details?id=com.Siro.siro\n"
"• *iOS:* https://apps.apple.com/st/app/siro-rider/id6748075179\n\n"
"🔗 ${'Quick Invite Link:'.tr}\n"
"${AppLink.inviteRedirectUrl}?code=$inviteCode&app=rider\n\n"
"${'See you on the road!'.tr} 🚗";
launchCommunication('whatsapp', formattedPhoneNumber, message);

View File

@@ -46,22 +46,6 @@ class InvitesRewardsController extends GetxController {
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 {
Get.dialog(const Center(child: CircularProgressIndicator()), barrierDismissible: false);

View File

@@ -28,10 +28,7 @@ class DefaultFirebaseOptions {
case TargetPlatform.iOS:
return ios;
case TargetPlatform.macOS:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for macos - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
return macos;
case TargetPlatform.windows:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for windows - '
@@ -51,17 +48,25 @@ class DefaultFirebaseOptions {
static const FirebaseOptions android = FirebaseOptions(
apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8',
appId: '1:825988584191:android:06782b540c7681ad1632ca',
appId: '1:825988584191:android:7e9088b719dcb7061632ca',
messagingSenderId: '825988584191',
projectId: 'siro-a6957',
storageBucket: 'siro-a6957.firebasestorage.app',
);
static const FirebaseOptions ios = FirebaseOptions(
apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA',
appId: '1:825988584191:ios:1d880fc7fc98b7671632ca',
appId: '1:825988584191:ios:4f60966dd0a69b3f1632ca',
messagingSenderId: '825988584191',
projectId: 'siro-a6957',
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',
);
}

View File

@@ -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),
),
),
),
],
),
);
}
}

View File

@@ -7,8 +7,6 @@ import '../../../constant/links.dart';
import '../../../constant/style.dart';
import '../../../controller/home/profile/invit_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';
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(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildQRCodeSection(),
const SizedBox(height: 20),
Container(
padding: const EdgeInsets.all(16),
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() {
return GetBuilder<InvitesRewardsController>(

View File

@@ -240,53 +240,65 @@ class _SnackContentState extends State<_SnackContent>
// ─────────────────────────────────────────────────────────────────────────────
// Internal dispatcher — single source of truth
// ─────────────────────────────────────────────────────────────────────────────
SnackbarController _show(_SnackVariant variant, String message) {
// Dismiss any existing snackbar first (no stacking)
if (Get.isSnackbarOpen) Get.closeCurrentSnackbar();
switch (variant.haptic) {
case HapticFeedbackType.light:
HapticFeedback.lightImpact();
case HapticFeedbackType.medium:
HapticFeedback.mediumImpact();
case HapticFeedbackType.selection:
HapticFeedback.selectionClick();
SnackbarController? _show(_SnackVariant variant, String message) {
// Prevent crash if Navigator or Overlay context is not yet initialized at early startup
if (Get.context == null || Get.overlayContext == null) {
debugPrint("⚠️ Cannot show snackbar: Overlay/Navigator is not ready yet. Message: $message");
return null;
}
return Get.snackbar(
'',
'',
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.transparent,
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),
),
);
try {
// Dismiss any existing snackbar first (no stacking)
if (Get.isSnackbarOpen) Get.closeCurrentSnackbar();
switch (variant.haptic) {
case HapticFeedbackType.light:
HapticFeedback.lightImpact();
case HapticFeedbackType.medium:
HapticFeedback.mediumImpact();
case HapticFeedbackType.selection:
HapticFeedback.selectionClick();
}
return Get.snackbar(
'',
'',
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.transparent,
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
// ─────────────────────────────────────────────────────────────────────────────
SnackbarController mySnackbarSuccess(String message) =>
SnackbarController? mySnackbarSuccess(String message) =>
_show(_SnackVariant.success, message);
SnackbarController mySnackeBarError(String message) =>
SnackbarController? mySnackeBarError(String message) =>
_show(_SnackVariant.error, message);
SnackbarController mySnackbarInfo(String message) =>
SnackbarController? mySnackbarInfo(String message) =>
_show(_SnackVariant.info, message);
SnackbarController mySnackbarWarning(String message) =>
SnackbarController? mySnackbarWarning(String message) =>
_show(_SnackVariant.warning, message);

View File

@@ -22,7 +22,6 @@ import geolocator_apple
import just_audio
import local_auth_darwin
import location
import mobile_scanner
import package_info_plus
import record_macos
import share_plus
@@ -51,7 +50,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin"))
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))

View File

@@ -21,6 +21,7 @@
/* End PBXAggregateTarget 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 */; };
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.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>"; };
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>"; };
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>"; };
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>"; };
@@ -76,6 +77,7 @@
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>"; };
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>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -125,6 +127,7 @@
331C80D6294CF71000263BE5 /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */,
37E101A228C86107D9AA7AE3 /* GoogleService-Info.plist */,
);
sourceTree = "<group>";
};
@@ -285,6 +288,7 @@
files = (
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
16396FA43926BDE6F011EC7C /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View 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>

View File

@@ -340,10 +340,10 @@ packages:
dependency: "direct main"
description:
name: device_info_plus
sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
url: "https://pub.dev"
source: hosted
version: "12.4.0"
version: "12.3.0"
device_info_plus_platform_interface:
dependency: transitive
description:
@@ -1333,14 +1333,6 @@ packages:
url: "https://pub.dev"
source: hosted
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:
dependency: transitive
description:
@@ -1581,22 +1573,6 @@ packages:
url: "https://pub.dev"
source: hosted
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:
dependency: "direct main"
description:

View File

@@ -61,7 +61,7 @@ dependencies:
# share: ^2.0.4
sign_in_with_apple: ^7.0.1
firebase_auth: ^6.1.4
device_info_plus: ^12.1.0
device_info_plus: 12.3.0
# uni_links: ^0.5.1
flutter_confetti: ^0.5.1
# intl_phone_field: ^3.1.0
@@ -82,10 +82,9 @@ dependencies:
app_links: ^7.0.0
intaleq_maps: ^2.2.0
socket_io_client: 1.0.2
mobile_scanner: ^5.2.3
qr_flutter: ^4.1.0
# home_widget: ^0.7.0+1
dev_dependencies:
flutter_test:
sdk: flutter

86
siromove.com/invite.php Normal file
View 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;
}
?>

View 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>