Skip to content

Commit d255cdb

Browse files
committed
Consolidate body weight repositories and other providers, cleanup
1 parent 8b8c462 commit d255cdb

20 files changed

+291
-335
lines changed

integration_test/1_dashboard.dart

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import 'package:provider/provider.dart';
55
import 'package:wger/l10n/generated/app_localizations.dart';
66
import 'package:wger/models/workouts/session.dart';
77
import 'package:wger/providers/body_weight_repository.dart';
8-
import 'package:wger/providers/body_weight_riverpod.dart';
9-
import 'package:wger/providers/body_weight_state.dart';
108
import 'package:wger/providers/measurement.dart';
119
import 'package:wger/providers/nutrition.dart';
1210
import 'package:wger/providers/routines.dart';
@@ -17,6 +15,7 @@ import 'package:wger/theme/theme.dart';
1715
import '../test/exercises/contribute_exercise_test.mocks.dart';
1816
import '../test/measurements/measurement_categories_screen_test.mocks.dart';
1917
import '../test/routine/weight_unit_form_widget_test.mocks.dart';
18+
import '../test/weight/weight_provider_test.mocks.dart';
2019
import '../test/weight/weight_screen_test.mocks.dart' as weight;
2120
import '../test_data/body_weight.dart';
2221
import '../test_data/exercises.dart';
@@ -51,10 +50,10 @@ Widget createDashboardScreen({String locale = 'en'}) {
5150
).thenAnswer((realInvocation) => getNutritionalPlanScreenshot());
5251
when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]);
5352

54-
// Prepare a BodyWeightState (Riverpod) with screenshot entries
55-
final repo = BodyWeightRepository();
56-
final bwState = BodyWeightState(repo);
57-
bwState.state = getScreenshotWeightEntries();
53+
final mockBodyWeightRepository = MockBodyWeightRepository();
54+
when(
55+
mockBodyWeightRepository.watchAllDrift(),
56+
).thenAnswer((_) => Stream.value(getWeightEntries()));
5857

5958
final mockMeasurementProvider = MockMeasurementProvider();
6059
when(mockMeasurementProvider.categories).thenReturn(getMeasurementCategories());
@@ -64,8 +63,7 @@ Widget createDashboardScreen({String locale = 'en'}) {
6463

6564
return riverpod.ProviderScope(
6665
overrides: [
67-
// Override the family provider to return our prepared BodyWeightState
68-
bodyWeightStateProvider.overrideWith((ref, auth) => bwState),
66+
bodyWeightRepositoryProvider.overrideWithValue(mockBodyWeightRepository),
6967
],
7068
child: MultiProvider(
7169
providers: [

integration_test/5_nutritional_plan.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import 'package:drift/native.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod;
4+
import 'package:mockito/mockito.dart';
45
import 'package:provider/provider.dart';
56
import 'package:wger/database/ingredients/ingredients_database.dart';
67
import 'package:wger/l10n/generated/app_localizations.dart';
78
import 'package:wger/providers/body_weight_repository.dart';
8-
import 'package:wger/providers/body_weight_riverpod.dart';
9-
import 'package:wger/providers/body_weight_state.dart';
109
import 'package:wger/providers/nutrition.dart';
1110
import 'package:wger/screens/nutritional_plan_screen.dart';
1211
import 'package:wger/theme/theme.dart';
1312

1413
import '../test/user/provider_test.mocks.dart';
14+
import '../test/weight/weight_provider_test.mocks.dart';
15+
import '../test_data/body_weight.dart';
1516
import '../test_data/nutritional_plans.dart';
1617

1718
Widget createNutritionalPlanScreen({locale = 'en'}) {
@@ -26,14 +27,14 @@ Widget createNutritionalPlanScreen({locale = 'en'}) {
2627
database: IngredientDatabase.inMemory(NativeDatabase.memory()),
2728
);
2829

29-
// Riverpod: prepare BodyWeightState with no entries for this test (or mock via mockBaseProvider)
30-
final repo = BodyWeightRepository();
31-
final bwState = BodyWeightState(repo);
30+
final mockBodyWeightRepository = MockBodyWeightRepository();
31+
when(
32+
mockBodyWeightRepository.watchAllDrift(),
33+
).thenAnswer((_) => Stream.value(getWeightEntries()));
3234

3335
return riverpod.ProviderScope(
3436
overrides: [
35-
// Override the family provider to return our prepared BodyWeightState
36-
bodyWeightStateProvider.overrideWith((ref, auth) => bwState),
37+
bodyWeightRepositoryProvider.overrideWithValue(mockBodyWeightRepository),
3738
],
3839
child: MultiProvider(
3940
providers: [

integration_test/6_weight.dart

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import 'package:mockito/mockito.dart';
44
import 'package:provider/provider.dart';
55
import 'package:wger/l10n/generated/app_localizations.dart';
66
import 'package:wger/providers/body_weight_repository.dart';
7-
import 'package:wger/providers/body_weight_riverpod.dart';
8-
import 'package:wger/providers/body_weight_state.dart';
97
import 'package:wger/providers/nutrition.dart';
108
import 'package:wger/providers/user.dart';
119
import 'package:wger/screens/form_screen.dart';
@@ -18,10 +16,10 @@ import '../test_data/nutritional_plans.dart';
1816
import '../test_data/profile.dart';
1917

2018
Widget createWeightScreen({locale = 'en'}) {
21-
// Build a Riverpod override so tests use the new BodyWeightState
22-
final repo = BodyWeightRepository();
23-
final bwState = BodyWeightState(repo);
24-
bwState.state = getScreenshotWeightEntries();
19+
final mockBodyWeightRepository = MockBodyWeightRepository();
20+
when(
21+
mockBodyWeightRepository.watchAllDrift(),
22+
).thenAnswer((_) => Stream.value(getWeightEntries()));
2523

2624
final mockUserProvider = MockUserProvider();
2725
when(mockUserProvider.profile).thenReturn(tProfile1);
@@ -32,8 +30,7 @@ Widget createWeightScreen({locale = 'en'}) {
3230

3331
return riverpod.ProviderScope(
3432
overrides: [
35-
// Override the family provider to return our prepared BodyWeightState
36-
bodyWeightStateProvider.overrideWith((ref, auth) => bwState),
33+
bodyWeightRepositoryProvider.overrideWithValue(mockBodyWeightRepository),
3734
],
3835
child: MultiProvider(
3936
providers: [
Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,41 @@
11
// Helper to read body weight entries from PowerSync local database and convert to WeightEntry
22

3-
import 'package:drift/drift.dart';
43
import 'package:logging/logging.dart';
54
import 'package:riverpod_annotation/riverpod_annotation.dart';
65
import 'package:wger/models/body_weight/weight_entry.dart';
76

8-
import '../database/powersync/database.dart';
9-
import 'body_weight_riverpod.dart';
7+
import 'body_weight_repository.dart';
108

119
part 'body_weight_powersync.g.dart';
1210

13-
final _log = Logger('body_weight_powersync');
14-
1511
@riverpod
1612
final class WeightEntryNotifier extends _$WeightEntryNotifier {
13+
final _log = Logger('WeightEntryNotifier');
14+
late final BodyWeightRepository _repo;
15+
1716
@override
18-
Stream<List<WeightEntry>> build() {
19-
final database = ref.watch(driftPowerSyncDatabase);
20-
final repo = ref.watch(bodyWeightRepositoryProvider);
21-
return repo.watchAllDrift(database);
17+
// BodyWeightState build() {
18+
Stream<List<WeightEntry>> build([BodyWeightRepository? repository]) {
19+
_repo = repository ?? ref.read(bodyWeightRepositoryProvider);
20+
21+
// final state = BodyWeightState();
22+
// repo.watchAllDrift(database).listen((entries) {
23+
// state.setItems(entries);
24+
// });
25+
// return state;
26+
27+
return _repo.watchAllDrift();
2228
}
2329

2430
Future<void> deleteEntry(String id) async {
25-
final db = ref.read(driftPowerSyncDatabase);
26-
final repo = ref.read(bodyWeightRepositoryProvider);
27-
await repo.deleteLocalDrift(db, id);
31+
await _repo.deleteLocalDrift(id);
2832
}
2933

3034
Future<void> updateEntry(WeightEntry entry) async {
31-
final db = ref.read(driftPowerSyncDatabase);
32-
final repo = ref.read(bodyWeightRepositoryProvider);
33-
await repo.updateLocalDrift(db, entry);
35+
await _repo.updateLocalDrift(entry);
3436
}
3537

3638
Future<void> addEntry(WeightEntry entry) async {
37-
final db = ref.read(driftPowerSyncDatabase);
38-
_log.info('Adding new weight entry on local drift: ${entry.date} - ${entry.weight}');
39-
await db
40-
.into(db.weightEntryTable)
41-
.insertReturning(
42-
WeightEntryTableCompanion.insert(
43-
date: Value(entry.date),
44-
weight: entry.weight as double,
45-
),
46-
);
39+
await _repo.addLocalDrift(entry);
4740
}
4841
}

lib/providers/body_weight_powersync.g.dart

Lines changed: 58 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/providers/body_weight_repository.dart

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,55 @@
33
*/
44

55
import 'package:drift/drift.dart';
6+
import 'package:flutter_riverpod/flutter_riverpod.dart';
67
import 'package:logging/logging.dart';
78
import 'package:wger/models/body_weight/weight_entry.dart';
89

910
import '../database/powersync/database.dart';
1011

12+
final bodyWeightRepositoryProvider = Provider<BodyWeightRepository>((ref) {
13+
final db = ref.read(driftPowerSyncDatabase);
14+
return BodyWeightRepository(db);
15+
});
16+
1117
class BodyWeightRepository {
1218
final _logger = Logger('BodyWeightRepository');
19+
final DriftPowersyncDatabase _db;
1320

14-
BodyWeightRepository();
21+
BodyWeightRepository(this._db);
1522

16-
Stream<List<WeightEntry>> watchAllDrift(DriftPowersyncDatabase db) {
23+
Stream<List<WeightEntry>> watchAllDrift() {
1724
_logger.finer('Watching all local weight entries');
18-
final query = db.select(db.weightEntryTable)
25+
final query = _db.select(_db.weightEntryTable)
1926
..orderBy([(t) => OrderingTerm(expression: t.date, mode: OrderingMode.desc)]);
2027
return query.watch();
2128
}
2229

23-
Future<void> deleteLocalDrift(DriftPowersyncDatabase db, String id) async {
30+
Future<void> deleteLocalDrift(String id) async {
2431
_logger.finer('Deleting local weight entry $id');
25-
await (db.delete(db.weightEntryTable)..where((t) => t.id.equals(id))).go();
32+
await (_db.delete(_db.weightEntryTable)..where((t) => t.id.equals(id))).go();
2633
}
2734

28-
Future<void> updateLocalDrift(DriftPowersyncDatabase db, WeightEntry entry) async {
35+
Future<void> updateLocalDrift(WeightEntry entry) async {
2936
_logger.finer('Updating local weight entry ${entry.id}');
30-
final stmt = db.update(db.weightEntryTable)..where((t) => t.id.equals(entry.id!));
37+
final stmt = _db.update(_db.weightEntryTable)..where((t) => t.id.equals(entry.id!));
3138
await stmt.write(
3239
WeightEntryTableCompanion(
3340
date: Value(entry.date),
3441
weight: Value(entry.weight as double),
3542
),
3643
);
3744
}
45+
46+
Future<void> addLocalDrift(WeightEntry entry) async {
47+
_logger.finer('Adding local weight entry ${entry.date}');
48+
await _db
49+
.into(_db.weightEntryTable)
50+
.insert(
51+
WeightEntryTableCompanion.insert(
52+
date: Value(entry.date),
53+
weight: entry.weight as double,
54+
),
55+
);
56+
}
3857
}

lib/providers/body_weight_riverpod.dart

Lines changed: 0 additions & 16 deletions
This file was deleted.

lib/providers/body_weight_state.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import 'package:logging/logging.dart';
22
import 'package:state_notifier/state_notifier.dart';
33
import 'package:wger/models/body_weight/weight_entry.dart';
4-
import 'package:wger/providers/body_weight_repository.dart';
54

5+
/*
6+
* TODO: decide if we want to use the state or just handle a list of entries
7+
*/
68
class BodyWeightState extends StateNotifier<List<WeightEntry>> {
79
final _logger = Logger('BodyWeightState');
8-
final BodyWeightRepository repository;
910

10-
BodyWeightState(this.repository) : super([]);
11+
BodyWeightState([super.initial = const []]);
1112

1213
List<WeightEntry> get items => [...state];
1314

@@ -30,4 +31,8 @@ class BodyWeightState extends StateNotifier<List<WeightEntry>> {
3031
}
3132

3233
void clear() => state = [];
34+
35+
void setItems(List<WeightEntry> entries) {
36+
state = List<WeightEntry>.from(entries);
37+
}
3338
}

0 commit comments

Comments
 (0)