Update: 2026-06-10 02:44:54
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user