214 lines
7.9 KiB
Dart
214 lines
7.9 KiB
Dart
import 'dart:math';
|
||
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_font_icons/flutter_font_icons.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:maplibre_gl/maplibre_gl.dart';
|
||
import 'dart:ui'; // مهم لإضافة تأثير الضبابية
|
||
|
||
import '../../../constant/colors.dart';
|
||
import '../../../controller/functions/tts.dart';
|
||
import '../../../controller/home/ios_live_activity_service.dart';
|
||
import '../../../controller/home/map_passenger_controller.dart';
|
||
import '../../../controller/home/vip_waitting_page.dart';
|
||
import '../../../print.dart';
|
||
|
||
// --- الدالة الرئيسية بالتصميم الجديد ---
|
||
GetBuilder<MapPassengerController> leftMainMenuIcons() {
|
||
Get.put(TextToSpeechController());
|
||
return GetBuilder<MapPassengerController>(
|
||
builder: (controller) => Positioned(
|
||
// تم تعديل الموضع ليتناسب مع التصميم الجديد
|
||
top: Get.height * .01,
|
||
left: 0,
|
||
right: 0,
|
||
child: Center(
|
||
child: ClipRRect(
|
||
borderRadius: BorderRadius.circular(50.0), // لإنشاء شكل الكبسولة
|
||
child: BackdropFilter(
|
||
filter: ImageFilter.blur(
|
||
sigmaX: 8.0, sigmaY: 8.0), // تأثير الزجاج المصنفر
|
||
child: AnimatedContainer(
|
||
duration: const Duration(milliseconds: 300),
|
||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||
decoration: BoxDecoration(
|
||
color: AppColor.secondaryColor.withOpacity(0.4), // لون شبه شفاف
|
||
borderRadius: BorderRadius.circular(50.0),
|
||
border: Border.all(color: AppColor.secondaryColor),
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
mainAxisSize: MainAxisSize.min, // ليأخذ الشريط حجم الأزرار فقط
|
||
children: [
|
||
// --- تم استخدام دالة مساعدة جديدة للزر ---
|
||
_buildMapActionButton(
|
||
icon: Icons.satellite_alt_outlined,
|
||
tooltip: 'Toggle Map Type',
|
||
onPressed: () => controller.changeMapType(),
|
||
),
|
||
// _buildVerticalDivider(),
|
||
// _buildMapActionButton(
|
||
// icon: Icons.traffic_outlined,
|
||
// tooltip: 'Toggle Traffic',
|
||
// onPressed: () => controller.changeMapTraffic(),
|
||
// ),
|
||
_buildVerticalDivider(),
|
||
_buildMapActionButton(
|
||
icon: Icons.my_location_rounded,
|
||
tooltip: 'Go to My Location',
|
||
onPressed: () {
|
||
controller.mapController?.animateCamera(
|
||
CameraUpdate.newLatLng(
|
||
LatLng(
|
||
controller.passengerLocation.latitude,
|
||
controller.passengerLocation.longitude,
|
||
),
|
||
),
|
||
);
|
||
},
|
||
),
|
||
_buildVerticalDivider(),
|
||
_buildMapActionButton(
|
||
icon: Octicons.watch,
|
||
tooltip: 'VIP Waiting Page',
|
||
onPressed: () => Get.to(() => VipWaittingPage()),
|
||
),
|
||
// _buildMapActionButton(
|
||
// icon: Octicons.ellipsis,
|
||
// tooltip: 'test',
|
||
// onPressed: () => Get.to(() => TestPage()),
|
||
// ),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
// --- دالة مساعدة جديدة لإنشاء الأزرار بشكل أنيق ---
|
||
Widget _buildMapActionButton({
|
||
required IconData icon,
|
||
required String tooltip,
|
||
required VoidCallback onPressed,
|
||
}) {
|
||
return IconButton(
|
||
onPressed: onPressed,
|
||
icon: Icon(icon, color: AppColor.writeColor, size: 22),
|
||
tooltip: tooltip,
|
||
splashRadius: 22,
|
||
padding: const EdgeInsets.all(12),
|
||
constraints: const BoxConstraints(), // لإزالة المساحات الافتراضية
|
||
);
|
||
}
|
||
|
||
// --- ويدجت للفاصل الرأسي بين الأزرار ---
|
||
Widget _buildVerticalDivider() {
|
||
return Container(
|
||
height: 20,
|
||
width: 1,
|
||
color: AppColor.writeColor.withOpacity(0.2),
|
||
);
|
||
}
|
||
|
||
// --- باقي الكود الخاص بك يبقى كما هو بدون تغيير ---
|
||
|
||
class TestPage extends StatelessWidget {
|
||
const TestPage({super.key});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final random = Random();
|
||
|
||
return Scaffold(
|
||
appBar: AppBar(
|
||
title: const Text('iOS Live Activity Test'),
|
||
),
|
||
body: Padding(
|
||
padding: const EdgeInsets.all(16.0),
|
||
child: Column(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: [
|
||
// زر البدء
|
||
ElevatedButton(
|
||
onPressed: () async {
|
||
print("🍎 محاولة تشغيل Live Activity (Start)...");
|
||
try {
|
||
await IosLiveActivityService.startRideActivity(
|
||
rideId: "123",
|
||
driverName: "تجربة مبدئية",
|
||
carDetails: "تويوتا • أسود",
|
||
etaText: "5 دقائق",
|
||
progress: 0.2,
|
||
);
|
||
Log.print(
|
||
"✅ تم تشغيل Live Activity بنجاح! أغلق الشاشة لترى النتيجة.");
|
||
} catch (e) {
|
||
Log.print("❌ خطأ في Start Live Activity: $e");
|
||
}
|
||
},
|
||
child: const Text('Start Activity'),
|
||
),
|
||
|
||
const SizedBox(height: 16),
|
||
|
||
// زر التحديث العشوائي
|
||
ElevatedButton(
|
||
onPressed: () async {
|
||
Log.print("🔄 محاولة تحديث Live Activity (Update)...");
|
||
|
||
// توليد بيانات عشوائية للاختبار
|
||
final statuses = ['waiting', 'ongoing'];
|
||
final status = statuses[random.nextInt(statuses.length)];
|
||
|
||
final int minutes = random.nextInt(15) + 1; // 1–15
|
||
final String eta = "$minutes دقائق";
|
||
|
||
final double progress = (random.nextDouble() * 0.9) + 0.05;
|
||
// بين 0.05 و 0.95 تقريبًا
|
||
|
||
try {
|
||
await IosLiveActivityService.updateRideActivity(
|
||
status: status,
|
||
driverName:
|
||
status == 'waiting' ? 'السائق في الطريق' : 'السائق معك',
|
||
carDetails: "تويوتا • أسود",
|
||
etaText: eta,
|
||
progress: progress,
|
||
);
|
||
Log.print(
|
||
"✅ تم تحديث Live Activity: status=$status, eta=$eta, progress=$progress");
|
||
} catch (e) {
|
||
Log.print("❌ خطأ في Update Live Activity: $e");
|
||
}
|
||
},
|
||
child: const Text('Update (Random)'),
|
||
),
|
||
|
||
const SizedBox(height: 16),
|
||
|
||
// زر الإنهاء
|
||
ElevatedButton(
|
||
style: ElevatedButton.styleFrom(
|
||
backgroundColor: Colors.red,
|
||
),
|
||
onPressed: () async {
|
||
Log.print("🛑 محاولة إنهاء Live Activity (End)...");
|
||
try {
|
||
await IosLiveActivityService.endRideActivity();
|
||
Log.print("✅ تم إنهاء Live Activity.");
|
||
} catch (e) {
|
||
Log.print("❌ خطأ في End Live Activity: $e");
|
||
}
|
||
},
|
||
child: const Text('End Activity'),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
}
|
||
}
|