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

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