Ajoute la persistance de l'exécution par étapes avec résultats par passage (ports, use cases, entités, modèle Drift avec migration) et l'éditeur d'exercice avec séquence d'étapes sur exercise_library_screen.dart. Développés dans le même worktree partagé par DevBackend et DevFrontend ; commit combiné plutôt que séparé car les fakes de repository de test corrigés (nouvelles interfaces #58) touchent plusieurs écrans sans lien avec l'éditeur lui-même (historique, accueil, exécution, séance-modèle). Corrige au passage un ListTile sans ancêtre Material dans le nouvel éditeur d'étapes (Material(type: MaterialType.transparency)). flutter pub get OK, build_runner OK, analyze propre (mêmes infos préexistantes), 93/93 tests verts, build APK debug validé. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -532,6 +532,38 @@ final class DriftActiveSessionRepository implements ActiveSessionRepository {
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveExerciseStepProgressState(
|
||||
domain.ActiveExerciseStepProgressState state,
|
||||
) async {
|
||||
await _upsertWithChangeLog(
|
||||
database: database,
|
||||
tableName: 'active_exercise_step_progress_states',
|
||||
entityType: 'ActiveExerciseStepProgressState',
|
||||
metadata: state.metadata,
|
||||
write: () => database
|
||||
.into(database.activeExerciseStepProgressStates)
|
||||
.insertOnConflictUpdate(
|
||||
_activeExerciseStepProgressStateCompanion(state),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveExerciseStepResult(
|
||||
domain.ActiveExerciseStepResult result,
|
||||
) async {
|
||||
await _upsertWithChangeLog(
|
||||
database: database,
|
||||
tableName: 'active_exercise_step_results',
|
||||
entityType: 'ActiveExerciseStepResult',
|
||||
metadata: result.metadata,
|
||||
write: () => database
|
||||
.into(database.activeExerciseStepResults)
|
||||
.insertOnConflictUpdate(_activeExerciseStepResultCompanion(result)),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteScoreStopwatchState({
|
||||
required String sessionId,
|
||||
@ -588,6 +620,28 @@ final class DriftActiveSessionRepository implements ActiveSessionRepository {
|
||||
return row == null ? null : _activeScoreStopwatchStateFromRow(row);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<domain.ActiveExerciseStepProgressState?>
|
||||
findExerciseStepProgressState({
|
||||
required String sessionId,
|
||||
required int programIndex,
|
||||
required int exerciseIndex,
|
||||
required int setIndex,
|
||||
}) async {
|
||||
final row =
|
||||
await (database.select(database.activeExerciseStepProgressStates)
|
||||
..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 : _activeExerciseStepProgressStateFromRow(row);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.ActiveSetResult>> listSetResults(String sessionId) async {
|
||||
final rows =
|
||||
@ -602,6 +656,47 @@ final class DriftActiveSessionRepository implements ActiveSessionRepository {
|
||||
return rows.map(_activeSetResultFromRow).toList();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.ActiveExerciseStepProgressState>>
|
||||
listExerciseStepProgressStates(String sessionId) async {
|
||||
final rows =
|
||||
await (database.select(database.activeExerciseStepProgressStates)
|
||||
..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(_activeExerciseStepProgressStateFromRow).toList();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.ActiveExerciseStepResult>> listExerciseStepResults(
|
||||
String sessionId,
|
||||
) async {
|
||||
final rows =
|
||||
await (database.select(database.activeExerciseStepResults)
|
||||
..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),
|
||||
(table) => OrderingTerm.asc(table.passageIndex),
|
||||
(table) => OrderingTerm.asc(table.stepIndex),
|
||||
]))
|
||||
.get();
|
||||
return rows.map(_activeExerciseStepResultFromRow).toList();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.ActiveRestState>> listRestStates(String sessionId) async {
|
||||
final rows =
|
||||
@ -661,9 +756,25 @@ final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository {
|
||||
(table) => OrderingTerm.asc(table.setIndex),
|
||||
]))
|
||||
.get();
|
||||
final stepResults =
|
||||
await (database.select(database.workoutHistoryStepResults)
|
||||
..where(
|
||||
(table) =>
|
||||
table.workoutHistoryId.equals(id) &
|
||||
table.deletedAt.isNull(),
|
||||
)
|
||||
..orderBy([
|
||||
(table) => OrderingTerm.asc(table.programIndex),
|
||||
(table) => OrderingTerm.asc(table.exerciseIndex),
|
||||
(table) => OrderingTerm.asc(table.setIndex),
|
||||
(table) => OrderingTerm.asc(table.passageIndex),
|
||||
(table) => OrderingTerm.asc(table.stepIndex),
|
||||
]))
|
||||
.get();
|
||||
return _workoutHistoryFromRow(
|
||||
row,
|
||||
results.map(_workoutHistorySetResultFromRow).toList(),
|
||||
stepResults.map(_workoutHistoryStepResultFromRow).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
@ -699,6 +810,9 @@ final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository {
|
||||
for (final result in history.results) {
|
||||
await saveSetResult(result);
|
||||
}
|
||||
for (final result in history.stepResults) {
|
||||
await saveStepResult(result);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -715,6 +829,19 @@ final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository {
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveStepResult(domain.WorkoutHistoryStepResult result) async {
|
||||
await _upsertWithChangeLog(
|
||||
database: database,
|
||||
tableName: 'workout_history_step_results',
|
||||
entityType: 'WorkoutHistoryStepResult',
|
||||
metadata: result.metadata,
|
||||
write: () => database
|
||||
.into(database.workoutHistoryStepResults)
|
||||
.insertOnConflictUpdate(_workoutHistoryStepResultCompanion(result)),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> delete(String id, DateTime deletedAt) async {
|
||||
await database.transaction(() async {
|
||||
@ -753,6 +880,18 @@ final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository {
|
||||
resultRows,
|
||||
deletedAt,
|
||||
);
|
||||
final stepResultRows =
|
||||
await (database.select(database.workoutHistoryStepResults)..where(
|
||||
(table) =>
|
||||
table.workoutHistoryId.equals(id) &
|
||||
table.deletedAt.isNull(),
|
||||
))
|
||||
.get();
|
||||
await _softDeleteWorkoutHistoryStepResultRows(
|
||||
database,
|
||||
stepResultRows,
|
||||
deletedAt,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1149,6 +1288,35 @@ Future<void> _softDeleteWorkoutHistorySetResultRows(
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _softDeleteWorkoutHistoryStepResultRows(
|
||||
db.AppDatabase database,
|
||||
List<db.WorkoutHistoryStepResult> rows,
|
||||
DateTime deletedAt,
|
||||
) async {
|
||||
for (final row in rows) {
|
||||
final revision = row.localRevision + 1;
|
||||
await (database.update(
|
||||
database.workoutHistoryStepResults,
|
||||
)..where((table) => table.id.equals(row.id))).write(
|
||||
db.WorkoutHistoryStepResultsCompanion(
|
||||
deletedAt: Value(deletedAt.toUtc()),
|
||||
updatedAt: Value(deletedAt.toUtc()),
|
||||
localRevision: Value(revision),
|
||||
syncState: const Value('deleted'),
|
||||
),
|
||||
);
|
||||
await _writeChangeLog(
|
||||
database: database,
|
||||
entityType: 'WorkoutHistoryStepResult',
|
||||
entityId: row.id,
|
||||
operation: 'softDelete',
|
||||
localRevision: revision,
|
||||
originDeviceId: row.originDeviceId,
|
||||
createdAt: deletedAt,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
DateTime _utc(DateTime value) => value.toUtc();
|
||||
|
||||
DateTime? _utcOrNull(DateTime? value) => value?.toUtc();
|
||||
@ -1732,6 +1900,142 @@ domain.ActiveScoreStopwatchState _activeScoreStopwatchStateFromRow(
|
||||
);
|
||||
}
|
||||
|
||||
db.ActiveExerciseStepProgressStatesCompanion
|
||||
_activeExerciseStepProgressStateCompanion(
|
||||
domain.ActiveExerciseStepProgressState state,
|
||||
) {
|
||||
final values = _metadataValues(state.metadata);
|
||||
return db.ActiveExerciseStepProgressStatesCompanion(
|
||||
id: values[0] as Value<String>,
|
||||
createdAt: values[1] as Value<DateTime>,
|
||||
updatedAt: values[2] as Value<DateTime>,
|
||||
deletedAt: values[3] as Value<DateTime?>,
|
||||
schemaVersion: values[4] as Value<int>,
|
||||
syncState: values[5] as Value<String>,
|
||||
localRevision: values[6] as Value<int>,
|
||||
originDeviceId: values[7] as Value<String>,
|
||||
futureOwnerProfileId: values[8] as Value<String?>,
|
||||
lastSyncedAt: values[9] as Value<DateTime?>,
|
||||
remoteRevision: values[10] as Value<String?>,
|
||||
activeWorkoutSessionId: Value(state.activeWorkoutSessionId),
|
||||
programIndex: Value(state.programIndex),
|
||||
exerciseIndex: Value(state.exerciseIndex),
|
||||
setIndex: Value(state.setIndex),
|
||||
currentPassageIndex: Value(state.currentPassageIndex),
|
||||
currentStepIndex: Value(state.currentStepIndex),
|
||||
currentStepSnapshotId: Value(state.currentStepSnapshotId),
|
||||
status: Value(_exerciseStepProgressStatusToDb(state.status)),
|
||||
startedAt: Value<DateTime?>(_utcOrNull(state.startedAt)),
|
||||
accumulatedMs: Value(state.accumulatedMs),
|
||||
lastTransitionAt: Value(state.lastTransitionAt.toUtc()),
|
||||
);
|
||||
}
|
||||
|
||||
domain.ActiveExerciseStepProgressState
|
||||
_activeExerciseStepProgressStateFromRow(
|
||||
db.ActiveExerciseStepProgressState row,
|
||||
) {
|
||||
return domain.ActiveExerciseStepProgressState(
|
||||
metadata: _metadataFromRow(row),
|
||||
activeWorkoutSessionId: row.activeWorkoutSessionId,
|
||||
programIndex: row.programIndex,
|
||||
exerciseIndex: row.exerciseIndex,
|
||||
setIndex: row.setIndex,
|
||||
currentPassageIndex: row.currentPassageIndex,
|
||||
currentStepIndex: row.currentStepIndex,
|
||||
currentStepSnapshotId: row.currentStepSnapshotId,
|
||||
status: _exerciseStepProgressStatusFromDb(row.status),
|
||||
startedAt: _utcOrNull(row.startedAt),
|
||||
accumulatedMs: row.accumulatedMs,
|
||||
lastTransitionAt: _utc(row.lastTransitionAt),
|
||||
);
|
||||
}
|
||||
|
||||
db.ActiveExerciseStepResultsCompanion _activeExerciseStepResultCompanion(
|
||||
domain.ActiveExerciseStepResult result,
|
||||
) {
|
||||
final values = _metadataValues(result.metadata);
|
||||
return db.ActiveExerciseStepResultsCompanion(
|
||||
id: values[0] as Value<String>,
|
||||
createdAt: values[1] as Value<DateTime>,
|
||||
updatedAt: values[2] as Value<DateTime>,
|
||||
deletedAt: values[3] as Value<DateTime?>,
|
||||
schemaVersion: values[4] as Value<int>,
|
||||
syncState: values[5] as Value<String>,
|
||||
localRevision: values[6] as Value<int>,
|
||||
originDeviceId: values[7] as Value<String>,
|
||||
futureOwnerProfileId: values[8] as Value<String?>,
|
||||
lastSyncedAt: values[9] as Value<DateTime?>,
|
||||
remoteRevision: values[10] as Value<String?>,
|
||||
activeWorkoutSessionId: Value(result.activeWorkoutSessionId),
|
||||
programSnapshotId: Value(result.programSnapshotId),
|
||||
exerciseSnapshotId: Value(result.exerciseSnapshotId),
|
||||
programIndex: Value(result.programIndex),
|
||||
exerciseIndex: Value(result.exerciseIndex),
|
||||
setIndex: Value(result.setIndex),
|
||||
passageIndex: Value(result.passageIndex),
|
||||
stepIndex: Value(result.stepIndex),
|
||||
stepSnapshotId: Value(result.stepSnapshotId),
|
||||
stepNameSnapshot: Value(result.stepNameSnapshot),
|
||||
stepTypeSnapshot: Value(_exerciseStepTypeToDb(result.stepTypeSnapshot)),
|
||||
targetValueSnapshot: Value(result.targetValueSnapshot),
|
||||
hasScoreSnapshot: Value(result.hasScoreSnapshot),
|
||||
scoreInputModeSnapshot: Value<String?>(
|
||||
result.scoreInputModeSnapshot == null
|
||||
? null
|
||||
: _scoreInputModeToDb(result.scoreInputModeSnapshot!),
|
||||
),
|
||||
scoreLabelSnapshot: Value<String?>(result.scoreLabelSnapshot),
|
||||
scoreUnitSnapshot: Value<String?>(result.scoreUnitSnapshot),
|
||||
targetScoreSnapshot: Value<double?>(result.targetScoreSnapshot),
|
||||
targetScoreTimeMsSnapshot: Value<int?>(result.targetScoreTimeMsSnapshot),
|
||||
status: Value(_setResultStatusToDb(result.status)),
|
||||
startedAt: Value<DateTime?>(_utcOrNull(result.startedAt)),
|
||||
completedAt: Value<DateTime?>(_utcOrNull(result.completedAt)),
|
||||
actualTimeMs: Value<int?>(result.actualTimeMs),
|
||||
actualReps: Value<int?>(result.actualReps),
|
||||
actualScore: Value<double?>(result.actualScore),
|
||||
actualScoreTimeMs: Value<int?>(result.actualScoreTimeMs),
|
||||
note: Value<String?>(result.note),
|
||||
);
|
||||
}
|
||||
|
||||
domain.ActiveExerciseStepResult _activeExerciseStepResultFromRow(
|
||||
db.ActiveExerciseStepResult row,
|
||||
) {
|
||||
return domain.ActiveExerciseStepResult(
|
||||
metadata: _metadataFromRow(row),
|
||||
activeWorkoutSessionId: row.activeWorkoutSessionId,
|
||||
programSnapshotId: row.programSnapshotId,
|
||||
exerciseSnapshotId: row.exerciseSnapshotId,
|
||||
programIndex: row.programIndex,
|
||||
exerciseIndex: row.exerciseIndex,
|
||||
setIndex: row.setIndex,
|
||||
passageIndex: row.passageIndex,
|
||||
stepIndex: row.stepIndex,
|
||||
stepSnapshotId: row.stepSnapshotId,
|
||||
stepNameSnapshot: row.stepNameSnapshot,
|
||||
stepTypeSnapshot: _exerciseStepTypeFromDb(row.stepTypeSnapshot),
|
||||
targetValueSnapshot: row.targetValueSnapshot,
|
||||
hasScoreSnapshot: row.hasScoreSnapshot,
|
||||
scoreInputModeSnapshot: row.scoreInputModeSnapshot == null
|
||||
? null
|
||||
: _scoreInputModeFromDb(row.scoreInputModeSnapshot!),
|
||||
scoreLabelSnapshot: row.scoreLabelSnapshot,
|
||||
scoreUnitSnapshot: row.scoreUnitSnapshot,
|
||||
targetScoreSnapshot: row.targetScoreSnapshot,
|
||||
targetScoreTimeMsSnapshot: row.targetScoreTimeMsSnapshot,
|
||||
status: _setResultStatusFromDb(row.status),
|
||||
startedAt: _utcOrNull(row.startedAt),
|
||||
completedAt: _utcOrNull(row.completedAt),
|
||||
actualTimeMs: row.actualTimeMs,
|
||||
actualReps: row.actualReps,
|
||||
actualScore: row.actualScore,
|
||||
actualScoreTimeMs: row.actualScoreTimeMs,
|
||||
note: row.note,
|
||||
);
|
||||
}
|
||||
|
||||
db.WorkoutHistoriesCompanion _workoutHistoryCompanion(
|
||||
domain.WorkoutHistory history,
|
||||
) {
|
||||
@ -1805,9 +2109,59 @@ db.WorkoutHistorySetResultsCompanion _workoutHistorySetResultCompanion(
|
||||
);
|
||||
}
|
||||
|
||||
db.WorkoutHistoryStepResultsCompanion _workoutHistoryStepResultCompanion(
|
||||
domain.WorkoutHistoryStepResult result,
|
||||
) {
|
||||
final values = _metadataValues(result.metadata);
|
||||
return db.WorkoutHistoryStepResultsCompanion(
|
||||
id: values[0] as Value<String>,
|
||||
createdAt: values[1] as Value<DateTime>,
|
||||
updatedAt: values[2] as Value<DateTime>,
|
||||
deletedAt: values[3] as Value<DateTime?>,
|
||||
schemaVersion: values[4] as Value<int>,
|
||||
syncState: values[5] as Value<String>,
|
||||
localRevision: values[6] as Value<int>,
|
||||
originDeviceId: values[7] as Value<String>,
|
||||
futureOwnerProfileId: values[8] as Value<String?>,
|
||||
lastSyncedAt: values[9] as Value<DateTime?>,
|
||||
remoteRevision: values[10] as Value<String?>,
|
||||
workoutHistoryId: Value(result.workoutHistoryId),
|
||||
programSnapshotId: Value(result.programSnapshotId),
|
||||
exerciseSnapshotId: Value(result.exerciseSnapshotId),
|
||||
programIndex: Value(result.programIndex),
|
||||
exerciseIndex: Value(result.exerciseIndex),
|
||||
setIndex: Value(result.setIndex),
|
||||
passageIndex: Value(result.passageIndex),
|
||||
stepIndex: Value(result.stepIndex),
|
||||
stepSnapshotId: Value(result.stepSnapshotId),
|
||||
stepNameSnapshot: Value(result.stepNameSnapshot),
|
||||
stepTypeSnapshot: Value(_exerciseStepTypeToDb(result.stepTypeSnapshot)),
|
||||
targetValueSnapshot: Value(result.targetValueSnapshot),
|
||||
hasScoreSnapshot: Value(result.hasScoreSnapshot),
|
||||
scoreInputModeSnapshot: Value<String?>(
|
||||
result.scoreInputModeSnapshot == null
|
||||
? null
|
||||
: _scoreInputModeToDb(result.scoreInputModeSnapshot!),
|
||||
),
|
||||
scoreLabelSnapshot: Value<String?>(result.scoreLabelSnapshot),
|
||||
scoreUnitSnapshot: Value<String?>(result.scoreUnitSnapshot),
|
||||
targetScoreSnapshot: Value<double?>(result.targetScoreSnapshot),
|
||||
targetScoreTimeMsSnapshot: Value<int?>(result.targetScoreTimeMsSnapshot),
|
||||
status: Value(_setResultStatusToDb(result.status)),
|
||||
startedAt: Value<DateTime?>(_utcOrNull(result.startedAt)),
|
||||
completedAt: Value<DateTime?>(_utcOrNull(result.completedAt)),
|
||||
actualTimeMs: Value<int?>(result.actualTimeMs),
|
||||
actualReps: Value<int?>(result.actualReps),
|
||||
actualScore: Value<double?>(result.actualScore),
|
||||
actualScoreTimeMs: Value<int?>(result.actualScoreTimeMs),
|
||||
note: Value<String?>(result.note),
|
||||
);
|
||||
}
|
||||
|
||||
domain.WorkoutHistory _workoutHistoryFromRow(
|
||||
db.WorkoutHistory row,
|
||||
List<domain.WorkoutHistorySetResult> results,
|
||||
List<domain.WorkoutHistoryStepResult> stepResults,
|
||||
) {
|
||||
return domain.WorkoutHistory(
|
||||
metadata: _metadataFromRow(row),
|
||||
@ -1820,6 +2174,7 @@ domain.WorkoutHistory _workoutHistoryFromRow(
|
||||
completed: row.completed,
|
||||
historySnapshotJson: row.historySnapshotJson,
|
||||
results: results,
|
||||
stepResults: stepResults,
|
||||
);
|
||||
}
|
||||
|
||||
@ -1856,6 +2211,42 @@ domain.WorkoutHistorySetResult _workoutHistorySetResultFromRow(
|
||||
);
|
||||
}
|
||||
|
||||
domain.WorkoutHistoryStepResult _workoutHistoryStepResultFromRow(
|
||||
db.WorkoutHistoryStepResult row,
|
||||
) {
|
||||
return domain.WorkoutHistoryStepResult(
|
||||
metadata: _metadataFromRow(row),
|
||||
workoutHistoryId: row.workoutHistoryId,
|
||||
programSnapshotId: row.programSnapshotId,
|
||||
exerciseSnapshotId: row.exerciseSnapshotId,
|
||||
programIndex: row.programIndex,
|
||||
exerciseIndex: row.exerciseIndex,
|
||||
setIndex: row.setIndex,
|
||||
passageIndex: row.passageIndex,
|
||||
stepIndex: row.stepIndex,
|
||||
stepSnapshotId: row.stepSnapshotId,
|
||||
stepNameSnapshot: row.stepNameSnapshot,
|
||||
stepTypeSnapshot: _exerciseStepTypeFromDb(row.stepTypeSnapshot),
|
||||
targetValueSnapshot: row.targetValueSnapshot,
|
||||
hasScoreSnapshot: row.hasScoreSnapshot,
|
||||
scoreInputModeSnapshot: row.scoreInputModeSnapshot == null
|
||||
? null
|
||||
: _scoreInputModeFromDb(row.scoreInputModeSnapshot!),
|
||||
scoreLabelSnapshot: row.scoreLabelSnapshot,
|
||||
scoreUnitSnapshot: row.scoreUnitSnapshot,
|
||||
targetScoreSnapshot: row.targetScoreSnapshot,
|
||||
targetScoreTimeMsSnapshot: row.targetScoreTimeMsSnapshot,
|
||||
status: _setResultStatusFromDb(row.status),
|
||||
startedAt: _utcOrNull(row.startedAt),
|
||||
completedAt: _utcOrNull(row.completedAt),
|
||||
actualTimeMs: row.actualTimeMs,
|
||||
actualReps: row.actualReps,
|
||||
actualScore: row.actualScore,
|
||||
actualScoreTimeMs: row.actualScoreTimeMs,
|
||||
note: row.note,
|
||||
);
|
||||
}
|
||||
|
||||
String _syncStateToDb(domain.SyncState state) => switch (state) {
|
||||
domain.SyncState.localOnly => 'localOnly',
|
||||
domain.SyncState.dirty => 'dirty',
|
||||
@ -1939,6 +2330,33 @@ domain.ActiveScoreStopwatchStatus _scoreStopwatchStatusFromDb(String value) =>
|
||||
),
|
||||
};
|
||||
|
||||
String _exerciseStepProgressStatusToDb(
|
||||
domain.ActiveExerciseStepProgressStatus status,
|
||||
) => switch (status) {
|
||||
domain.ActiveExerciseStepProgressStatus.notStarted => 'notStarted',
|
||||
domain.ActiveExerciseStepProgressStatus.waitingManual => 'waitingManual',
|
||||
domain.ActiveExerciseStepProgressStatus.runningTimer => 'runningTimer',
|
||||
domain.ActiveExerciseStepProgressStatus.pausedTimer => 'pausedTimer',
|
||||
domain.ActiveExerciseStepProgressStatus.stoppedTimer => 'stoppedTimer',
|
||||
domain.ActiveExerciseStepProgressStatus.sequenceComplete =>
|
||||
'sequenceComplete',
|
||||
};
|
||||
|
||||
domain.ActiveExerciseStepProgressStatus _exerciseStepProgressStatusFromDb(
|
||||
String value,
|
||||
) => switch (value) {
|
||||
'notStarted' => domain.ActiveExerciseStepProgressStatus.notStarted,
|
||||
'waitingManual' => domain.ActiveExerciseStepProgressStatus.waitingManual,
|
||||
'runningTimer' => domain.ActiveExerciseStepProgressStatus.runningTimer,
|
||||
'pausedTimer' => domain.ActiveExerciseStepProgressStatus.pausedTimer,
|
||||
'stoppedTimer' => domain.ActiveExerciseStepProgressStatus.stoppedTimer,
|
||||
'sequenceComplete' =>
|
||||
domain.ActiveExerciseStepProgressStatus.sequenceComplete,
|
||||
_ => throw domain.DomainException(
|
||||
'Unknown active exercise step progress status: $value',
|
||||
),
|
||||
};
|
||||
|
||||
String? _encodeImageMediaIdsSnapshot(List<String> imageMediaIds) {
|
||||
return imageMediaIds.isEmpty ? null : jsonEncode(imageMediaIds);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user