63 lines
3.0 KiB
Dart
63 lines
3.0 KiB
Dart
// 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('تعذّر فتح تطبيق الخرائط');
|
|
}
|
|
}
|
|
}
|