Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
224 commits
Select commit Hold shift + click to select a range
4d2083f
Update body weight provider to use riverpod
rolandgeider Oct 21, 2025
76f894a
Start actually interacting with powersync
rolandgeider Oct 21, 2025
017ccca
Start adding drift and using riverpod
rolandgeider Oct 22, 2025
8b8c462
Powersync seems to be working now
rolandgeider Oct 23, 2025
d255cdb
Consolidate body weight repositories and other providers, cleanup
rolandgeider Oct 23, 2025
944830e
Rename provider file
rolandgeider Oct 23, 2025
7969376
Test how feasible it is to load exercises via powersync as well
rolandgeider Oct 23, 2025
6663591
Use the powersync drift provider to show exercises
rolandgeider Oct 24, 2025
52a3ced
Also load the corresponding equipment
rolandgeider Oct 24, 2025
e99fbc3
Use the new drift provider to load the exercises in their overview
rolandgeider Oct 24, 2025
1128269
Missing M2N table
rolandgeider Oct 24, 2025
5ab04cb
Remove filters from old exercise provider
rolandgeider Oct 24, 2025
ca007d2
Move more usages to new exercise provider
rolandgeider Oct 25, 2025
3dc9519
Move more usages to new exercise provider
rolandgeider Oct 25, 2025
d138e0f
Add new network provider to check connectivity and disable options
rolandgeider Oct 25, 2025
2aa1206
Remove the json serializable decorators, not needed anymore
rolandgeider Oct 25, 2025
14ff95a
Read the powersync URL from the server's response
rolandgeider Oct 26, 2025
c60cfbe
Add tables for workout sessions
rolandgeider Oct 26, 2025
b17f39f
Set foreign key relationships for the exercise tables
rolandgeider Oct 28, 2025
eb087e1
Set correct nullable attributes
rolandgeider Oct 29, 2025
7d1c03a
Pre-load all exercises on opening the app
rolandgeider Oct 29, 2025
b8ea38b
Use WarningCard to display offline mode
rolandgeider Oct 31, 2025
2b44a1e
Remove the exercise cache settings tile
rolandgeider Oct 31, 2025
92eee49
Remove unused methods from exercise provider
rolandgeider Oct 31, 2025
30c7c5a
Move more widgets to use the new providers
rolandgeider Oct 31, 2025
9040106
Rework the base data providers, fix some tests
rolandgeider Nov 3, 2025
c782d1a
Fix test, remove unused mocks
rolandgeider Nov 3, 2025
8889158
Add tables and providers for weight and repetition units
rolandgeider Nov 3, 2025
d1e6a04
Remove old exercise database
rolandgeider Nov 3, 2025
1fcd01e
Fix some tests
rolandgeider Nov 3, 2025
1204876
Remove json serializable code for exercise models
rolandgeider Nov 3, 2025
a368fe2
Pass the exercises and workout units as parameters
rolandgeider Nov 4, 2025
743b28b
Use directly the the weight unit providers
rolandgeider Nov 4, 2025
5912cea
Fix some tests
rolandgeider Nov 4, 2025
1e9e5ab
Fix some more tests
rolandgeider Nov 4, 2025
72deeda
Update session and log models
rolandgeider Nov 4, 2025
e85d4a6
Fix test
rolandgeider Nov 4, 2025
dd3f993
Remove old exercises provider 🥲
rolandgeider Nov 4, 2025
e975eee
Refactor the django powersync connector
rolandgeider Nov 5, 2025
3905a91
Notes is nullable on the db
rolandgeider Nov 7, 2025
2132249
Wrap the routines provider
rolandgeider Nov 7, 2025
aafd464
Fix tests
rolandgeider Nov 7, 2025
4a2047e
Edit sessions with the new sessions provider
rolandgeider Nov 8, 2025
49873d2
Cleanup some of the models
rolandgeider Nov 8, 2025
e1359d0
Add a new riverpod provider for the routines
rolandgeider Nov 10, 2025
7d93280
Add tests for provider and repository interface
rolandgeider Nov 10, 2025
406fb3c
Move some methods to the RoutineState
rolandgeider Nov 10, 2025
6f1a6a9
Override network status provider
rolandgeider Nov 10, 2025
2afad29
Don't make the body weight repository a family, this is not needed
rolandgeider Nov 10, 2025
94b7431
Add riverpod lint
rolandgeider Nov 10, 2025
eedc249
Merge branch 'master' into feature/powersync-test
rolandgeider Nov 25, 2025
909b85c
Merge conflicts
rolandgeider Dec 2, 2025
e639709
Recreate generated files
rolandgeider Dec 2, 2025
08bbe3f
Update pubspec.lock
rolandgeider Dec 2, 2025
d8a5369
Merge branch 'master' into feature/powersync-test
rolandgeider Dec 4, 2025
b75ee0d
Merge conflicts
rolandgeider Dec 4, 2025
3713399
More merge fixes
rolandgeider Dec 4, 2025
455c9a0
Merge branch 'master' into feature/powersync-test
rolandgeider Dec 18, 2025
f32dec2
Merge branch 'master' into feature/offline-mode
rolandgeider Jan 19, 2026
c87d382
Merge branch 'master' into feature/offline-mode
rolandgeider Mar 12, 2026
a5f08c0
Add the network information widget to regular list of dashboard widgets
rolandgeider Mar 13, 2026
61e1c24
Update measurement tables to use powersync
rolandgeider Mar 13, 2026
7926a7d
Start working on new drift based provider for measurements
rolandgeider Mar 13, 2026
7221109
Revert to using ID and UUID as names for the fields
rolandgeider Mar 13, 2026
1ed2efe
Migrate more widgets to use the new measurement provider
rolandgeider Mar 13, 2026
d38a760
Start removing the old MeasurementProvider, refactor measurement form
rolandgeider Mar 14, 2026
e20de66
Fix and cleanup some tests
rolandgeider Mar 14, 2026
8ddd964
Remove old MeasurementProvider
rolandgeider Mar 14, 2026
b106090
Move language models to "core"
rolandgeider Mar 14, 2026
997e4af
Add ingredient and license tables
rolandgeider Mar 14, 2026
6750859
Move powersync table definitions
rolandgeider Mar 14, 2026
c916136
Update measurement models
rolandgeider Mar 15, 2026
3ea4713
Use UUIDv7, as in the backend
rolandgeider Mar 21, 2026
9c531a7
Merge branch 'master' into feature/offline-mode
rolandgeider Apr 17, 2026
6dea8d5
Merge branch 'master' into feature/offline-mode
rolandgeider Apr 17, 2026
0b9d3d5
Move exercise model to new variation structure
rolandgeider Apr 17, 2026
efce4a9
Bump some dependencies
rolandgeider Apr 17, 2026
4cbbdbf
Don't make the repositories final
rolandgeider Apr 17, 2026
70dff57
Fix tests
rolandgeider Apr 17, 2026
8ad3585
Refactor the auth provider, and move it to riverpod
rolandgeider Apr 17, 2026
f4a0a9b
Migrate the user provider to riverpode
rolandgeider Apr 17, 2026
95fb6c6
Migrate the nutrition provider to riverpod
rolandgeider Apr 17, 2026
97dee19
Migrate the gallery provider to riverpod
rolandgeider Apr 17, 2026
d708860
Migrate the contribute provider to riverpod and remove the old provid…
rolandgeider Apr 17, 2026
c1a733b
Clear the powersync database when a user logs out
rolandgeider Apr 17, 2026
8252dcd
Properly check if the userprofile was correctly loaded
rolandgeider Apr 18, 2026
7a15ea0
Remove rive as a dependency, not needed anymore
rolandgeider Apr 18, 2026
0afb102
Further refactor how the new providers fetch data
rolandgeider Apr 18, 2026
af378df
Make the routines provider async
rolandgeider Apr 18, 2026
9a4fec8
Refactor the workout session provider
rolandgeider Apr 18, 2026
fdce3bf
Rename file with the wger base provider
rolandgeider Apr 18, 2026
d70c43e
Properly gate the parts of the application that need network connecti…
rolandgeider Apr 18, 2026
1258382
Use common widget to render AsyncValues (errors, loading, etc.)
rolandgeider Apr 18, 2026
dc67d29
Don't do real DNS checks during tests
rolandgeider Apr 18, 2026
7f68036
Invalidate data providers after successful login/logout
rolandgeider Apr 20, 2026
e0892c4
Refactor calendar widget
rolandgeider Apr 20, 2026
e8e0cc5
Remove the uuid column in the weight table, this doesn't exist anymore
rolandgeider Apr 20, 2026
c59fd68
Pass the userID and the expiration to the PowerSync credentials
rolandgeider Apr 20, 2026
eaa4579
Use correct controller
rolandgeider Apr 22, 2026
f7458f8
Add unreachable server screen and related error handling
rolandgeider Apr 23, 2026
9cccca2
Consolidate app server checks in one helper
rolandgeider Apr 23, 2026
f5ab4ca
Handle HTTP errors
rolandgeider Apr 23, 2026
c1d2fbe
Show loading spinner for the routine widget in the dashboard
rolandgeider Apr 23, 2026
30072fb
Properly handle timezones for datetime values
rolandgeider Apr 24, 2026
27cdd32
Set the exercises for log objects
rolandgeider Apr 24, 2026
b6923d1
Refactor exercise providers
rolandgeider Apr 24, 2026
88e0248
Remove BodyWeightState
rolandgeider Apr 24, 2026
e2d650f
Use the AsyncValueWidget when handling Stream-Provider data
rolandgeider Apr 24, 2026
72ef83e
Translate the sync status in the main icon
rolandgeider Apr 24, 2026
4b58117
Show more sync information to the user
rolandgeider Apr 24, 2026
4353f00
Start handling validation errors from the backend for powersync opera…
rolandgeider Apr 28, 2026
680127e
Sync the base Routine and Nutritional plan entries via powersync
rolandgeider Apr 29, 2026
06a445a
Properly gate the nutritional plan FAB when there's no network connec…
rolandgeider Apr 29, 2026
cbc4fa1
Properly handle DateFields
rolandgeider Apr 29, 2026
c5dbcc2
Extract routines repository to its own file
rolandgeider Apr 29, 2026
733fe24
Remove fetchAndSetRoutineFull from future
rolandgeider Apr 29, 2026
40c3bbc
Use the workout session and logs from the current routine in summary.…
rolandgeider Apr 29, 2026
379d86c
Commit connector transform test
rolandgeider Apr 29, 2026
5f52538
Wrap the log and session saving logic in a transaction
rolandgeider Apr 29, 2026
271d9f9
Refactor unit selection for repetitions and weight
rolandgeider Apr 29, 2026
e0068e9
Hydrate exercise and unit objects in routine entries
rolandgeider Apr 29, 2026
3fbdaac
Consolidate routine hydration logic
rolandgeider Apr 29, 2026
5bf2dd2
Properly load the ingredient images
rolandgeider Apr 29, 2026
d135e81
Cache ingredient and exercise images on device
rolandgeider Apr 30, 2026
4751b2d
Delete old images from the device older than approx. 3 months
rolandgeider Apr 30, 2026
3505611
Be a bit smarter about contructing the absolute URL for images
rolandgeider Apr 30, 2026
c5ac063
Properly mark columns as nullable
rolandgeider Apr 30, 2026
a9644ab
Refactor ingredient handling to use direct object references
rolandgeider Apr 30, 2026
d6e652f
Sync the ingredient weight units to the local sqlite db
rolandgeider Apr 30, 2026
5ee653b
Improve error logging
rolandgeider Apr 30, 2026
d152031
Refactor ingredient weight unit handling and remove unused methods
rolandgeider Apr 30, 2026
97c4a5b
Refactor ingredient weight unit handling and remove unused methods
rolandgeider Apr 30, 2026
a1722f1
Open ingredient info dialog from the nutritional plan list
rolandgeider Apr 30, 2026
445063b
Properly fake network connectivity in the tests
rolandgeider Apr 30, 2026
73e1621
Updated goldens
rolandgeider Apr 30, 2026
d1f6fc2
Sync nutritional logs
rolandgeider Apr 30, 2026
5fea670
Merge master
rolandgeider Apr 30, 2026
9f365f8
Consolidate ingredient search methods into the ingredient repo
rolandgeider May 1, 2026
09f0202
Merge remote-tracking branch 'origin/feature/offline-mode' into featu…
rolandgeider May 1, 2026
9226b06
Rename for more consistency
rolandgeider May 1, 2026
3540437
Refactor exercise repository online/offline search
rolandgeider May 1, 2026
209ab7c
Add gallery sync tables
rolandgeider May 1, 2026
16ffafe
Remove unused methods
rolandgeider May 1, 2026
2f2c781
Cleanup providers and use consistent naming
rolandgeider May 1, 2026
5d30a1c
Cleanup providers and use consistent naming
rolandgeider May 1, 2026
2cb4061
Cleanup providers and use consistent naming
rolandgeider May 1, 2026
e56d5a8
Add missing tests for the new repositories and states
rolandgeider May 1, 2026
df9a69d
Create a new id for when setting new logs
rolandgeider May 1, 2026
35789cf
Remove validateLanguage, this wasn't used
rolandgeider May 1, 2026
a63cce2
Test the powersync communications with the outer world
rolandgeider May 1, 2026
cf13af1
Sync the rest of the nutrition tables to powersync
rolandgeider May 1, 2026
d6affe4
Sync the rest of the nutrition tables with powersync
rolandgeider May 2, 2026
1a9ab58
refactor: improve image error handling with pattern matching and URI …
pankaj-basnet May 2, 2026
f578938
refactor(models): add copyWith to Routine and make replaceExercise im…
pankaj-basnet May 2, 2026
11a8393
fix(gym): resolve in-place routine mutation in replaceExercises
pankaj-basnet May 2, 2026
050258b
Merge pull request #1187 from pankaj-basnet/fix/offline-mode--provide…
rolandgeider May 3, 2026
c1dccbd
Make the "impression" in workout session an enum
rolandgeider May 2, 2026
1ec921f
Consistent usage of uuid IDs
rolandgeider May 2, 2026
1249036
Properly update routine data
rolandgeider May 2, 2026
0fb660d
Move access to nutritional plans to the nutrition state
rolandgeider May 3, 2026
2ce3cc2
Cleanup
rolandgeider May 3, 2026
c39c418
Merge master
rolandgeider May 3, 2026
2c8164f
Update Podfile.lock
rolandgeider May 4, 2026
395eb58
Merge remote-tracking branch 'origin/master' into feature/offline-mode
rolandgeider May 7, 2026
83569fc
Merge remote-tracking branch 'origin/master' into feature/offline-mode
rolandgeider May 7, 2026
130232e
Remove null assertions where not needed
rolandgeider May 8, 2026
11699f8
Slightly increase the maximum workout duration
rolandgeider May 8, 2026
f4c8db7
Properly use mutable objects
rolandgeider May 8, 2026
98737fd
Extract helper functions as own widgets
rolandgeider May 8, 2026
944b27e
Also sync all the license information, even if we don't expose all of…
rolandgeider May 15, 2026
d71bbcf
Update to flutter 3.44
rolandgeider May 19, 2026
d5acd00
Move to swift package manager
rolandgeider May 19, 2026
cbf6884
Update the online connectivity gates
rolandgeider May 20, 2026
0674066
Remove unused code and mocks
rolandgeider May 20, 2026
99d8d2c
Remove unused test fixtures
rolandgeider May 20, 2026
4866551
Move exercises and their translations to RawTables
rolandgeider May 20, 2026
f8187b2
Cleanup exercise models
rolandgeider May 20, 2026
25b4441
Correctly load the notes and aliases for exercises
rolandgeider May 20, 2026
bf9916a
Merge remote-tracking branch 'origin/master' into feature/offline-mode
rolandgeider May 20, 2026
508b552
Remove unused fatalResponseCodes
rolandgeider May 20, 2026
9913ee4
Use WgerImage to render the trophies
rolandgeider May 20, 2026
c411e89
Consolidate time and date picking logic into their own widgets
rolandgeider May 20, 2026
dc5bd1e
Consolidate localized number edit logic into its own widgets
rolandgeider May 20, 2026
97e0e63
Consolidate submission logic into its own widget
rolandgeider May 20, 2026
834d7e4
Consolidate form error handling
rolandgeider May 21, 2026
52364eb
Merge branch 'master' into feature/offline-mode
rolandgeider May 21, 2026
848ba17
Format number inputs according to locale
rolandgeider May 21, 2026
370a7d8
Remove obsolete _isSaving guard
rolandgeider May 21, 2026
cfa40da
Remove obsolete FormProgressIndicator
rolandgeider May 21, 2026
60cf1b9
Remove remaining podfiles and their configurations
rolandgeider May 21, 2026
e99a036
Replace the allowed connectivity list
rolandgeider May 21, 2026
d97de48
Refactor the error logic
rolandgeider May 22, 2026
d0c56c4
Re-probe the connection to the wger server itself
rolandgeider May 22, 2026
4edf49b
Reduce the pollution of logs from powersync
rolandgeider May 22, 2026
51730e9
Make more widgets online-aware
rolandgeider May 22, 2026
1075a28
Remove the AuthStatus.serverUnreachable case
rolandgeider May 22, 2026
af8ed10
Also write to the user profile via powersync
rolandgeider May 22, 2026
736cb41
Improve the login process
rolandgeider May 22, 2026
164d583
Gate the trophies provider when the server is not available
rolandgeider May 22, 2026
26722a4
Start implementing JWT support
rolandgeider May 15, 2026
3f89b5a
Add secure storage integration and headless (allauth) JWT support
rolandgeider May 15, 2026
225a689
Implement refresh token logic
rolandgeider May 15, 2026
42752de
Move Authorization header to a dedicated HTTP client
rolandgeider May 15, 2026
87a40fd
Switch the pasted-token field from DRF tokens to refresh tokens
rolandgeider May 15, 2026
6188175
Add 2fa login screen
rolandgeider May 15, 2026
8fc1497
Edit the user's email via allauth's endpoints
rolandgeider May 15, 2026
32677fb
Edit the user's email via allauth's endpoints
rolandgeider May 15, 2026
291d3f0
Extract token from correct key
rolandgeider May 15, 2026
8213c44
Add "login via web"
rolandgeider May 18, 2026
0e6dfe9
Receive wger:// deep links on Linux
rolandgeider May 18, 2026
efd9620
Add D-Bus service file
rolandgeider May 19, 2026
e282c57
Remove DBusActivatable, this is probably not needed
rolandgeider May 19, 2026
d1077ff
Mark app as needing attention
rolandgeider May 19, 2026
fadcb93
Add missing build dependencies
rolandgeider May 19, 2026
99f54a8
Regenerate build files
rolandgeider May 19, 2026
fe5c7bb
Regenerate build files
rolandgeider May 22, 2026
b9dd03c
Re-apply login-process improvements on headless auth
rolandgeider May 22, 2026
3772934
Fix trophy provider online gate
rolandgeider May 22, 2026
cc7ae51
Mark trophy box in the dashboard when no internet is available
rolandgeider May 22, 2026
1b72fb7
Fix circular provider dependency
rolandgeider May 22, 2026
ea30877
Merge branch 'feature/allauth' into feature/offline-mode
rolandgeider May 22, 2026
aaa7885
Cleanup auth screen
rolandgeider May 22, 2026
d77fc07
More cleanup on the auth screen
rolandgeider May 22, 2026
6ffb1b6
Add some more tests for the auth screen
rolandgeider May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/actions/flutter-common/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ runs:
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.41.9
flutter-version: 3.44.0
cache: true

- name: Install Flutter dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ jobs:
- name: Build application for linux
run: |
sudo apt update
sudo apt install -y pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev --no-install-recommends
sudo apt install -y pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libsecret-1-dev libjsoncpp-dev --no-install-recommends
flutter build linux --release
tar -zcvf linux-${{ matrix.platform }}.tar.gz build/linux/${{ matrix.platform }}/release/bundle
- uses: actions/upload-artifact@v7
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/screenshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,6 @@ jobs:
- name: Common flutter setup
uses: ./.github/actions/flutter-common

- name: Install CocoaPods
run: |
cd ios
pod install || true
cd ..

- name: Boot iOS simulator
id: boot
run: |
Expand Down
9 changes: 9 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<!-- Web-handoff deep link: the server redirects to wger://app-auth#token=…
after a browser login; app_link_router consumes the URI. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="wger" android:host="app-auth" />
</intent-filter>
</activity>


Expand Down
6 changes: 6 additions & 0 deletions build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
targets:
$default:
builders:
drift_dev:
options:
store_date_time_values_as_text: true
3 changes: 2 additions & 1 deletion devtools_options.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
extensions:
- drift: true
- provider: true
- provider: true
- shared_preferences: true
3 changes: 2 additions & 1 deletion flatpak/de.wger.flutter.desktop
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ Comment=Fitness/workout, nutrition and weight tracker
# HealthFitness;Exercise;Nutrition
Categories=Education;Utility;Sports;
Icon=de.wger.flutter
Exec=wger
Exec=wger %u
MimeType=x-scheme-handler/wger;
StartupWMClass=wger
X-Purism-FormFactor=Workstation;Mobile;
X-KDE-FormFactors=desktop;tablet;handset;mediacenter;
3 changes: 3 additions & 0 deletions flatpak/de.wger.flutter.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[D-BUS Service]
Name=de.wger.flutter
Exec=/app/bin/wger --gapplication-service
3 changes: 1 addition & 2 deletions integration_test/make_screenshots_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ enum DeviceType {
androidWear('wearScreenshots'),

iOSPhoneBig('iPhone 6.9', isAndroid: false),
iOSPhoneSmall('iPhone 6.7', isAndroid: false)
;
iOSPhoneSmall('iPhone 6.7', isAndroid: false);

final String folderName;
final bool isAndroid;
Expand Down
175 changes: 78 additions & 97 deletions integration_test/screenshots_01_dashboard.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,131 +17,112 @@
*/

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod;
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/models/workouts/session.dart';
import 'package:wger/providers/auth.dart';
import 'package:wger/providers/body_weight.dart';
import 'package:wger/providers/exercises.dart';
import 'package:wger/providers/gallery.dart';
import 'package:wger/providers/measurement.dart';
import 'package:wger/providers/nutrition.dart';
import 'package:wger/providers/routines.dart';
import 'package:wger/providers/user.dart';
import 'package:wger/models/measurements/measurement_category.dart';
import 'package:wger/providers/auth_notifier.dart';
import 'package:wger/providers/auth_state.dart';
import 'package:wger/providers/body_weight_repository.dart';
import 'package:wger/providers/gallery_repository.dart';
import 'package:wger/providers/ingredient_repository.dart';
import 'package:wger/providers/measurement_repository.dart';
import 'package:wger/providers/nutrition_notifier.dart';
import 'package:wger/providers/nutrition_repository.dart';
import 'package:wger/providers/routines_notifier.dart';
import 'package:wger/providers/user_profile_repository.dart';
import 'package:wger/screens/home_tabs_screen.dart';
import 'package:wger/theme/theme.dart';

import '../test/exercises/contribute_exercise_test.mocks.dart';
import '../test/gallery/gallery_form_test.mocks.dart';
import '../test/measurements/measurement_categories_screen_test.mocks.dart';
import '../test/nutrition/nutritional_plan_screen_test.mocks.dart';
import '../test/routine/weight_unit_form_widget_test.mocks.dart';
import '../test/weight/weight_screen_test.mocks.dart' as weight;
import '../test_data/body_weight.dart';
import '../test_data/exercises.dart';
import '../test_data/gallery.dart';
import '../test_data/measurements.dart';
import '../test_data/nutritional_plans.dart';
import '../test_data/profile.dart';
import '../test_data/routines.dart';

Widget createDashboardScreen({Locale? locale}) {
locale ??= const Locale('en');
class _FakeAuthNotifier extends AuthNotifier {
_FakeAuthNotifier(this._state);

final mockGalleryProvider = MockGalleryProvider();
final AuthState _state;

final mockExercisesProvider = MockExercisesProvider();
@override
Future<AuthState> build() async => _state;
}

final mockAuthProvider = MockAuthProvider();
when(mockAuthProvider.setServerVersion()).thenAnswer((_) async {});
when(mockAuthProvider.dataInit).thenReturn(true);
Widget createDashboardScreen({Locale? locale}) {
locale ??= const Locale('en');

final mockWorkoutProvider = MockRoutinesProvider();
when(mockWorkoutProvider.items).thenReturn([getTestRoutine(exercises: getScreenshotExercises())]);
when(
mockWorkoutProvider.currentRoutine,
).thenReturn(getTestRoutine(exercises: getScreenshotExercises()));
final mockGalleryRepo = MockGalleryRepository();
when(mockGalleryRepo.watchAllDrift()).thenAnswer((_) => Stream.value(getTestImages()));

when(mockWorkoutProvider.fetchSessionData()).thenAnswer(
(a) => Future.value([
WorkoutSession(
routineId: 1,
date: DateTime.now().add(const Duration(days: -1)),
timeStart: const TimeOfDay(hour: 17, minute: 34),
timeEnd: const TimeOfDay(hour: 19, minute: 3),
impression: 3,
),
]),
);
final mockNutritionRepo = weight.MockNutritionRepository();
final mockIngredientRepo = weight.MockIngredientRepository();
when(mockIngredientRepo.getById(any)).thenAnswer((_) async => null);

final mockNutritionProvider = weight.MockNutritionPlansProvider();
final mockBodyWeightRepository = MockBodyWeightRepository();
when(
mockBodyWeightRepository.watchAllDrift(),
).thenAnswer((_) => Stream.value(getWeightEntries()));

final mockMeasurementRepo = MockMeasurementRepository();
when(
mockNutritionProvider.currentPlan,
).thenAnswer((realInvocation) => getNutritionalPlanScreenshot());
when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]);
mockMeasurementRepo.watchAll(),
).thenAnswer((_) => Stream<List<MeasurementCategory>>.value(getMeasurementCategories()));

final mockWeightProvider = weight.MockBodyWeightProvider();
when(mockWeightProvider.items).thenReturn(getScreenshotWeightEntries());
final mockUserProfileRepo = weight.MockUserProfileRepository();
when(
mockUserProfileRepo.watchDrift(),
).thenAnswer((_) => Stream.value(tUserProfile1));

final mockMeasurementProvider = MockMeasurementProvider();
when(mockMeasurementProvider.categories).thenReturn(getMeasurementCategories());
const loggedInAuth = AuthState(
status: AuthStatus.loggedIn,
token: 'test-token',
serverUrl: 'http://localhost',
);
final container = ProviderContainer.test(
overrides: [
bodyWeightRepositoryProvider.overrideWithValue(mockBodyWeightRepository),
measurementRepositoryProvider.overrideWithValue(mockMeasurementRepo),
authProvider.overrideWith(() => _FakeAuthNotifier(loggedInAuth)),
userProfileRepositoryProvider.overrideWithValue(mockUserProfileRepo),
nutritionRepositoryProvider.overrideWithValue(mockNutritionRepo),
ingredientRepositoryProvider.overrideWithValue(mockIngredientRepo),
galleryRepositoryProvider.overrideWithValue(mockGalleryRepo),
],
);
container.read(routinesRiverpodProvider.notifier).state = AsyncData(
RoutinesState(
routines: [getTestRoutine(exercises: getScreenshotExercises())],
),
);

final mockUserProvider = MockUserProvider();
when(mockUserProvider.profile).thenReturn(tProfile1);
when(mockUserProvider.dashboardWidgets).thenReturn([
DashboardWidget.routines,
DashboardWidget.weight,
DashboardWidget.measurements,
DashboardWidget.calendar,
DashboardWidget.nutrition,
DashboardWidget.trophies,
]);
// Seed the nutrition notifier with the screenshot plan so the dashboard can
// show it without going through the server.
container.read(nutritionProvider.notifier).state = AsyncData(
NutritionState(plans: [getNutritionalPlanScreenshot()]),
);

return riverpod.ProviderScope(
child: MediaQuery(
data: MediaQueryData.fromView(WidgetsBinding.instance.platformDispatcher.views.first)
.copyWith(
padding: EdgeInsets.zero,
viewPadding: EdgeInsets.zero,
viewInsets: EdgeInsets.zero,
),
child: MultiProvider(
providers: [
ChangeNotifierProvider<GalleryProvider>(
create: (context) => mockGalleryProvider,
),
ChangeNotifierProvider<ExercisesProvider>(
create: (context) => mockExercisesProvider,
),
ChangeNotifierProvider<AuthProvider>(
create: (context) => mockAuthProvider,
),
ChangeNotifierProvider<UserProvider>(
create: (context) => mockUserProvider,
),
ChangeNotifierProvider<RoutinesProvider>(
create: (context) => mockWorkoutProvider,
),
ChangeNotifierProvider<NutritionPlansProvider>(
create: (context) => mockNutritionProvider,
),
ChangeNotifierProvider<BodyWeightProvider>(
create: (context) => mockWeightProvider,
),
ChangeNotifierProvider<MeasurementProvider>(
create: (context) => mockMeasurementProvider,
),
],
child: MaterialApp(
locale: locale,
debugShowCheckedModeBanner: false,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
theme: wgerLightTheme,
home: HomeTabsScreen(),
),
return MediaQuery(
data: MediaQueryData.fromView(WidgetsBinding.instance.platformDispatcher.views.first).copyWith(
padding: EdgeInsets.zero,
viewPadding: EdgeInsets.zero,
viewInsets: EdgeInsets.zero,
),
child: UncontrolledProviderScope(
container: container,
child: MaterialApp(
locale: locale,
debugShowCheckedModeBanner: false,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
theme: wgerLightTheme,
home: HomeTabsScreen(),
),
),
);
Expand Down
22 changes: 10 additions & 12 deletions integration_test/screenshots_02_workout.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,37 +17,35 @@
*/

import 'package:flutter/material.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod;
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/providers/routines.dart';
import 'package:wger/providers/routines_notifier.dart';
import 'package:wger/screens/routine_screen.dart';
import 'package:wger/theme/theme.dart';

import '../test/routine/routine_form_test.mocks.dart';
import '../test_data/exercises.dart';
import '../test_data/routines.dart';

Widget createWorkoutDetailScreen({Locale? locale}) {
locale ??= const Locale('en');
final key = GlobalKey<NavigatorState>();

final mockRoutinesProvider = MockRoutinesProvider();
final routine = getTestRoutine(exercises: getScreenshotExercises());
when(mockRoutinesProvider.findById(1)).thenReturn(routine);
final container = riverpod.ProviderContainer.test();
container.read(routinesRiverpodProvider.notifier).state = riverpod.AsyncData(
RoutinesState(
routines: [getTestRoutine(exercises: getScreenshotExercises())],
),
);

return MediaQuery(
data: MediaQueryData.fromView(WidgetsBinding.instance.platformDispatcher.views.first).copyWith(
padding: EdgeInsets.zero,
viewPadding: EdgeInsets.zero,
viewInsets: EdgeInsets.zero,
),
child: MultiProvider(
providers: [
ChangeNotifierProvider<RoutinesProvider>(
create: (context) => mockRoutinesProvider,
),
],
child: riverpod.UncontrolledProviderScope(
container: container,
child: MaterialApp(
locale: locale,
debugShowCheckedModeBanner: false,
Expand Down
Loading
Loading