Update: 2026-06-10 02:44:54

This commit is contained in:
Hamza-Ayed
2026-06-10 02:44:55 +03:00
parent 9bc7a31c94
commit a0473a8b0f
134 changed files with 1706 additions and 544 deletions

View File

@@ -308,6 +308,7 @@ class LoginController extends GetxController {
box.write(BoxName.validity, data['validity']);
box.write(BoxName.isInstall, data['isInstall'] ?? 'none');
box.write(BoxName.isGiftToken, data['isGiftToken'] ?? 'none');
box.write(BoxName.isClaim, data['isClaim'] ?? '0');
if (data['inviteCode'] != null) {
box.write(BoxName.inviteCode, data['inviteCode'].toString());
}
@@ -384,6 +385,15 @@ class LoginController extends GetxController {
"inviteCode": invite,
"passengerID": passengerID,
});
// سجل الدعوة أيضاً في النظام الموحد الجديد
await CRUD().post(link: AppLink.addUnifiedInvite, payload: {
"inviter_code": invite,
});
// تحديث الحالة محلياً لضمان عدم إرسال الطلب مرة أخرى
box.write(BoxName.isInstall, '1');
await Get.defaultDialog(
title: 'Invitation Used'.tr,
middleText: "Your invite code was successfully applied!".tr,

View File

@@ -2,6 +2,8 @@ import 'package:siro_rider/print.dart';
import 'dart:async';
import 'package:app_links/app_links.dart';
import 'package:get/get.dart';
import '../../main.dart';
import 'profile/invites_rewards_controller.dart';
class DeepLinkController extends GetxController {
final _appLinks = AppLinks();
@@ -21,6 +23,7 @@ class DeepLinkController extends GetxController {
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
Log.print('🔗 Received deep link (Stream): $uri');
rawDeepLink.value = uri.toString();
_processInviteCode(uri);
});
// الاستماع للروابط إذا كان التطبيق مغلقاً تماماً (Cold Start)
@@ -29,15 +32,37 @@ class DeepLinkController extends GetxController {
if (initialUri != null) {
Log.print('🔗 Received initial deep link (Cold Start): $initialUri');
rawDeepLink.value = initialUri.toString();
_processInviteCode(initialUri);
}
} catch (e) {
Log.print('Error getting initial link: $e');
}
}
void _processInviteCode(Uri uri) {
if (uri.queryParameters.containsKey('inviteCode')) {
String? inviteCode = uri.queryParameters['inviteCode'];
if (inviteCode != null && inviteCode.isNotEmpty) {
// دائماً نخزن الكود حتى لو لم يكن مسجلاً، ليتم استخدامه بعد التسجيل
box.write('inviteCode', inviteCode);
// إذا كان المستخدم مسجل دخول (يمتلك JWT)، نربط الدعوة فوراً
if (box.read('jwt') != null) {
try {
var rewardsController = Get.find<InvitesRewardsController>();
rewardsController.linkInviteCode(inviteCode);
} catch (e) {
var rewardsController = Get.put(InvitesRewardsController());
rewardsController.linkInviteCode(inviteCode);
}
}
}
}
}
@override
void onClose() {
_linkSubscription?.cancel();
super.onClose();
}
}
}

View File

@@ -0,0 +1,94 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:siro_rider/constant/links.dart';
import 'package:siro_rider/controller/functions/crud.dart';
class InvitesRewardsController extends GetxController {
bool isLoading = false;
String? referralCode;
int totalInvitedDrivers = 0;
int totalInvitedPassengers = 0;
List<dynamic> referrals = [];
@override
void onInit() {
super.onInit();
fetchPassengerReferrals();
}
Future<void> fetchPassengerReferrals() async {
isLoading = true;
update();
try {
var response = await CRUD().post(
link: AppLink.getPassengerReferrals,
payload: {} // Token is automatically handled by CRUD()
);
if (response != 'failure') {
var data = jsonDecode(response);
if (data['status'] == 'success') {
referralCode = data['message']['referral_code'];
totalInvitedDrivers = data['message']['total_invited_drivers'] ?? 0;
totalInvitedPassengers = data['message']['total_invited_passengers'] ?? 0;
referrals = data['message']['referrals'] ?? [];
} else {
referrals = [];
}
}
} catch (e) {
print("Error fetching passenger referrals: $e");
}
isLoading = false;
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);
try {
var response = await CRUD().post(
link: AppLink.addUnifiedInvite,
payload: {
"inviter_code": inviteCode,
}
);
Get.back(); // close loading
if (response != 'failure') {
var data = jsonDecode(response);
if (data['status'] == 'success') {
Get.snackbar("Success".tr, "You have been successfully referred!".tr, backgroundColor: Colors.green, colorText: Colors.white);
} else {
Get.snackbar("Notice".tr, data['message'] ?? "Could not add invite".tr);
}
} else {
Get.snackbar("Error".tr, "Network error occurred".tr);
}
} catch (e) {
Get.back(); // close loading
Get.snackbar("Error".tr, "Network error occurred".tr);
}
}
}