Food: single-source tracking, mode exclusivity, in-app navigation
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
// food_navigation.dart — تشغيل ملاحة سيرو الداخلية لمهام التوصيل
|
||||
//
|
||||
// لماذا النسخة نفسها (بلا tag) لا نسخة مستقلة للتوصيل:
|
||||
// خطّ تحديث الموقع المركزي في LocationController يُغذّي نسخة واحدة فقط
|
||||
// (Get.find<NavigationController> بلا وسم). نسخة موسومة للتوصيل ستُحرم من
|
||||
// تحديثات الموقع فلا تعمل الملاحة أصلاً، وتغذيتها يستلزم تعديل مسار الموقع
|
||||
// وهو المسار الأخطر في التطبيق. فنستعمل النسخة المشتركة، ونعالج التضارب
|
||||
// الوحيد الممكن (سائق في ملاحة رحلة ثم يفتح مهمة توصيل) بسؤاله صراحةً
|
||||
// بدل استبدال مساره صامتاً.
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intaleq_maps/intaleq_maps.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../../views/widgets/error_snakbar.dart';
|
||||
import '../home/navigation/navigation_controller.dart';
|
||||
import '../home/navigation/navigation_view.dart';
|
||||
|
||||
class FoodNavigation {
|
||||
/// يفتح ملاحة سيرو إلى [lat]/[lng]. يعيد false إذا ألغى السائق الاستبدال.
|
||||
static Future<bool> startInApp({
|
||||
required double lat,
|
||||
required double lng,
|
||||
required String title,
|
||||
}) async {
|
||||
final controller = Get.isRegistered<NavigationController>()
|
||||
? Get.find<NavigationController>()
|
||||
: Get.put(NavigationController());
|
||||
|
||||
if (controller.isNavigating) {
|
||||
final replace = await Get.dialog<bool>(
|
||||
AlertDialog(
|
||||
title: const Text('ملاحة نشطة'),
|
||||
content: Text('لديك ملاحة جارية. هل تستبدلها بالوجهة الجديدة؟\n$title'),
|
||||
actions: [
|
||||
TextButton(onPressed: () => Get.back(result: false), child: const Text('إبقاء الحالية')),
|
||||
TextButton(onPressed: () => Get.back(result: true), child: const Text('استبدال')),
|
||||
],
|
||||
),
|
||||
);
|
||||
if (replace != true) return false;
|
||||
}
|
||||
|
||||
Get.to(() => const NavigationView());
|
||||
await controller.startNavigationTo(LatLng(lat, lng), infoWindowTitle: title);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// خيار ثانوي لمن يفضّل جوجل — نفس ما يتيحه تدفّق الرحلات.
|
||||
/// لا نمرّر في الرابط سوى الإحداثيات: لا اسم زبون ولا رقم طلب.
|
||||
static Future<void> startExternal(double lat, double lng) async {
|
||||
final nav = Uri.parse('google.navigation:q=$lat,$lng');
|
||||
if (await canLaunchUrl(nav)) {
|
||||
await launchUrl(nav);
|
||||
return;
|
||||
}
|
||||
final web = Uri.parse('https://www.google.com/maps/dir/?api=1&destination=$lat,$lng');
|
||||
if (!await launchUrl(web, mode: LaunchMode.externalApplication)) {
|
||||
mySnackbarWarning('تعذّر فتح تطبيق الخرائط');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user