Online tracking, deviceidentityservice
This commit is contained in:
@@ -40,12 +40,14 @@ import 'package:terepi_seged/pages/ntrip_settings/presentation/views/ntrip_setti
|
||||
import 'package:terepi_seged/pages/tracking/presentation/controllers/tracking_controller.dart';
|
||||
import 'package:terepi_seged/services/app_database.dart';
|
||||
import 'package:terepi_seged/services/coord_converter_service.dart';
|
||||
import 'package:terepi_seged/services/device_identity_service.dart';
|
||||
import 'package:terepi_seged/services/gnss/gnss_connection.dart';
|
||||
import 'package:terepi_seged/services/gnss/gnss_device_service.dart';
|
||||
import 'package:terepi_seged/services/gnss/gnss_service.dart';
|
||||
import 'package:terepi_seged/services/ntrip_service.dart';
|
||||
import 'package:terepi_seged/services/project_service.dart';
|
||||
import 'package:terepi_seged/widgets/map/imported_layer_overlay.dart';
|
||||
import 'package:terepi_seged/widgets/map/team_member_widget.dart';
|
||||
import 'package:terepi_seged/widgets/map_edit_tools/color_row.dart';
|
||||
import 'package:terepi_seged/widgets/map_edit_tools/map_feature_save_sheet.dart';
|
||||
import 'package:terepi_seged/widgets/map_edit_tools/note_item_list_sheet.dart';
|
||||
@@ -190,6 +192,10 @@ class MapSurveyController extends GetxController {
|
||||
final polylineNotes = <Polyline<int>>[].obs;
|
||||
final polygonNotes = <Polygon<int>>[].obs;
|
||||
|
||||
final teamTrackMarkers = <String, Marker>{}.obs;
|
||||
final teamTrackPoints = <String, List<LatLng>>{}.obs;
|
||||
RealtimeChannel? _teamChannel;
|
||||
|
||||
late final PolygonEditorController polygonEditorController;
|
||||
|
||||
final activeEditColor = const Color(0xFF185FA5).obs;
|
||||
@@ -284,6 +290,8 @@ class MapSurveyController extends GetxController {
|
||||
|
||||
await _loadNoteItems();
|
||||
await _loadMeasurePoints();
|
||||
|
||||
_subscribeToTeamPosition();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -292,6 +300,7 @@ class MapSurveyController extends GetxController {
|
||||
_gnssUpdateSub?.cancel();
|
||||
final f = _supaChannel?.unsubscribe();
|
||||
if (f != null) unawaited(f);
|
||||
unawaited(_teamChannel?.unsubscribe());
|
||||
|
||||
pointIdController.dispose();
|
||||
pointDescriptionController.dispose();
|
||||
@@ -1915,4 +1924,65 @@ class MapSurveyController extends GetxController {
|
||||
Get.back(); // ← dialóg bezárása, akár sikerült akár nem
|
||||
}
|
||||
}
|
||||
|
||||
void _subscribeToTeamPosition() {
|
||||
_teamChannel = Supabase.instance.client
|
||||
.channel('public:terepi_seged_device_positions')
|
||||
.onPostgresChanges(
|
||||
event: PostgresChangeEvent.all,
|
||||
schema: 'public',
|
||||
table: 'terepi_seged_device_positions',
|
||||
callback: (payload) => _onTeamUpdate(payload.newRecord))
|
||||
.subscribe();
|
||||
}
|
||||
|
||||
void _onTeamUpdate(Map<String, dynamic> data) {
|
||||
final deviceId = data['device_id'] as String? ?? '';
|
||||
if (deviceId.isEmpty) return;
|
||||
|
||||
if (deviceId == DeviceIdentityService.to.deviceId) return;
|
||||
final isActive = data['is_active'] as bool? ?? true;
|
||||
|
||||
if (!isActive) {
|
||||
teamTrackMarkers.remove(deviceId);
|
||||
teamTrackPoints.remove(deviceId);
|
||||
teamTrackMarkers.refresh();
|
||||
teamTrackPoints.refresh();
|
||||
return;
|
||||
}
|
||||
|
||||
final lat = (data['latitude'] as num?)?.toDouble();
|
||||
final lon = (data['longitude'] as num?)?.toDouble();
|
||||
final name = data['user_name'] as String? ?? deviceId.substring(0, 8);
|
||||
|
||||
if (lat == null || lon == null) return;
|
||||
|
||||
final point = LatLng(lat, lon);
|
||||
teamTrackMarkers[deviceId] = _buildTeamMarker(point, name, deviceId);
|
||||
|
||||
teamTrackPoints.putIfAbsent(deviceId, () => []);
|
||||
teamTrackPoints[deviceId]!.add(point);
|
||||
|
||||
teamTrackMarkers.refresh();
|
||||
teamTrackPoints.refresh();
|
||||
}
|
||||
|
||||
Marker _buildTeamMarker(LatLng point, String name, String deviceId) {
|
||||
final colors = [
|
||||
Colors.blue,
|
||||
Colors.purple,
|
||||
Colors.teal,
|
||||
Colors.indigo,
|
||||
Colors.cyan,
|
||||
Colors.deepPurple
|
||||
];
|
||||
final color = colors[deviceId.hashCode.abs() % colors.length];
|
||||
|
||||
return Marker(
|
||||
point: point,
|
||||
width: 100,
|
||||
height: 48,
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: TeamMemberWidget(name: name, color: color));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user