Update: 2026-06-11 13:47:39
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
إليك التقرير الفني الشامل لمشروع **Intaleq Passenger App**، مكتوباً بصيغة توثيق تقني (Technical Documentation) موجهة لفريق التطوير، بناءً على تحليل الكود المصدري.
|
||||
إليك التقرير الفني الشامل لمشروع **Siro Passenger App**، مكتوباً بصيغة توثيق تقني (Technical Documentation) موجهة لفريق التطوير، بناءً على تحليل الكود المصدري.
|
||||
|
||||
---
|
||||
|
||||
# 📘 Intaleq Passenger App - Technical Documentation Report
|
||||
# 📘 Siro Passenger App - Technical Documentation Report
|
||||
|
||||
**Prepared by:** CTO Office
|
||||
**Target Audience:** Mobile Engineering Team
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
/// A class that holds the color palette for the 'Intaleq' app.
|
||||
/// A class that holds the color palette for the 'Siro' app.
|
||||
/// The palette is professionally designed to be modern, cohesive, and culturally
|
||||
/// relevant, inspired by the Syrian flag and the app's brand identity.
|
||||
class AppColor {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class AppInformation {
|
||||
static const String companyName = 'Intaleq llc';
|
||||
static const String appName = 'Intaleq';
|
||||
static const String companyName = 'Siro llc';
|
||||
static const String appName = 'Siro';
|
||||
static const String phoneNumber = '962798583052';
|
||||
static const String linkedInProfile =
|
||||
'https://www.linkedin.com/in/hamza-ayed/';
|
||||
@@ -13,7 +13,7 @@ class AppInformation {
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Intaleq - Privacy Policy & Terms of Use</title>
|
||||
<title>Siro - Privacy Policy & Terms of Use</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
@@ -68,11 +68,11 @@ class AppInformation {
|
||||
</div>
|
||||
|
||||
<h2>1. Introduction and Acceptance</h2>
|
||||
<p>By downloading, registering, or using the Intaleq application ("App"), you agree to be bound by this Privacy Policy and our Terms of Use. If you do not agree, you must stop using the App immediately. Your continued use constitutes acceptance of these terms and any future updates.</p>
|
||||
<p>By downloading, registering, or using the Siro application ("App"), you agree to be bound by this Privacy Policy and our Terms of Use. If you do not agree, you must stop using the App immediately. Your continued use constitutes acceptance of these terms and any future updates.</p>
|
||||
|
||||
<h2>2. Definitions</h2>
|
||||
<ul>
|
||||
<li><strong>"Intaleq", "we", "us":</strong> Refers to the Intaleq for Ride Hailing company, Damascus – Syria (Owner & operator), which provides the technology platform.</li>
|
||||
<li><strong>"Siro", "we", "us":</strong> Refers to the Siro for Ride Hailing company, Damascus – Syria (Owner & operator), which provides the technology platform.</li>
|
||||
<li><strong>"Driver":</strong> An independent service provider who uses the App to offer transportation services.</li>
|
||||
<li><strong>"Passenger", "you":</strong> An individual who uses the App to request transportation services.</li>
|
||||
<li><strong>"Services":</strong> The connection between Passengers and Drivers facilitated by our App.</li>
|
||||
@@ -133,7 +133,7 @@ class AppInformation {
|
||||
</ul>
|
||||
|
||||
<h2>5. Disclaimer of Liability</h2>
|
||||
<p>The App is provided "as is". Intaleq is an intermediary platform and is not liable for the actions of Drivers or Passengers, accidents, delays, or any disputes between users. Our liability is limited to the fullest extent permitted by law.</p>
|
||||
<p>The App is provided "as is". Siro is an intermediary platform and is not liable for the actions of Drivers or Passengers, accidents, delays, or any disputes between users. Our liability is limited to the fullest extent permitted by law.</p>
|
||||
|
||||
<h2>6. Policy Updates</h2>
|
||||
<p>We may update these terms. If we make significant changes, we will notify you within the App. You will be required to review and accept the new terms to continue using the Services, ensuring your consent is active and informed.</p>
|
||||
@@ -152,7 +152,7 @@ class AppInformation {
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>انطلق - سياسة الخصوصية وشروط الاستخدام</title>
|
||||
<title>سيرو - سياسة الخصوصية وشروط الاستخدام</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
@@ -208,11 +208,11 @@ class AppInformation {
|
||||
</div>
|
||||
|
||||
<h2>1. المقدمة والقبول</h2>
|
||||
<p>عبر تحميل أو تسجيل أو استخدام تطبيق "انطلق" ("التطبيق")، فإنك توافق على الالتزام بسياسة الخصوصية وشروط الاستخدام هذه. إذا كنت لا توافق، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يُعد قبولاً لهذه الشروط وأي تحديثات مستقبلية لها.</p>
|
||||
<p>عبر تحميل أو تسجيل أو استخدام تطبيق "سيرو" ("التطبيق")، فإنك توافق على الالتزام بسياسة الخصوصية وشروط الاستخدام هذه. إذا كنت لا توافق، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يُعد قبولاً لهذه الشروط وأي تحديثات مستقبلية لها.</p>
|
||||
|
||||
<h2>2. التعريفات</h2>
|
||||
<ul>
|
||||
<li><strong>"انطلق"، "نحن":</strong> تشير إلى شركة انطلق لنقل الركاب، دمشق – سوريا (مالك ومشغل التطبيق)، التي توفر المنصة التقنية.</li>
|
||||
<li><strong>"سيرو"، "نحن":</strong> تشير إلى شركة سيرو لنقل الركاب، دمشق – سوريا (مالك ومشغل التطبيق)، التي توفر المنصة التقنية.</li>
|
||||
<li><strong>"السائق":</strong> مقدم خدمة مستقل يستخدم التطبيق لتقديم خدمات النقل.</li>
|
||||
<li><strong>"الراكب"، "أنت":</strong> الفرد الذي يستخدم التطبيق لطلب خدمات النقل.</li>
|
||||
<li><strong>"الخدمات":</strong> عملية الربط بين الركاب والسائقين التي يسهلها تطبيقنا.</li>
|
||||
@@ -273,7 +273,7 @@ class AppInformation {
|
||||
</ul>
|
||||
|
||||
<h2>5. إخلاء المسؤولية</h2>
|
||||
<p>يتم تقديم التطبيق "كما هو". "انطلق" هي منصة وسيطة وليست مسؤولة عن تصرفات السائقين أو الركاب، أو الحوادث، أو التأخير، أو أي نزاعات بين المستخدمين. مسؤوليتنا محدودة إلى أقصى حد يسمح به القانون.</p>
|
||||
<p>يتم تقديم التطبيق "كما هو". "سيرو" هي منصة وسيطة وليست مسؤولة عن تصرفات السائقين أو الركاب، أو الحوادث، أو التأخير، أو أي نزاعات بين المستخدمين. مسؤوليتنا محدودة إلى أقصى حد يسمح به القانون.</p>
|
||||
|
||||
<h2>6. تحديثات السياسة</h2>
|
||||
<p>قد نقوم بتحديث هذه الشروط. في حال إجراء تغييرات جوهرية، سنقوم بإعلامك داخل التطبيق. سيُطلب منك مراجعة الشروط الجديدة وقبولها لمواصلة استخدام الخدمات، لضمان أن موافقتك فعالة ومبنية على معرفة.</p>
|
||||
|
||||
@@ -6,8 +6,8 @@ class AppLink {
|
||||
///https://walletintaleq.intaleq.xyz/v1/main
|
||||
static String paymentServer = 'https://walletintaleq.intaleq.xyz/v2/main';
|
||||
|
||||
///https://api.intaleq.xyz/intaleq/ride/location
|
||||
static String location = 'https://api.intaleq.xyz/intaleq_v3/ride/location';
|
||||
///https://api.intaleq.xyz/siro/ride/location
|
||||
static String location = 'https://api.intaleq.xyz/siro_v3/ride/location';
|
||||
|
||||
/// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات.
|
||||
/// https://routesy.intaleq.xyz for syria
|
||||
@@ -21,21 +21,21 @@ class AppLink {
|
||||
static String mapSaasPlaces =
|
||||
'https://map-saas.intaleqapp.com/api/geocoding/places';
|
||||
|
||||
///https://location.intaleq.xyz/intaleq/ride/location
|
||||
///https://location.intaleq.xyz/siro/ride/location
|
||||
///locationServerSide هو السيرفر الجانبي الخاص بموقع السائقين، حيث يتم إرسال تحديثات الموقع من التطبيق إلى هذا السيرفر، ومن ثم يقوم هذا السيرفر بتوزيع هذه التحديثات إلى الركاب المتصلين الذين يتابعون السائق في الوقت الحقيقي.
|
||||
static String locationServerSide =
|
||||
'https://location.intaleq.xyz/intaleq/ride/location';
|
||||
'https://location.intaleq.xyz/siro/ride/location';
|
||||
|
||||
///https://api.intaleq.xyz/intaleq
|
||||
static final String endPoint = 'https://api.intaleq.xyz/intaleq_v3';
|
||||
///https://api.intaleq.xyz/siro
|
||||
static final String endPoint = 'https://api.intaleq.xyz/siro_v3';
|
||||
|
||||
/// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات.
|
||||
/// https://rides.intaleq.xyz/intaleq
|
||||
static final String rideServerSide = 'https://rides.intaleq.xyz/intaleq';
|
||||
/// https://rides.intaleq.xyz/siro
|
||||
static final String rideServerSide = 'https://rides.intaleq.xyz/siro';
|
||||
|
||||
///https://api.intaleq.xyz/intaleq
|
||||
///https://api.intaleq.xyz/siro
|
||||
/// main api link for all api calls except rides and location
|
||||
static final String server = 'https://api.intaleq.xyz/intaleq_v3';
|
||||
static final String server = 'https://api.intaleq.xyz/siro_v3';
|
||||
|
||||
///https://rides.intaleq.xyz
|
||||
/// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات.
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
List<String> passengerMessages = [
|
||||
// --- رسائل العروض والتوفير ---
|
||||
"وفر على حالك: 🚗 أسعار انطلق نازلة كتير! شوف العروض الجديدة وفوت هلأ قبل ما تخلص. 🌟",
|
||||
"خصم اليوم: 🤔 لا تفوّت الفرصة! افتح تطبيق انطلق وشوف الأسعار يلي ما بتنعاد.",
|
||||
"وفر على حالك: 🚗 أسعار سيرو نازلة كتير! شوف العروض الجديدة وفوت هلأ قبل ما تخلص. 🌟",
|
||||
"خصم اليوم: 🤔 لا تفوّت الفرصة! افتح تطبيق سيرو وشوف الأسعار يلي ما بتنعاد.",
|
||||
"عروض نارية: 🎁 اليوم خصم خاص إلك، احجز مشوارك الجاي بسعر ولا أروع!",
|
||||
"مشاوير اقتصادية: 💸 مع انطلق بتتحرك براحتك وبتدفع أقل، جرب وشوف الفرق!",
|
||||
"مشاوير اقتصادية: 💸 مع سيرو بتتحرك براحتك وبتدفع أقل، جرب وشوف الفرق!",
|
||||
|
||||
// --- رسائل السهولة والراحة ---
|
||||
"مشوار بكبسة زر: 📲 افتح تطبيق انطلق، وخلِّي السيارة توصلك لعندك بثواني.",
|
||||
"ارتاح من المواصلات: 🤔 خلّي انطلق يريحك من الانتظار والزحمة، وانطلق وين ما بدك.",
|
||||
"مشوار بكبسة زر: 📲 افتح تطبيق سيرو، وخلِّي السيارة توصلك لعندك بثواني.",
|
||||
"ارتاح من المواصلات: 🤔 خلّي سيرو يريحك من الانتظار والزحمة، وسيرو وين ما بدك.",
|
||||
"سيارتك جاهزة: 🚕 الكابتن ناطر طلبك، حدد وجهتك وخلّي الطريق علينا.",
|
||||
"رحلة مريحة: 🛣️ ارتاح بالكرسي، نحنا منهتم بكل التفاصيل من الباب للباب.",
|
||||
|
||||
// --- رسائل الأمان والثقة ---
|
||||
"رحلتك بأمان: 🙏 كل كباتنّا مدرّبين وملتزمين، وسلامتك أولويتنا.",
|
||||
"سافر وانت مطمّن: 🔒 مع انطلق كل شي موثوق ومسجّل لتكون مرتاح البال.",
|
||||
"سافر وانت مطمّن: 🔒 مع سيرو كل شي موثوق ومسجّل لتكون مرتاح البال.",
|
||||
"شارك رحلتك: ❤️ فيك تبعت تفاصيل المشوار لأهلك أو رفقاتك بخطوة وحدة.",
|
||||
"انطلق بثقة: ✅ كل الرحلات مراقبة لتضمن تجربة آمنة ومريحة 100%.",
|
||||
"سيرو بثقة: ✅ كل الرحلات مراقبة لتضمن تجربة آمنة ومريحة 100%.",
|
||||
|
||||
// --- رسائل تفاعلية ومناسبات ---
|
||||
"الويكند بلّش: 🥳 خلي مشاويرك مع الأصحاب علينا، وفر وقتك وفلوسك مع انطلق.",
|
||||
"الويكند بلّش: 🥳 خلي مشاويرك مع الأصحاب علينا، وفر وقتك وفلوسك مع سيرو.",
|
||||
"رايح عالشغل: 💼 لا تتأخر، افتح التطبيق وخلي الكابتن يوصلك بلا تعب.",
|
||||
"الشمس مولّعة: ☀️ لا تمشي تحت الحر، خلي السيارة تجي لعندك.",
|
||||
"مستعجل: 🏃♂️ لا تقلق، انطلق أسرع طريق لتوصل عموعدك.",
|
||||
"مستعجل: 🏃♂️ لا تقلق، سيرو أسرع طريق لتوصل عموعدك.",
|
||||
|
||||
// --- رسائل تشجيعية عامة ---
|
||||
"وين رايح اليوم؟ 🗺️ وين ما كانت وجهتك، انطلق بيخدمك بكل مكان وبأي وقت.",
|
||||
"وين رايح اليوم؟ 🗺️ وين ما كانت وجهتك، سيرو بيخدمك بكل مكان وبأي وقت.",
|
||||
"جرب شي جديد: 🚘 شوف فئات السيارات الجديدة وخلي رحلتك أريح وأجمل.",
|
||||
"شكراً لاختيارك: ⭐ وجودك معنا بيفرحنا، ونتمنى دايماً تكون رحلتك مريحة وسعيدة.",
|
||||
"كل يوم جديد: ✨ فوت عالتطبيق وتابع آخر التحديثات والعروض يلي نازلة خصيصاً إلك."
|
||||
|
||||
@@ -15,5 +15,5 @@ class Pasenger {
|
||||
static const String payMobApikey = 'payMobApikey';
|
||||
static const String initializationVector = 'initializationVector';
|
||||
static const String keyOfApp = 'keyOfApp';
|
||||
static const String FCM_PRIVATE_KEY_INTALEQ = 'FCM_PRIVATE_KEY_INTALEQ';
|
||||
static const String FCM_PRIVATE_KEY_SIRO = 'FCM_PRIVATE_KEY_SIRO';
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
// )
|
||||
// ];
|
||||
|
||||
@@ -446,7 +446,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
|
||||
// NotificationController().showNotification(
|
||||
// 'Don’t 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');
|
||||
// }
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 ?, ;, =
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -10,7 +10,7 @@ class IosLiveActivityService {
|
||||
static void init() {
|
||||
if (Platform.isIOS) {
|
||||
_liveActivitiesPlugin.init(
|
||||
appGroupId: "group.com.Intaleq.intaleq",
|
||||
appGroupId: "group.com.Siro.siro",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -2,22 +2,22 @@ import 'package:get/get.dart';
|
||||
|
||||
List<OnBoardingModel> onBoardingList = [
|
||||
OnBoardingModel(
|
||||
title: 'Welcome to Intaleq!'.tr,
|
||||
title: 'Welcome to Siro!'.tr,
|
||||
image: 'assets/images/on1.png',
|
||||
body:
|
||||
'Intaleq is the ride-hailing app that is safe, reliable, and accessible.'
|
||||
'Siro is the ride-hailing app that is safe, reliable, and accessible.'
|
||||
.tr,
|
||||
),
|
||||
OnBoardingModel(
|
||||
title: 'Get to your destination quickly and easily.'.tr,
|
||||
image: 'assets/images/on2.png',
|
||||
body: 'With Intaleq, you can get a ride to your destination in minutes.'.tr,
|
||||
body: 'With Siro, you can get a ride to your destination in minutes.'.tr,
|
||||
),
|
||||
OnBoardingModel(
|
||||
title: 'Enjoy a safe and comfortable ride.'.tr,
|
||||
image: 'assets/images/on3.png',
|
||||
body:
|
||||
'Intaleq is committed to safety, and all of our captains are carefully screened and background checked.'
|
||||
'Siro is committed to safety, and all of our captains are carefully screened and background checked.'
|
||||
.tr,
|
||||
),
|
||||
];
|
||||
|
||||
@@ -6,7 +6,7 @@ import '../print.dart';
|
||||
/// خدمة التحكم بوضع النافذة العائمة (Picture-in-Picture) على أندرويد.
|
||||
/// تُستدعى عند بدء الرحلة لتفعيل PiP تلقائياً عند خروج المستخدم من التطبيق.
|
||||
class PipService {
|
||||
static const MethodChannel _channel = MethodChannel('intaleq/pip');
|
||||
static const MethodChannel _channel = MethodChannel('siro/pip');
|
||||
|
||||
/// هل وضع PiP مدعوم على هذا الجهاز؟
|
||||
static Future<bool> isPipSupported() async {
|
||||
|
||||
@@ -22,7 +22,7 @@ class RideLiveNotification {
|
||||
final android = AndroidNotificationDetails(
|
||||
'live_ride_tracking', // channel id
|
||||
'Ride Tracking', // channel name
|
||||
channelDescription: 'Live updates for the current Intaleq ride',
|
||||
channelDescription: 'Live updates for the current Siro ride',
|
||||
importance: Importance.max,
|
||||
priority: Priority.high,
|
||||
ongoing: true, // إشعار ثابت
|
||||
|
||||
@@ -2,7 +2,7 @@ import 'dart:io';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class RideTrackingNative {
|
||||
static const MethodChannel _channel = MethodChannel('intaleq/ride_tracking');
|
||||
static const MethodChannel _channel = MethodChannel('siro/ride_tracking');
|
||||
|
||||
static Future<void> updateRideTracking({
|
||||
required String driverName,
|
||||
|
||||
@@ -143,7 +143,7 @@ class SplashScreen extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
// ── اسم "Intaleq" مع توهج متنفّس ─────────
|
||||
// ── اسم "Siro" مع توهج متنفّس ─────────
|
||||
AnimatedBuilder(
|
||||
animation: controller.glowAnimation,
|
||||
builder: (_, child) => Container(
|
||||
@@ -166,7 +166,7 @@ class SplashScreen extends StatelessWidget {
|
||||
child: AnimatedTextKit(
|
||||
animatedTexts: [
|
||||
ColorizeAnimatedText(
|
||||
'Intaleq',
|
||||
'Siro',
|
||||
textStyle: const TextStyle(
|
||||
fontSize: 38,
|
||||
fontWeight: FontWeight.w800,
|
||||
@@ -290,7 +290,7 @@ class SplashScreen extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'INTALEQ',
|
||||
'SIRO',
|
||||
style: TextStyle(
|
||||
fontSize: 9.5,
|
||||
fontWeight: FontWeight.w700,
|
||||
|
||||
@@ -98,7 +98,7 @@ class RateDriverFromPassenger extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(4.0),
|
||||
child: Text(
|
||||
'Exclusive offers and discounts always with the Intaleq app'
|
||||
'Exclusive offers and discounts always with the Siro app'
|
||||
.tr,
|
||||
style: AppStyle.title.copyWith(
|
||||
color: AppColor.redColor,
|
||||
|
||||
@@ -238,7 +238,7 @@ class LoginPage extends StatelessWidget {
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
launchUrl(Uri.parse(
|
||||
'https://intaleq.xyz/intaleq/privacy_policy.php'));
|
||||
'https://intaleq.xyz/siro/privacy_policy.php'));
|
||||
},
|
||||
),
|
||||
TextSpan(text: " and acknowledge our Privacy Policy.".tr),
|
||||
|
||||
@@ -421,7 +421,7 @@ class _PhoneNumberScreenState extends State<PhoneNumberScreen> {
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
|
||||
return AuthScreen(
|
||||
title: 'welcome to intaleq'.tr,
|
||||
title: 'welcome to siro'.tr,
|
||||
subtitle: 'login or register subtitle'.tr,
|
||||
form: Form(
|
||||
key: _formKey,
|
||||
|
||||
@@ -28,7 +28,7 @@ class AboutPage extends StatelessWidget {
|
||||
|
||||
// Company Name and Introduction
|
||||
Text(
|
||||
'Intaleq LLC',
|
||||
'Siro LLC',
|
||||
style: CupertinoTheme.of(context).textTheme.navTitleTextStyle,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
@@ -43,7 +43,7 @@ class AboutPage extends StatelessWidget {
|
||||
|
||||
// Key Features Section
|
||||
Text(
|
||||
'Why Choose Intaleq?'.tr,
|
||||
'Why Choose Siro?'.tr,
|
||||
style: CupertinoTheme.of(context).textTheme.navTitleTextStyle,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
|
||||
@@ -107,7 +107,7 @@ class ContactUsPage extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
"Intaleq Support".tr,
|
||||
"Siro Support".tr,
|
||||
style: AppStyle.headTitle2.copyWith(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -229,7 +229,7 @@ class ContactUsPage extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"About Intaleq".tr,
|
||||
"About Siro".tr,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18,
|
||||
@@ -239,7 +239,7 @@ class ContactUsPage extends StatelessWidget {
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Get.find<TextToSpeechController>().speakText(
|
||||
'Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience.'
|
||||
'Siro is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience.'
|
||||
.tr,
|
||||
);
|
||||
},
|
||||
@@ -249,7 +249,7 @@ class ContactUsPage extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Text(
|
||||
'Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.'
|
||||
'Siro is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Siro, you enjoy quality, safety, and peace of mind—every time you ride.'
|
||||
.tr,
|
||||
style: TextStyle(
|
||||
color: isDark ? Colors.white70 : Colors.black54,
|
||||
|
||||
@@ -56,7 +56,7 @@ class FrequentlyQuestionsPage extends StatelessWidget {
|
||||
onTap: () => _showAnswerDialog(
|
||||
context,
|
||||
'How do I request a ride?'.tr,
|
||||
'Simply open the Intaleq app, enter your destination, and tap "Request Ride". The app will connect you with a nearby driver.'
|
||||
'Simply open the Siro app, enter your destination, and tap "Request Ride". The app will connect you with a nearby driver.'
|
||||
.tr,
|
||||
),
|
||||
),
|
||||
@@ -78,7 +78,7 @@ class FrequentlyQuestionsPage extends StatelessWidget {
|
||||
onTap: () => _showAnswerDialog(
|
||||
context,
|
||||
'What types of vehicles are available?'.tr,
|
||||
'Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.'
|
||||
'Siro offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.'
|
||||
.tr,
|
||||
),
|
||||
),
|
||||
@@ -149,7 +149,7 @@ class FrequentlyQuestionsPage extends StatelessWidget {
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.indigo)),
|
||||
content: Text(
|
||||
'To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.'
|
||||
'To register as a driver or learn about the requirements, please visit our website or contact Siro support directly.'
|
||||
.tr),
|
||||
actions: <CupertinoDialogAction>[
|
||||
CupertinoDialogAction(
|
||||
@@ -208,12 +208,12 @@ class FrequentlyQuestionsPage extends StatelessWidget {
|
||||
CupertinoIcons.shield_fill,
|
||||
color: Colors.teal,
|
||||
),
|
||||
title: Text('What safety measures does Intaleq offer?'.tr),
|
||||
title: Text('What safety measures does Siro offer?'.tr),
|
||||
trailing: const CupertinoListTileChevron(),
|
||||
onTap: () => _showAnswerDialog(
|
||||
context,
|
||||
'What safety measures does Intaleq offer?'.tr,
|
||||
'Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.'
|
||||
'What safety measures does Siro offer?'.tr,
|
||||
'Siro offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.'
|
||||
.tr,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -107,8 +107,8 @@ class AttributionMap extends StatelessWidget {
|
||||
child: Opacity(
|
||||
opacity: 0.7,
|
||||
child: Text(
|
||||
"Intaleq Maps",
|
||||
// "Intaleq Maps • © OpenStreetMap contributors",
|
||||
"Siro Maps",
|
||||
// "Siro Maps • © OpenStreetMap contributors",
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
color: Colors.grey[700],
|
||||
|
||||
@@ -309,7 +309,7 @@ class MapMenuWidget extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(width: 6),
|
||||
Text(
|
||||
"Intaleq Passenger".tr,
|
||||
"Siro Passenger".tr,
|
||||
style: TextStyle(
|
||||
color: _kTextMuted,
|
||||
fontSize: 12,
|
||||
@@ -374,10 +374,10 @@ class MapMenuWidget extends StatelessWidget {
|
||||
final String driverAppUrl;
|
||||
if (defaultTargetPlatform == TargetPlatform.android) {
|
||||
driverAppUrl =
|
||||
'https://play.google.com/store/apps/details?id=com.intaleq_driver';
|
||||
'https://play.google.com/store/apps/details?id=com.siro_driver';
|
||||
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
|
||||
driverAppUrl =
|
||||
'https://apps.apple.com/st/app/intaleq-driver/id6482995159';
|
||||
'https://apps.apple.com/st/app/siro-driver/id6482995159';
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -257,4 +257,4 @@ class PassengerWallet extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
// الكلاس القديم CardIntaleqWallet لم نعد بحاجة إليه لأنه تم دمجه وتطويره
|
||||
// الكلاس القديم CardSiroWallet لم نعد بحاجة إليه لأنه تم دمجه وتطويره
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:ffi';
|
||||
import 'dart:math';
|
||||
import 'package:siro_rider/views/widgets/error_snakbar.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
@@ -1173,7 +1174,7 @@ class NavigationController extends GetxController
|
||||
_lastTraveledIndexInFullRoute = 0;
|
||||
currentInstruction = "";
|
||||
nextInstruction = "";
|
||||
currentManeuverModifier = "intaleq";
|
||||
currentManeuverModifier = "siro";
|
||||
distanceToNextStep = "";
|
||||
totalDistanceRemaining = "";
|
||||
estimatedTimeRemaining = "";
|
||||
|
||||
@@ -145,7 +145,7 @@ class ComplaintPage extends StatelessWidget {
|
||||
ListTile(
|
||||
leading: const Icon(Icons.support_agent_outlined,
|
||||
color: AppColor.primaryColor),
|
||||
title: Text("Intaleq's Response".tr,
|
||||
title: Text("Siro's Response".tr,
|
||||
style: AppStyle.title),
|
||||
subtitle: Text(
|
||||
// --- تعديل هنا لعرض الرد من الخادم ---
|
||||
|
||||
Reference in New Issue
Block a user