Food delivery driver module + masked calls + TURN
This commit is contained in:
@@ -4,9 +4,11 @@ import 'package:get/get.dart';
|
||||
|
||||
import '../../constant/box_name.dart';
|
||||
import '../../constant/colors.dart';
|
||||
import '../../constant/links.dart';
|
||||
import '../../constant/style.dart';
|
||||
import '../../main.dart';
|
||||
import '../../controller/food/food_controller.dart';
|
||||
import '../../controller/voice_call_controller.dart';
|
||||
import '../../controller/food/food_models.dart';
|
||||
import '../widgets/my_scafold.dart';
|
||||
import 'food_home_page.dart';
|
||||
@@ -127,7 +129,27 @@ class _FoodOrderTrackingPageState extends State<FoodOrderTrackingPage> {
|
||||
Text(foodFormatPrice(order.grandTotal), style: AppStyle.title.copyWith(fontWeight: FontWeight.bold)),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
const SizedBox(height: 16),
|
||||
// الاتصال بالسائق متاح فقط أثناء التوصيل، وعبر قناة مقنّعة:
|
||||
// لا رقم هاتف يُعرض لأي طرف — جلسة صوتية مؤقتة تُقفل بانتهاء الطلب.
|
||||
if (order.status == 'courier_assigned' || order.status == 'picked_up')
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: OutlinedButton.icon(
|
||||
style: OutlinedButton.styleFrom(
|
||||
side: BorderSide(color: AppColor.primaryColor),
|
||||
padding: const EdgeInsets.symmetric(vertical: 14),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
|
||||
),
|
||||
onPressed: () => _callCourier(order.id),
|
||||
icon: Icon(Icons.phone_in_talk_rounded, color: AppColor.primaryColor),
|
||||
label: Text(
|
||||
_isAr ? 'الاتصال بالسائق' : 'Call the courier',
|
||||
style: TextStyle(color: AppColor.primaryColor),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
if (order.status == 'pending')
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
@@ -172,6 +194,27 @@ class _FoodOrderTrackingPageState extends State<FoodOrderTrackingPage> {
|
||||
);
|
||||
}
|
||||
|
||||
// القناة نفسها المستعملة في مكالمات الرحلات (WebRTC عبر خادم الإشارات)،
|
||||
// لكن الجلسة تُنشأ من واجهة الطعام التي تتحقق أن الطلب لي وأنه قيد التوصيل.
|
||||
Future<void> _callCourier(int orderId) async {
|
||||
// مسجَّل عالمياً بـ lazyPut(fenix) في app_bindings — والـ put احتياط
|
||||
VoiceCallController voiceCtrl;
|
||||
try {
|
||||
voiceCtrl = Get.find<VoiceCallController>();
|
||||
} catch (_) {
|
||||
voiceCtrl = Get.put(VoiceCallController());
|
||||
}
|
||||
|
||||
await voiceCtrl.startCall(
|
||||
rideIdVal: 'food_$orderId',
|
||||
driverId: '', // هوية السائق لا تصل التطبيق — الخادم يحلّها من الطلب
|
||||
passengerId: box.read(BoxName.passengerID).toString(),
|
||||
remoteNameVal: _isAr ? 'سائق التوصيل' : 'Delivery courier',
|
||||
sessionEndpoint: '${AppLink.server}/food/order/call_courier.php',
|
||||
sessionPayload: {'order_id': orderId.toString()},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _statusTimeline(String currentStatus) {
|
||||
final currentIndex = foodOrderStatusFlow.indexOf(currentStatus);
|
||||
return Column(
|
||||
|
||||
Reference in New Issue
Block a user