نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق». نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا `cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules · .dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore. هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ. ⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
108 lines
2.9 KiB
Dart
108 lines
2.9 KiB
Dart
import 'dart:async';
|
|
import 'dart:convert';
|
|
|
|
import 'package:siro_rider/constant/links.dart';
|
|
import 'package:siro_rider/controller/functions/crud.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:intaleq_maps/intaleq_maps.dart';
|
|
|
|
class TripMonitorController extends GetxController {
|
|
bool isLoading = false;
|
|
Map tripData = {};
|
|
late String rideId;
|
|
late String driverId;
|
|
IntaleqMapController? mapController;
|
|
List myListString = [];
|
|
late Timer timer;
|
|
late LatLng parentLocation;
|
|
String carIcon = 'car';
|
|
String motoIcon = 'moto';
|
|
String ladyIcon = 'lady';
|
|
double rotation = 0;
|
|
double speed = 0;
|
|
bool isStyleLoaded = false;
|
|
|
|
Set<Marker> markers = {};
|
|
|
|
getLocationParent() async {
|
|
var res = await CRUD().get(
|
|
link: AppLink.getLocationParents, payload: {"driver_id": driverId});
|
|
if (res != 'failure') {
|
|
tripData = res;
|
|
parentLocation = LatLng(
|
|
double.parse(tripData['message'][0]['latitude'].toString()),
|
|
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();
|
|
}
|
|
}
|
|
|
|
void onMapCreated(IntaleqMapController controller) async {
|
|
mapController = controller;
|
|
update();
|
|
}
|
|
|
|
void onStyleLoaded() async {
|
|
isStyleLoaded = true;
|
|
mapController?.animateCamera(
|
|
CameraUpdate.newLatLng(parentLocation),
|
|
);
|
|
_updateMarker();
|
|
|
|
// Set up a timer or interval to trigger the marker update every 10 seconds.
|
|
timer = Timer.periodic(const Duration(seconds: 10), (_) async {
|
|
await getLocationParent();
|
|
mapController?.animateCamera(CameraUpdate.newLatLng(parentLocation));
|
|
update();
|
|
});
|
|
}
|
|
|
|
void _updateMarker() {
|
|
String iconPath = 'assets/images/car.png';
|
|
if (tripData['message'] != null && tripData['message'].isNotEmpty) {
|
|
final model = tripData['message'][0]['model'].toString();
|
|
final gender = tripData['message'][0]['gender'].toString();
|
|
if (model.contains('دراجة')) {
|
|
iconPath = 'assets/images/moto1.png';
|
|
} else if (gender == 'Female') {
|
|
iconPath = 'assets/images/lady1.png';
|
|
}
|
|
}
|
|
|
|
markers = {
|
|
Marker(
|
|
markerId: const MarkerId('driver'),
|
|
position: parentLocation,
|
|
icon: InlqBitmap.fromAsset(iconPath),
|
|
rotation: rotation,
|
|
anchor: const Offset(0.5, 0.5),
|
|
),
|
|
};
|
|
update();
|
|
}
|
|
|
|
Future<void> init({String? rideId, String? driverId}) async {
|
|
this.driverId = driverId!;
|
|
this.rideId = rideId!;
|
|
await getLocationParent();
|
|
update();
|
|
}
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
timer.cancel();
|
|
mapController = null;
|
|
super.onClose();
|
|
}
|
|
}
|