diff --git a/.ideai/tickets/25/carnet.md b/.ideai/tickets/25/carnet.md index 7b85911..2e9a909 100644 --- a/.ideai/tickets/25/carnet.md +++ b/.ideai/tickets/25/carnet.md @@ -1,6 +1,6 @@ --- issueRef: "#25" -version: 1 +version: 2 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784328239814 +updatedAt: 1784329799370 --- diff --git a/.ideai/tickets/25/issue.md b/.ideai/tickets/25/issue.md index 67d5233..02b89c8 100644 --- a/.ideai/tickets/25/issue.md +++ b/.ideai/tickets/25/issue.md @@ -2,7 +2,7 @@ id: "da78f1df-ff9b-4745-b108-b312eec9efe7" number: 25 title: "[DevBackend] Domain et migration pour le score chronométré" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#18","kind":"relatesTo"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784328239814 -updatedAt: 1784328239814 -version: 1 +updatedAt: 1784329799370 +version: 2 --- Fondation du ticket #18 (score chronométré). Ajouter ScoreInputMode (manual|stopwatch) sur Exercise avec propagation snapshot pattern (ProgramExercise, snapshot de séance, ActiveSetResult, WorkoutHistorySetResult). Ajouter actualScoreTimeMs/targetScoreTimeMs/targetScoreTimeMsOverride distincts de actualScore/targetScore/targetScoreOverride. Nouvelle table Drift ActiveScoreStopwatchState (status running|stopped, startedAt, accumulatedMs, stoppedAt, clé programIndex/exerciseIndex/setIndex). Migration Drift schemaVersion 2 -> 3. Use cases : démarrer/arrêter/reprendre/réinitialiser le chrono d'une série, copie de la durée finale vers ActiveSetResult à la validation. Cf. mémoires "gametime-ux-score-chrono" et "gametime-architecture-score-chrono" pour le détail complet. \ No newline at end of file diff --git a/.ideai/tickets/31/carnet.md b/.ideai/tickets/31/carnet.md index ad6dc0c..4061e03 100644 --- a/.ideai/tickets/31/carnet.md +++ b/.ideai/tickets/31/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#31" -version: 6 -updatedBy: {"kind":"user"} -updatedAt: 1784329025027 +version: 7 +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +updatedAt: 1784329139605 --- Décision UX : la flèche de retour doit ouvrir le même état Pause que le bouton "Pause" actuel (pas de "Quitter et sauvegarder" direct, pas de désactivation). diff --git a/.ideai/tickets/31/issue.md b/.ideai/tickets/31/issue.md index 7a3b301..b1a832a 100644 --- a/.ideai/tickets/31/issue.md +++ b/.ideai/tickets/31/issue.md @@ -2,15 +2,15 @@ id: "2f55c804-65e7-465a-9296-f66dd6db684a" number: 31 title: "[Bug] Fleche retour non fonctionnelle dans une seance en cours" -status: "inProgress" +status: "closed" priority: "high" sprint: "abc4f969-b169-45f7-988c-daeeab762201" links: [] agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}] createdBy: {"kind":"user"} -updatedBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784328786412 -updatedAt: 1784329025027 -version: 6 +updatedAt: 1784329139605 +version: 7 --- Je suis dans une séance, et le bouton de retour en haut à gauche ne fonctionne pas, je dois faire pause et abandonner ou quitter et sauvegarder pour sortir. Demander à UX l'action que doit produire cette fleche de retour \ No newline at end of file diff --git a/.ideai/tickets/33/carnet.md b/.ideai/tickets/33/carnet.md index aafa58e..261b02f 100644 --- a/.ideai/tickets/33/carnet.md +++ b/.ideai/tickets/33/carnet.md @@ -1,6 +1,6 @@ --- issueRef: "#33" -version: 1 +version: 4 updatedBy: {"kind":"user"} -updatedAt: 1784329082771 +updatedAt: 1784329182115 --- diff --git a/.ideai/tickets/33/issue.md b/.ideai/tickets/33/issue.md index 0f86f42..961649b 100644 --- a/.ideai/tickets/33/issue.md +++ b/.ideai/tickets/33/issue.md @@ -3,13 +3,14 @@ id: "a588ff04-9e55-4492-ac76-5298ba94e5c7" number: 33 title: "[Bug] Impossible de lancer une seance" status: "open" -priority: "critical" -sprint: null +priority: "medium" +sprint: "abc4f969-b169-45f7-988c-daeeab762201" links: [] agentRefs: [] createdBy: {"kind":"user"} updatedBy: {"kind":"user"} createdAt: 1784329082771 -updatedAt: 1784329082771 -version: 1 +updatedAt: 1784329182115 +version: 4 --- +Si une seance est déjà en cours je ne peux poas en lancer une autre. Je trouve ça bien, j'aimerais juste qu'une petite popup me le dise car on a actuellement aucun retour pour ça \ No newline at end of file diff --git a/.ideai/tickets/34/carnet.md b/.ideai/tickets/34/carnet.md new file mode 100644 index 0000000..7c186e9 --- /dev/null +++ b/.ideai/tickets/34/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#34" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1784329283319 +--- diff --git a/.ideai/tickets/34/issue.md b/.ideai/tickets/34/issue.md new file mode 100644 index 0000000..532fad4 --- /dev/null +++ b/.ideai/tickets/34/issue.md @@ -0,0 +1,16 @@ +--- +id: "a78c5f84-3d2e-40ae-b800-880de78f2035" +number: 34 +title: "Rendr ele compteur de série plus visible" +status: "open" +priority: "high" +sprint: null +links: [] +agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784329212434 +updatedAt: 1784329283319 +version: 3 +--- +Il faudrait que le compteur de série soit plus visible. Actuellement il est perdu avec le compteur de programme et le compteur d'exercice. J'aimerais qu'il soit plus visible, pour ça il faudrait le déplacer plus proche de notre série en cours et pourquoi pas le mettre plus gros/d'une autre couleur ? Laisser UX gérer ça \ No newline at end of file diff --git a/.ideai/tickets/35/carnet.md b/.ideai/tickets/35/carnet.md new file mode 100644 index 0000000..e8c1405 --- /dev/null +++ b/.ideai/tickets/35/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#35" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1784329588125 +--- diff --git a/.ideai/tickets/35/issue.md b/.ideai/tickets/35/issue.md new file mode 100644 index 0000000..728b380 --- /dev/null +++ b/.ideai/tickets/35/issue.md @@ -0,0 +1,16 @@ +--- +id: "3f1a583a-320b-43c3-9993-52d249c9c430" +number: 35 +title: "Proposer de emttre plsuieurs images pour un exercice" +status: "open" +priority: "low" +sprint: null +links: [] +agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784329532159 +updatedAt: 1784329588125 +version: 3 +--- +J'iamerais que lors de la création d'un exercice, ils oit possible d'associer jusqu'a 5 images \ No newline at end of file diff --git a/.ideai/tickets/36/carnet.md b/.ideai/tickets/36/carnet.md new file mode 100644 index 0000000..790b1b8 --- /dev/null +++ b/.ideai/tickets/36/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#36" +version: 6 +updatedBy: {"kind":"user"} +updatedAt: 1784329810425 +--- diff --git a/.ideai/tickets/36/issue.md b/.ideai/tickets/36/issue.md new file mode 100644 index 0000000..e19d665 --- /dev/null +++ b/.ideai/tickets/36/issue.md @@ -0,0 +1,16 @@ +--- +id: "1d0445c0-c8f7-4527-b948-42d894a9e265" +number: 36 +title: "Afficher les images et les vidéos" +status: "open" +priority: "medium" +sprint: null +links: [{"target":"#35","kind":"dependsOn"}] +agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784329666884 +updatedAt: 1784329810425 +version: 6 +--- +Pour chaque exercice on a la possibilité d'upload des images et une vidéo. J'iamerais que ces images et cette vidéo, s'il y en a, soit affichés pendant l'exercie, ou au moins qu'on ai la possibilité de les voir. Ces images et cette vidéo peuvent être dans le but de présenter et d'expliquer l'exercice, ils sont donc importants. Laisser UX décider de la façon de les afficher pour que ça ne surchage pas non plus l'interface et que ça reste dans la DA \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index f1a21b0..9e65e4a 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 34 + "nextNumber": 37 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index 27e1aa8..4a25020 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -279,13 +279,13 @@ "issueRef": "#25", "path": "25", "title": "[DevBackend] Domain et migration pour le score chronométré", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "10ee045b-1c41-479e-ba03-dceed9edd495" ], - "updatedAt": 1784328239814 + "updatedAt": 1784329799370 }, { "issueRef": "#26", @@ -347,13 +347,13 @@ "issueRef": "#31", "path": "31", "title": "[Bug] Fleche retour non fonctionnelle dans une seance en cours", - "status": "inProgress", + "status": "closed", "priority": "high", "sprint": "abc4f969-b169-45f7-988c-daeeab762201", "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784329025027 + "updatedAt": 1784329139605 }, { "issueRef": "#32", @@ -372,10 +372,46 @@ "path": "33", "title": "[Bug] Impossible de lancer une seance", "status": "open", - "priority": "critical", - "sprint": null, + "priority": "medium", + "sprint": "abc4f969-b169-45f7-988c-daeeab762201", "assignedAgentIds": [], - "updatedAt": 1784329082771 + "updatedAt": 1784329182115 + }, + { + "issueRef": "#34", + "path": "34", + "title": "Rendr ele compteur de série plus visible", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "57695b92-24d0-4876-837c-76116e70a6ae" + ], + "updatedAt": 1784329283319 + }, + { + "issueRef": "#35", + "path": "35", + "title": "Proposer de emttre plsuieurs images pour un exercice", + "status": "open", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "57695b92-24d0-4876-837c-76116e70a6ae" + ], + "updatedAt": 1784329588125 + }, + { + "issueRef": "#36", + "path": "36", + "title": "Afficher les images et les vidéos", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "57695b92-24d0-4876-837c-76116e70a6ae" + ], + "updatedAt": 1784329810425 } ] } \ No newline at end of file diff --git a/lib/application/ports.dart b/lib/application/ports.dart index 5c46e1e..dd9be66 100644 --- a/lib/application/ports.dart +++ b/lib/application/ports.dart @@ -80,9 +80,26 @@ abstract interface class ActiveSessionRepository { Future save(ActiveWorkoutSession session); Future saveSetResult(ActiveSetResult result); Future saveRestState(ActiveRestState restState); + Future saveScoreStopwatchState(ActiveScoreStopwatchState state); + Future deleteScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required DateTime deletedAt, + }); Future findRestStateById(String id); + Future findScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }); Future> listSetResults(String sessionId); Future> listRestStates(String sessionId); + Future> listScoreStopwatchStates( + String sessionId, + ); } abstract interface class WorkoutHistoryRepository { diff --git a/lib/application/use_cases.dart b/lib/application/use_cases.dart index 8393b2e..5456401 100644 --- a/lib/application/use_cases.dart +++ b/lib/application/use_cases.dart @@ -24,6 +24,7 @@ final class ExerciseUseCases { required bool hasTimeMeasure, required bool hasRepsMeasure, required bool hasScoreMeasure, + ScoreInputMode scoreInputMode = ScoreInputMode.manual, String? scoreLabel, String? scoreUnit, }) async { @@ -37,6 +38,7 @@ final class ExerciseUseCases { hasTimeMeasure: hasTimeMeasure, hasRepsMeasure: hasRepsMeasure, hasScoreMeasure: hasScoreMeasure, + scoreInputMode: scoreInputMode, scoreLabel: scoreLabel, scoreUnit: scoreUnit, ); @@ -61,6 +63,7 @@ final class ExerciseUseCases { required bool hasTimeMeasure, required bool hasRepsMeasure, required bool hasScoreMeasure, + ScoreInputMode scoreInputMode = ScoreInputMode.manual, String? scoreLabel, String? scoreUnit, }) async { @@ -77,6 +80,7 @@ final class ExerciseUseCases { hasTimeMeasure: hasTimeMeasure, hasRepsMeasure: hasRepsMeasure, hasScoreMeasure: hasScoreMeasure, + scoreInputMode: scoreInputMode, scoreLabel: scoreLabel, scoreUnit: scoreUnit, ); @@ -285,6 +289,7 @@ final class ProgramUseCases { availableTimeSnapshot: input.availableTimeSnapshot, availableRepsSnapshot: input.availableRepsSnapshot, availableScoreSnapshot: input.availableScoreSnapshot, + scoreInputModeSnapshot: input.scoreInputModeSnapshot, scoreLabelSnapshot: input.scoreLabelSnapshot, scoreUnitSnapshot: input.scoreUnitSnapshot, setsCount: input.setsCount, @@ -294,6 +299,7 @@ final class ProgramUseCases { targetTimeSeconds: input.targetTimeSeconds, targetReps: input.targetReps, targetScore: input.targetScore, + targetScoreTimeMs: input.targetScoreTimeMs, restSecondsOverride: input.restSecondsOverride, ), ); @@ -317,6 +323,7 @@ final class ProgramUseCases { int? targetTimeSeconds, int? targetReps, double? targetScore, + int? targetScoreTimeMs, int? restSecondsOverride, }) async { final source = await exerciseRepository.findById(exerciseId); @@ -334,6 +341,7 @@ final class ProgramUseCases { targetTimeSeconds: targetTimeSeconds, targetReps: targetReps, targetScore: targetScore, + targetScoreTimeMs: targetScoreTimeMs, restSecondsOverride: restSecondsOverride, ); await programRepository.saveExercise(programExercise); @@ -353,6 +361,7 @@ final class ProgramExerciseConfig { required this.availableTimeSnapshot, required this.availableRepsSnapshot, required this.availableScoreSnapshot, + this.scoreInputModeSnapshot = ScoreInputMode.manual, this.scoreLabelSnapshot, this.scoreUnitSnapshot, required this.setsCount, @@ -360,6 +369,7 @@ final class ProgramExerciseConfig { this.targetTimeSeconds, this.targetReps, this.targetScore, + this.targetScoreTimeMs, this.restSecondsOverride, }); @@ -373,6 +383,7 @@ final class ProgramExerciseConfig { final bool availableTimeSnapshot; final bool availableRepsSnapshot; final bool availableScoreSnapshot; + final ScoreInputMode scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final int setsCount; @@ -380,6 +391,7 @@ final class ProgramExerciseConfig { final int? targetTimeSeconds; final int? targetReps; final double? targetScore; + final int? targetScoreTimeMs; final int? restSecondsOverride; } @@ -480,6 +492,7 @@ final class WorkoutTemplateUseCases { targetTimeSecondsOverride: input.targetTimeSecondsOverride, targetRepsOverride: input.targetRepsOverride, targetScoreOverride: input.targetScoreOverride, + targetScoreTimeMsOverride: input.targetScoreTimeMsOverride, ), ); } @@ -521,6 +534,7 @@ final class WorkoutTemplateUseCases { int? targetTimeSecondsOverride, int? targetRepsOverride, double? targetScoreOverride, + int? targetScoreTimeMsOverride, Set? attemptedMeasureOverride, }) async { if (attemptedMeasureOverride != null) { @@ -537,6 +551,7 @@ final class WorkoutTemplateUseCases { targetTimeSecondsOverride: targetTimeSecondsOverride, targetRepsOverride: targetRepsOverride, targetScoreOverride: targetScoreOverride, + targetScoreTimeMsOverride: targetScoreTimeMsOverride, ); await templateRepository.saveOverride(override); return override; @@ -570,6 +585,7 @@ final class WorkoutTemplateExerciseOverrideConfig { this.targetTimeSecondsOverride, this.targetRepsOverride, this.targetScoreOverride, + this.targetScoreTimeMsOverride, }); final EntityMetadata? existingMetadata; @@ -579,6 +595,7 @@ final class WorkoutTemplateExerciseOverrideConfig { final int? targetTimeSecondsOverride; final int? targetRepsOverride; final double? targetScoreOverride; + final int? targetScoreTimeMsOverride; } final class ActiveWorkoutSessionUseCases { @@ -635,6 +652,7 @@ final class ActiveWorkoutSessionUseCases { 'targetTimeSecondsOverride': override.targetTimeSecondsOverride, 'targetRepsOverride': override.targetRepsOverride, 'targetScoreOverride': override.targetScoreOverride, + 'targetScoreTimeMsOverride': override.targetScoreTimeMsOverride, }, ) .toList(), @@ -668,7 +686,21 @@ final class ActiveWorkoutSessionUseCases { Future pause(String sessionId) async { final session = await _requiredSession(sessionId); - final paused = session.pause(clock.now()); + final now = clock.now(); + final runningStopwatches = + (await sessionRepository.listScoreStopwatchStates( + sessionId, + )).where((state) => state.status == ActiveScoreStopwatchStatus.running); + for (final state in runningStopwatches) { + final stopped = state.copyWith( + metadata: state.metadata.touch(now), + status: ActiveScoreStopwatchStatus.stopped, + accumulatedMs: state.elapsedMillisecondsAt(now), + stoppedAt: now, + ); + await sessionRepository.saveScoreStopwatchState(stopped); + } + final paused = session.pause(now); await sessionRepository.save(paused); return paused; } @@ -699,10 +731,21 @@ final class ActiveWorkoutSessionUseCases { int? actualTimeMs, int? actualReps, double? actualScore, + int? actualScoreTimeMs, + ScoreInputMode scoreInputModeSnapshot = ScoreInputMode.manual, String? scoreLabelSnapshot, String? scoreUnitSnapshot, }) async { final now = clock.now(); + final resolvedActualScoreTimeMs = await _resolveStopwatchScoreTimeMs( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + scoreInputMode: scoreInputModeSnapshot, + explicitActualScoreTimeMs: actualScoreTimeMs, + now: now, + ); final result = ActiveSetResult( metadata: _newMetadata(ids, originDeviceId, now), activeWorkoutSessionId: sessionId, @@ -715,6 +758,8 @@ final class ActiveWorkoutSessionUseCases { actualTimeMs: actualTimeMs, actualReps: actualReps, actualScore: actualScore, + actualScoreTimeMs: resolvedActualScoreTimeMs, + scoreInputModeSnapshot: scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, status: SetResultStatus.completed, @@ -732,6 +777,8 @@ final class ActiveWorkoutSessionUseCases { int? actualTimeMs, int? actualReps, double? actualScore, + int? actualScoreTimeMs, + ScoreInputMode? scoreInputModeSnapshot, String? scoreLabelSnapshot, String? scoreUnitSnapshot, String? note, @@ -766,6 +813,8 @@ final class ActiveWorkoutSessionUseCases { } final now = clock.now(); final isSkipped = status == SetResultStatus.skipped; + final resolvedScoreInputMode = + scoreInputModeSnapshot ?? snapshot.scoreInputModeSnapshot; final upserted = ActiveSetResult( metadata: existing == null ? _newMetadata(ids, originDeviceId, now) @@ -781,6 +830,8 @@ final class ActiveWorkoutSessionUseCases { actualTimeMs: isSkipped ? null : actualTimeMs, actualReps: isSkipped ? null : actualReps, actualScore: isSkipped ? null : actualScore, + actualScoreTimeMs: isSkipped ? null : actualScoreTimeMs, + scoreInputModeSnapshot: resolvedScoreInputMode, scoreLabelSnapshot: isSkipped ? null : scoreLabelSnapshot ?? snapshot.scoreLabelSnapshot, @@ -794,6 +845,102 @@ final class ActiveWorkoutSessionUseCases { return upserted; } + Future startScoreStopwatch({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + await _requiredSession(sessionId); + final now = clock.now(); + final existing = await sessionRepository.findScoreStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + if (existing != null) { + if (existing.status == ActiveScoreStopwatchStatus.running) { + return existing; + } + final resumed = existing.copyWith( + metadata: existing.metadata.touch(now), + status: ActiveScoreStopwatchStatus.running, + startedAt: now, + stoppedAt: null, + ); + await sessionRepository.saveScoreStopwatchState(resumed); + return resumed; + } + final state = ActiveScoreStopwatchState( + metadata: _newMetadata(ids, originDeviceId, now), + activeWorkoutSessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + status: ActiveScoreStopwatchStatus.running, + startedAt: now, + accumulatedMs: 0, + ); + await sessionRepository.saveScoreStopwatchState(state); + return state; + } + + Future stopScoreStopwatch({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + final state = await _requiredStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + if (state.status == ActiveScoreStopwatchStatus.stopped) { + return state; + } + final now = clock.now(); + final stopped = state.copyWith( + metadata: state.metadata.touch(now), + status: ActiveScoreStopwatchStatus.stopped, + accumulatedMs: state.elapsedMillisecondsAt(now), + stoppedAt: now, + ); + await sessionRepository.saveScoreStopwatchState(stopped); + return stopped; + } + + Future resumeScoreStopwatch({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) { + return startScoreStopwatch( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + } + + Future resetScoreStopwatch({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + await sessionRepository.deleteScoreStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + deletedAt: clock.now(), + ); + } + Future> listSetResults(String sessionId) async { final session = await _requiredSession(sessionId); final snapshots = _listSetSnapshots(session.resolvedTemplateSnapshotJson); @@ -960,6 +1107,58 @@ final class ActiveWorkoutSessionUseCases { } return session; } + + Future _requiredStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + final state = await sessionRepository.findScoreStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + if (state == null) { + throw const DomainException('Active score stopwatch state not found.'); + } + return state; + } + + Future _resolveStopwatchScoreTimeMs({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required ScoreInputMode scoreInputMode, + required int? explicitActualScoreTimeMs, + required DateTime now, + }) async { + if (scoreInputMode != ScoreInputMode.stopwatch) { + return explicitActualScoreTimeMs; + } + final state = await sessionRepository.findScoreStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + if (state == null) { + return explicitActualScoreTimeMs; + } + if (state.status == ActiveScoreStopwatchStatus.stopped) { + return explicitActualScoreTimeMs ?? state.accumulatedMs; + } + final stopped = state.copyWith( + metadata: state.metadata.touch(now), + status: ActiveScoreStopwatchStatus.stopped, + accumulatedMs: state.elapsedMillisecondsAt(now), + stoppedAt: now, + ); + await sessionRepository.saveScoreStopwatchState(stopped); + return explicitActualScoreTimeMs ?? stopped.accumulatedMs; + } } final class CloseWorkoutSessionUseCase { @@ -1025,6 +1224,8 @@ final class CloseWorkoutSessionUseCase { 'actualTimeMs': result.actualTimeMs, 'actualReps': result.actualReps, 'actualScore': result.actualScore, + 'actualScoreTimeMs': result.actualScoreTimeMs, + 'scoreInputModeSnapshot': result.scoreInputModeSnapshot.name, 'scoreLabelSnapshot': result.scoreLabelSnapshot, 'scoreUnitSnapshot': result.scoreUnitSnapshot, 'status': result.status.name, @@ -1096,6 +1297,22 @@ void _validateOverrideTargets( if (input.targetScoreOverride != null && exercise['scoreEnabled'] != true) { throw const DomainException('Cannot override inactive score target.'); } + if (input.targetScoreTimeMsOverride != null && + exercise['scoreEnabled'] != true) { + throw const DomainException('Cannot override inactive score target.'); + } + final mode = _scoreInputModeFromSnapshot(exercise['scoreInputModeSnapshot']); + if (input.targetScoreOverride != null && mode != ScoreInputMode.manual) { + throw const DomainException( + 'Cannot override manual score target on stopwatch score mode.', + ); + } + if (input.targetScoreTimeMsOverride != null && + mode != ScoreInputMode.stopwatch) { + throw const DomainException( + 'Cannot override stopwatch score target on manual score mode.', + ); + } } void _ensureEditablePastPosition({ @@ -1142,6 +1359,13 @@ String _positionKey(int programIndex, int exerciseIndex, int setIndex) { return '$programIndex:$exerciseIndex:$setIndex'; } +ScoreInputMode _scoreInputModeFromSnapshot(Object? value) { + return switch (value) { + 'stopwatch' => ScoreInputMode.stopwatch, + _ => ScoreInputMode.manual, + }; +} + _SetPositionSnapshot? _findSetSnapshot({ required String resolvedTemplateSnapshotJson, required int programIndex, @@ -1196,6 +1420,9 @@ List<_SetPositionSnapshot> _listSetSnapshots( setIndex: setIndex, scoreLabelSnapshot: exercise['scoreLabelSnapshot'] as String?, scoreUnitSnapshot: exercise['scoreUnitSnapshot'] as String?, + scoreInputModeSnapshot: _scoreInputModeFromSnapshot( + exercise['scoreInputModeSnapshot'], + ), ), ); } @@ -1213,6 +1440,7 @@ final class _SetPositionSnapshot { required this.setIndex, this.scoreLabelSnapshot, this.scoreUnitSnapshot, + required this.scoreInputModeSnapshot, }); final String programSnapshotId; @@ -1222,6 +1450,7 @@ final class _SetPositionSnapshot { final int setIndex; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; + final ScoreInputMode scoreInputModeSnapshot; } List _historyResultsFromActiveResults({ @@ -1250,13 +1479,18 @@ List _historyResultsFromActiveResults({ timeEnabledSnapshot: snapshot?.timeEnabled ?? result.actualTimeMs != null, repsEnabledSnapshot: snapshot?.repsEnabled ?? result.actualReps != null, scoreEnabledSnapshot: - snapshot?.scoreEnabled ?? result.actualScore != null, + snapshot?.scoreEnabled ?? + (result.actualScore != null || result.actualScoreTimeMs != null), targetTimeSecondsSnapshot: snapshot?.targetTimeSeconds, targetRepsSnapshot: snapshot?.targetReps, targetScoreSnapshot: snapshot?.targetScore, + targetScoreTimeMsSnapshot: snapshot?.targetScoreTimeMs, actualTimeMs: result.actualTimeMs, actualReps: result.actualReps, actualScore: result.actualScore, + actualScoreTimeMs: result.actualScoreTimeMs, + scoreInputModeSnapshot: + snapshot?.scoreInputModeSnapshot ?? result.scoreInputModeSnapshot, scoreLabelSnapshot: result.scoreLabelSnapshot ?? snapshot?.scoreLabelSnapshot, scoreUnitSnapshot: @@ -1299,6 +1533,10 @@ Map _exerciseSnapshotsById( targetTimeSeconds: exercise['targetTimeSeconds'] as int?, targetReps: exercise['targetReps'] as int?, targetScore: (exercise['targetScore'] as num?)?.toDouble(), + targetScoreTimeMs: exercise['targetScoreTimeMs'] as int?, + scoreInputModeSnapshot: _scoreInputModeFromSnapshot( + exercise['scoreInputModeSnapshot'], + ), scoreLabelSnapshot: exercise['scoreLabelSnapshot'] as String?, scoreUnitSnapshot: exercise['scoreUnitSnapshot'] as String?, ); @@ -1317,6 +1555,8 @@ final class _ResolvedExerciseSnapshot { this.targetTimeSeconds, this.targetReps, this.targetScore, + this.targetScoreTimeMs, + required this.scoreInputModeSnapshot, this.scoreLabelSnapshot, this.scoreUnitSnapshot, }); @@ -1329,6 +1569,8 @@ final class _ResolvedExerciseSnapshot { final int? targetTimeSeconds; final int? targetReps; final double? targetScore; + final int? targetScoreTimeMs; + final ScoreInputMode scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; } diff --git a/lib/domain/entities.dart b/lib/domain/entities.dart index fce8387..fadfe16 100644 --- a/lib/domain/entities.dart +++ b/lib/domain/entities.dart @@ -6,10 +6,14 @@ enum MediaKind { image, video } enum WorkoutMeasure { time, reps, score } +enum ScoreInputMode { manual, stopwatch } + enum ActiveWorkoutStatus { running, paused, savedExit, completed, abandoned } enum SetResultStatus { completed, skipped } +enum ActiveScoreStopwatchStatus { running, stopped } + final class DomainException implements Exception { const DomainException(this.message); @@ -125,6 +129,7 @@ final class Exercise { required this.hasTimeMeasure, required this.hasRepsMeasure, required this.hasScoreMeasure, + this.scoreInputMode = ScoreInputMode.manual, this.scoreLabel, this.scoreUnit, this.archivedAt, @@ -134,7 +139,12 @@ final class Exercise { hasReps: hasRepsMeasure, hasScore: hasScoreMeasure, ); - if (hasScoreMeasure) { + if (!hasScoreMeasure && scoreInputMode == ScoreInputMode.stopwatch) { + throw const DomainException( + 'Stopwatch score mode requires an active score measure.', + ); + } + if (hasScoreMeasure && scoreInputMode == ScoreInputMode.manual) { _nonBlank(scoreLabel, 'Score label'); _nonBlank(scoreUnit, 'Score unit'); } @@ -148,6 +158,7 @@ final class Exercise { final bool hasTimeMeasure; final bool hasRepsMeasure; final bool hasScoreMeasure; + final ScoreInputMode scoreInputMode; final String? scoreLabel; final String? scoreUnit; final DateTime? archivedAt; @@ -171,6 +182,7 @@ final class Exercise { bool? hasTimeMeasure, bool? hasRepsMeasure, bool? hasScoreMeasure, + ScoreInputMode? scoreInputMode, Object? scoreLabel = _unchanged, Object? scoreUnit = _unchanged, Object? archivedAt = _unchanged, @@ -190,6 +202,7 @@ final class Exercise { hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreInputMode: scoreInputMode ?? this.scoreInputMode, scoreLabel: scoreLabel == _unchanged ? this.scoreLabel : scoreLabel as String?, @@ -249,6 +262,7 @@ final class ProgramExercise { required this.availableTimeSnapshot, required this.availableRepsSnapshot, required this.availableScoreSnapshot, + this.scoreInputModeSnapshot = ScoreInputMode.manual, this.scoreLabelSnapshot, this.scoreUnitSnapshot, required this.setsCount, @@ -258,6 +272,7 @@ final class ProgramExercise { this.targetTimeSeconds, this.targetReps, this.targetScore, + this.targetScoreTimeMs, this.restSecondsOverride, }) : exerciseNameSnapshot = _nonBlank( exerciseNameSnapshot, @@ -282,7 +297,14 @@ final class ProgramExercise { _requireNullablePositive(targetTimeSeconds, 'Target time seconds'); _requireNullablePositive(targetReps, 'Target reps'); _requireNullableNonNegativeDouble(targetScore, 'Target score'); + _requireNullablePositive(targetScoreTimeMs, 'Target score time ms'); _requireNullableNonNegative(restSecondsOverride, 'Rest seconds override'); + _requireScoreTargetShape( + scoreEnabled: scoreEnabled, + scoreInputMode: scoreInputModeSnapshot, + targetScore: targetScore, + targetScoreTimeMs: targetScoreTimeMs, + ); } final EntityMetadata metadata; @@ -297,6 +319,7 @@ final class ProgramExercise { final bool availableTimeSnapshot; final bool availableRepsSnapshot; final bool availableScoreSnapshot; + final ScoreInputMode scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final int setsCount; @@ -306,6 +329,7 @@ final class ProgramExercise { final int? targetTimeSeconds; final int? targetReps; final double? targetScore; + final int? targetScoreTimeMs; final int? restSecondsOverride; static ProgramExercise snapshotFromExercise({ @@ -318,6 +342,7 @@ final class ProgramExercise { int? targetTimeSeconds, int? targetReps, double? targetScore, + int? targetScoreTimeMs, int? restSecondsOverride, }) { final available = exercise.availableMeasures; @@ -339,6 +364,7 @@ final class ProgramExercise { availableTimeSnapshot: exercise.hasTimeMeasure, availableRepsSnapshot: exercise.hasRepsMeasure, availableScoreSnapshot: exercise.hasScoreMeasure, + scoreInputModeSnapshot: exercise.scoreInputMode, scoreLabelSnapshot: exercise.scoreLabel, scoreUnitSnapshot: exercise.scoreUnit, setsCount: setsCount, @@ -348,6 +374,7 @@ final class ProgramExercise { targetTimeSeconds: targetTimeSeconds, targetReps: targetReps, targetScore: targetScore, + targetScoreTimeMs: targetScoreTimeMs, restSecondsOverride: restSecondsOverride, ); } @@ -364,6 +391,7 @@ final class ProgramExercise { 'availableTimeSnapshot': availableTimeSnapshot, 'availableRepsSnapshot': availableRepsSnapshot, 'availableScoreSnapshot': availableScoreSnapshot, + 'scoreInputModeSnapshot': scoreInputModeSnapshot.name, 'scoreLabelSnapshot': scoreLabelSnapshot, 'scoreUnitSnapshot': scoreUnitSnapshot, 'setsCount': setsCount, @@ -373,6 +401,7 @@ final class ProgramExercise { 'targetTimeSeconds': targetTimeSeconds, 'targetReps': targetReps, 'targetScore': targetScore, + 'targetScoreTimeMs': targetScoreTimeMs, 'restSecondsOverride': restSecondsOverride, }; } @@ -452,6 +481,7 @@ final class WorkoutTemplateExerciseOverride { this.targetTimeSecondsOverride, this.targetRepsOverride, this.targetScoreOverride, + this.targetScoreTimeMsOverride, }) : snapshotProgramExerciseId = _nonBlank( snapshotProgramExerciseId, 'Snapshot program exercise id', @@ -466,6 +496,15 @@ final class WorkoutTemplateExerciseOverride { targetScoreOverride, 'Target score override', ); + _requireNullablePositive( + targetScoreTimeMsOverride, + 'Target score time ms override', + ); + if (targetScoreOverride != null && targetScoreTimeMsOverride != null) { + throw const DomainException( + 'Manual and stopwatch score overrides cannot both be set.', + ); + } } final EntityMetadata metadata; @@ -475,6 +514,7 @@ final class WorkoutTemplateExerciseOverride { final int? targetTimeSecondsOverride; final int? targetRepsOverride; final double? targetScoreOverride; + final int? targetScoreTimeMsOverride; } final class ActiveWorkoutSession { @@ -587,15 +627,25 @@ final class ActiveSetResult { this.actualTimeMs, this.actualReps, this.actualScore, + this.actualScoreTimeMs, + this.scoreInputModeSnapshot = ScoreInputMode.manual, this.scoreLabelSnapshot, this.scoreUnitSnapshot, this.note, this.status = SetResultStatus.completed, }) { if (status == SetResultStatus.skipped && - (actualTimeMs != null || actualReps != null || actualScore != null)) { + (actualTimeMs != null || + actualReps != null || + actualScore != null || + actualScoreTimeMs != null)) { throw const DomainException('Skipped set results cannot have values.'); } + _requireScoreResultShape( + scoreInputMode: scoreInputModeSnapshot, + actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, + ); } final EntityMetadata metadata; @@ -610,12 +660,72 @@ final class ActiveSetResult { final int? actualTimeMs; final int? actualReps; final double? actualScore; + final int? actualScoreTimeMs; + final ScoreInputMode scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final String? note; final SetResultStatus status; } +final class ActiveScoreStopwatchState { + ActiveScoreStopwatchState({ + required this.metadata, + required this.activeWorkoutSessionId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + required this.status, + required this.startedAt, + required this.accumulatedMs, + this.stoppedAt, + }) { + _requireNonNegative(programIndex, 'Program index'); + _requireNonNegative(exerciseIndex, 'Exercise index'); + _requireNonNegative(setIndex, 'Set index'); + _requireNonNegative(accumulatedMs, 'Accumulated milliseconds'); + } + + final EntityMetadata metadata; + final String activeWorkoutSessionId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final ActiveScoreStopwatchStatus status; + final DateTime startedAt; + final int accumulatedMs; + final DateTime? stoppedAt; + + int elapsedMillisecondsAt(DateTime now) { + if (status == ActiveScoreStopwatchStatus.stopped) { + return accumulatedMs; + } + return accumulatedMs + now.difference(startedAt).inMilliseconds; + } + + ActiveScoreStopwatchState copyWith({ + EntityMetadata? metadata, + ActiveScoreStopwatchStatus? status, + DateTime? startedAt, + int? accumulatedMs, + Object? stoppedAt = _unchanged, + }) { + return ActiveScoreStopwatchState( + metadata: metadata ?? this.metadata, + activeWorkoutSessionId: activeWorkoutSessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + status: status ?? this.status, + startedAt: startedAt ?? this.startedAt, + accumulatedMs: accumulatedMs ?? this.accumulatedMs, + stoppedAt: stoppedAt == _unchanged + ? this.stoppedAt + : stoppedAt as DateTime?, + ); + } +} + final class ActiveRestState { const ActiveRestState({ required this.metadata, @@ -707,9 +817,12 @@ final class WorkoutHistorySetResult { this.targetTimeSecondsSnapshot, this.targetRepsSnapshot, this.targetScoreSnapshot, + this.targetScoreTimeMsSnapshot, this.actualTimeMs, this.actualReps, this.actualScore, + this.actualScoreTimeMs, + this.scoreInputModeSnapshot = ScoreInputMode.manual, this.scoreLabelSnapshot, this.scoreUnitSnapshot, this.startedAt, @@ -717,11 +830,25 @@ final class WorkoutHistorySetResult { this.status = SetResultStatus.completed, }) { if (status == SetResultStatus.skipped && - (actualTimeMs != null || actualReps != null || actualScore != null)) { + (actualTimeMs != null || + actualReps != null || + actualScore != null || + actualScoreTimeMs != null)) { throw const DomainException( 'Skipped history results cannot have values.', ); } + _requireScoreTargetShape( + scoreEnabled: scoreEnabledSnapshot, + scoreInputMode: scoreInputModeSnapshot, + targetScore: targetScoreSnapshot, + targetScoreTimeMs: targetScoreTimeMsSnapshot, + ); + _requireScoreResultShape( + scoreInputMode: scoreInputModeSnapshot, + actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, + ); } final EntityMetadata metadata; @@ -739,9 +866,12 @@ final class WorkoutHistorySetResult { final int? targetTimeSecondsSnapshot; final int? targetRepsSnapshot; final double? targetScoreSnapshot; + final int? targetScoreTimeMsSnapshot; final int? actualTimeMs; final int? actualReps; final double? actualScore; + final int? actualScoreTimeMs; + final ScoreInputMode scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final DateTime? startedAt; @@ -796,3 +926,50 @@ void _requireNullableNonNegativeDouble(double? value, String label) { throw DomainException('$label must not be negative.'); } } + +void _requireScoreTargetShape({ + required bool scoreEnabled, + required ScoreInputMode scoreInputMode, + required double? targetScore, + required int? targetScoreTimeMs, +}) { + if (targetScore != null && targetScoreTimeMs != null) { + throw const DomainException( + 'Manual and stopwatch score targets cannot both be set.', + ); + } + if (targetScore != null && + (!scoreEnabled || scoreInputMode != ScoreInputMode.manual)) { + throw const DomainException( + 'Manual score target requires manual score mode.', + ); + } + if (targetScoreTimeMs != null && + (!scoreEnabled || scoreInputMode != ScoreInputMode.stopwatch)) { + throw const DomainException( + 'Stopwatch score target requires stopwatch score mode.', + ); + } +} + +void _requireScoreResultShape({ + required ScoreInputMode scoreInputMode, + required double? actualScore, + required int? actualScoreTimeMs, +}) { + if (actualScore != null && actualScoreTimeMs != null) { + throw const DomainException( + 'Manual and stopwatch score results cannot both be set.', + ); + } + if (actualScore != null && scoreInputMode != ScoreInputMode.manual) { + throw const DomainException( + 'Manual score result requires manual score mode.', + ); + } + if (actualScoreTimeMs != null && scoreInputMode != ScoreInputMode.stopwatch) { + throw const DomainException( + 'Stopwatch score result requires stopwatch score mode.', + ); + } +} diff --git a/lib/infrastructure/local/app_database.dart b/lib/infrastructure/local/app_database.dart index 8330e5d..43cfd1c 100644 --- a/lib/infrastructure/local/app_database.dart +++ b/lib/infrastructure/local/app_database.dart @@ -8,6 +8,7 @@ part 'app_database.g.dart'; @DriftDatabase( tables: [ ActiveRestStates, + ActiveScoreStopwatchStates, ActiveSetResults, ActiveWorkoutSessions, ChangeLogEntries, @@ -35,7 +36,7 @@ final class AppDatabase extends _$AppDatabase { } @override - int get schemaVersion => 2; + int get schemaVersion => 3; @override MigrationStrategy get migration { @@ -56,6 +57,10 @@ final class AppDatabase extends _$AppDatabase { "'skipped'))", ); } + if (from < 3) { + await _migrateToSchema3(migrator); + } + await _createIndexes(); }, beforeOpen: (details) async { await customStatement('PRAGMA foreign_keys = ON'); @@ -95,6 +100,10 @@ final class AppDatabase extends _$AppDatabase { 'CREATE INDEX IF NOT EXISTS idx_active_set_results_session_id ' 'ON active_set_results (active_workout_session_id)', ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_active_score_stopwatch_states_session_id ' + 'ON active_score_stopwatch_states (active_workout_session_id)', + ); await customStatement( 'CREATE INDEX IF NOT EXISTS idx_active_rest_states_session_id ' 'ON active_rest_states (active_workout_session_id)', @@ -131,6 +140,7 @@ final class AppDatabase extends _$AppDatabase { const _syncableTableNames = [ 'active_rest_states', + 'active_score_stopwatch_states', 'active_set_results', 'active_workout_sessions', 'exercises', @@ -143,3 +153,53 @@ const _syncableTableNames = [ 'workout_template_programs', 'workout_templates', ]; + +extension on AppDatabase { + Future _migrateToSchema3(Migrator migrator) async { + await customStatement( + 'ALTER TABLE exercises ADD COLUMN score_input_mode TEXT NOT NULL ' + "DEFAULT 'manual' CHECK (score_input_mode IN ('manual', 'stopwatch'))", + ); + await customStatement( + 'ALTER TABLE program_exercises ADD COLUMN score_input_mode_snapshot TEXT ' + "NOT NULL DEFAULT 'manual' CHECK (score_input_mode_snapshot IN " + "('manual', 'stopwatch'))", + ); + await customStatement( + 'ALTER TABLE program_exercises ADD COLUMN target_score_time_ms INTEGER ' + 'CHECK (target_score_time_ms IS NULL OR target_score_time_ms > 0)', + ); + await customStatement( + 'ALTER TABLE workout_template_exercise_overrides ADD COLUMN ' + 'target_score_time_ms_override INTEGER CHECK ' + '(target_score_time_ms_override IS NULL OR ' + 'target_score_time_ms_override > 0)', + ); + await customStatement( + 'ALTER TABLE active_set_results ADD COLUMN actual_score_time_ms INTEGER ' + 'CHECK (actual_score_time_ms IS NULL OR actual_score_time_ms >= 0)', + ); + await customStatement( + 'ALTER TABLE active_set_results ADD COLUMN score_input_mode_snapshot ' + "TEXT NOT NULL DEFAULT 'manual' CHECK (score_input_mode_snapshot IN " + "('manual', 'stopwatch'))", + ); + await customStatement( + 'ALTER TABLE workout_history_set_results ADD COLUMN ' + 'score_input_mode_snapshot TEXT NOT NULL DEFAULT ' + "'manual' CHECK (score_input_mode_snapshot IN ('manual', 'stopwatch'))", + ); + await customStatement( + 'ALTER TABLE workout_history_set_results ADD COLUMN ' + 'target_score_time_ms_snapshot INTEGER CHECK ' + '(target_score_time_ms_snapshot IS NULL OR ' + 'target_score_time_ms_snapshot > 0)', + ); + await customStatement( + 'ALTER TABLE workout_history_set_results ADD COLUMN ' + 'actual_score_time_ms INTEGER CHECK (actual_score_time_ms IS NULL OR ' + 'actual_score_time_ms >= 0)', + ); + await migrator.createTable(activeScoreStopwatchStates); + } +} diff --git a/lib/infrastructure/local/app_database.g.dart b/lib/infrastructure/local/app_database.g.dart index 3a1c0d5..6b01c63 100644 --- a/lib/infrastructure/local/app_database.g.dart +++ b/lib/infrastructure/local/app_database.g.dart @@ -3289,6 +3289,1130 @@ class ActiveRestStatesCompanion extends UpdateCompanion { } } +class $ActiveScoreStopwatchStatesTable extends ActiveScoreStopwatchStates + with + TableInfo<$ActiveScoreStopwatchStatesTable, ActiveScoreStopwatchState> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ActiveScoreStopwatchStatesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _activeWorkoutSessionIdMeta = + const VerificationMeta('activeWorkoutSessionId'); + @override + late final GeneratedColumn activeWorkoutSessionId = + GeneratedColumn( + 'active_workout_session_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES active_workout_sessions (id)', + ), + ); + static const VerificationMeta _programIndexMeta = const VerificationMeta( + 'programIndex', + ); + @override + late final GeneratedColumn programIndex = GeneratedColumn( + 'program_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseIndexMeta = const VerificationMeta( + 'exerciseIndex', + ); + @override + late final GeneratedColumn exerciseIndex = GeneratedColumn( + 'exercise_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _setIndexMeta = const VerificationMeta( + 'setIndex', + ); + @override + late final GeneratedColumn setIndex = GeneratedColumn( + 'set_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _statusMeta = const VerificationMeta('status'); + @override + late final GeneratedColumn status = GeneratedColumn( + 'status', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _accumulatedMsMeta = const VerificationMeta( + 'accumulatedMs', + ); + @override + late final GeneratedColumn accumulatedMs = GeneratedColumn( + 'accumulated_ms', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _stoppedAtMeta = const VerificationMeta( + 'stoppedAt', + ); + @override + late final GeneratedColumn stoppedAt = GeneratedColumn( + 'stopped_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + programIndex, + exerciseIndex, + setIndex, + status, + startedAt, + accumulatedMs, + stoppedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'active_score_stopwatch_states'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('active_workout_session_id')) { + context.handle( + _activeWorkoutSessionIdMeta, + activeWorkoutSessionId.isAcceptableOrUnknown( + data['active_workout_session_id']!, + _activeWorkoutSessionIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_activeWorkoutSessionIdMeta); + } + if (data.containsKey('program_index')) { + context.handle( + _programIndexMeta, + programIndex.isAcceptableOrUnknown( + data['program_index']!, + _programIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_programIndexMeta); + } + if (data.containsKey('exercise_index')) { + context.handle( + _exerciseIndexMeta, + exerciseIndex.isAcceptableOrUnknown( + data['exercise_index']!, + _exerciseIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseIndexMeta); + } + if (data.containsKey('set_index')) { + context.handle( + _setIndexMeta, + setIndex.isAcceptableOrUnknown(data['set_index']!, _setIndexMeta), + ); + } else if (isInserting) { + context.missing(_setIndexMeta); + } + if (data.containsKey('status')) { + context.handle( + _statusMeta, + status.isAcceptableOrUnknown(data['status']!, _statusMeta), + ); + } else if (isInserting) { + context.missing(_statusMeta); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } else if (isInserting) { + context.missing(_startedAtMeta); + } + if (data.containsKey('accumulated_ms')) { + context.handle( + _accumulatedMsMeta, + accumulatedMs.isAcceptableOrUnknown( + data['accumulated_ms']!, + _accumulatedMsMeta, + ), + ); + } else if (isInserting) { + context.missing(_accumulatedMsMeta); + } + if (data.containsKey('stopped_at')) { + context.handle( + _stoppedAtMeta, + stoppedAt.isAcceptableOrUnknown(data['stopped_at']!, _stoppedAtMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ActiveScoreStopwatchState map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActiveScoreStopwatchState( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + activeWorkoutSessionId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}active_workout_session_id'], + )!, + programIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}program_index'], + )!, + exerciseIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}exercise_index'], + )!, + setIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}set_index'], + )!, + status: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}status'], + )!, + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + )!, + accumulatedMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}accumulated_ms'], + )!, + stoppedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}stopped_at'], + ), + ); + } + + @override + $ActiveScoreStopwatchStatesTable createAlias(String alias) { + return $ActiveScoreStopwatchStatesTable(attachedDatabase, alias); + } +} + +class ActiveScoreStopwatchState extends DataClass + implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String activeWorkoutSessionId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final String status; + final DateTime startedAt; + final int accumulatedMs; + final DateTime? stoppedAt; + const ActiveScoreStopwatchState({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.activeWorkoutSessionId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + required this.status, + required this.startedAt, + required this.accumulatedMs, + this.stoppedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['active_workout_session_id'] = Variable(activeWorkoutSessionId); + map['program_index'] = Variable(programIndex); + map['exercise_index'] = Variable(exerciseIndex); + map['set_index'] = Variable(setIndex); + map['status'] = Variable(status); + map['started_at'] = Variable(startedAt); + map['accumulated_ms'] = Variable(accumulatedMs); + if (!nullToAbsent || stoppedAt != null) { + map['stopped_at'] = Variable(stoppedAt); + } + return map; + } + + ActiveScoreStopwatchStatesCompanion toCompanion(bool nullToAbsent) { + return ActiveScoreStopwatchStatesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + activeWorkoutSessionId: Value(activeWorkoutSessionId), + programIndex: Value(programIndex), + exerciseIndex: Value(exerciseIndex), + setIndex: Value(setIndex), + status: Value(status), + startedAt: Value(startedAt), + accumulatedMs: Value(accumulatedMs), + stoppedAt: stoppedAt == null && nullToAbsent + ? const Value.absent() + : Value(stoppedAt), + ); + } + + factory ActiveScoreStopwatchState.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActiveScoreStopwatchState( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + activeWorkoutSessionId: serializer.fromJson( + json['activeWorkoutSessionId'], + ), + programIndex: serializer.fromJson(json['programIndex']), + exerciseIndex: serializer.fromJson(json['exerciseIndex']), + setIndex: serializer.fromJson(json['setIndex']), + status: serializer.fromJson(json['status']), + startedAt: serializer.fromJson(json['startedAt']), + accumulatedMs: serializer.fromJson(json['accumulatedMs']), + stoppedAt: serializer.fromJson(json['stoppedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'activeWorkoutSessionId': serializer.toJson( + activeWorkoutSessionId, + ), + 'programIndex': serializer.toJson(programIndex), + 'exerciseIndex': serializer.toJson(exerciseIndex), + 'setIndex': serializer.toJson(setIndex), + 'status': serializer.toJson(status), + 'startedAt': serializer.toJson(startedAt), + 'accumulatedMs': serializer.toJson(accumulatedMs), + 'stoppedAt': serializer.toJson(stoppedAt), + }; + } + + ActiveScoreStopwatchState copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? activeWorkoutSessionId, + int? programIndex, + int? exerciseIndex, + int? setIndex, + String? status, + DateTime? startedAt, + int? accumulatedMs, + Value stoppedAt = const Value.absent(), + }) => ActiveScoreStopwatchState( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + status: status ?? this.status, + startedAt: startedAt ?? this.startedAt, + accumulatedMs: accumulatedMs ?? this.accumulatedMs, + stoppedAt: stoppedAt.present ? stoppedAt.value : this.stoppedAt, + ); + ActiveScoreStopwatchState copyWithCompanion( + ActiveScoreStopwatchStatesCompanion data, + ) { + return ActiveScoreStopwatchState( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: data.activeWorkoutSessionId.present + ? data.activeWorkoutSessionId.value + : this.activeWorkoutSessionId, + programIndex: data.programIndex.present + ? data.programIndex.value + : this.programIndex, + exerciseIndex: data.exerciseIndex.present + ? data.exerciseIndex.value + : this.exerciseIndex, + setIndex: data.setIndex.present ? data.setIndex.value : this.setIndex, + status: data.status.present ? data.status.value : this.status, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + accumulatedMs: data.accumulatedMs.present + ? data.accumulatedMs.value + : this.accumulatedMs, + stoppedAt: data.stoppedAt.present ? data.stoppedAt.value : this.stoppedAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActiveScoreStopwatchState(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('status: $status, ') + ..write('startedAt: $startedAt, ') + ..write('accumulatedMs: $accumulatedMs, ') + ..write('stoppedAt: $stoppedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + programIndex, + exerciseIndex, + setIndex, + status, + startedAt, + accumulatedMs, + stoppedAt, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActiveScoreStopwatchState && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.activeWorkoutSessionId == this.activeWorkoutSessionId && + other.programIndex == this.programIndex && + other.exerciseIndex == this.exerciseIndex && + other.setIndex == this.setIndex && + other.status == this.status && + other.startedAt == this.startedAt && + other.accumulatedMs == this.accumulatedMs && + other.stoppedAt == this.stoppedAt); +} + +class ActiveScoreStopwatchStatesCompanion + extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value activeWorkoutSessionId; + final Value programIndex; + final Value exerciseIndex; + final Value setIndex; + final Value status; + final Value startedAt; + final Value accumulatedMs; + final Value stoppedAt; + final Value rowid; + const ActiveScoreStopwatchStatesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.activeWorkoutSessionId = const Value.absent(), + this.programIndex = const Value.absent(), + this.exerciseIndex = const Value.absent(), + this.setIndex = const Value.absent(), + this.status = const Value.absent(), + this.startedAt = const Value.absent(), + this.accumulatedMs = const Value.absent(), + this.stoppedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + ActiveScoreStopwatchStatesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String status, + required DateTime startedAt, + required int accumulatedMs, + this.stoppedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + activeWorkoutSessionId = Value(activeWorkoutSessionId), + programIndex = Value(programIndex), + exerciseIndex = Value(exerciseIndex), + setIndex = Value(setIndex), + status = Value(status), + startedAt = Value(startedAt), + accumulatedMs = Value(accumulatedMs); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? activeWorkoutSessionId, + Expression? programIndex, + Expression? exerciseIndex, + Expression? setIndex, + Expression? status, + Expression? startedAt, + Expression? accumulatedMs, + Expression? stoppedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (activeWorkoutSessionId != null) + 'active_workout_session_id': activeWorkoutSessionId, + if (programIndex != null) 'program_index': programIndex, + if (exerciseIndex != null) 'exercise_index': exerciseIndex, + if (setIndex != null) 'set_index': setIndex, + if (status != null) 'status': status, + if (startedAt != null) 'started_at': startedAt, + if (accumulatedMs != null) 'accumulated_ms': accumulatedMs, + if (stoppedAt != null) 'stopped_at': stoppedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + ActiveScoreStopwatchStatesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? activeWorkoutSessionId, + Value? programIndex, + Value? exerciseIndex, + Value? setIndex, + Value? status, + Value? startedAt, + Value? accumulatedMs, + Value? stoppedAt, + Value? rowid, + }) { + return ActiveScoreStopwatchStatesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + status: status ?? this.status, + startedAt: startedAt ?? this.startedAt, + accumulatedMs: accumulatedMs ?? this.accumulatedMs, + stoppedAt: stoppedAt ?? this.stoppedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (activeWorkoutSessionId.present) { + map['active_workout_session_id'] = Variable( + activeWorkoutSessionId.value, + ); + } + if (programIndex.present) { + map['program_index'] = Variable(programIndex.value); + } + if (exerciseIndex.present) { + map['exercise_index'] = Variable(exerciseIndex.value); + } + if (setIndex.present) { + map['set_index'] = Variable(setIndex.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (accumulatedMs.present) { + map['accumulated_ms'] = Variable(accumulatedMs.value); + } + if (stoppedAt.present) { + map['stopped_at'] = Variable(stoppedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActiveScoreStopwatchStatesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('status: $status, ') + ..write('startedAt: $startedAt, ') + ..write('accumulatedMs: $accumulatedMs, ') + ..write('stoppedAt: $stoppedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + class $ActiveSetResultsTable extends ActiveSetResults with TableInfo<$ActiveSetResultsTable, ActiveSetResult> { @override @@ -3546,6 +4670,29 @@ class $ActiveSetResultsTable extends ActiveSetResults type: DriftSqlType.double, requiredDuringInsert: false, ); + static const VerificationMeta _actualScoreTimeMsMeta = const VerificationMeta( + 'actualScoreTimeMs', + ); + @override + late final GeneratedColumn actualScoreTimeMs = GeneratedColumn( + 'actual_score_time_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreInputModeSnapshotMeta = + const VerificationMeta('scoreInputModeSnapshot'); + @override + late final GeneratedColumn scoreInputModeSnapshot = + GeneratedColumn( + 'score_input_mode_snapshot', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('manual'), + ); static const VerificationMeta _scoreLabelSnapshotMeta = const VerificationMeta('scoreLabelSnapshot'); @override @@ -3612,6 +4759,8 @@ class $ActiveSetResultsTable extends ActiveSetResults actualTimeMs, actualReps, actualScore, + actualScoreTimeMs, + scoreInputModeSnapshot, scoreLabelSnapshot, scoreUnitSnapshot, note, @@ -3824,6 +4973,24 @@ class $ActiveSetResultsTable extends ActiveSetResults ), ); } + if (data.containsKey('actual_score_time_ms')) { + context.handle( + _actualScoreTimeMsMeta, + actualScoreTimeMs.isAcceptableOrUnknown( + data['actual_score_time_ms']!, + _actualScoreTimeMsMeta, + ), + ); + } + if (data.containsKey('score_input_mode_snapshot')) { + context.handle( + _scoreInputModeSnapshotMeta, + scoreInputModeSnapshot.isAcceptableOrUnknown( + data['score_input_mode_snapshot']!, + _scoreInputModeSnapshotMeta, + ), + ); + } if (data.containsKey('score_label_snapshot')) { context.handle( _scoreLabelSnapshotMeta, @@ -3951,6 +5118,14 @@ class $ActiveSetResultsTable extends ActiveSetResults DriftSqlType.double, data['${effectivePrefix}actual_score'], ), + actualScoreTimeMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_score_time_ms'], + ), + scoreInputModeSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_input_mode_snapshot'], + )!, scoreLabelSnapshot: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}score_label_snapshot'], @@ -3999,6 +5174,8 @@ class ActiveSetResult extends DataClass implements Insertable { final int? actualTimeMs; final int? actualReps; final double? actualScore; + final int? actualScoreTimeMs; + final String scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final String? note; @@ -4026,6 +5203,8 @@ class ActiveSetResult extends DataClass implements Insertable { this.actualTimeMs, this.actualReps, this.actualScore, + this.actualScoreTimeMs, + required this.scoreInputModeSnapshot, this.scoreLabelSnapshot, this.scoreUnitSnapshot, this.note, @@ -4074,6 +5253,10 @@ class ActiveSetResult extends DataClass implements Insertable { if (!nullToAbsent || actualScore != null) { map['actual_score'] = Variable(actualScore); } + if (!nullToAbsent || actualScoreTimeMs != null) { + map['actual_score_time_ms'] = Variable(actualScoreTimeMs); + } + map['score_input_mode_snapshot'] = Variable(scoreInputModeSnapshot); if (!nullToAbsent || scoreLabelSnapshot != null) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot); } @@ -4129,6 +5312,10 @@ class ActiveSetResult extends DataClass implements Insertable { actualScore: actualScore == null && nullToAbsent ? const Value.absent() : Value(actualScore), + actualScoreTimeMs: actualScoreTimeMs == null && nullToAbsent + ? const Value.absent() + : Value(actualScoreTimeMs), + scoreInputModeSnapshot: Value(scoreInputModeSnapshot), scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent ? const Value.absent() : Value(scoreLabelSnapshot), @@ -4174,6 +5361,10 @@ class ActiveSetResult extends DataClass implements Insertable { actualTimeMs: serializer.fromJson(json['actualTimeMs']), actualReps: serializer.fromJson(json['actualReps']), actualScore: serializer.fromJson(json['actualScore']), + actualScoreTimeMs: serializer.fromJson(json['actualScoreTimeMs']), + scoreInputModeSnapshot: serializer.fromJson( + json['scoreInputModeSnapshot'], + ), scoreLabelSnapshot: serializer.fromJson( json['scoreLabelSnapshot'], ), @@ -4212,6 +5403,10 @@ class ActiveSetResult extends DataClass implements Insertable { 'actualTimeMs': serializer.toJson(actualTimeMs), 'actualReps': serializer.toJson(actualReps), 'actualScore': serializer.toJson(actualScore), + 'actualScoreTimeMs': serializer.toJson(actualScoreTimeMs), + 'scoreInputModeSnapshot': serializer.toJson( + scoreInputModeSnapshot, + ), 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), 'note': serializer.toJson(note), @@ -4242,6 +5437,8 @@ class ActiveSetResult extends DataClass implements Insertable { Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), + String? scoreInputModeSnapshot, Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value note = const Value.absent(), @@ -4274,6 +5471,11 @@ class ActiveSetResult extends DataClass implements Insertable { actualTimeMs: actualTimeMs.present ? actualTimeMs.value : this.actualTimeMs, actualReps: actualReps.present ? actualReps.value : this.actualReps, actualScore: actualScore.present ? actualScore.value : this.actualScore, + actualScoreTimeMs: actualScoreTimeMs.present + ? actualScoreTimeMs.value + : this.actualScoreTimeMs, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot.present ? scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -4337,6 +5539,12 @@ class ActiveSetResult extends DataClass implements Insertable { actualScore: data.actualScore.present ? data.actualScore.value : this.actualScore, + actualScoreTimeMs: data.actualScoreTimeMs.present + ? data.actualScoreTimeMs.value + : this.actualScoreTimeMs, + scoreInputModeSnapshot: data.scoreInputModeSnapshot.present + ? data.scoreInputModeSnapshot.value + : this.scoreInputModeSnapshot, scoreLabelSnapshot: data.scoreLabelSnapshot.present ? data.scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -4373,6 +5581,8 @@ class ActiveSetResult extends DataClass implements Insertable { ..write('actualTimeMs: $actualTimeMs, ') ..write('actualReps: $actualReps, ') ..write('actualScore: $actualScore, ') + ..write('actualScoreTimeMs: $actualScoreTimeMs, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('note: $note, ') @@ -4405,6 +5615,8 @@ class ActiveSetResult extends DataClass implements Insertable { actualTimeMs, actualReps, actualScore, + actualScoreTimeMs, + scoreInputModeSnapshot, scoreLabelSnapshot, scoreUnitSnapshot, note, @@ -4436,6 +5648,8 @@ class ActiveSetResult extends DataClass implements Insertable { other.actualTimeMs == this.actualTimeMs && other.actualReps == this.actualReps && other.actualScore == this.actualScore && + other.actualScoreTimeMs == this.actualScoreTimeMs && + other.scoreInputModeSnapshot == this.scoreInputModeSnapshot && other.scoreLabelSnapshot == this.scoreLabelSnapshot && other.scoreUnitSnapshot == this.scoreUnitSnapshot && other.note == this.note && @@ -4465,6 +5679,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { final Value actualTimeMs; final Value actualReps; final Value actualScore; + final Value actualScoreTimeMs; + final Value scoreInputModeSnapshot; final Value scoreLabelSnapshot; final Value scoreUnitSnapshot; final Value note; @@ -4493,6 +5709,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { this.actualTimeMs = const Value.absent(), this.actualReps = const Value.absent(), this.actualScore = const Value.absent(), + this.actualScoreTimeMs = const Value.absent(), + this.scoreInputModeSnapshot = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), this.note = const Value.absent(), @@ -4522,6 +5740,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { this.actualTimeMs = const Value.absent(), this.actualReps = const Value.absent(), this.actualScore = const Value.absent(), + this.actualScoreTimeMs = const Value.absent(), + this.scoreInputModeSnapshot = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), this.note = const Value.absent(), @@ -4562,6 +5782,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { Expression? actualTimeMs, Expression? actualReps, Expression? actualScore, + Expression? actualScoreTimeMs, + Expression? scoreInputModeSnapshot, Expression? scoreLabelSnapshot, Expression? scoreUnitSnapshot, Expression? note, @@ -4594,6 +5816,9 @@ class ActiveSetResultsCompanion extends UpdateCompanion { if (actualTimeMs != null) 'actual_time_ms': actualTimeMs, if (actualReps != null) 'actual_reps': actualReps, if (actualScore != null) 'actual_score': actualScore, + if (actualScoreTimeMs != null) 'actual_score_time_ms': actualScoreTimeMs, + if (scoreInputModeSnapshot != null) + 'score_input_mode_snapshot': scoreInputModeSnapshot, if (scoreLabelSnapshot != null) 'score_label_snapshot': scoreLabelSnapshot, if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, @@ -4626,6 +5851,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { Value? actualTimeMs, Value? actualReps, Value? actualScore, + Value? actualScoreTimeMs, + Value? scoreInputModeSnapshot, Value? scoreLabelSnapshot, Value? scoreUnitSnapshot, Value? note, @@ -4656,6 +5883,9 @@ class ActiveSetResultsCompanion extends UpdateCompanion { actualTimeMs: actualTimeMs ?? this.actualTimeMs, actualReps: actualReps ?? this.actualReps, actualScore: actualScore ?? this.actualScore, + actualScoreTimeMs: actualScoreTimeMs ?? this.actualScoreTimeMs, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, note: note ?? this.note, @@ -4737,6 +5967,14 @@ class ActiveSetResultsCompanion extends UpdateCompanion { if (actualScore.present) { map['actual_score'] = Variable(actualScore.value); } + if (actualScoreTimeMs.present) { + map['actual_score_time_ms'] = Variable(actualScoreTimeMs.value); + } + if (scoreInputModeSnapshot.present) { + map['score_input_mode_snapshot'] = Variable( + scoreInputModeSnapshot.value, + ); + } if (scoreLabelSnapshot.present) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); } @@ -4780,6 +6018,8 @@ class ActiveSetResultsCompanion extends UpdateCompanion { ..write('actualTimeMs: $actualTimeMs, ') ..write('actualReps: $actualReps, ') ..write('actualScore: $actualScore, ') + ..write('actualScoreTimeMs: $actualScoreTimeMs, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('note: $note, ') @@ -6789,6 +8029,18 @@ class $ExercisesTable extends Exercises 'CHECK ("has_score_measure" IN (0, 1))', ), ); + static const VerificationMeta _scoreInputModeMeta = const VerificationMeta( + 'scoreInputMode', + ); + @override + late final GeneratedColumn scoreInputMode = GeneratedColumn( + 'score_input_mode', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('manual'), + ); static const VerificationMeta _scoreLabelMeta = const VerificationMeta( 'scoreLabel', ); @@ -6842,6 +8094,7 @@ class $ExercisesTable extends Exercises hasTimeMeasure, hasRepsMeasure, hasScoreMeasure, + scoreInputMode, scoreLabel, scoreUnit, archivedAt, @@ -7019,6 +8272,15 @@ class $ExercisesTable extends Exercises } else if (isInserting) { context.missing(_hasScoreMeasureMeta); } + if (data.containsKey('score_input_mode')) { + context.handle( + _scoreInputModeMeta, + scoreInputMode.isAcceptableOrUnknown( + data['score_input_mode']!, + _scoreInputModeMeta, + ), + ); + } if (data.containsKey('score_label')) { context.handle( _scoreLabelMeta, @@ -7118,6 +8380,10 @@ class $ExercisesTable extends Exercises DriftSqlType.bool, data['${effectivePrefix}has_score_measure'], )!, + scoreInputMode: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_input_mode'], + )!, scoreLabel: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}score_label'], @@ -7158,6 +8424,7 @@ class Exercise extends DataClass implements Insertable { final bool hasTimeMeasure; final bool hasRepsMeasure; final bool hasScoreMeasure; + final String scoreInputMode; final String? scoreLabel; final String? scoreUnit; final DateTime? archivedAt; @@ -7180,6 +8447,7 @@ class Exercise extends DataClass implements Insertable { required this.hasTimeMeasure, required this.hasRepsMeasure, required this.hasScoreMeasure, + required this.scoreInputMode, this.scoreLabel, this.scoreUnit, this.archivedAt, @@ -7219,6 +8487,7 @@ class Exercise extends DataClass implements Insertable { map['has_time_measure'] = Variable(hasTimeMeasure); map['has_reps_measure'] = Variable(hasRepsMeasure); map['has_score_measure'] = Variable(hasScoreMeasure); + map['score_input_mode'] = Variable(scoreInputMode); if (!nullToAbsent || scoreLabel != null) { map['score_label'] = Variable(scoreLabel); } @@ -7265,6 +8534,7 @@ class Exercise extends DataClass implements Insertable { hasTimeMeasure: Value(hasTimeMeasure), hasRepsMeasure: Value(hasRepsMeasure), hasScoreMeasure: Value(hasScoreMeasure), + scoreInputMode: Value(scoreInputMode), scoreLabel: scoreLabel == null && nullToAbsent ? const Value.absent() : Value(scoreLabel), @@ -7303,6 +8573,7 @@ class Exercise extends DataClass implements Insertable { hasTimeMeasure: serializer.fromJson(json['hasTimeMeasure']), hasRepsMeasure: serializer.fromJson(json['hasRepsMeasure']), hasScoreMeasure: serializer.fromJson(json['hasScoreMeasure']), + scoreInputMode: serializer.fromJson(json['scoreInputMode']), scoreLabel: serializer.fromJson(json['scoreLabel']), scoreUnit: serializer.fromJson(json['scoreUnit']), archivedAt: serializer.fromJson(json['archivedAt']), @@ -7330,6 +8601,7 @@ class Exercise extends DataClass implements Insertable { 'hasTimeMeasure': serializer.toJson(hasTimeMeasure), 'hasRepsMeasure': serializer.toJson(hasRepsMeasure), 'hasScoreMeasure': serializer.toJson(hasScoreMeasure), + 'scoreInputMode': serializer.toJson(scoreInputMode), 'scoreLabel': serializer.toJson(scoreLabel), 'scoreUnit': serializer.toJson(scoreUnit), 'archivedAt': serializer.toJson(archivedAt), @@ -7355,6 +8627,7 @@ class Exercise extends DataClass implements Insertable { bool? hasTimeMeasure, bool? hasRepsMeasure, bool? hasScoreMeasure, + String? scoreInputMode, Value scoreLabel = const Value.absent(), Value scoreUnit = const Value.absent(), Value archivedAt = const Value.absent(), @@ -7381,6 +8654,7 @@ class Exercise extends DataClass implements Insertable { hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreInputMode: scoreInputMode ?? this.scoreInputMode, scoreLabel: scoreLabel.present ? scoreLabel.value : this.scoreLabel, scoreUnit: scoreUnit.present ? scoreUnit.value : this.scoreUnit, archivedAt: archivedAt.present ? archivedAt.value : this.archivedAt, @@ -7429,6 +8703,9 @@ class Exercise extends DataClass implements Insertable { hasScoreMeasure: data.hasScoreMeasure.present ? data.hasScoreMeasure.value : this.hasScoreMeasure, + scoreInputMode: data.scoreInputMode.present + ? data.scoreInputMode.value + : this.scoreInputMode, scoreLabel: data.scoreLabel.present ? data.scoreLabel.value : this.scoreLabel, @@ -7460,6 +8737,7 @@ class Exercise extends DataClass implements Insertable { ..write('hasTimeMeasure: $hasTimeMeasure, ') ..write('hasRepsMeasure: $hasRepsMeasure, ') ..write('hasScoreMeasure: $hasScoreMeasure, ') + ..write('scoreInputMode: $scoreInputMode, ') ..write('scoreLabel: $scoreLabel, ') ..write('scoreUnit: $scoreUnit, ') ..write('archivedAt: $archivedAt') @@ -7487,6 +8765,7 @@ class Exercise extends DataClass implements Insertable { hasTimeMeasure, hasRepsMeasure, hasScoreMeasure, + scoreInputMode, scoreLabel, scoreUnit, archivedAt, @@ -7513,6 +8792,7 @@ class Exercise extends DataClass implements Insertable { other.hasTimeMeasure == this.hasTimeMeasure && other.hasRepsMeasure == this.hasRepsMeasure && other.hasScoreMeasure == this.hasScoreMeasure && + other.scoreInputMode == this.scoreInputMode && other.scoreLabel == this.scoreLabel && other.scoreUnit == this.scoreUnit && other.archivedAt == this.archivedAt); @@ -7537,6 +8817,7 @@ class ExercisesCompanion extends UpdateCompanion { final Value hasTimeMeasure; final Value hasRepsMeasure; final Value hasScoreMeasure; + final Value scoreInputMode; final Value scoreLabel; final Value scoreUnit; final Value archivedAt; @@ -7560,6 +8841,7 @@ class ExercisesCompanion extends UpdateCompanion { this.hasTimeMeasure = const Value.absent(), this.hasRepsMeasure = const Value.absent(), this.hasScoreMeasure = const Value.absent(), + this.scoreInputMode = const Value.absent(), this.scoreLabel = const Value.absent(), this.scoreUnit = const Value.absent(), this.archivedAt = const Value.absent(), @@ -7584,6 +8866,7 @@ class ExercisesCompanion extends UpdateCompanion { required bool hasTimeMeasure, required bool hasRepsMeasure, required bool hasScoreMeasure, + this.scoreInputMode = const Value.absent(), this.scoreLabel = const Value.absent(), this.scoreUnit = const Value.absent(), this.archivedAt = const Value.absent(), @@ -7617,6 +8900,7 @@ class ExercisesCompanion extends UpdateCompanion { Expression? hasTimeMeasure, Expression? hasRepsMeasure, Expression? hasScoreMeasure, + Expression? scoreInputMode, Expression? scoreLabel, Expression? scoreUnit, Expression? archivedAt, @@ -7642,6 +8926,7 @@ class ExercisesCompanion extends UpdateCompanion { if (hasTimeMeasure != null) 'has_time_measure': hasTimeMeasure, if (hasRepsMeasure != null) 'has_reps_measure': hasRepsMeasure, if (hasScoreMeasure != null) 'has_score_measure': hasScoreMeasure, + if (scoreInputMode != null) 'score_input_mode': scoreInputMode, if (scoreLabel != null) 'score_label': scoreLabel, if (scoreUnit != null) 'score_unit': scoreUnit, if (archivedAt != null) 'archived_at': archivedAt, @@ -7668,6 +8953,7 @@ class ExercisesCompanion extends UpdateCompanion { Value? hasTimeMeasure, Value? hasRepsMeasure, Value? hasScoreMeasure, + Value? scoreInputMode, Value? scoreLabel, Value? scoreUnit, Value? archivedAt, @@ -7692,6 +8978,7 @@ class ExercisesCompanion extends UpdateCompanion { hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreInputMode: scoreInputMode ?? this.scoreInputMode, scoreLabel: scoreLabel ?? this.scoreLabel, scoreUnit: scoreUnit ?? this.scoreUnit, archivedAt: archivedAt ?? this.archivedAt, @@ -7758,6 +9045,9 @@ class ExercisesCompanion extends UpdateCompanion { if (hasScoreMeasure.present) { map['has_score_measure'] = Variable(hasScoreMeasure.value); } + if (scoreInputMode.present) { + map['score_input_mode'] = Variable(scoreInputMode.value); + } if (scoreLabel.present) { map['score_label'] = Variable(scoreLabel.value); } @@ -7794,6 +9084,7 @@ class ExercisesCompanion extends UpdateCompanion { ..write('hasTimeMeasure: $hasTimeMeasure, ') ..write('hasRepsMeasure: $hasRepsMeasure, ') ..write('hasScoreMeasure: $hasScoreMeasure, ') + ..write('scoreInputMode: $scoreInputMode, ') ..write('scoreLabel: $scoreLabel, ') ..write('scoreUnit: $scoreUnit, ') ..write('archivedAt: $archivedAt, ') @@ -8880,6 +10171,18 @@ class $ProgramExercisesTable extends ProgramExercises 'CHECK ("available_score_snapshot" IN (0, 1))', ), ); + static const VerificationMeta _scoreInputModeSnapshotMeta = + const VerificationMeta('scoreInputModeSnapshot'); + @override + late final GeneratedColumn scoreInputModeSnapshot = + GeneratedColumn( + 'score_input_mode_snapshot', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('manual'), + ); static const VerificationMeta _scoreLabelSnapshotMeta = const VerificationMeta('scoreLabelSnapshot'); @override @@ -8989,6 +10292,17 @@ class $ProgramExercisesTable extends ProgramExercises type: DriftSqlType.double, requiredDuringInsert: false, ); + static const VerificationMeta _targetScoreTimeMsMeta = const VerificationMeta( + 'targetScoreTimeMs', + ); + @override + late final GeneratedColumn targetScoreTimeMs = GeneratedColumn( + 'target_score_time_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); static const VerificationMeta _restSecondsOverrideMeta = const VerificationMeta('restSecondsOverride'); @override @@ -9023,6 +10337,7 @@ class $ProgramExercisesTable extends ProgramExercises availableTimeSnapshot, availableRepsSnapshot, availableScoreSnapshot, + scoreInputModeSnapshot, scoreLabelSnapshot, scoreUnitSnapshot, setsCount, @@ -9032,6 +10347,7 @@ class $ProgramExercisesTable extends ProgramExercises targetTimeSeconds, targetReps, targetScore, + targetScoreTimeMs, restSecondsOverride, ]; @override @@ -9244,6 +10560,15 @@ class $ProgramExercisesTable extends ProgramExercises } else if (isInserting) { context.missing(_availableScoreSnapshotMeta); } + if (data.containsKey('score_input_mode_snapshot')) { + context.handle( + _scoreInputModeSnapshotMeta, + scoreInputModeSnapshot.isAcceptableOrUnknown( + data['score_input_mode_snapshot']!, + _scoreInputModeSnapshotMeta, + ), + ); + } if (data.containsKey('score_label_snapshot')) { context.handle( _scoreLabelSnapshotMeta, @@ -9327,6 +10652,15 @@ class $ProgramExercisesTable extends ProgramExercises ), ); } + if (data.containsKey('target_score_time_ms')) { + context.handle( + _targetScoreTimeMsMeta, + targetScoreTimeMs.isAcceptableOrUnknown( + data['target_score_time_ms']!, + _targetScoreTimeMsMeta, + ), + ); + } if (data.containsKey('rest_seconds_override')) { context.handle( _restSecondsOverrideMeta, @@ -9433,6 +10767,10 @@ class $ProgramExercisesTable extends ProgramExercises DriftSqlType.bool, data['${effectivePrefix}available_score_snapshot'], )!, + scoreInputModeSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_input_mode_snapshot'], + )!, scoreLabelSnapshot: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}score_label_snapshot'], @@ -9469,6 +10807,10 @@ class $ProgramExercisesTable extends ProgramExercises DriftSqlType.double, data['${effectivePrefix}target_score'], ), + targetScoreTimeMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_score_time_ms'], + ), restSecondsOverride: attachedDatabase.typeMapping.read( DriftSqlType.int, data['${effectivePrefix}rest_seconds_override'], @@ -9505,6 +10847,7 @@ class ProgramExercise extends DataClass implements Insertable { final bool availableTimeSnapshot; final bool availableRepsSnapshot; final bool availableScoreSnapshot; + final String scoreInputModeSnapshot; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final int setsCount; @@ -9514,6 +10857,7 @@ class ProgramExercise extends DataClass implements Insertable { final int? targetTimeSeconds; final int? targetReps; final double? targetScore; + final int? targetScoreTimeMs; final int? restSecondsOverride; const ProgramExercise({ required this.id, @@ -9538,6 +10882,7 @@ class ProgramExercise extends DataClass implements Insertable { required this.availableTimeSnapshot, required this.availableRepsSnapshot, required this.availableScoreSnapshot, + required this.scoreInputModeSnapshot, this.scoreLabelSnapshot, this.scoreUnitSnapshot, required this.setsCount, @@ -9547,6 +10892,7 @@ class ProgramExercise extends DataClass implements Insertable { this.targetTimeSeconds, this.targetReps, this.targetScore, + this.targetScoreTimeMs, this.restSecondsOverride, }); @override @@ -9598,6 +10944,7 @@ class ProgramExercise extends DataClass implements Insertable { map['available_time_snapshot'] = Variable(availableTimeSnapshot); map['available_reps_snapshot'] = Variable(availableRepsSnapshot); map['available_score_snapshot'] = Variable(availableScoreSnapshot); + map['score_input_mode_snapshot'] = Variable(scoreInputModeSnapshot); if (!nullToAbsent || scoreLabelSnapshot != null) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot); } @@ -9617,6 +10964,9 @@ class ProgramExercise extends DataClass implements Insertable { if (!nullToAbsent || targetScore != null) { map['target_score'] = Variable(targetScore); } + if (!nullToAbsent || targetScoreTimeMs != null) { + map['target_score_time_ms'] = Variable(targetScoreTimeMs); + } if (!nullToAbsent || restSecondsOverride != null) { map['rest_seconds_override'] = Variable(restSecondsOverride); } @@ -9666,6 +11016,7 @@ class ProgramExercise extends DataClass implements Insertable { availableTimeSnapshot: Value(availableTimeSnapshot), availableRepsSnapshot: Value(availableRepsSnapshot), availableScoreSnapshot: Value(availableScoreSnapshot), + scoreInputModeSnapshot: Value(scoreInputModeSnapshot), scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent ? const Value.absent() : Value(scoreLabelSnapshot), @@ -9685,6 +11036,9 @@ class ProgramExercise extends DataClass implements Insertable { targetScore: targetScore == null && nullToAbsent ? const Value.absent() : Value(targetScore), + targetScoreTimeMs: targetScoreTimeMs == null && nullToAbsent + ? const Value.absent() + : Value(targetScoreTimeMs), restSecondsOverride: restSecondsOverride == null && nullToAbsent ? const Value.absent() : Value(restSecondsOverride), @@ -9737,6 +11091,9 @@ class ProgramExercise extends DataClass implements Insertable { availableScoreSnapshot: serializer.fromJson( json['availableScoreSnapshot'], ), + scoreInputModeSnapshot: serializer.fromJson( + json['scoreInputModeSnapshot'], + ), scoreLabelSnapshot: serializer.fromJson( json['scoreLabelSnapshot'], ), @@ -9750,6 +11107,7 @@ class ProgramExercise extends DataClass implements Insertable { targetTimeSeconds: serializer.fromJson(json['targetTimeSeconds']), targetReps: serializer.fromJson(json['targetReps']), targetScore: serializer.fromJson(json['targetScore']), + targetScoreTimeMs: serializer.fromJson(json['targetScoreTimeMs']), restSecondsOverride: serializer.fromJson( json['restSecondsOverride'], ), @@ -9789,6 +11147,9 @@ class ProgramExercise extends DataClass implements Insertable { 'availableTimeSnapshot': serializer.toJson(availableTimeSnapshot), 'availableRepsSnapshot': serializer.toJson(availableRepsSnapshot), 'availableScoreSnapshot': serializer.toJson(availableScoreSnapshot), + 'scoreInputModeSnapshot': serializer.toJson( + scoreInputModeSnapshot, + ), 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), 'setsCount': serializer.toJson(setsCount), @@ -9798,6 +11159,7 @@ class ProgramExercise extends DataClass implements Insertable { 'targetTimeSeconds': serializer.toJson(targetTimeSeconds), 'targetReps': serializer.toJson(targetReps), 'targetScore': serializer.toJson(targetScore), + 'targetScoreTimeMs': serializer.toJson(targetScoreTimeMs), 'restSecondsOverride': serializer.toJson(restSecondsOverride), }; } @@ -9825,6 +11187,7 @@ class ProgramExercise extends DataClass implements Insertable { bool? availableTimeSnapshot, bool? availableRepsSnapshot, bool? availableScoreSnapshot, + String? scoreInputModeSnapshot, Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), int? setsCount, @@ -9834,6 +11197,7 @@ class ProgramExercise extends DataClass implements Insertable { Value targetTimeSeconds = const Value.absent(), Value targetReps = const Value.absent(), Value targetScore = const Value.absent(), + Value targetScoreTimeMs = const Value.absent(), Value restSecondsOverride = const Value.absent(), }) => ProgramExercise( id: id ?? this.id, @@ -9872,6 +11236,8 @@ class ProgramExercise extends DataClass implements Insertable { availableRepsSnapshot: availableRepsSnapshot ?? this.availableRepsSnapshot, availableScoreSnapshot: availableScoreSnapshot ?? this.availableScoreSnapshot, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot.present ? scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -9887,6 +11253,9 @@ class ProgramExercise extends DataClass implements Insertable { : this.targetTimeSeconds, targetReps: targetReps.present ? targetReps.value : this.targetReps, targetScore: targetScore.present ? targetScore.value : this.targetScore, + targetScoreTimeMs: targetScoreTimeMs.present + ? targetScoreTimeMs.value + : this.targetScoreTimeMs, restSecondsOverride: restSecondsOverride.present ? restSecondsOverride.value : this.restSecondsOverride, @@ -9945,6 +11314,9 @@ class ProgramExercise extends DataClass implements Insertable { availableScoreSnapshot: data.availableScoreSnapshot.present ? data.availableScoreSnapshot.value : this.availableScoreSnapshot, + scoreInputModeSnapshot: data.scoreInputModeSnapshot.present + ? data.scoreInputModeSnapshot.value + : this.scoreInputModeSnapshot, scoreLabelSnapshot: data.scoreLabelSnapshot.present ? data.scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -9970,6 +11342,9 @@ class ProgramExercise extends DataClass implements Insertable { targetScore: data.targetScore.present ? data.targetScore.value : this.targetScore, + targetScoreTimeMs: data.targetScoreTimeMs.present + ? data.targetScoreTimeMs.value + : this.targetScoreTimeMs, restSecondsOverride: data.restSecondsOverride.present ? data.restSecondsOverride.value : this.restSecondsOverride, @@ -10005,6 +11380,7 @@ class ProgramExercise extends DataClass implements Insertable { ..write('availableTimeSnapshot: $availableTimeSnapshot, ') ..write('availableRepsSnapshot: $availableRepsSnapshot, ') ..write('availableScoreSnapshot: $availableScoreSnapshot, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('setsCount: $setsCount, ') @@ -10014,6 +11390,7 @@ class ProgramExercise extends DataClass implements Insertable { ..write('targetTimeSeconds: $targetTimeSeconds, ') ..write('targetReps: $targetReps, ') ..write('targetScore: $targetScore, ') + ..write('targetScoreTimeMs: $targetScoreTimeMs, ') ..write('restSecondsOverride: $restSecondsOverride') ..write(')')) .toString(); @@ -10043,6 +11420,7 @@ class ProgramExercise extends DataClass implements Insertable { availableTimeSnapshot, availableRepsSnapshot, availableScoreSnapshot, + scoreInputModeSnapshot, scoreLabelSnapshot, scoreUnitSnapshot, setsCount, @@ -10052,6 +11430,7 @@ class ProgramExercise extends DataClass implements Insertable { targetTimeSeconds, targetReps, targetScore, + targetScoreTimeMs, restSecondsOverride, ]); @override @@ -10083,6 +11462,7 @@ class ProgramExercise extends DataClass implements Insertable { other.availableTimeSnapshot == this.availableTimeSnapshot && other.availableRepsSnapshot == this.availableRepsSnapshot && other.availableScoreSnapshot == this.availableScoreSnapshot && + other.scoreInputModeSnapshot == this.scoreInputModeSnapshot && other.scoreLabelSnapshot == this.scoreLabelSnapshot && other.scoreUnitSnapshot == this.scoreUnitSnapshot && other.setsCount == this.setsCount && @@ -10092,6 +11472,7 @@ class ProgramExercise extends DataClass implements Insertable { other.targetTimeSeconds == this.targetTimeSeconds && other.targetReps == this.targetReps && other.targetScore == this.targetScore && + other.targetScoreTimeMs == this.targetScoreTimeMs && other.restSecondsOverride == this.restSecondsOverride); } @@ -10118,6 +11499,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { final Value availableTimeSnapshot; final Value availableRepsSnapshot; final Value availableScoreSnapshot; + final Value scoreInputModeSnapshot; final Value scoreLabelSnapshot; final Value scoreUnitSnapshot; final Value setsCount; @@ -10127,6 +11509,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { final Value targetTimeSeconds; final Value targetReps; final Value targetScore; + final Value targetScoreTimeMs; final Value restSecondsOverride; final Value rowid; const ProgramExercisesCompanion({ @@ -10152,6 +11535,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { this.availableTimeSnapshot = const Value.absent(), this.availableRepsSnapshot = const Value.absent(), this.availableScoreSnapshot = const Value.absent(), + this.scoreInputModeSnapshot = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), this.setsCount = const Value.absent(), @@ -10161,6 +11545,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { this.targetTimeSeconds = const Value.absent(), this.targetReps = const Value.absent(), this.targetScore = const Value.absent(), + this.targetScoreTimeMs = const Value.absent(), this.restSecondsOverride = const Value.absent(), this.rowid = const Value.absent(), }); @@ -10187,6 +11572,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { required bool availableTimeSnapshot, required bool availableRepsSnapshot, required bool availableScoreSnapshot, + this.scoreInputModeSnapshot = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), required int setsCount, @@ -10196,6 +11582,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { this.targetTimeSeconds = const Value.absent(), this.targetReps = const Value.absent(), this.targetScore = const Value.absent(), + this.targetScoreTimeMs = const Value.absent(), this.restSecondsOverride = const Value.absent(), this.rowid = const Value.absent(), }) : id = Value(id), @@ -10237,6 +11624,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { Expression? availableTimeSnapshot, Expression? availableRepsSnapshot, Expression? availableScoreSnapshot, + Expression? scoreInputModeSnapshot, Expression? scoreLabelSnapshot, Expression? scoreUnitSnapshot, Expression? setsCount, @@ -10246,6 +11634,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { Expression? targetTimeSeconds, Expression? targetReps, Expression? targetScore, + Expression? targetScoreTimeMs, Expression? restSecondsOverride, Expression? rowid, }) { @@ -10281,6 +11670,8 @@ class ProgramExercisesCompanion extends UpdateCompanion { 'available_reps_snapshot': availableRepsSnapshot, if (availableScoreSnapshot != null) 'available_score_snapshot': availableScoreSnapshot, + if (scoreInputModeSnapshot != null) + 'score_input_mode_snapshot': scoreInputModeSnapshot, if (scoreLabelSnapshot != null) 'score_label_snapshot': scoreLabelSnapshot, if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, @@ -10291,6 +11682,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { if (targetTimeSeconds != null) 'target_time_seconds': targetTimeSeconds, if (targetReps != null) 'target_reps': targetReps, if (targetScore != null) 'target_score': targetScore, + if (targetScoreTimeMs != null) 'target_score_time_ms': targetScoreTimeMs, if (restSecondsOverride != null) 'rest_seconds_override': restSecondsOverride, if (rowid != null) 'rowid': rowid, @@ -10320,6 +11712,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { Value? availableTimeSnapshot, Value? availableRepsSnapshot, Value? availableScoreSnapshot, + Value? scoreInputModeSnapshot, Value? scoreLabelSnapshot, Value? scoreUnitSnapshot, Value? setsCount, @@ -10329,6 +11722,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { Value? targetTimeSeconds, Value? targetReps, Value? targetScore, + Value? targetScoreTimeMs, Value? restSecondsOverride, Value? rowid, }) { @@ -10362,6 +11756,8 @@ class ProgramExercisesCompanion extends UpdateCompanion { availableRepsSnapshot ?? this.availableRepsSnapshot, availableScoreSnapshot: availableScoreSnapshot ?? this.availableScoreSnapshot, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, setsCount: setsCount ?? this.setsCount, @@ -10371,6 +11767,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { targetTimeSeconds: targetTimeSeconds ?? this.targetTimeSeconds, targetReps: targetReps ?? this.targetReps, targetScore: targetScore ?? this.targetScore, + targetScoreTimeMs: targetScoreTimeMs ?? this.targetScoreTimeMs, restSecondsOverride: restSecondsOverride ?? this.restSecondsOverride, rowid: rowid ?? this.rowid, ); @@ -10463,6 +11860,11 @@ class ProgramExercisesCompanion extends UpdateCompanion { availableScoreSnapshot.value, ); } + if (scoreInputModeSnapshot.present) { + map['score_input_mode_snapshot'] = Variable( + scoreInputModeSnapshot.value, + ); + } if (scoreLabelSnapshot.present) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); } @@ -10490,6 +11892,9 @@ class ProgramExercisesCompanion extends UpdateCompanion { if (targetScore.present) { map['target_score'] = Variable(targetScore.value); } + if (targetScoreTimeMs.present) { + map['target_score_time_ms'] = Variable(targetScoreTimeMs.value); + } if (restSecondsOverride.present) { map['rest_seconds_override'] = Variable(restSecondsOverride.value); } @@ -10528,6 +11933,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { ..write('availableTimeSnapshot: $availableTimeSnapshot, ') ..write('availableRepsSnapshot: $availableRepsSnapshot, ') ..write('availableScoreSnapshot: $availableScoreSnapshot, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('setsCount: $setsCount, ') @@ -10537,6 +11943,7 @@ class ProgramExercisesCompanion extends UpdateCompanion { ..write('targetTimeSeconds: $targetTimeSeconds, ') ..write('targetReps: $targetReps, ') ..write('targetScore: $targetScore, ') + ..write('targetScoreTimeMs: $targetScoreTimeMs, ') ..write('restSecondsOverride: $restSecondsOverride, ') ..write('rowid: $rowid') ..write(')')) @@ -11967,6 +13374,18 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults 'CHECK ("score_enabled_snapshot" IN (0, 1))', ), ); + static const VerificationMeta _scoreInputModeSnapshotMeta = + const VerificationMeta('scoreInputModeSnapshot'); + @override + late final GeneratedColumn scoreInputModeSnapshot = + GeneratedColumn( + 'score_input_mode_snapshot', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('manual'), + ); static const VerificationMeta _targetTimeSecondsSnapshotMeta = const VerificationMeta('targetTimeSecondsSnapshot'); @override @@ -11999,6 +13418,17 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults type: DriftSqlType.double, requiredDuringInsert: false, ); + static const VerificationMeta _targetScoreTimeMsSnapshotMeta = + const VerificationMeta('targetScoreTimeMsSnapshot'); + @override + late final GeneratedColumn targetScoreTimeMsSnapshot = + GeneratedColumn( + 'target_score_time_ms_snapshot', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); static const VerificationMeta _actualTimeMsMeta = const VerificationMeta( 'actualTimeMs', ); @@ -12032,6 +13462,17 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults type: DriftSqlType.double, requiredDuringInsert: false, ); + static const VerificationMeta _actualScoreTimeMsMeta = const VerificationMeta( + 'actualScoreTimeMs', + ); + @override + late final GeneratedColumn actualScoreTimeMs = GeneratedColumn( + 'actual_score_time_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); static const VerificationMeta _scoreLabelSnapshotMeta = const VerificationMeta('scoreLabelSnapshot'); @override @@ -12111,12 +13552,15 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults timeEnabledSnapshot, repsEnabledSnapshot, scoreEnabledSnapshot, + scoreInputModeSnapshot, targetTimeSecondsSnapshot, targetRepsSnapshot, targetScoreSnapshot, + targetScoreTimeMsSnapshot, actualTimeMs, actualReps, actualScore, + actualScoreTimeMs, scoreLabelSnapshot, scoreUnitSnapshot, startedAt, @@ -12346,6 +13790,15 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults } else if (isInserting) { context.missing(_scoreEnabledSnapshotMeta); } + if (data.containsKey('score_input_mode_snapshot')) { + context.handle( + _scoreInputModeSnapshotMeta, + scoreInputModeSnapshot.isAcceptableOrUnknown( + data['score_input_mode_snapshot']!, + _scoreInputModeSnapshotMeta, + ), + ); + } if (data.containsKey('target_time_seconds_snapshot')) { context.handle( _targetTimeSecondsSnapshotMeta, @@ -12373,6 +13826,15 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults ), ); } + if (data.containsKey('target_score_time_ms_snapshot')) { + context.handle( + _targetScoreTimeMsSnapshotMeta, + targetScoreTimeMsSnapshot.isAcceptableOrUnknown( + data['target_score_time_ms_snapshot']!, + _targetScoreTimeMsSnapshotMeta, + ), + ); + } if (data.containsKey('actual_time_ms')) { context.handle( _actualTimeMsMeta, @@ -12397,6 +13859,15 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults ), ); } + if (data.containsKey('actual_score_time_ms')) { + context.handle( + _actualScoreTimeMsMeta, + actualScoreTimeMs.isAcceptableOrUnknown( + data['actual_score_time_ms']!, + _actualScoreTimeMsMeta, + ), + ); + } if (data.containsKey('score_label_snapshot')) { context.handle( _scoreLabelSnapshotMeta, @@ -12536,6 +14007,10 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults DriftSqlType.bool, data['${effectivePrefix}score_enabled_snapshot'], )!, + scoreInputModeSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_input_mode_snapshot'], + )!, targetTimeSecondsSnapshot: attachedDatabase.typeMapping.read( DriftSqlType.int, data['${effectivePrefix}target_time_seconds_snapshot'], @@ -12548,6 +14023,10 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults DriftSqlType.double, data['${effectivePrefix}target_score_snapshot'], ), + targetScoreTimeMsSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_score_time_ms_snapshot'], + ), actualTimeMs: attachedDatabase.typeMapping.read( DriftSqlType.int, data['${effectivePrefix}actual_time_ms'], @@ -12560,6 +14039,10 @@ class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults DriftSqlType.double, data['${effectivePrefix}actual_score'], ), + actualScoreTimeMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_score_time_ms'], + ), scoreLabelSnapshot: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}score_label_snapshot'], @@ -12613,12 +14096,15 @@ class WorkoutHistorySetResult extends DataClass final bool timeEnabledSnapshot; final bool repsEnabledSnapshot; final bool scoreEnabledSnapshot; + final String scoreInputModeSnapshot; final int? targetTimeSecondsSnapshot; final int? targetRepsSnapshot; final double? targetScoreSnapshot; + final int? targetScoreTimeMsSnapshot; final int? actualTimeMs; final int? actualReps; final double? actualScore; + final int? actualScoreTimeMs; final String? scoreLabelSnapshot; final String? scoreUnitSnapshot; final DateTime? startedAt; @@ -12647,12 +14133,15 @@ class WorkoutHistorySetResult extends DataClass required this.timeEnabledSnapshot, required this.repsEnabledSnapshot, required this.scoreEnabledSnapshot, + required this.scoreInputModeSnapshot, this.targetTimeSecondsSnapshot, this.targetRepsSnapshot, this.targetScoreSnapshot, + this.targetScoreTimeMsSnapshot, this.actualTimeMs, this.actualReps, this.actualScore, + this.actualScoreTimeMs, this.scoreLabelSnapshot, this.scoreUnitSnapshot, this.startedAt, @@ -12692,6 +14181,7 @@ class WorkoutHistorySetResult extends DataClass map['time_enabled_snapshot'] = Variable(timeEnabledSnapshot); map['reps_enabled_snapshot'] = Variable(repsEnabledSnapshot); map['score_enabled_snapshot'] = Variable(scoreEnabledSnapshot); + map['score_input_mode_snapshot'] = Variable(scoreInputModeSnapshot); if (!nullToAbsent || targetTimeSecondsSnapshot != null) { map['target_time_seconds_snapshot'] = Variable( targetTimeSecondsSnapshot, @@ -12703,6 +14193,11 @@ class WorkoutHistorySetResult extends DataClass if (!nullToAbsent || targetScoreSnapshot != null) { map['target_score_snapshot'] = Variable(targetScoreSnapshot); } + if (!nullToAbsent || targetScoreTimeMsSnapshot != null) { + map['target_score_time_ms_snapshot'] = Variable( + targetScoreTimeMsSnapshot, + ); + } if (!nullToAbsent || actualTimeMs != null) { map['actual_time_ms'] = Variable(actualTimeMs); } @@ -12712,6 +14207,9 @@ class WorkoutHistorySetResult extends DataClass if (!nullToAbsent || actualScore != null) { map['actual_score'] = Variable(actualScore); } + if (!nullToAbsent || actualScoreTimeMs != null) { + map['actual_score_time_ms'] = Variable(actualScoreTimeMs); + } if (!nullToAbsent || scoreLabelSnapshot != null) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot); } @@ -12760,6 +14258,7 @@ class WorkoutHistorySetResult extends DataClass timeEnabledSnapshot: Value(timeEnabledSnapshot), repsEnabledSnapshot: Value(repsEnabledSnapshot), scoreEnabledSnapshot: Value(scoreEnabledSnapshot), + scoreInputModeSnapshot: Value(scoreInputModeSnapshot), targetTimeSecondsSnapshot: targetTimeSecondsSnapshot == null && nullToAbsent ? const Value.absent() @@ -12770,6 +14269,10 @@ class WorkoutHistorySetResult extends DataClass targetScoreSnapshot: targetScoreSnapshot == null && nullToAbsent ? const Value.absent() : Value(targetScoreSnapshot), + targetScoreTimeMsSnapshot: + targetScoreTimeMsSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(targetScoreTimeMsSnapshot), actualTimeMs: actualTimeMs == null && nullToAbsent ? const Value.absent() : Value(actualTimeMs), @@ -12779,6 +14282,9 @@ class WorkoutHistorySetResult extends DataClass actualScore: actualScore == null && nullToAbsent ? const Value.absent() : Value(actualScore), + actualScoreTimeMs: actualScoreTimeMs == null && nullToAbsent + ? const Value.absent() + : Value(actualScoreTimeMs), scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent ? const Value.absent() : Value(scoreLabelSnapshot), @@ -12837,6 +14343,9 @@ class WorkoutHistorySetResult extends DataClass scoreEnabledSnapshot: serializer.fromJson( json['scoreEnabledSnapshot'], ), + scoreInputModeSnapshot: serializer.fromJson( + json['scoreInputModeSnapshot'], + ), targetTimeSecondsSnapshot: serializer.fromJson( json['targetTimeSecondsSnapshot'], ), @@ -12844,9 +14353,13 @@ class WorkoutHistorySetResult extends DataClass targetScoreSnapshot: serializer.fromJson( json['targetScoreSnapshot'], ), + targetScoreTimeMsSnapshot: serializer.fromJson( + json['targetScoreTimeMsSnapshot'], + ), actualTimeMs: serializer.fromJson(json['actualTimeMs']), actualReps: serializer.fromJson(json['actualReps']), actualScore: serializer.fromJson(json['actualScore']), + actualScoreTimeMs: serializer.fromJson(json['actualScoreTimeMs']), scoreLabelSnapshot: serializer.fromJson( json['scoreLabelSnapshot'], ), @@ -12884,14 +14397,21 @@ class WorkoutHistorySetResult extends DataClass 'timeEnabledSnapshot': serializer.toJson(timeEnabledSnapshot), 'repsEnabledSnapshot': serializer.toJson(repsEnabledSnapshot), 'scoreEnabledSnapshot': serializer.toJson(scoreEnabledSnapshot), + 'scoreInputModeSnapshot': serializer.toJson( + scoreInputModeSnapshot, + ), 'targetTimeSecondsSnapshot': serializer.toJson( targetTimeSecondsSnapshot, ), 'targetRepsSnapshot': serializer.toJson(targetRepsSnapshot), 'targetScoreSnapshot': serializer.toJson(targetScoreSnapshot), + 'targetScoreTimeMsSnapshot': serializer.toJson( + targetScoreTimeMsSnapshot, + ), 'actualTimeMs': serializer.toJson(actualTimeMs), 'actualReps': serializer.toJson(actualReps), 'actualScore': serializer.toJson(actualScore), + 'actualScoreTimeMs': serializer.toJson(actualScoreTimeMs), 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), 'startedAt': serializer.toJson(startedAt), @@ -12923,12 +14443,15 @@ class WorkoutHistorySetResult extends DataClass bool? timeEnabledSnapshot, bool? repsEnabledSnapshot, bool? scoreEnabledSnapshot, + String? scoreInputModeSnapshot, Value targetTimeSecondsSnapshot = const Value.absent(), Value targetRepsSnapshot = const Value.absent(), Value targetScoreSnapshot = const Value.absent(), + Value targetScoreTimeMsSnapshot = const Value.absent(), Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value startedAt = const Value.absent(), @@ -12961,6 +14484,8 @@ class WorkoutHistorySetResult extends DataClass timeEnabledSnapshot: timeEnabledSnapshot ?? this.timeEnabledSnapshot, repsEnabledSnapshot: repsEnabledSnapshot ?? this.repsEnabledSnapshot, scoreEnabledSnapshot: scoreEnabledSnapshot ?? this.scoreEnabledSnapshot, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, targetTimeSecondsSnapshot: targetTimeSecondsSnapshot.present ? targetTimeSecondsSnapshot.value : this.targetTimeSecondsSnapshot, @@ -12970,9 +14495,15 @@ class WorkoutHistorySetResult extends DataClass targetScoreSnapshot: targetScoreSnapshot.present ? targetScoreSnapshot.value : this.targetScoreSnapshot, + targetScoreTimeMsSnapshot: targetScoreTimeMsSnapshot.present + ? targetScoreTimeMsSnapshot.value + : this.targetScoreTimeMsSnapshot, actualTimeMs: actualTimeMs.present ? actualTimeMs.value : this.actualTimeMs, actualReps: actualReps.present ? actualReps.value : this.actualReps, actualScore: actualScore.present ? actualScore.value : this.actualScore, + actualScoreTimeMs: actualScoreTimeMs.present + ? actualScoreTimeMs.value + : this.actualScoreTimeMs, scoreLabelSnapshot: scoreLabelSnapshot.present ? scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -13041,6 +14572,9 @@ class WorkoutHistorySetResult extends DataClass scoreEnabledSnapshot: data.scoreEnabledSnapshot.present ? data.scoreEnabledSnapshot.value : this.scoreEnabledSnapshot, + scoreInputModeSnapshot: data.scoreInputModeSnapshot.present + ? data.scoreInputModeSnapshot.value + : this.scoreInputModeSnapshot, targetTimeSecondsSnapshot: data.targetTimeSecondsSnapshot.present ? data.targetTimeSecondsSnapshot.value : this.targetTimeSecondsSnapshot, @@ -13050,6 +14584,9 @@ class WorkoutHistorySetResult extends DataClass targetScoreSnapshot: data.targetScoreSnapshot.present ? data.targetScoreSnapshot.value : this.targetScoreSnapshot, + targetScoreTimeMsSnapshot: data.targetScoreTimeMsSnapshot.present + ? data.targetScoreTimeMsSnapshot.value + : this.targetScoreTimeMsSnapshot, actualTimeMs: data.actualTimeMs.present ? data.actualTimeMs.value : this.actualTimeMs, @@ -13059,6 +14596,9 @@ class WorkoutHistorySetResult extends DataClass actualScore: data.actualScore.present ? data.actualScore.value : this.actualScore, + actualScoreTimeMs: data.actualScoreTimeMs.present + ? data.actualScoreTimeMs.value + : this.actualScoreTimeMs, scoreLabelSnapshot: data.scoreLabelSnapshot.present ? data.scoreLabelSnapshot.value : this.scoreLabelSnapshot, @@ -13098,12 +14638,15 @@ class WorkoutHistorySetResult extends DataClass ..write('timeEnabledSnapshot: $timeEnabledSnapshot, ') ..write('repsEnabledSnapshot: $repsEnabledSnapshot, ') ..write('scoreEnabledSnapshot: $scoreEnabledSnapshot, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('targetTimeSecondsSnapshot: $targetTimeSecondsSnapshot, ') ..write('targetRepsSnapshot: $targetRepsSnapshot, ') ..write('targetScoreSnapshot: $targetScoreSnapshot, ') + ..write('targetScoreTimeMsSnapshot: $targetScoreTimeMsSnapshot, ') ..write('actualTimeMs: $actualTimeMs, ') ..write('actualReps: $actualReps, ') ..write('actualScore: $actualScore, ') + ..write('actualScoreTimeMs: $actualScoreTimeMs, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('startedAt: $startedAt, ') @@ -13137,12 +14680,15 @@ class WorkoutHistorySetResult extends DataClass timeEnabledSnapshot, repsEnabledSnapshot, scoreEnabledSnapshot, + scoreInputModeSnapshot, targetTimeSecondsSnapshot, targetRepsSnapshot, targetScoreSnapshot, + targetScoreTimeMsSnapshot, actualTimeMs, actualReps, actualScore, + actualScoreTimeMs, scoreLabelSnapshot, scoreUnitSnapshot, startedAt, @@ -13175,12 +14721,15 @@ class WorkoutHistorySetResult extends DataClass other.timeEnabledSnapshot == this.timeEnabledSnapshot && other.repsEnabledSnapshot == this.repsEnabledSnapshot && other.scoreEnabledSnapshot == this.scoreEnabledSnapshot && + other.scoreInputModeSnapshot == this.scoreInputModeSnapshot && other.targetTimeSecondsSnapshot == this.targetTimeSecondsSnapshot && other.targetRepsSnapshot == this.targetRepsSnapshot && other.targetScoreSnapshot == this.targetScoreSnapshot && + other.targetScoreTimeMsSnapshot == this.targetScoreTimeMsSnapshot && other.actualTimeMs == this.actualTimeMs && other.actualReps == this.actualReps && other.actualScore == this.actualScore && + other.actualScoreTimeMs == this.actualScoreTimeMs && other.scoreLabelSnapshot == this.scoreLabelSnapshot && other.scoreUnitSnapshot == this.scoreUnitSnapshot && other.startedAt == this.startedAt && @@ -13212,12 +14761,15 @@ class WorkoutHistorySetResultsCompanion final Value timeEnabledSnapshot; final Value repsEnabledSnapshot; final Value scoreEnabledSnapshot; + final Value scoreInputModeSnapshot; final Value targetTimeSecondsSnapshot; final Value targetRepsSnapshot; final Value targetScoreSnapshot; + final Value targetScoreTimeMsSnapshot; final Value actualTimeMs; final Value actualReps; final Value actualScore; + final Value actualScoreTimeMs; final Value scoreLabelSnapshot; final Value scoreUnitSnapshot; final Value startedAt; @@ -13247,12 +14799,15 @@ class WorkoutHistorySetResultsCompanion this.timeEnabledSnapshot = const Value.absent(), this.repsEnabledSnapshot = const Value.absent(), this.scoreEnabledSnapshot = const Value.absent(), + this.scoreInputModeSnapshot = const Value.absent(), this.targetTimeSecondsSnapshot = const Value.absent(), this.targetRepsSnapshot = const Value.absent(), this.targetScoreSnapshot = const Value.absent(), + this.targetScoreTimeMsSnapshot = const Value.absent(), this.actualTimeMs = const Value.absent(), this.actualReps = const Value.absent(), this.actualScore = const Value.absent(), + this.actualScoreTimeMs = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), this.startedAt = const Value.absent(), @@ -13283,12 +14838,15 @@ class WorkoutHistorySetResultsCompanion required bool timeEnabledSnapshot, required bool repsEnabledSnapshot, required bool scoreEnabledSnapshot, + this.scoreInputModeSnapshot = const Value.absent(), this.targetTimeSecondsSnapshot = const Value.absent(), this.targetRepsSnapshot = const Value.absent(), this.targetScoreSnapshot = const Value.absent(), + this.targetScoreTimeMsSnapshot = const Value.absent(), this.actualTimeMs = const Value.absent(), this.actualReps = const Value.absent(), this.actualScore = const Value.absent(), + this.actualScoreTimeMs = const Value.absent(), this.scoreLabelSnapshot = const Value.absent(), this.scoreUnitSnapshot = const Value.absent(), this.startedAt = const Value.absent(), @@ -13335,12 +14893,15 @@ class WorkoutHistorySetResultsCompanion Expression? timeEnabledSnapshot, Expression? repsEnabledSnapshot, Expression? scoreEnabledSnapshot, + Expression? scoreInputModeSnapshot, Expression? targetTimeSecondsSnapshot, Expression? targetRepsSnapshot, Expression? targetScoreSnapshot, + Expression? targetScoreTimeMsSnapshot, Expression? actualTimeMs, Expression? actualReps, Expression? actualScore, + Expression? actualScoreTimeMs, Expression? scoreLabelSnapshot, Expression? scoreUnitSnapshot, Expression? startedAt, @@ -13378,15 +14939,20 @@ class WorkoutHistorySetResultsCompanion 'reps_enabled_snapshot': repsEnabledSnapshot, if (scoreEnabledSnapshot != null) 'score_enabled_snapshot': scoreEnabledSnapshot, + if (scoreInputModeSnapshot != null) + 'score_input_mode_snapshot': scoreInputModeSnapshot, if (targetTimeSecondsSnapshot != null) 'target_time_seconds_snapshot': targetTimeSecondsSnapshot, if (targetRepsSnapshot != null) 'target_reps_snapshot': targetRepsSnapshot, if (targetScoreSnapshot != null) 'target_score_snapshot': targetScoreSnapshot, + if (targetScoreTimeMsSnapshot != null) + 'target_score_time_ms_snapshot': targetScoreTimeMsSnapshot, if (actualTimeMs != null) 'actual_time_ms': actualTimeMs, if (actualReps != null) 'actual_reps': actualReps, if (actualScore != null) 'actual_score': actualScore, + if (actualScoreTimeMs != null) 'actual_score_time_ms': actualScoreTimeMs, if (scoreLabelSnapshot != null) 'score_label_snapshot': scoreLabelSnapshot, if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, @@ -13420,12 +14986,15 @@ class WorkoutHistorySetResultsCompanion Value? timeEnabledSnapshot, Value? repsEnabledSnapshot, Value? scoreEnabledSnapshot, + Value? scoreInputModeSnapshot, Value? targetTimeSecondsSnapshot, Value? targetRepsSnapshot, Value? targetScoreSnapshot, + Value? targetScoreTimeMsSnapshot, Value? actualTimeMs, Value? actualReps, Value? actualScore, + Value? actualScoreTimeMs, Value? scoreLabelSnapshot, Value? scoreUnitSnapshot, Value? startedAt, @@ -13456,13 +15025,18 @@ class WorkoutHistorySetResultsCompanion timeEnabledSnapshot: timeEnabledSnapshot ?? this.timeEnabledSnapshot, repsEnabledSnapshot: repsEnabledSnapshot ?? this.repsEnabledSnapshot, scoreEnabledSnapshot: scoreEnabledSnapshot ?? this.scoreEnabledSnapshot, + scoreInputModeSnapshot: + scoreInputModeSnapshot ?? this.scoreInputModeSnapshot, targetTimeSecondsSnapshot: targetTimeSecondsSnapshot ?? this.targetTimeSecondsSnapshot, targetRepsSnapshot: targetRepsSnapshot ?? this.targetRepsSnapshot, targetScoreSnapshot: targetScoreSnapshot ?? this.targetScoreSnapshot, + targetScoreTimeMsSnapshot: + targetScoreTimeMsSnapshot ?? this.targetScoreTimeMsSnapshot, actualTimeMs: actualTimeMs ?? this.actualTimeMs, actualReps: actualReps ?? this.actualReps, actualScore: actualScore ?? this.actualScore, + actualScoreTimeMs: actualScoreTimeMs ?? this.actualScoreTimeMs, scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, startedAt: startedAt ?? this.startedAt, @@ -13549,6 +15123,11 @@ class WorkoutHistorySetResultsCompanion scoreEnabledSnapshot.value, ); } + if (scoreInputModeSnapshot.present) { + map['score_input_mode_snapshot'] = Variable( + scoreInputModeSnapshot.value, + ); + } if (targetTimeSecondsSnapshot.present) { map['target_time_seconds_snapshot'] = Variable( targetTimeSecondsSnapshot.value, @@ -13562,6 +15141,11 @@ class WorkoutHistorySetResultsCompanion targetScoreSnapshot.value, ); } + if (targetScoreTimeMsSnapshot.present) { + map['target_score_time_ms_snapshot'] = Variable( + targetScoreTimeMsSnapshot.value, + ); + } if (actualTimeMs.present) { map['actual_time_ms'] = Variable(actualTimeMs.value); } @@ -13571,6 +15155,9 @@ class WorkoutHistorySetResultsCompanion if (actualScore.present) { map['actual_score'] = Variable(actualScore.value); } + if (actualScoreTimeMs.present) { + map['actual_score_time_ms'] = Variable(actualScoreTimeMs.value); + } if (scoreLabelSnapshot.present) { map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); } @@ -13617,12 +15204,15 @@ class WorkoutHistorySetResultsCompanion ..write('timeEnabledSnapshot: $timeEnabledSnapshot, ') ..write('repsEnabledSnapshot: $repsEnabledSnapshot, ') ..write('scoreEnabledSnapshot: $scoreEnabledSnapshot, ') + ..write('scoreInputModeSnapshot: $scoreInputModeSnapshot, ') ..write('targetTimeSecondsSnapshot: $targetTimeSecondsSnapshot, ') ..write('targetRepsSnapshot: $targetRepsSnapshot, ') ..write('targetScoreSnapshot: $targetScoreSnapshot, ') + ..write('targetScoreTimeMsSnapshot: $targetScoreTimeMsSnapshot, ') ..write('actualTimeMs: $actualTimeMs, ') ..write('actualReps: $actualReps, ') ..write('actualScore: $actualScore, ') + ..write('actualScoreTimeMs: $actualScoreTimeMs, ') ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') ..write('startedAt: $startedAt, ') @@ -14889,6 +16479,17 @@ class $WorkoutTemplateExerciseOverridesTable type: DriftSqlType.double, requiredDuringInsert: false, ); + static const VerificationMeta _targetScoreTimeMsOverrideMeta = + const VerificationMeta('targetScoreTimeMsOverride'); + @override + late final GeneratedColumn targetScoreTimeMsOverride = + GeneratedColumn( + 'target_score_time_ms_override', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); @override List get $columns => [ id, @@ -14908,6 +16509,7 @@ class $WorkoutTemplateExerciseOverridesTable targetTimeSecondsOverride, targetRepsOverride, targetScoreOverride, + targetScoreTimeMsOverride, ]; @override String get aliasedName => _alias ?? actualTableName; @@ -15072,6 +16674,15 @@ class $WorkoutTemplateExerciseOverridesTable ), ); } + if (data.containsKey('target_score_time_ms_override')) { + context.handle( + _targetScoreTimeMsOverrideMeta, + targetScoreTimeMsOverride.isAcceptableOrUnknown( + data['target_score_time_ms_override']!, + _targetScoreTimeMsOverrideMeta, + ), + ); + } return context; } @@ -15152,6 +16763,10 @@ class $WorkoutTemplateExerciseOverridesTable DriftSqlType.double, data['${effectivePrefix}target_score_override'], ), + targetScoreTimeMsOverride: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_score_time_ms_override'], + ), ); } @@ -15180,6 +16795,7 @@ class WorkoutTemplateExerciseOverride extends DataClass final int? targetTimeSecondsOverride; final int? targetRepsOverride; final double? targetScoreOverride; + final int? targetScoreTimeMsOverride; const WorkoutTemplateExerciseOverride({ required this.id, required this.createdAt, @@ -15198,6 +16814,7 @@ class WorkoutTemplateExerciseOverride extends DataClass this.targetTimeSecondsOverride, this.targetRepsOverride, this.targetScoreOverride, + this.targetScoreTimeMsOverride, }); @override Map toColumns(bool nullToAbsent) { @@ -15241,6 +16858,11 @@ class WorkoutTemplateExerciseOverride extends DataClass if (!nullToAbsent || targetScoreOverride != null) { map['target_score_override'] = Variable(targetScoreOverride); } + if (!nullToAbsent || targetScoreTimeMsOverride != null) { + map['target_score_time_ms_override'] = Variable( + targetScoreTimeMsOverride, + ); + } return map; } @@ -15280,6 +16902,10 @@ class WorkoutTemplateExerciseOverride extends DataClass targetScoreOverride: targetScoreOverride == null && nullToAbsent ? const Value.absent() : Value(targetScoreOverride), + targetScoreTimeMsOverride: + targetScoreTimeMsOverride == null && nullToAbsent + ? const Value.absent() + : Value(targetScoreTimeMsOverride), ); } @@ -15316,6 +16942,9 @@ class WorkoutTemplateExerciseOverride extends DataClass targetScoreOverride: serializer.fromJson( json['targetScoreOverride'], ), + targetScoreTimeMsOverride: serializer.fromJson( + json['targetScoreTimeMsOverride'], + ), ); } @override @@ -15345,6 +16974,9 @@ class WorkoutTemplateExerciseOverride extends DataClass ), 'targetRepsOverride': serializer.toJson(targetRepsOverride), 'targetScoreOverride': serializer.toJson(targetScoreOverride), + 'targetScoreTimeMsOverride': serializer.toJson( + targetScoreTimeMsOverride, + ), }; } @@ -15366,6 +16998,7 @@ class WorkoutTemplateExerciseOverride extends DataClass Value targetTimeSecondsOverride = const Value.absent(), Value targetRepsOverride = const Value.absent(), Value targetScoreOverride = const Value.absent(), + Value targetScoreTimeMsOverride = const Value.absent(), }) => WorkoutTemplateExerciseOverride( id: id ?? this.id, createdAt: createdAt ?? this.createdAt, @@ -15398,6 +17031,9 @@ class WorkoutTemplateExerciseOverride extends DataClass targetScoreOverride: targetScoreOverride.present ? targetScoreOverride.value : this.targetScoreOverride, + targetScoreTimeMsOverride: targetScoreTimeMsOverride.present + ? targetScoreTimeMsOverride.value + : this.targetScoreTimeMsOverride, ); WorkoutTemplateExerciseOverride copyWithCompanion( WorkoutTemplateExerciseOverridesCompanion data, @@ -15444,6 +17080,9 @@ class WorkoutTemplateExerciseOverride extends DataClass targetScoreOverride: data.targetScoreOverride.present ? data.targetScoreOverride.value : this.targetScoreOverride, + targetScoreTimeMsOverride: data.targetScoreTimeMsOverride.present + ? data.targetScoreTimeMsOverride.value + : this.targetScoreTimeMsOverride, ); } @@ -15466,7 +17105,8 @@ class WorkoutTemplateExerciseOverride extends DataClass ..write('setsCountOverride: $setsCountOverride, ') ..write('targetTimeSecondsOverride: $targetTimeSecondsOverride, ') ..write('targetRepsOverride: $targetRepsOverride, ') - ..write('targetScoreOverride: $targetScoreOverride') + ..write('targetScoreOverride: $targetScoreOverride, ') + ..write('targetScoreTimeMsOverride: $targetScoreTimeMsOverride') ..write(')')) .toString(); } @@ -15490,6 +17130,7 @@ class WorkoutTemplateExerciseOverride extends DataClass targetTimeSecondsOverride, targetRepsOverride, targetScoreOverride, + targetScoreTimeMsOverride, ); @override bool operator ==(Object other) => @@ -15511,7 +17152,8 @@ class WorkoutTemplateExerciseOverride extends DataClass other.setsCountOverride == this.setsCountOverride && other.targetTimeSecondsOverride == this.targetTimeSecondsOverride && other.targetRepsOverride == this.targetRepsOverride && - other.targetScoreOverride == this.targetScoreOverride); + other.targetScoreOverride == this.targetScoreOverride && + other.targetScoreTimeMsOverride == this.targetScoreTimeMsOverride); } class WorkoutTemplateExerciseOverridesCompanion @@ -15533,6 +17175,7 @@ class WorkoutTemplateExerciseOverridesCompanion final Value targetTimeSecondsOverride; final Value targetRepsOverride; final Value targetScoreOverride; + final Value targetScoreTimeMsOverride; final Value rowid; const WorkoutTemplateExerciseOverridesCompanion({ this.id = const Value.absent(), @@ -15552,6 +17195,7 @@ class WorkoutTemplateExerciseOverridesCompanion this.targetTimeSecondsOverride = const Value.absent(), this.targetRepsOverride = const Value.absent(), this.targetScoreOverride = const Value.absent(), + this.targetScoreTimeMsOverride = const Value.absent(), this.rowid = const Value.absent(), }); WorkoutTemplateExerciseOverridesCompanion.insert({ @@ -15572,6 +17216,7 @@ class WorkoutTemplateExerciseOverridesCompanion this.targetTimeSecondsOverride = const Value.absent(), this.targetRepsOverride = const Value.absent(), this.targetScoreOverride = const Value.absent(), + this.targetScoreTimeMsOverride = const Value.absent(), this.rowid = const Value.absent(), }) : id = Value(id), createdAt = Value(createdAt), @@ -15599,6 +17244,7 @@ class WorkoutTemplateExerciseOverridesCompanion Expression? targetTimeSecondsOverride, Expression? targetRepsOverride, Expression? targetScoreOverride, + Expression? targetScoreTimeMsOverride, Expression? rowid, }) { return RawValuesInsertable({ @@ -15625,6 +17271,8 @@ class WorkoutTemplateExerciseOverridesCompanion 'target_reps_override': targetRepsOverride, if (targetScoreOverride != null) 'target_score_override': targetScoreOverride, + if (targetScoreTimeMsOverride != null) + 'target_score_time_ms_override': targetScoreTimeMsOverride, if (rowid != null) 'rowid': rowid, }); } @@ -15647,6 +17295,7 @@ class WorkoutTemplateExerciseOverridesCompanion Value? targetTimeSecondsOverride, Value? targetRepsOverride, Value? targetScoreOverride, + Value? targetScoreTimeMsOverride, Value? rowid, }) { return WorkoutTemplateExerciseOverridesCompanion( @@ -15670,6 +17319,8 @@ class WorkoutTemplateExerciseOverridesCompanion targetTimeSecondsOverride ?? this.targetTimeSecondsOverride, targetRepsOverride: targetRepsOverride ?? this.targetRepsOverride, targetScoreOverride: targetScoreOverride ?? this.targetScoreOverride, + targetScoreTimeMsOverride: + targetScoreTimeMsOverride ?? this.targetScoreTimeMsOverride, rowid: rowid ?? this.rowid, ); } @@ -15738,6 +17389,11 @@ class WorkoutTemplateExerciseOverridesCompanion targetScoreOverride.value, ); } + if (targetScoreTimeMsOverride.present) { + map['target_score_time_ms_override'] = Variable( + targetScoreTimeMsOverride.value, + ); + } if (rowid.present) { map['rowid'] = Variable(rowid.value); } @@ -15764,6 +17420,7 @@ class WorkoutTemplateExerciseOverridesCompanion ..write('targetTimeSecondsOverride: $targetTimeSecondsOverride, ') ..write('targetRepsOverride: $targetRepsOverride, ') ..write('targetScoreOverride: $targetScoreOverride, ') + ..write('targetScoreTimeMsOverride: $targetScoreTimeMsOverride, ') ..write('rowid: $rowid') ..write(')')) .toString(); @@ -15781,6 +17438,8 @@ abstract class _$AppDatabase extends GeneratedDatabase { late final $ActiveRestStatesTable activeRestStates = $ActiveRestStatesTable( this, ); + late final $ActiveScoreStopwatchStatesTable activeScoreStopwatchStates = + $ActiveScoreStopwatchStatesTable(this); late final $ActiveSetResultsTable activeSetResults = $ActiveSetResultsTable( this, ); @@ -15812,6 +17471,7 @@ abstract class _$AppDatabase extends GeneratedDatabase { workoutTemplates, activeWorkoutSessions, activeRestStates, + activeScoreStopwatchStates, activeSetResults, changeLogEntries, mediaAssets, @@ -16643,6 +18303,38 @@ final class $$ActiveWorkoutSessionsTableReferences ); } + static MultiTypedResultKey< + $ActiveScoreStopwatchStatesTable, + List + > + _activeScoreStopwatchStatesRefsTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.activeScoreStopwatchStates, + aliasName: + 'active_workout_sessions__id__active_score_stopwatch_states__active_workout_session_id', + ); + + $$ActiveScoreStopwatchStatesTableProcessedTableManager + get activeScoreStopwatchStatesRefs { + final manager = + $$ActiveScoreStopwatchStatesTableTableManager( + $_db, + $_db.activeScoreStopwatchStates, + ).filter( + (f) => f.activeWorkoutSessionId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _activeScoreStopwatchStatesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + static MultiTypedResultKey<$ActiveSetResultsTable, List> _activeSetResultsRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( db.activeSetResults, @@ -16852,6 +18544,33 @@ class $$ActiveWorkoutSessionsTableFilterComposer return f(composer); } + Expression activeScoreStopwatchStatesRefs( + Expression Function($$ActiveScoreStopwatchStatesTableFilterComposer f) + f, + ) { + final $$ActiveScoreStopwatchStatesTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeScoreStopwatchStates, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveScoreStopwatchStatesTableFilterComposer( + $db: $db, + $table: $db.activeScoreStopwatchStates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + Expression activeSetResultsRefs( Expression Function($$ActiveSetResultsTableFilterComposer f) f, ) { @@ -17187,6 +18906,35 @@ class $$ActiveWorkoutSessionsTableAnnotationComposer return f(composer); } + Expression activeScoreStopwatchStatesRefs( + Expression Function( + $$ActiveScoreStopwatchStatesTableAnnotationComposer a, + ) + f, + ) { + final $$ActiveScoreStopwatchStatesTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeScoreStopwatchStates, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveScoreStopwatchStatesTableAnnotationComposer( + $db: $db, + $table: $db.activeScoreStopwatchStates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + Expression activeSetResultsRefs( Expression Function($$ActiveSetResultsTableAnnotationComposer a) f, ) { @@ -17254,6 +19002,7 @@ class $$ActiveWorkoutSessionsTableTableManager PrefetchHooks Function({ bool sourceWorkoutTemplateId, bool activeRestStatesRefs, + bool activeScoreStopwatchStatesRefs, bool activeSetResultsRefs, bool workoutHistoriesRefs, }) @@ -17393,6 +19142,7 @@ class $$ActiveWorkoutSessionsTableTableManager ({ sourceWorkoutTemplateId = false, activeRestStatesRefs = false, + activeScoreStopwatchStatesRefs = false, activeSetResultsRefs = false, workoutHistoriesRefs = false, }) { @@ -17400,6 +19150,8 @@ class $$ActiveWorkoutSessionsTableTableManager db: db, explicitlyWatchedTables: [ if (activeRestStatesRefs) db.activeRestStates, + if (activeScoreStopwatchStatesRefs) + db.activeScoreStopwatchStates, if (activeSetResultsRefs) db.activeSetResults, if (workoutHistoriesRefs) db.workoutHistories, ], @@ -17462,6 +19214,28 @@ class $$ActiveWorkoutSessionsTableTableManager ), typedResults: items, ), + if (activeScoreStopwatchStatesRefs) + await $_getPrefetchedData< + ActiveWorkoutSession, + $ActiveWorkoutSessionsTable, + ActiveScoreStopwatchState + >( + currentTable: table, + referencedTable: + $$ActiveWorkoutSessionsTableReferences + ._activeScoreStopwatchStatesRefsTable(db), + managerFromTypedResult: (p0) => + $$ActiveWorkoutSessionsTableReferences( + db, + table, + p0, + ).activeScoreStopwatchStatesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.activeWorkoutSessionId == item.id, + ), + typedResults: items, + ), if (activeSetResultsRefs) await $_getPrefetchedData< ActiveWorkoutSession, @@ -17530,6 +19304,7 @@ typedef $$ActiveWorkoutSessionsTableProcessedTableManager = PrefetchHooks Function({ bool sourceWorkoutTemplateId, bool activeRestStatesRefs, + bool activeScoreStopwatchStatesRefs, bool activeSetResultsRefs, bool workoutHistoriesRefs, }) @@ -18175,6 +19950,640 @@ typedef $$ActiveRestStatesTableProcessedTableManager = ActiveRestState, PrefetchHooks Function({bool activeWorkoutSessionId}) >; +typedef $$ActiveScoreStopwatchStatesTableCreateCompanionBuilder = + ActiveScoreStopwatchStatesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String activeWorkoutSessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String status, + required DateTime startedAt, + required int accumulatedMs, + Value stoppedAt, + Value rowid, + }); +typedef $$ActiveScoreStopwatchStatesTableUpdateCompanionBuilder = + ActiveScoreStopwatchStatesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value activeWorkoutSessionId, + Value programIndex, + Value exerciseIndex, + Value setIndex, + Value status, + Value startedAt, + Value accumulatedMs, + Value stoppedAt, + Value rowid, + }); + +final class $$ActiveScoreStopwatchStatesTableReferences + extends + BaseReferences< + _$AppDatabase, + $ActiveScoreStopwatchStatesTable, + ActiveScoreStopwatchState + > { + $$ActiveScoreStopwatchStatesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $ActiveWorkoutSessionsTable _activeWorkoutSessionIdTable( + _$AppDatabase db, + ) => db.activeWorkoutSessions.createAlias( + 'active_score_stopwatch_states__active_workout_session_id__active_workout_sessions__id', + ); + + $$ActiveWorkoutSessionsTableProcessedTableManager get activeWorkoutSessionId { + final $_column = $_itemColumn('active_workout_session_id')!; + + final manager = $$ActiveWorkoutSessionsTableTableManager( + $_db, + $_db.activeWorkoutSessions, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _activeWorkoutSessionIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$ActiveScoreStopwatchStatesTableFilterComposer + extends Composer<_$AppDatabase, $ActiveScoreStopwatchStatesTable> { + $$ActiveScoreStopwatchStatesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get accumulatedMs => $composableBuilder( + column: $table.accumulatedMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get stoppedAt => $composableBuilder( + column: $table.stoppedAt, + builder: (column) => ColumnFilters(column), + ); + + $$ActiveWorkoutSessionsTableFilterComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableFilterComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveScoreStopwatchStatesTableOrderingComposer + extends Composer<_$AppDatabase, $ActiveScoreStopwatchStatesTable> { + $$ActiveScoreStopwatchStatesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get accumulatedMs => $composableBuilder( + column: $table.accumulatedMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get stoppedAt => $composableBuilder( + column: $table.stoppedAt, + builder: (column) => ColumnOrderings(column), + ); + + $$ActiveWorkoutSessionsTableOrderingComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableOrderingComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveScoreStopwatchStatesTableAnnotationComposer + extends Composer<_$AppDatabase, $ActiveScoreStopwatchStatesTable> { + $$ActiveScoreStopwatchStatesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => column, + ); + + GeneratedColumn get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => column, + ); + + GeneratedColumn get setIndex => + $composableBuilder(column: $table.setIndex, builder: (column) => column); + + GeneratedColumn get status => + $composableBuilder(column: $table.status, builder: (column) => column); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get accumulatedMs => $composableBuilder( + column: $table.accumulatedMs, + builder: (column) => column, + ); + + GeneratedColumn get stoppedAt => + $composableBuilder(column: $table.stoppedAt, builder: (column) => column); + + $$ActiveWorkoutSessionsTableAnnotationComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveScoreStopwatchStatesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ActiveScoreStopwatchStatesTable, + ActiveScoreStopwatchState, + $$ActiveScoreStopwatchStatesTableFilterComposer, + $$ActiveScoreStopwatchStatesTableOrderingComposer, + $$ActiveScoreStopwatchStatesTableAnnotationComposer, + $$ActiveScoreStopwatchStatesTableCreateCompanionBuilder, + $$ActiveScoreStopwatchStatesTableUpdateCompanionBuilder, + ( + ActiveScoreStopwatchState, + $$ActiveScoreStopwatchStatesTableReferences, + ), + ActiveScoreStopwatchState, + PrefetchHooks Function({bool activeWorkoutSessionId}) + > { + $$ActiveScoreStopwatchStatesTableTableManager( + _$AppDatabase db, + $ActiveScoreStopwatchStatesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ActiveScoreStopwatchStatesTableFilterComposer( + $db: db, + $table: table, + ), + createOrderingComposer: () => + $$ActiveScoreStopwatchStatesTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + $$ActiveScoreStopwatchStatesTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value activeWorkoutSessionId = const Value.absent(), + Value programIndex = const Value.absent(), + Value exerciseIndex = const Value.absent(), + Value setIndex = const Value.absent(), + Value status = const Value.absent(), + Value startedAt = const Value.absent(), + Value accumulatedMs = const Value.absent(), + Value stoppedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveScoreStopwatchStatesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + status: status, + startedAt: startedAt, + accumulatedMs: accumulatedMs, + stoppedAt: stoppedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String status, + required DateTime startedAt, + required int accumulatedMs, + Value stoppedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveScoreStopwatchStatesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + status: status, + startedAt: startedAt, + accumulatedMs: accumulatedMs, + stoppedAt: stoppedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ActiveScoreStopwatchStatesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({activeWorkoutSessionId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (activeWorkoutSessionId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.activeWorkoutSessionId, + referencedTable: + $$ActiveScoreStopwatchStatesTableReferences + ._activeWorkoutSessionIdTable(db), + referencedColumn: + $$ActiveScoreStopwatchStatesTableReferences + ._activeWorkoutSessionIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$ActiveScoreStopwatchStatesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ActiveScoreStopwatchStatesTable, + ActiveScoreStopwatchState, + $$ActiveScoreStopwatchStatesTableFilterComposer, + $$ActiveScoreStopwatchStatesTableOrderingComposer, + $$ActiveScoreStopwatchStatesTableAnnotationComposer, + $$ActiveScoreStopwatchStatesTableCreateCompanionBuilder, + $$ActiveScoreStopwatchStatesTableUpdateCompanionBuilder, + (ActiveScoreStopwatchState, $$ActiveScoreStopwatchStatesTableReferences), + ActiveScoreStopwatchState, + PrefetchHooks Function({bool activeWorkoutSessionId}) + >; typedef $$ActiveSetResultsTableCreateCompanionBuilder = ActiveSetResultsCompanion Function({ required String id, @@ -18199,6 +20608,8 @@ typedef $$ActiveSetResultsTableCreateCompanionBuilder = Value actualTimeMs, Value actualReps, Value actualScore, + Value actualScoreTimeMs, + Value scoreInputModeSnapshot, Value scoreLabelSnapshot, Value scoreUnitSnapshot, Value note, @@ -18229,6 +20640,8 @@ typedef $$ActiveSetResultsTableUpdateCompanionBuilder = Value actualTimeMs, Value actualReps, Value actualScore, + Value actualScoreTimeMs, + Value scoreInputModeSnapshot, Value scoreLabelSnapshot, Value scoreUnitSnapshot, Value note, @@ -18382,6 +20795,16 @@ class $$ActiveSetResultsTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnFilters(column), @@ -18541,6 +20964,16 @@ class $$ActiveSetResultsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnOrderings(column), @@ -18686,6 +21119,16 @@ class $$ActiveSetResultsTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => column, + ); + + GeneratedColumn get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => column, + ); + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => column, @@ -18779,6 +21222,8 @@ class $$ActiveSetResultsTableTableManager Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), + Value scoreInputModeSnapshot = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value note = const Value.absent(), @@ -18807,6 +21252,8 @@ class $$ActiveSetResultsTableTableManager actualTimeMs: actualTimeMs, actualReps: actualReps, actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, + scoreInputModeSnapshot: scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, note: note, @@ -18837,6 +21284,8 @@ class $$ActiveSetResultsTableTableManager Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), + Value scoreInputModeSnapshot = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value note = const Value.absent(), @@ -18865,6 +21314,8 @@ class $$ActiveSetResultsTableTableManager actualTimeMs: actualTimeMs, actualReps: actualReps, actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, + scoreInputModeSnapshot: scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, note: note, @@ -20187,6 +22638,7 @@ typedef $$ExercisesTableCreateCompanionBuilder = required bool hasTimeMeasure, required bool hasRepsMeasure, required bool hasScoreMeasure, + Value scoreInputMode, Value scoreLabel, Value scoreUnit, Value archivedAt, @@ -20212,6 +22664,7 @@ typedef $$ExercisesTableUpdateCompanionBuilder = Value hasTimeMeasure, Value hasRepsMeasure, Value hasScoreMeasure, + Value scoreInputMode, Value scoreLabel, Value scoreUnit, Value archivedAt, @@ -20366,6 +22819,11 @@ class $$ExercisesTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get scoreInputMode => $composableBuilder( + column: $table.scoreInputMode, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get scoreLabel => $composableBuilder( column: $table.scoreLabel, builder: (column) => ColumnFilters(column), @@ -20542,6 +23000,11 @@ class $$ExercisesTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get scoreInputMode => $composableBuilder( + column: $table.scoreInputMode, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get scoreLabel => $composableBuilder( column: $table.scoreLabel, builder: (column) => ColumnOrderings(column), @@ -20681,6 +23144,11 @@ class $$ExercisesTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get scoreInputMode => $composableBuilder( + column: $table.scoreInputMode, + builder: (column) => column, + ); + GeneratedColumn get scoreLabel => $composableBuilder( column: $table.scoreLabel, builder: (column) => column, @@ -20816,6 +23284,7 @@ class $$ExercisesTableTableManager Value hasTimeMeasure = const Value.absent(), Value hasRepsMeasure = const Value.absent(), Value hasScoreMeasure = const Value.absent(), + Value scoreInputMode = const Value.absent(), Value scoreLabel = const Value.absent(), Value scoreUnit = const Value.absent(), Value archivedAt = const Value.absent(), @@ -20839,6 +23308,7 @@ class $$ExercisesTableTableManager hasTimeMeasure: hasTimeMeasure, hasRepsMeasure: hasRepsMeasure, hasScoreMeasure: hasScoreMeasure, + scoreInputMode: scoreInputMode, scoreLabel: scoreLabel, scoreUnit: scoreUnit, archivedAt: archivedAt, @@ -20864,6 +23334,7 @@ class $$ExercisesTableTableManager required bool hasTimeMeasure, required bool hasRepsMeasure, required bool hasScoreMeasure, + Value scoreInputMode = const Value.absent(), Value scoreLabel = const Value.absent(), Value scoreUnit = const Value.absent(), Value archivedAt = const Value.absent(), @@ -20887,6 +23358,7 @@ class $$ExercisesTableTableManager hasTimeMeasure: hasTimeMeasure, hasRepsMeasure: hasRepsMeasure, hasScoreMeasure: hasScoreMeasure, + scoreInputMode: scoreInputMode, scoreLabel: scoreLabel, scoreUnit: scoreUnit, archivedAt: archivedAt, @@ -21615,6 +24087,7 @@ typedef $$ProgramExercisesTableCreateCompanionBuilder = required bool availableTimeSnapshot, required bool availableRepsSnapshot, required bool availableScoreSnapshot, + Value scoreInputModeSnapshot, Value scoreLabelSnapshot, Value scoreUnitSnapshot, required int setsCount, @@ -21624,6 +24097,7 @@ typedef $$ProgramExercisesTableCreateCompanionBuilder = Value targetTimeSeconds, Value targetReps, Value targetScore, + Value targetScoreTimeMs, Value restSecondsOverride, Value rowid, }); @@ -21651,6 +24125,7 @@ typedef $$ProgramExercisesTableUpdateCompanionBuilder = Value availableTimeSnapshot, Value availableRepsSnapshot, Value availableScoreSnapshot, + Value scoreInputModeSnapshot, Value scoreLabelSnapshot, Value scoreUnitSnapshot, Value setsCount, @@ -21660,6 +24135,7 @@ typedef $$ProgramExercisesTableUpdateCompanionBuilder = Value targetTimeSeconds, Value targetReps, Value targetScore, + Value targetScoreTimeMs, Value restSecondsOverride, Value rowid, }); @@ -21852,6 +24328,11 @@ class $$ProgramExercisesTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnFilters(column), @@ -21897,6 +24378,11 @@ class $$ProgramExercisesTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get targetScoreTimeMs => $composableBuilder( + column: $table.targetScoreTimeMs, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get restSecondsOverride => $composableBuilder( column: $table.restSecondsOverride, builder: (column) => ColumnFilters(column), @@ -22094,6 +24580,11 @@ class $$ProgramExercisesTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnOrderings(column), @@ -22139,6 +24630,11 @@ class $$ProgramExercisesTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get targetScoreTimeMs => $composableBuilder( + column: $table.targetScoreTimeMs, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get restSecondsOverride => $composableBuilder( column: $table.restSecondsOverride, builder: (column) => ColumnOrderings(column), @@ -22324,6 +24820,11 @@ class $$ProgramExercisesTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => column, + ); + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => column, @@ -22367,6 +24868,11 @@ class $$ProgramExercisesTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get targetScoreTimeMs => $composableBuilder( + column: $table.targetScoreTimeMs, + builder: (column) => column, + ); + GeneratedColumn get restSecondsOverride => $composableBuilder( column: $table.restSecondsOverride, builder: (column) => column, @@ -22525,6 +25031,7 @@ class $$ProgramExercisesTableTableManager Value availableTimeSnapshot = const Value.absent(), Value availableRepsSnapshot = const Value.absent(), Value availableScoreSnapshot = const Value.absent(), + Value scoreInputModeSnapshot = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value setsCount = const Value.absent(), @@ -22534,6 +25041,7 @@ class $$ProgramExercisesTableTableManager Value targetTimeSeconds = const Value.absent(), Value targetReps = const Value.absent(), Value targetScore = const Value.absent(), + Value targetScoreTimeMs = const Value.absent(), Value restSecondsOverride = const Value.absent(), Value rowid = const Value.absent(), }) => ProgramExercisesCompanion( @@ -22559,6 +25067,7 @@ class $$ProgramExercisesTableTableManager availableTimeSnapshot: availableTimeSnapshot, availableRepsSnapshot: availableRepsSnapshot, availableScoreSnapshot: availableScoreSnapshot, + scoreInputModeSnapshot: scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, setsCount: setsCount, @@ -22568,6 +25077,7 @@ class $$ProgramExercisesTableTableManager targetTimeSeconds: targetTimeSeconds, targetReps: targetReps, targetScore: targetScore, + targetScoreTimeMs: targetScoreTimeMs, restSecondsOverride: restSecondsOverride, rowid: rowid, ), @@ -22598,6 +25108,7 @@ class $$ProgramExercisesTableTableManager required bool availableTimeSnapshot, required bool availableRepsSnapshot, required bool availableScoreSnapshot, + Value scoreInputModeSnapshot = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), required int setsCount, @@ -22607,6 +25118,7 @@ class $$ProgramExercisesTableTableManager Value targetTimeSeconds = const Value.absent(), Value targetReps = const Value.absent(), Value targetScore = const Value.absent(), + Value targetScoreTimeMs = const Value.absent(), Value restSecondsOverride = const Value.absent(), Value rowid = const Value.absent(), }) => ProgramExercisesCompanion.insert( @@ -22632,6 +25144,7 @@ class $$ProgramExercisesTableTableManager availableTimeSnapshot: availableTimeSnapshot, availableRepsSnapshot: availableRepsSnapshot, availableScoreSnapshot: availableScoreSnapshot, + scoreInputModeSnapshot: scoreInputModeSnapshot, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, setsCount: setsCount, @@ -22641,6 +25154,7 @@ class $$ProgramExercisesTableTableManager targetTimeSeconds: targetTimeSeconds, targetReps: targetReps, targetScore: targetScore, + targetScoreTimeMs: targetScoreTimeMs, restSecondsOverride: restSecondsOverride, rowid: rowid, ), @@ -23647,12 +26161,15 @@ typedef $$WorkoutHistorySetResultsTableCreateCompanionBuilder = required bool timeEnabledSnapshot, required bool repsEnabledSnapshot, required bool scoreEnabledSnapshot, + Value scoreInputModeSnapshot, Value targetTimeSecondsSnapshot, Value targetRepsSnapshot, Value targetScoreSnapshot, + Value targetScoreTimeMsSnapshot, Value actualTimeMs, Value actualReps, Value actualScore, + Value actualScoreTimeMs, Value scoreLabelSnapshot, Value scoreUnitSnapshot, Value startedAt, @@ -23684,12 +26201,15 @@ typedef $$WorkoutHistorySetResultsTableUpdateCompanionBuilder = Value timeEnabledSnapshot, Value repsEnabledSnapshot, Value scoreEnabledSnapshot, + Value scoreInputModeSnapshot, Value targetTimeSecondsSnapshot, Value targetRepsSnapshot, Value targetScoreSnapshot, + Value targetScoreTimeMsSnapshot, Value actualTimeMs, Value actualReps, Value actualScore, + Value actualScoreTimeMs, Value scoreLabelSnapshot, Value scoreUnitSnapshot, Value startedAt, @@ -23845,6 +26365,11 @@ class $$WorkoutHistorySetResultsTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get targetTimeSecondsSnapshot => $composableBuilder( column: $table.targetTimeSecondsSnapshot, builder: (column) => ColumnFilters(column), @@ -23860,6 +26385,11 @@ class $$WorkoutHistorySetResultsTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get targetScoreTimeMsSnapshot => $composableBuilder( + column: $table.targetScoreTimeMsSnapshot, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get actualTimeMs => $composableBuilder( column: $table.actualTimeMs, builder: (column) => ColumnFilters(column), @@ -23875,6 +26405,11 @@ class $$WorkoutHistorySetResultsTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => ColumnFilters(column), + ); + ColumnFilters get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnFilters(column), @@ -24038,6 +26573,11 @@ class $$WorkoutHistorySetResultsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get targetTimeSecondsSnapshot => $composableBuilder( column: $table.targetTimeSecondsSnapshot, builder: (column) => ColumnOrderings(column), @@ -24053,6 +26593,11 @@ class $$WorkoutHistorySetResultsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get targetScoreTimeMsSnapshot => $composableBuilder( + column: $table.targetScoreTimeMsSnapshot, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get actualTimeMs => $composableBuilder( column: $table.actualTimeMs, builder: (column) => ColumnOrderings(column), @@ -24068,6 +26613,11 @@ class $$WorkoutHistorySetResultsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => ColumnOrderings(column), + ); + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => ColumnOrderings(column), @@ -24219,6 +26769,11 @@ class $$WorkoutHistorySetResultsTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get scoreInputModeSnapshot => $composableBuilder( + column: $table.scoreInputModeSnapshot, + builder: (column) => column, + ); + GeneratedColumn get targetTimeSecondsSnapshot => $composableBuilder( column: $table.targetTimeSecondsSnapshot, builder: (column) => column, @@ -24234,6 +26789,11 @@ class $$WorkoutHistorySetResultsTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get targetScoreTimeMsSnapshot => $composableBuilder( + column: $table.targetScoreTimeMsSnapshot, + builder: (column) => column, + ); + GeneratedColumn get actualTimeMs => $composableBuilder( column: $table.actualTimeMs, builder: (column) => column, @@ -24249,6 +26809,11 @@ class $$WorkoutHistorySetResultsTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get actualScoreTimeMs => $composableBuilder( + column: $table.actualScoreTimeMs, + builder: (column) => column, + ); + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( column: $table.scoreLabelSnapshot, builder: (column) => column, @@ -24355,12 +26920,15 @@ class $$WorkoutHistorySetResultsTableTableManager Value timeEnabledSnapshot = const Value.absent(), Value repsEnabledSnapshot = const Value.absent(), Value scoreEnabledSnapshot = const Value.absent(), + Value scoreInputModeSnapshot = const Value.absent(), Value targetTimeSecondsSnapshot = const Value.absent(), Value targetRepsSnapshot = const Value.absent(), Value targetScoreSnapshot = const Value.absent(), + Value targetScoreTimeMsSnapshot = const Value.absent(), Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value startedAt = const Value.absent(), @@ -24390,12 +26958,15 @@ class $$WorkoutHistorySetResultsTableTableManager timeEnabledSnapshot: timeEnabledSnapshot, repsEnabledSnapshot: repsEnabledSnapshot, scoreEnabledSnapshot: scoreEnabledSnapshot, + scoreInputModeSnapshot: scoreInputModeSnapshot, targetTimeSecondsSnapshot: targetTimeSecondsSnapshot, targetRepsSnapshot: targetRepsSnapshot, targetScoreSnapshot: targetScoreSnapshot, + targetScoreTimeMsSnapshot: targetScoreTimeMsSnapshot, actualTimeMs: actualTimeMs, actualReps: actualReps, actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, startedAt: startedAt, @@ -24427,12 +26998,15 @@ class $$WorkoutHistorySetResultsTableTableManager required bool timeEnabledSnapshot, required bool repsEnabledSnapshot, required bool scoreEnabledSnapshot, + Value scoreInputModeSnapshot = const Value.absent(), Value targetTimeSecondsSnapshot = const Value.absent(), Value targetRepsSnapshot = const Value.absent(), Value targetScoreSnapshot = const Value.absent(), + Value targetScoreTimeMsSnapshot = const Value.absent(), Value actualTimeMs = const Value.absent(), Value actualReps = const Value.absent(), Value actualScore = const Value.absent(), + Value actualScoreTimeMs = const Value.absent(), Value scoreLabelSnapshot = const Value.absent(), Value scoreUnitSnapshot = const Value.absent(), Value startedAt = const Value.absent(), @@ -24462,12 +27036,15 @@ class $$WorkoutHistorySetResultsTableTableManager timeEnabledSnapshot: timeEnabledSnapshot, repsEnabledSnapshot: repsEnabledSnapshot, scoreEnabledSnapshot: scoreEnabledSnapshot, + scoreInputModeSnapshot: scoreInputModeSnapshot, targetTimeSecondsSnapshot: targetTimeSecondsSnapshot, targetRepsSnapshot: targetRepsSnapshot, targetScoreSnapshot: targetScoreSnapshot, + targetScoreTimeMsSnapshot: targetScoreTimeMsSnapshot, actualTimeMs: actualTimeMs, actualReps: actualReps, actualScore: actualScore, + actualScoreTimeMs: actualScoreTimeMs, scoreLabelSnapshot: scoreLabelSnapshot, scoreUnitSnapshot: scoreUnitSnapshot, startedAt: startedAt, @@ -25371,6 +27948,7 @@ typedef $$WorkoutTemplateExerciseOverridesTableCreateCompanionBuilder = Value targetTimeSecondsOverride, Value targetRepsOverride, Value targetScoreOverride, + Value targetScoreTimeMsOverride, Value rowid, }); typedef $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder = @@ -25392,6 +27970,7 @@ typedef $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder = Value targetTimeSecondsOverride, Value targetRepsOverride, Value targetScoreOverride, + Value targetScoreTimeMsOverride, Value rowid, }); @@ -25521,6 +28100,11 @@ class $$WorkoutTemplateExerciseOverridesTableFilterComposer builder: (column) => ColumnFilters(column), ); + ColumnFilters get targetScoreTimeMsOverride => $composableBuilder( + column: $table.targetScoreTimeMsOverride, + builder: (column) => ColumnFilters(column), + ); + $$WorkoutTemplateProgramsTableFilterComposer get workoutTemplateProgramId { final $$WorkoutTemplateProgramsTableFilterComposer composer = $composerBuilder( @@ -25635,6 +28219,11 @@ class $$WorkoutTemplateExerciseOverridesTableOrderingComposer builder: (column) => ColumnOrderings(column), ); + ColumnOrderings get targetScoreTimeMsOverride => $composableBuilder( + column: $table.targetScoreTimeMsOverride, + builder: (column) => ColumnOrderings(column), + ); + $$WorkoutTemplateProgramsTableOrderingComposer get workoutTemplateProgramId { final $$WorkoutTemplateProgramsTableOrderingComposer composer = $composerBuilder( @@ -25739,6 +28328,11 @@ class $$WorkoutTemplateExerciseOverridesTableAnnotationComposer builder: (column) => column, ); + GeneratedColumn get targetScoreTimeMsOverride => $composableBuilder( + column: $table.targetScoreTimeMsOverride, + builder: (column) => column, + ); + $$WorkoutTemplateProgramsTableAnnotationComposer get workoutTemplateProgramId { final $$WorkoutTemplateProgramsTableAnnotationComposer composer = @@ -25824,6 +28418,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager Value targetTimeSecondsOverride = const Value.absent(), Value targetRepsOverride = const Value.absent(), Value targetScoreOverride = const Value.absent(), + Value targetScoreTimeMsOverride = const Value.absent(), Value rowid = const Value.absent(), }) => WorkoutTemplateExerciseOverridesCompanion( id: id, @@ -25843,6 +28438,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager targetTimeSecondsOverride: targetTimeSecondsOverride, targetRepsOverride: targetRepsOverride, targetScoreOverride: targetScoreOverride, + targetScoreTimeMsOverride: targetScoreTimeMsOverride, rowid: rowid, ), createCompanionCallback: @@ -25864,6 +28460,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager Value targetTimeSecondsOverride = const Value.absent(), Value targetRepsOverride = const Value.absent(), Value targetScoreOverride = const Value.absent(), + Value targetScoreTimeMsOverride = const Value.absent(), Value rowid = const Value.absent(), }) => WorkoutTemplateExerciseOverridesCompanion.insert( id: id, @@ -25883,6 +28480,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager targetTimeSecondsOverride: targetTimeSecondsOverride, targetRepsOverride: targetRepsOverride, targetScoreOverride: targetScoreOverride, + targetScoreTimeMsOverride: targetScoreTimeMsOverride, rowid: rowid, ), withReferenceMapper: (p0) => p0 @@ -25971,6 +28569,12 @@ class $AppDatabaseManager { $$ActiveWorkoutSessionsTableTableManager(_db, _db.activeWorkoutSessions); $$ActiveRestStatesTableTableManager get activeRestStates => $$ActiveRestStatesTableTableManager(_db, _db.activeRestStates); + $$ActiveScoreStopwatchStatesTableTableManager + get activeScoreStopwatchStates => + $$ActiveScoreStopwatchStatesTableTableManager( + _db, + _db.activeScoreStopwatchStates, + ); $$ActiveSetResultsTableTableManager get activeSetResults => $$ActiveSetResultsTableTableManager(_db, _db.activeSetResults); $$ChangeLogEntriesTableTableManager get changeLogEntries => diff --git a/lib/infrastructure/local/drift_repositories.dart b/lib/infrastructure/local/drift_repositories.dart index f479db5..8d5444a 100644 --- a/lib/infrastructure/local/drift_repositories.dart +++ b/lib/infrastructure/local/drift_repositories.dart @@ -469,6 +469,77 @@ final class DriftActiveSessionRepository implements ActiveSessionRepository { return row == null ? null : _activeRestStateFromRow(row); } + @override + Future saveScoreStopwatchState( + domain.ActiveScoreStopwatchState state, + ) async { + await _upsertWithChangeLog( + database: database, + tableName: 'active_score_stopwatch_states', + entityType: 'ActiveScoreStopwatchState', + metadata: state.metadata, + write: () => database + .into(database.activeScoreStopwatchStates) + .insertOnConflictUpdate(_activeScoreStopwatchStateCompanion(state)), + ); + } + + @override + Future deleteScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required DateTime deletedAt, + }) async { + final row = + await (database.select(database.activeScoreStopwatchStates)..where( + (table) => + table.activeWorkoutSessionId.equals(sessionId) & + table.programIndex.equals(programIndex) & + table.exerciseIndex.equals(exerciseIndex) & + table.setIndex.equals(setIndex) & + table.deletedAt.isNull(), + )) + .getSingleOrNull(); + if (row == null) { + return; + } + final revision = row.localRevision + 1; + await (database.delete( + database.activeScoreStopwatchStates, + )..where((table) => table.id.equals(row.id))).go(); + await _writeChangeLog( + database: database, + entityType: 'ActiveScoreStopwatchState', + entityId: row.id, + operation: 'delete', + localRevision: revision, + originDeviceId: row.originDeviceId, + createdAt: deletedAt, + ); + } + + @override + Future findScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + final row = + await (database.select(database.activeScoreStopwatchStates)..where( + (table) => + table.activeWorkoutSessionId.equals(sessionId) & + table.programIndex.equals(programIndex) & + table.exerciseIndex.equals(exerciseIndex) & + table.setIndex.equals(setIndex) & + table.deletedAt.isNull(), + )) + .getSingleOrNull(); + return row == null ? null : _activeScoreStopwatchStateFromRow(row); + } + @override Future> listSetResults(String sessionId) async { final rows = @@ -492,6 +563,26 @@ final class DriftActiveSessionRepository implements ActiveSessionRepository { .get(); return rows.map(_activeRestStateFromRow).toList(); } + + @override + Future> listScoreStopwatchStates( + String sessionId, + ) async { + final rows = + await (database.select(database.activeScoreStopwatchStates) + ..where( + (table) => + table.activeWorkoutSessionId.equals(sessionId) & + table.deletedAt.isNull(), + ) + ..orderBy([ + (table) => OrderingTerm.asc(table.programIndex), + (table) => OrderingTerm.asc(table.exerciseIndex), + (table) => OrderingTerm.asc(table.setIndex), + ])) + .get(); + return rows.map(_activeScoreStopwatchStateFromRow).toList(); + } } final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository { @@ -872,6 +963,7 @@ db.ExercisesCompanion _exerciseCompanion(domain.Exercise exercise) { hasTimeMeasure: Value(exercise.hasTimeMeasure), hasRepsMeasure: Value(exercise.hasRepsMeasure), hasScoreMeasure: Value(exercise.hasScoreMeasure), + scoreInputMode: Value(_scoreInputModeToDb(exercise.scoreInputMode)), scoreLabel: Value(exercise.scoreLabel), scoreUnit: Value(exercise.scoreUnit), archivedAt: Value(_utcOrNull(exercise.archivedAt)), @@ -888,6 +980,7 @@ domain.Exercise _exerciseFromRow(db.Exercise row) { hasTimeMeasure: row.hasTimeMeasure, hasRepsMeasure: row.hasRepsMeasure, hasScoreMeasure: row.hasScoreMeasure, + scoreInputMode: _scoreInputModeFromDb(row.scoreInputMode), scoreLabel: row.scoreLabel, scoreUnit: row.scoreUnit, archivedAt: _utcOrNull(row.archivedAt), @@ -995,6 +1088,9 @@ db.ProgramExercisesCompanion _programExerciseCompanion( availableTimeSnapshot: Value(exercise.availableTimeSnapshot), availableRepsSnapshot: Value(exercise.availableRepsSnapshot), availableScoreSnapshot: Value(exercise.availableScoreSnapshot), + scoreInputModeSnapshot: Value( + _scoreInputModeToDb(exercise.scoreInputModeSnapshot), + ), scoreLabelSnapshot: Value(exercise.scoreLabelSnapshot), scoreUnitSnapshot: Value(exercise.scoreUnitSnapshot), setsCount: Value(exercise.setsCount), @@ -1004,6 +1100,7 @@ db.ProgramExercisesCompanion _programExerciseCompanion( targetTimeSeconds: Value(exercise.targetTimeSeconds), targetReps: Value(exercise.targetReps), targetScore: Value(exercise.targetScore), + targetScoreTimeMs: Value(exercise.targetScoreTimeMs), restSecondsOverride: Value(exercise.restSecondsOverride), ); } @@ -1022,6 +1119,7 @@ domain.ProgramExercise _programExerciseFromRow(db.ProgramExercise row) { availableTimeSnapshot: row.availableTimeSnapshot, availableRepsSnapshot: row.availableRepsSnapshot, availableScoreSnapshot: row.availableScoreSnapshot, + scoreInputModeSnapshot: _scoreInputModeFromDb(row.scoreInputModeSnapshot), scoreLabelSnapshot: row.scoreLabelSnapshot, scoreUnitSnapshot: row.scoreUnitSnapshot, setsCount: row.setsCount, @@ -1031,6 +1129,7 @@ domain.ProgramExercise _programExerciseFromRow(db.ProgramExercise row) { targetTimeSeconds: row.targetTimeSeconds, targetReps: row.targetReps, targetScore: row.targetScore, + targetScoreTimeMs: row.targetScoreTimeMs, restSecondsOverride: row.restSecondsOverride, ); } @@ -1132,6 +1231,7 @@ _workoutTemplateExerciseOverrideCompanion( targetTimeSecondsOverride: Value(override.targetTimeSecondsOverride), targetRepsOverride: Value(override.targetRepsOverride), targetScoreOverride: Value(override.targetScoreOverride), + targetScoreTimeMsOverride: Value(override.targetScoreTimeMsOverride), ); } @@ -1146,6 +1246,7 @@ domain.WorkoutTemplateExerciseOverride _workoutTemplateExerciseOverrideFromRow( targetTimeSecondsOverride: row.targetTimeSecondsOverride, targetRepsOverride: row.targetRepsOverride, targetScoreOverride: row.targetScoreOverride, + targetScoreTimeMsOverride: row.targetScoreTimeMsOverride, ); } @@ -1225,6 +1326,10 @@ db.ActiveSetResultsCompanion _activeSetResultCompanion( actualTimeMs: Value(result.actualTimeMs), actualReps: Value(result.actualReps), actualScore: Value(result.actualScore), + actualScoreTimeMs: Value(result.actualScoreTimeMs), + scoreInputModeSnapshot: Value( + _scoreInputModeToDb(result.scoreInputModeSnapshot), + ), scoreLabelSnapshot: Value(result.scoreLabelSnapshot), scoreUnitSnapshot: Value(result.scoreUnitSnapshot), note: Value(result.note), @@ -1246,6 +1351,8 @@ domain.ActiveSetResult _activeSetResultFromRow(db.ActiveSetResult row) { actualTimeMs: row.actualTimeMs, actualReps: row.actualReps, actualScore: row.actualScore, + actualScoreTimeMs: row.actualScoreTimeMs, + scoreInputModeSnapshot: _scoreInputModeFromDb(row.scoreInputModeSnapshot), scoreLabelSnapshot: row.scoreLabelSnapshot, scoreUnitSnapshot: row.scoreUnitSnapshot, note: row.note, @@ -1296,6 +1403,49 @@ domain.ActiveRestState _activeRestStateFromRow(db.ActiveRestState row) { ); } +db.ActiveScoreStopwatchStatesCompanion _activeScoreStopwatchStateCompanion( + domain.ActiveScoreStopwatchState state, +) { + final values = _metadataValues(state.metadata); + return db.ActiveScoreStopwatchStatesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + activeWorkoutSessionId: Value(state.activeWorkoutSessionId), + programIndex: Value(state.programIndex), + exerciseIndex: Value(state.exerciseIndex), + setIndex: Value(state.setIndex), + status: Value(_scoreStopwatchStatusToDb(state.status)), + startedAt: Value(state.startedAt.toUtc()), + accumulatedMs: Value(state.accumulatedMs), + stoppedAt: Value(_utcOrNull(state.stoppedAt)), + ); +} + +domain.ActiveScoreStopwatchState _activeScoreStopwatchStateFromRow( + db.ActiveScoreStopwatchState row, +) { + return domain.ActiveScoreStopwatchState( + metadata: _metadataFromRow(row), + activeWorkoutSessionId: row.activeWorkoutSessionId, + programIndex: row.programIndex, + exerciseIndex: row.exerciseIndex, + setIndex: row.setIndex, + status: _scoreStopwatchStatusFromDb(row.status), + startedAt: _utc(row.startedAt), + accumulatedMs: row.accumulatedMs, + stoppedAt: _utcOrNull(row.stoppedAt), + ); +} + db.WorkoutHistoriesCompanion _workoutHistoryCompanion( domain.WorkoutHistory history, ) { @@ -1350,12 +1500,17 @@ db.WorkoutHistorySetResultsCompanion _workoutHistorySetResultCompanion( timeEnabledSnapshot: Value(result.timeEnabledSnapshot), repsEnabledSnapshot: Value(result.repsEnabledSnapshot), scoreEnabledSnapshot: Value(result.scoreEnabledSnapshot), + scoreInputModeSnapshot: Value( + _scoreInputModeToDb(result.scoreInputModeSnapshot), + ), targetTimeSecondsSnapshot: Value(result.targetTimeSecondsSnapshot), targetRepsSnapshot: Value(result.targetRepsSnapshot), targetScoreSnapshot: Value(result.targetScoreSnapshot), + targetScoreTimeMsSnapshot: Value(result.targetScoreTimeMsSnapshot), actualTimeMs: Value(result.actualTimeMs), actualReps: Value(result.actualReps), actualScore: Value(result.actualScore), + actualScoreTimeMs: Value(result.actualScoreTimeMs), scoreLabelSnapshot: Value(result.scoreLabelSnapshot), scoreUnitSnapshot: Value(result.scoreUnitSnapshot), startedAt: Value(_utcOrNull(result.startedAt)), @@ -1398,12 +1553,15 @@ domain.WorkoutHistorySetResult _workoutHistorySetResultFromRow( timeEnabledSnapshot: row.timeEnabledSnapshot, repsEnabledSnapshot: row.repsEnabledSnapshot, scoreEnabledSnapshot: row.scoreEnabledSnapshot, + scoreInputModeSnapshot: _scoreInputModeFromDb(row.scoreInputModeSnapshot), targetTimeSecondsSnapshot: row.targetTimeSecondsSnapshot, targetRepsSnapshot: row.targetRepsSnapshot, targetScoreSnapshot: row.targetScoreSnapshot, + targetScoreTimeMsSnapshot: row.targetScoreTimeMsSnapshot, actualTimeMs: row.actualTimeMs, actualReps: row.actualReps, actualScore: row.actualScore, + actualScoreTimeMs: row.actualScoreTimeMs, scoreLabelSnapshot: row.scoreLabelSnapshot, scoreUnitSnapshot: row.scoreUnitSnapshot, startedAt: _utcOrNull(row.startedAt), @@ -1446,6 +1604,17 @@ domain.MediaKind _mediaKindFromDb(String value) => switch (value) { _ => throw domain.DomainException('Unknown media kind: $value'), }; +String _scoreInputModeToDb(domain.ScoreInputMode mode) => switch (mode) { + domain.ScoreInputMode.manual => 'manual', + domain.ScoreInputMode.stopwatch => 'stopwatch', +}; + +domain.ScoreInputMode _scoreInputModeFromDb(String value) => switch (value) { + 'manual' => domain.ScoreInputMode.manual, + 'stopwatch' => domain.ScoreInputMode.stopwatch, + _ => throw domain.DomainException('Unknown score input mode: $value'), +}; + String _setResultStatusToDb(domain.SetResultStatus status) => switch (status) { domain.SetResultStatus.completed => 'completed', domain.SetResultStatus.skipped => 'skipped', @@ -1457,6 +1626,21 @@ domain.SetResultStatus _setResultStatusFromDb(String value) => switch (value) { _ => throw domain.DomainException('Unknown set result status: $value'), }; +String _scoreStopwatchStatusToDb(domain.ActiveScoreStopwatchStatus status) => + switch (status) { + domain.ActiveScoreStopwatchStatus.running => 'running', + domain.ActiveScoreStopwatchStatus.stopped => 'stopped', + }; + +domain.ActiveScoreStopwatchStatus _scoreStopwatchStatusFromDb(String value) => + switch (value) { + 'running' => domain.ActiveScoreStopwatchStatus.running, + 'stopped' => domain.ActiveScoreStopwatchStatus.stopped, + _ => throw domain.DomainException( + 'Unknown active score stopwatch status: $value', + ), + }; + domain.ActiveWorkoutStatus _activeStatusFromDb(String value) => switch (value) { 'running' => domain.ActiveWorkoutStatus.running, 'paused' => domain.ActiveWorkoutStatus.paused, diff --git a/lib/infrastructure/local/tables.dart b/lib/infrastructure/local/tables.dart index a7ae9d8..399ecfe 100644 --- a/lib/infrastructure/local/tables.dart +++ b/lib/infrastructure/local/tables.dart @@ -65,6 +65,8 @@ class Exercises extends SyncableTable { BoolColumn get hasTimeMeasure => boolean()(); BoolColumn get hasRepsMeasure => boolean()(); BoolColumn get hasScoreMeasure => boolean()(); + TextColumn get scoreInputMode => + text().withDefault(const Constant('manual'))(); TextColumn get scoreLabel => text().nullable()(); TextColumn get scoreUnit => text().nullable()(); DateTimeColumn get archivedAt => dateTime().nullable()(); @@ -72,9 +74,11 @@ class Exercises extends SyncableTable { @override List get customConstraints => [ 'CHECK (has_time_measure OR has_reps_measure OR has_score_measure)', - 'CHECK (NOT has_score_measure OR (score_label IS NOT NULL ' - 'AND length(trim(score_label)) > 0 AND score_unit IS NOT NULL ' - 'AND length(trim(score_unit)) > 0))', + "CHECK (score_input_mode IN ('manual', 'stopwatch'))", + "CHECK (has_score_measure OR score_input_mode = 'manual')", + "CHECK (score_input_mode != 'manual' OR NOT has_score_measure OR " + '(score_label IS NOT NULL AND length(trim(score_label)) > 0 ' + 'AND score_unit IS NOT NULL AND length(trim(score_unit)) > 0))', ]; } @@ -111,6 +115,8 @@ class ProgramExercises extends SyncableTable { BoolColumn get availableTimeSnapshot => boolean()(); BoolColumn get availableRepsSnapshot => boolean()(); BoolColumn get availableScoreSnapshot => boolean()(); + TextColumn get scoreInputModeSnapshot => + text().withDefault(const Constant('manual'))(); TextColumn get scoreLabelSnapshot => text().nullable()(); TextColumn get scoreUnitSnapshot => text().nullable()(); IntColumn get setsCount => integer()(); @@ -120,6 +126,7 @@ class ProgramExercises extends SyncableTable { IntColumn get targetTimeSeconds => integer().nullable()(); IntColumn get targetReps => integer().nullable()(); RealColumn get targetScore => real().nullable()(); + IntColumn get targetScoreTimeMs => integer().nullable()(); IntColumn get restSecondsOverride => integer().nullable()(); @override @@ -134,11 +141,18 @@ class ProgramExercises extends SyncableTable { 'CHECK (target_time_seconds IS NULL OR target_time_seconds > 0)', 'CHECK (target_reps IS NULL OR target_reps > 0)', 'CHECK (target_score IS NULL OR target_score >= 0)', + 'CHECK (target_score_time_ms IS NULL OR target_score_time_ms > 0)', 'CHECK (rest_seconds_override IS NULL OR rest_seconds_override >= 0)', 'CHECK (target_time_seconds IS NULL OR time_enabled)', 'CHECK (target_reps IS NULL OR reps_enabled)', - 'CHECK (target_score IS NULL OR score_enabled)', - 'CHECK (NOT available_score_snapshot OR (score_label_snapshot ' + "CHECK (score_input_mode_snapshot IN ('manual', 'stopwatch'))", + 'CHECK (target_score IS NULL OR ' + "(score_enabled AND score_input_mode_snapshot = 'manual'))", + 'CHECK (target_score_time_ms IS NULL OR ' + "(score_enabled AND score_input_mode_snapshot = 'stopwatch'))", + 'CHECK (target_score IS NULL OR target_score_time_ms IS NULL)', + "CHECK (score_input_mode_snapshot != 'manual' OR " + 'NOT available_score_snapshot OR (score_label_snapshot ' 'IS NOT NULL AND length(trim(score_label_snapshot)) > 0 ' 'AND score_unit_snapshot IS NOT NULL ' 'AND length(trim(score_unit_snapshot)) > 0))', @@ -185,6 +199,7 @@ class WorkoutTemplateExerciseOverrides extends SyncableTable { IntColumn get targetTimeSecondsOverride => integer().nullable()(); IntColumn get targetRepsOverride => integer().nullable()(); RealColumn get targetScoreOverride => real().nullable()(); + IntColumn get targetScoreTimeMsOverride => integer().nullable()(); @override List get customConstraints => [ @@ -194,6 +209,10 @@ class WorkoutTemplateExerciseOverrides extends SyncableTable { 'target_time_seconds_override > 0)', 'CHECK (target_reps_override IS NULL OR target_reps_override > 0)', 'CHECK (target_score_override IS NULL OR target_score_override >= 0)', + 'CHECK (target_score_time_ms_override IS NULL OR ' + 'target_score_time_ms_override > 0)', + 'CHECK (target_score_override IS NULL OR ' + 'target_score_time_ms_override IS NULL)', ]; } @@ -241,6 +260,9 @@ class ActiveSetResults extends SyncableTable { IntColumn get actualTimeMs => integer().nullable()(); IntColumn get actualReps => integer().nullable()(); RealColumn get actualScore => real().nullable()(); + IntColumn get actualScoreTimeMs => integer().nullable()(); + TextColumn get scoreInputModeSnapshot => + text().withDefault(const Constant('manual'))(); TextColumn get scoreLabelSnapshot => text().nullable()(); TextColumn get scoreUnitSnapshot => text().nullable()(); TextColumn get note => text().nullable()(); @@ -256,9 +278,17 @@ class ActiveSetResults extends SyncableTable { 'CHECK (actual_time_ms IS NULL OR actual_time_ms >= 0)', 'CHECK (actual_reps IS NULL OR actual_reps >= 0)', 'CHECK (actual_score IS NULL OR actual_score >= 0)', + 'CHECK (actual_score_time_ms IS NULL OR actual_score_time_ms >= 0)', "CHECK (status IN ('completed', 'skipped'))", 'CHECK (status != \'skipped\' OR (actual_time_ms IS NULL ' - 'AND actual_reps IS NULL AND actual_score IS NULL))', + 'AND actual_reps IS NULL AND actual_score IS NULL ' + 'AND actual_score_time_ms IS NULL))', + "CHECK (score_input_mode_snapshot IN ('manual', 'stopwatch'))", + 'CHECK (actual_score IS NULL OR ' + "score_input_mode_snapshot = 'manual')", + 'CHECK (actual_score_time_ms IS NULL OR ' + "score_input_mode_snapshot = 'stopwatch')", + 'CHECK (actual_score IS NULL OR actual_score_time_ms IS NULL)', 'CHECK (actual_score IS NULL OR (score_label_snapshot IS NOT NULL ' 'AND length(trim(score_label_snapshot)) > 0 ' 'AND score_unit_snapshot IS NOT NULL ' @@ -266,6 +296,32 @@ class ActiveSetResults extends SyncableTable { ]; } +class ActiveScoreStopwatchStates extends SyncableTable { + @override + String get tableName => 'active_score_stopwatch_states'; + + TextColumn get activeWorkoutSessionId => + text().references(ActiveWorkoutSessions, #id)(); + IntColumn get programIndex => integer()(); + IntColumn get exerciseIndex => integer()(); + IntColumn get setIndex => integer()(); + TextColumn get status => text()(); + DateTimeColumn get startedAt => dateTime()(); + IntColumn get accumulatedMs => integer()(); + DateTimeColumn get stoppedAt => dateTime().nullable()(); + + @override + List get customConstraints => [ + 'UNIQUE (active_workout_session_id, program_index, exercise_index, ' + 'set_index)', + 'CHECK (program_index >= 0)', + 'CHECK (exercise_index >= 0)', + 'CHECK (set_index >= 0)', + "CHECK (status IN ('running', 'stopped'))", + 'CHECK (accumulated_ms >= 0)', + ]; +} + class ActiveRestStates extends SyncableTable { @override String get tableName => 'active_rest_states'; @@ -326,12 +382,16 @@ class WorkoutHistorySetResults extends SyncableTable { BoolColumn get timeEnabledSnapshot => boolean()(); BoolColumn get repsEnabledSnapshot => boolean()(); BoolColumn get scoreEnabledSnapshot => boolean()(); + TextColumn get scoreInputModeSnapshot => + text().withDefault(const Constant('manual'))(); IntColumn get targetTimeSecondsSnapshot => integer().nullable()(); IntColumn get targetRepsSnapshot => integer().nullable()(); RealColumn get targetScoreSnapshot => real().nullable()(); + IntColumn get targetScoreTimeMsSnapshot => integer().nullable()(); IntColumn get actualTimeMs => integer().nullable()(); IntColumn get actualReps => integer().nullable()(); RealColumn get actualScore => real().nullable()(); + IntColumn get actualScoreTimeMs => integer().nullable()(); TextColumn get scoreLabelSnapshot => text().nullable()(); TextColumn get scoreUnitSnapshot => text().nullable()(); DateTimeColumn get startedAt => dateTime().nullable()(); @@ -351,12 +411,28 @@ class WorkoutHistorySetResults extends SyncableTable { 'target_time_seconds_snapshot > 0)', 'CHECK (target_reps_snapshot IS NULL OR target_reps_snapshot > 0)', 'CHECK (target_score_snapshot IS NULL OR target_score_snapshot >= 0)', + 'CHECK (target_score_time_ms_snapshot IS NULL OR ' + 'target_score_time_ms_snapshot > 0)', 'CHECK (actual_time_ms IS NULL OR actual_time_ms >= 0)', 'CHECK (actual_reps IS NULL OR actual_reps >= 0)', 'CHECK (actual_score IS NULL OR actual_score >= 0)', + 'CHECK (actual_score_time_ms IS NULL OR actual_score_time_ms >= 0)', "CHECK (status IN ('completed', 'skipped'))", 'CHECK (status != \'skipped\' OR (actual_time_ms IS NULL ' - 'AND actual_reps IS NULL AND actual_score IS NULL))', + 'AND actual_reps IS NULL AND actual_score IS NULL ' + 'AND actual_score_time_ms IS NULL))', + "CHECK (score_input_mode_snapshot IN ('manual', 'stopwatch'))", + 'CHECK (target_score_snapshot IS NULL OR ' + "(score_enabled_snapshot AND score_input_mode_snapshot = 'manual'))", + 'CHECK (target_score_time_ms_snapshot IS NULL OR ' + "(score_enabled_snapshot AND score_input_mode_snapshot = 'stopwatch'))", + 'CHECK (target_score_snapshot IS NULL OR ' + 'target_score_time_ms_snapshot IS NULL)', + 'CHECK (actual_score IS NULL OR ' + "score_input_mode_snapshot = 'manual')", + 'CHECK (actual_score_time_ms IS NULL OR ' + "score_input_mode_snapshot = 'stopwatch')", + 'CHECK (actual_score IS NULL OR actual_score_time_ms IS NULL)', 'CHECK (actual_score IS NULL OR (score_label_snapshot IS NOT NULL ' 'AND length(trim(score_label_snapshot)) > 0 ' 'AND score_unit_snapshot IS NOT NULL ' diff --git a/test/application/use_cases_test.dart b/test/application/use_cases_test.dart index fee0301..186a46f 100644 --- a/test/application/use_cases_test.dart +++ b/test/application/use_cases_test.dart @@ -326,6 +326,124 @@ void main() { ]); }, ); + + test( + 'score stopwatch start stop resume accumulates elapsed duration', + () async { + final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12)); + final session = _sessionWithSnapshot( + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + ); + final repository = _FakeActiveSessionRepository()..session = session; + final useCase = _activeUseCase(repository, clock); + + await useCase.startScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + clock.value = clock.value.add(const Duration(seconds: 5)); + final stopped = await useCase.stopScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + clock.value = clock.value.add(const Duration(seconds: 10)); + await useCase.resumeScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + clock.value = clock.value.add(const Duration(seconds: 3)); + final stoppedAgain = await useCase.stopScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + + expect(stopped.accumulatedMs, 5000); + expect(stoppedAgain.accumulatedMs, 8000); + }, + ); + + test('score stopwatch state survives use case reconstruction', () async { + final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12)); + final session = _sessionWithSnapshot( + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + ); + final repository = _FakeActiveSessionRepository()..session = session; + + await _activeUseCase(repository, clock).startScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + clock.value = clock.value.add(const Duration(seconds: 4)); + + final reconstructed = _activeUseCase(repository, clock); + final stopped = await reconstructed.stopScoreStopwatch( + sessionId: session.metadata.id, + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + + expect(stopped.accumulatedMs, 4000); + }); + + test('score result enforces manual xor stopwatch values', () { + expect( + () => ActiveSetResult( + metadata: _metadata('result-1'), + activeWorkoutSessionId: 'session-1', + programSnapshotId: 'program-1', + exerciseSnapshotId: 'exercise-1', + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + actualScore: 12, + actualScoreTimeMs: 12000, + ), + throwsA(isA()), + ); + expect( + () => ActiveSetResult( + metadata: _metadata('result-2'), + activeWorkoutSessionId: 'session-1', + programSnapshotId: 'program-1', + exerciseSnapshotId: 'exercise-1', + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + actualScore: 12, + scoreInputModeSnapshot: ScoreInputMode.stopwatch, + ), + throwsA(isA()), + ); + expect( + () => ActiveSetResult( + metadata: _metadata('result-3'), + activeWorkoutSessionId: 'session-1', + programSnapshotId: 'program-1', + exerciseSnapshotId: 'exercise-1', + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + actualScoreTimeMs: 12000, + scoreInputModeSnapshot: ScoreInputMode.manual, + ), + throwsA(isA()), + ); + }); } EntityMetadata _metadata(String id) { @@ -414,6 +532,7 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { ActiveWorkoutSession? session; final results = []; final restStates = {}; + final scoreStopwatchStates = {}; @override Future findById(String id) async { @@ -426,6 +545,25 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { @override Future findRestStateById(String id) async => restStates[id]; + @override + Future findScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + return scoreStopwatchStates.values + .where( + (state) => + state.activeWorkoutSessionId == sessionId && + state.programIndex == programIndex && + state.exerciseIndex == exerciseIndex && + state.setIndex == setIndex && + state.metadata.deletedAt == null, + ) + .firstOrNull; + } + @override Future> listRestStates(String sessionId) async { return restStates.values @@ -433,6 +571,19 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { .toList(); } + @override + Future> listScoreStopwatchStates( + String sessionId, + ) async { + return scoreStopwatchStates.values + .where( + (state) => + state.activeWorkoutSessionId == sessionId && + state.metadata.deletedAt == null, + ) + .toList(); + } + @override Future> listSetResults(String sessionId) async { return results @@ -450,6 +601,31 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { restStates[restState.metadata.id] = restState; } + @override + Future saveScoreStopwatchState(ActiveScoreStopwatchState state) async { + scoreStopwatchStates[state.metadata.id] = state; + } + + @override + Future deleteScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required DateTime deletedAt, + }) async { + final state = await findScoreStopwatchState( + sessionId: sessionId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + ); + if (state == null) { + return; + } + scoreStopwatchStates.remove(state.metadata.id); + } + @override Future saveSetResult(ActiveSetResult result) async { results.removeWhere( diff --git a/test/presentation/history_screen_test.dart b/test/presentation/history_screen_test.dart index 394b599..3e6fe73 100644 --- a/test/presentation/history_screen_test.dart +++ b/test/presentation/history_screen_test.dart @@ -287,11 +287,26 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { @override Future findRestStateById(String id) async => null; + @override + Future findScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async => null; + @override Future> listRestStates(String sessionId) async { return const []; } + @override + Future> listScoreStopwatchStates( + String sessionId, + ) async { + return const []; + } + @override Future> listSetResults(String sessionId) async { return const []; @@ -303,6 +318,18 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { @override Future saveRestState(ActiveRestState restState) async {} + @override + Future saveScoreStopwatchState(ActiveScoreStopwatchState state) async {} + + @override + Future deleteScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required DateTime deletedAt, + }) async {} + @override Future saveSetResult(ActiveSetResult result) async {} } diff --git a/test/presentation/workout_execution_screen_test.dart b/test/presentation/workout_execution_screen_test.dart index 83e3910..7cf8944 100644 --- a/test/presentation/workout_execution_screen_test.dart +++ b/test/presentation/workout_execution_screen_test.dart @@ -545,6 +545,7 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { ActiveWorkoutSession? session; final results = []; final restStates = []; + final scoreStopwatchStates = []; @override Future findById(String id) async { @@ -564,6 +565,25 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { return null; } + @override + Future findScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + for (final state in scoreStopwatchStates) { + if (state.activeWorkoutSessionId == sessionId && + state.programIndex == programIndex && + state.exerciseIndex == exerciseIndex && + state.setIndex == setIndex && + state.metadata.deletedAt == null) { + return state; + } + } + return null; + } + @override Future> listRestStates(String sessionId) async { return restStates @@ -571,6 +591,15 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { .toList(); } + @override + Future> listScoreStopwatchStates( + String sessionId, + ) async { + return scoreStopwatchStates + .where((state) => state.activeWorkoutSessionId == sessionId) + .toList(); + } + @override Future> listSetResults(String sessionId) async { return results; @@ -593,6 +622,27 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository { } } + @override + Future saveScoreStopwatchState(ActiveScoreStopwatchState state) async { + final index = scoreStopwatchStates.indexWhere( + (saved) => saved.metadata.id == state.metadata.id, + ); + if (index == -1) { + scoreStopwatchStates.add(state); + } else { + scoreStopwatchStates[index] = state; + } + } + + @override + Future deleteScoreStopwatchState({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required DateTime deletedAt, + }) async {} + @override Future saveSetResult(ActiveSetResult result) async { final index = results.indexWhere(