Online tracking, deviceidentityservice

This commit is contained in:
2026-06-23 15:21:20 +02:00
parent 65b355edd9
commit aa78c7bb6f
13 changed files with 850 additions and 33 deletions
@@ -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));
}
}