Update: 2026-06-11 13:47:39

This commit is contained in:
Hamza-Ayed
2026-06-11 13:47:40 +03:00
parent 977adfe99d
commit c5170a88d2
516 changed files with 3654 additions and 3321 deletions

View File

@@ -222,14 +222,14 @@ class RegisterController extends GetxController {
if (res1 != 'failure') {
//Multi-server signup (moved inside the successful registration check)
// if (AppLink.IntaleqAlexandriaServer != AppLink.IntaleqSyriaServer) {
// if (AppLink.SiroAlexandriaServer != AppLink.SiroSyriaServer) {
// List<Future> signUp = [
// CRUD().post(
// link: '${AppLink.IntaleqAlexandriaServer}/auth/signup.php',
// link: '${AppLink.SiroAlexandriaServer}/auth/signup.php',
// payload: payload,
// ),
// CRUD().post(
// link: '${AppLink.IntaleqGizaServer}/auth/signup.php',
// link: '${AppLink.SiroGizaServer}/auth/signup.php',
// payload: payload,
// )
// ];

View File

@@ -446,7 +446,7 @@ class FirebaseMessagesController extends GetxController {
// NotificationController().showNotification(
// 'Dont forget your personal belongings.'.tr,
// 'Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app'
// 'Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Siro app'
// .tr,
// 'ding');
@@ -536,7 +536,7 @@ class FirebaseMessagesController extends GetxController {
// if (Platform.isAndroid) {
// notificationController.showNotification(
// 'Driver Cancelled Your Trip'.tr,
// 'you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet'
// 'you will pay to Driver you will be pay the cost of driver time look to your Siro Wallet'
// .tr,
// 'cancel');
// }

View File

@@ -6,7 +6,7 @@ import '../../print.dart'; // للترجمة .tr
class NotificationService {
static const String _serverUrl =
'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php';
'https://api.intaleq.xyz/siro/ride/firebase/send_fcm.php';
static Future<void> sendNotification({
required String target,

View File

@@ -70,8 +70,8 @@ checkForBounusInvitation() {
void showUpdateDialog(BuildContext context) {
final String storeUrl = Platform.isAndroid
? 'https://play.google.com/store/apps/details?id=com.Intaleq.intaleq'
: 'https://apps.apple.com/jo/app/intaleq-rider/id6748075179';
? 'https://play.google.com/store/apps/details?id=com.Siro.siro'
: 'https://apps.apple.com/jo/app/siro-rider/id6748075179';
showGeneralDialog(
context: context,
barrierDismissible: false,

View File

@@ -8,7 +8,7 @@ import '../../main.dart';
class SecurityChecks {
static const platform = MethodChannel(
'com.Intaleq.intaleq/security'); // Choose a unique channel name
'com.Siro.siro/security'); // Choose a unique channel name
static Future<bool> isDeviceCompromised() async {
try {

View File

@@ -42,7 +42,7 @@ VARS=$(cat "$ORIG_FILE" | awk '
# Extract words that look like declarations.
# We look for typical type names or var/final followed by variable name
for (i = 1; i < NF; i++) {
if ($i ~ /^(var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|IntaleqMapController)$/) {
if ($i ~ /^(var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|SiroMapController)$/) {
# The next field might be the variable name, or it might have a type like String?
name = $(i+1)
# Remove trailing ?, ;, =

View File

@@ -47,7 +47,7 @@ def extract_declarations(text):
# Extract variables/fields declarations
var_decl_pattern = re.compile(
r'\b(?:var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|IntaleqMapController)\??\s+([a-zA-Z0-9_]+)\b'
r'\b(?:var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|SiroMapController)\??\s+([a-zA-Z0-9_]+)\b'
)
variables = set()

View File

@@ -10,7 +10,7 @@ class IosLiveActivityService {
static void init() {
if (Platform.isIOS) {
_liveActivitiesPlugin.init(
appGroupId: "group.com.Intaleq.intaleq",
appGroupId: "group.com.Siro.siro",
);
}
}

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:ui' as ui;
import 'dart:math' show cos, max, min, pi, pow, sqrt;
import 'dart:typed_data';
import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart';
@@ -84,7 +85,7 @@ class MapEngineController extends GetxController {
}
void onStyleLoaded() async {
Log.print('🗺️ Intaleq Map Style Loaded. Initializing...');
Log.print('🗺️ Siro Map Style Loaded. Initializing...');
isStyleLoaded = true;
await _loadMapIcons();
@@ -161,6 +162,14 @@ class MapEngineController extends GetxController {
await _addMapImage('orange_marker', 'assets/images/moto1.png');
await _addMapImage('violet_marker', 'assets/images/lady1.png');
try {
final walkBytes = await _createWalkMarkerBytes();
await mapController?.addImage('walk_icon', walkBytes);
Log.print('delimited: successfully added dynamic walk_icon');
} catch (e) {
Log.print('❌ Error loading dynamic walk icon: $e');
}
isIconsLoaded = true;
markers = markers.map((m) => m.copyWith()).toSet();
update();
@@ -799,6 +808,44 @@ class MapEngineController extends GetxController {
update();
}
Future<Uint8List> _createWalkMarkerBytes() async {
final ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
final Canvas canvas = Canvas(pictureRecorder);
const double size = 60.0;
final Paint paint = Paint()..color = const Color(0xFF0288D1);
final Paint borderPaint = Paint()
..color = Colors.white
..style = PaintingStyle.stroke
..strokeWidth = 3.0;
canvas.drawCircle(const Offset(size / 2, size / 2), size / 2.5, paint);
canvas.drawCircle(
const Offset(size / 2, size / 2), size / 2.5, borderPaint);
TextPainter iconPainter = TextPainter(textDirection: TextDirection.ltr);
iconPainter.text = TextSpan(
text: String.fromCharCode(Icons.directions_walk.codePoint),
style: TextStyle(
fontSize: 30.0,
fontFamily: Icons.directions_walk.fontFamily,
color: Colors.white,
),
);
iconPainter.layout();
iconPainter.paint(
canvas,
Offset((size - iconPainter.width) / 2, (size - iconPainter.height) / 2),
);
final ui.Image image = await pictureRecorder
.endRecording()
.toImage(size.toInt(), size.toInt());
final ByteData? data =
await image.toByteData(format: ui.ImageByteFormat.png);
return data!.buffer.asUint8List();
}
@override
void onClose() {
_animationTimers.forEach((key, timer) => timer.cancel());

View File

@@ -846,6 +846,7 @@ class RideLifecycleController extends GetxController {
rideIsBeginPassengerTimer();
runWhenRideIsBegin();
_updatePassengerWalkLine();
update();
}
@@ -1730,7 +1731,7 @@ class RideLifecycleController extends GetxController {
String generateTrackingLink(String rideId, String driverId) {
String cleanRideId = rideId.toString().trim();
String cleanDriverId = driverId.toString().trim();
const String secretSalt = "Intaleq_Secure_Track_2025";
const String secretSalt = "Siro_Secure_Track_2025";
String rawString = "$cleanRideId$cleanDriverId$secretSalt";
var bytes = utf8.encode(rawString);
@@ -2260,6 +2261,7 @@ class RideLifecycleController extends GetxController {
}
mapEngine.fitCameraToPoints(driverPos, passengerPos);
_updatePassengerWalkLine();
update();
}
} catch (e) {
@@ -2386,6 +2388,7 @@ class RideLifecycleController extends GetxController {
),
};
}
_updatePassengerWalkLine();
update();
}
}
@@ -3508,9 +3511,29 @@ class RideLifecycleController extends GetxController {
LatLngBounds boundsObj =
LatLngBounds(northeast: northeastBound, southwest: southwestBound);
var cameraUpdate = CameraUpdate.newLatLngBounds(boundsObj,
left: 180, top: 180, right: 180, bottom: 180);
mapController!.animateCamera(cameraUpdate);
final latDiff = (northeastBound.latitude - southwestBound.latitude).abs();
final lngDiff = (northeastBound.longitude - southwestBound.longitude).abs();
if (latDiff < 0.0001 || lngDiff < 0.0001) {
final center = LatLng(
(northeastBound.latitude + southwestBound.latitude) / 2,
(northeastBound.longitude + southwestBound.longitude) / 2,
);
mapController!.animateCamera(CameraUpdate.newLatLngZoom(center, 17));
} else {
try {
var cameraUpdate = CameraUpdate.newLatLngBounds(boundsObj,
left: 180, top: 180, right: 180, bottom: 180);
mapController!.animateCamera(cameraUpdate);
} catch (e) {
final center = LatLng(
(northeastBound.latitude + southwestBound.latitude) / 2,
(northeastBound.longitude + southwestBound.longitude) / 2,
);
mapController!.animateCamera(CameraUpdate.newLatLngZoom(center, 17));
}
}
update();
}
@@ -4562,4 +4585,82 @@ class RideLifecycleController extends GetxController {
sinLng;
return 2 * R * atan2(pow(h, 0.5).toDouble(), pow(1 - h, 0.5).toDouble());
}
// دالة لبناء الخط المنقط
List<Polyline> _buildDashedLine(LatLng start, LatLng end,
{required Color color, required String prefixId}) {
List<Polyline> segments = [];
double dist = Geolocator.distanceBetween(
start.latitude, start.longitude, end.latitude, end.longitude);
const double dashLengthMeters = 8.0;
const double gapLengthMeters = 6.0;
double latDiff = end.latitude - start.latitude;
double lngDiff = end.longitude - start.longitude;
double totalLength = 0;
int segmentCount = 0;
while (totalLength < dist) {
double startFraction = totalLength / dist;
double endFraction = (totalLength + dashLengthMeters) / dist;
if (endFraction > 1.0) {
endFraction = 1.0;
}
double startLat = start.latitude + latDiff * startFraction;
double startLng = start.longitude + lngDiff * startFraction;
double endLat = start.latitude + latDiff * endFraction;
double endLng = start.longitude + lngDiff * endFraction;
segments.add(
Polyline(
polylineId: PolylineId('${prefixId}_dash_$segmentCount'),
points: [LatLng(startLat, startLng), LatLng(endLat, endLng)],
color: color,
width: 4,
),
);
segmentCount++;
totalLength += dashLengthMeters + gapLengthMeters;
}
return segments;
}
// تحديث الخط المنقط ومكان أيقونة المشي للراكب
void _updatePassengerWalkLine() {
polyLines.removeWhere(
(p) => p.polylineId.value.startsWith('passenger_walk_line'));
markers.removeWhere((m) => m.markerId.value == 'walk_end_marker');
bool shouldShowWalkPath =
(statusRide == 'Apply' || statusRide == 'Arrived') &&
_currentDriverRoutePoints.isNotEmpty &&
passengerLocation.latitude != 0;
if (shouldShowWalkPath) {
final LatLng lastRoadPt = _currentDriverRoutePoints.last;
final walkDashes = _buildDashedLine(
lastRoadPt,
passengerLocation,
color: Colors.blueGrey,
prefixId: 'passenger_walk_line',
);
polyLines.addAll(walkDashes);
markers.add(
Marker(
markerId: const MarkerId('walk_end_marker'),
position: lastRoadPt,
icon: InlqBitmap.fromStyleImage('walk_icon'),
anchor: const Offset(0.5, 0.5),
),
);
}
mapEngine.update();
update();
}
}

View File

@@ -291,25 +291,25 @@ class UiInteractionsController extends GetxController {
rideLifecycle.rideId, rideLifecycle.driverId);
String message = """
مرحباً، تابع رحلتي مباشرة على تطبيق انطلق 🚗
مرحباً، تابع رحلتي مباشرة على تطبيق سيرو 🚗
يمكنك تتبع مسار الرحلة من هنا:
$trackingLink
السائق: ${rideLifecycle.passengerName}
السيارة: ${rideLifecycle.model} - ${rideLifecycle.licensePlate}
شكراً لاستخدامك انطلق!
شكراً لاستخدامك سيرو!
"""
.tr;
String messageEn = """Hello, follow my trip live on Intaleq 🚗
String messageEn = """Hello, follow my trip live on Siro 🚗
Track my ride here:
$trackingLink
Driver: ${rideLifecycle.passengerName}
Car: ${rideLifecycle.model} - ${rideLifecycle.licensePlate}
Thank you for using Intaleq!
Thank you for using Siro!
""";
String userLanguage = box.read(BoxName.lang) ?? 'ar';
@@ -362,7 +362,7 @@ Thank you for using Intaleq!
),
const SizedBox(height: 10),
Text(
"Send Intaleq app to him".tr,
"Send Siro app to him".tr,
style: AppStyle.title
.copyWith(color: AppColor.greenColor, fontSize: 14),
textAlign: TextAlign.center,
@@ -379,14 +379,14 @@ Thank you for using Intaleq!
var message = '''Dear Friend,
🚀 I have just started an exciting trip on Intaleq!
🚀 I have just started an exciting trip on Siro!
Download the app to track my ride:
👉 Android: https://play.google.com/store/apps/details?id=com.Intaleq.intaleq&hl=en-US
👉 iOS: https://apps.apple.com/st/app/intaleq-rider/id6748075179
👉 Android: https://play.google.com/store/apps/details?id=com.Siro.siro&hl=en-US
👉 iOS: https://apps.apple.com/st/app/siro-rider/id6748075179
See you there!
Intaleq Team''';
Siro Team''';
launchCommunication('whatsapp', phone, message);
},

View File

@@ -126,7 +126,7 @@
// formSearchPlaces(3),
// ];
// IntaleqMapController? mapController;
// SiroMapController? mapController;
// bool isStyleLoaded = false;
// Set<Marker> markers = {};
@@ -3930,7 +3930,7 @@
// String cleanDriverId = driverId.toString().trim();
// // الكلمة السرية للمطابقة مع السيرفر
// const String secretSalt = "Intaleq_Secure_Track_2025";
// const String secretSalt = "Siro_Secure_Track_2025";
// // الدمج والتشفير
// String rawString = "$cleanRideId$cleanDriverId$secretSalt";
@@ -4006,25 +4006,25 @@
// // 4. تجهيز الرسالة (بالإنجليزية وجاهزة للترجمة)
// // لاحظ: استخدمت المتغيرات الموجودة في الكنترولر (passengerName هنا عادة يحمل اسم السائق في الكنترولر الخاص بك حسب الكود السابق)
// String message = """
// مرحباً، تابع رحلتي مباشرة على تطبيق انطلق 🚗
// مرحباً، تابع رحلتي مباشرة على تطبيق سيرو 🚗
// يمكنك تتبع مسار الرحلة من هنا:
// $trackingLink
// السائق: $passengerName
// السيارة: $model - $licensePlate
// شكراً لاستخدامك انطلق!
// شكراً لاستخدامك سيرو!
// """
// .tr;
// String messageEn = """Hello, follow my trip live on Intaleq 🚗
// String messageEn = """Hello, follow my trip live on Siro 🚗
// Track my ride here:
// $trackingLink
// Driver: $passengerName
// Car: $model - $licensePlate
// Thank you for using Intaleq!
// Thank you for using Siro!
// """;
// // اختر الرسالة بناءً على اللغة المفضلة (مثال بسيط)
@@ -4131,7 +4131,7 @@
// ),
// const SizedBox(height: 10),
// Text(
// "Send Intaleq app to him".tr,
// "Send Siro app to him".tr,
// style: AppStyle.title
// .copyWith(color: AppColor.greenColor, fontSize: 14),
// textAlign: TextAlign.center,
@@ -4152,14 +4152,14 @@
// // تصحيح نص الرسالة
// var message = '''Dear Friend,
// 🚀 I have just started an exciting trip on Intaleq!
// 🚀 I have just started an exciting trip on Siro!
// Download the app to track my ride:
// 👉 Android: https://play.google.com/store/apps/details?id=com.Intaleq.intaleq&hl=en-US
// 👉 iOS: https://apps.apple.com/st/app/intaleq-rider/id6748075179
// 👉 Android: https://play.google.com/store/apps/details?id=com.Siro.siro&hl=en-US
// 👉 iOS: https://apps.apple.com/st/app/siro-rider/id6748075179
// See you there!
// Intaleq Team''';
// Siro Team''';
// launchCommunication('whatsapp', phone, message);
// }),
@@ -4518,7 +4518,7 @@
// if (mapController != null) {
// mapController!.animateCamera(CameraUpdate.newLatLng(
// currentPos)); // Optional: Follow car if needed
// // Note: IntaleqMapController doesn't expose raw symbol update yet for Marker object,
// // Note: SiroMapController doesn't expose raw symbol update yet for Marker object,
// // but declarative update via GetBuilder is fast.
// }
@@ -5451,13 +5451,13 @@
// );
// }
// void onMapCreated(IntaleqMapController controller) {
// void onMapCreated(SiroMapController controller) {
// mapController = controller;
// update();
// }
// void onStyleLoaded() async {
// Log.print('🗺️ Intaleq Map Style Loaded. Initializing...');
// Log.print('🗺️ Siro Map Style Loaded. Initializing...');
// isStyleLoaded = true;
// _loadMapIcons();

View File

@@ -49,9 +49,9 @@ class InviteController extends GetxController {
Future<void> shareDriverCode() async {
if (driverCouponCode != null) {
final String shareText = '''
${'Join Intaleq as a driver using my referral code!'.tr}
${'Join Siro as a driver using my referral code!'.tr}
${'Use code:'.tr} $driverCouponCode
${'Download the Intaleq Driver app now and earn rewards!'.tr}
${'Download the Siro Driver app now and earn rewards!'.tr}
''';
await Share.share(shareText);
}
@@ -60,9 +60,9 @@ ${'Download the Intaleq Driver app now and earn rewards!'.tr}
Future<void> sharePassengerCode() async {
if (couponCode != null) {
final String shareText = '''
${'Get a discount on your first Intaleq ride!'.tr}
${'Get a discount on your first Siro ride!'.tr}
${'Use my referral code:'.tr} $couponCode
${'Download the Intaleq app now and enjoy your ride!'.tr}
${'Download the Siro app now and enjoy your ride!'.tr}
''';
await Share.share(shareText);
}
@@ -243,14 +243,14 @@ ${'Download the Intaleq app now and enjoy your ride!'.tr}
// New and improved WhatsApp message for better user engagement.
String message =
"👋 ${'Hello! I\'m inviting you to try Intaleq.'.tr}\n\n"
"👋 ${'Hello! I\'m inviting you to try Siro.'.tr}\n\n"
"🎁 ${'Use my invitation code to get a special gift on your first ride!'.tr}\n\n"
"${'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.Intaleq.intaleq\n"
"• *iOS:* https://apps.apple.com/st/app/intaleq-rider/id6748075179\n\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"
"${'See you on the road!'.tr} 🚗";
launchCommunication('whatsapp', formattedPhoneNumber, message);

View File

@@ -183,18 +183,18 @@ class SplashScreenController extends GetxController
final List<String> msgs = passengerMessages ?? const [];
if (msgs.isEmpty) {
controller.scheduleNotificationsForSevenDays(
'Intaleq', 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.', "tone1");
'Siro', 'مرحباً بك! تابع رحلاتك بأمان مع سيرو.', "tone1");
} else {
final rnd = Random();
final raw = msgs[rnd.nextInt(msgs.length)];
final parts = raw.split(':');
final title = parts.isNotEmpty ? parts.first.trim() : 'Intaleq';
final title = parts.isNotEmpty ? parts.first.trim() : 'Siro';
final body = parts.length > 1
? parts.sublist(1).join(':').trim()
: 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.';
: 'مرحباً بك! تابع رحلاتك بأمان مع سيرو.';
controller.scheduleNotificationsForSevenDays(
title.isEmpty ? 'Intaleq' : title,
body.isEmpty ? 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.' : body,
title.isEmpty ? 'Siro' : title,
body.isEmpty ? 'مرحباً بك! تابع رحلاتك بأمان مع سيرو.' : body,
"tone1");
}
} catch (e, st) {

View File

@@ -23,7 +23,7 @@ class TripMonitorController extends GetxController {
double rotation = 0;
double speed = 0;
bool isStyleLoaded = false;
Set<Marker> markers = {};
getLocationParent() async {
@@ -36,7 +36,7 @@ class TripMonitorController extends GetxController {
double.parse(tripData['message'][0]['longitude'].toString()));
rotation = double.parse(tripData['message'][0]['heading'].toString());
speed = double.parse(tripData['message'][0]['speed'].toString());
_updateMarker();
update();
}

File diff suppressed because it is too large Load Diff

View File

@@ -272,7 +272,7 @@ class PaymobBillingDataWallet {
(box.read(BoxName.name).toString().split(' ')[0]).toString(),
"last_name":
(box.read(BoxName.name).toString().split(' ')[1]).toString() ??
'Intaleq',
'Siro',
"phone_number": (box.read(BoxName.phoneWallet)),
"apartment": apartment ?? "NA",
"floor": floor ?? "NA",