Track online szinkronizáció refraktorálása

This commit is contained in:
2026-07-08 23:29:22 +02:00
parent 1ab656585b
commit d23f736ead
7 changed files with 131 additions and 154 deletions
@@ -102,6 +102,16 @@ class TrackingController extends GetxController {
super.onInit();
_initForegroundTask();
loadSavedTracks();
// A TrackingController permanent, egyszer indul az app életciklusában —
// enélkül projektváltáskor a lista a réginél ragadna.
ever(ProjectService.to.activeProject, (_) {
loadSavedTracks();
// Ne maradjon a térképen egy MÁSIK projekt track-overlaya.
overlayTrackIds.clear();
_trackCoords.clear();
});
}
void _initForegroundTask() {
@@ -130,11 +140,18 @@ class TrackingController extends GetxController {
/// Elindítja a rögzítést a megadott forrással (alapértelmezett: telefon GPS).
Future<void> startRecording(
{LocationSource? source,
String? name,
TrackSyncMode syncMode = TrackSyncMode.online}) async {
{LocationSource? source, String? name, TrackSyncMode? syncMode}) async {
if (isRecording.value) return;
// Alapértelmezés: a track kövesse az AKTÍV PROJEKT online/lokális
// állapotát — eddig ez mindig 'online' volt, függetlenül a projekt
// beállításától. Explicit paraméterrel felülírható.
final activeProject = ProjectService.to.activeProject.value;
final effectiveSyncMode = syncMode ??
(activeProject?.isLocalOnly ?? true
? TrackSyncMode.localOnly
: TrackSyncMode.online);
_source = source ?? PhoneGpsSource(intervalMs: 1000, distanceFilter: 2.0);
// Track létrehozása az adatbázisban
@@ -144,8 +161,8 @@ class TrackingController extends GetxController {
name: trackName,
startTime: now,
source: _source!.displayName,
projectId: ProjectService.to.activeProjectId,
syncMode: syncMode));
projectId: activeProject?.id,
syncMode: effectiveSyncMode));
currentTrack.value = await _db.getTrack(trackId);
// Állapot reset
@@ -162,20 +179,11 @@ class TrackingController extends GetxController {
callback: startTrackingCallback,
);
if (!(currentTrack.value?.isLocalOnly ?? true)) {
TrackSyncService.to
.createRemoteTrack(currentTrack.value!)
.then((supabaseId) async {
if (supabaseId == null) return;
final updated = currentTrack.value!.copyWith(supabaseId: supabaseId);
await _db.updateTrack(updated);
currentTrack.value = updated;
TrackSyncService.to.startSession(updated);
});
} else {
TrackSyncService.to.startSession(currentTrack.value!);
}
// A TrackSyncService.startSession() maga dönti el (a track
// isLocalOnly-ja alapján), hogy indítja-e a szinkron-időzítőket —
// nincs többé külön "előbb hozzuk létre szerveroldalon" lépés, mert
// az egységes (uuid-alapú) push maga hozza létre a sort a szerveren.
TrackSyncService.to.startSession(currentTrack.value!);
// GPS stream feliratkozás
_positionSub = _source!.positionStream.listen(
_onPosition,
@@ -260,7 +268,8 @@ class TrackingController extends GetxController {
}
Future<void> loadSavedTracks() async {
savedTracks.value = await _db.listTracks();
savedTracks.value =
await _db.listTracks(projectId: ProjectService.to.activeProjectId);
}
Future<void> deleteTrack(int id) async {