Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions lib/providers/gym_state.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:wger/models/exercises/exercise.dart';
Expand Down Expand Up @@ -35,40 +36,58 @@ class GymState {
dayId: dayId ?? this.dayId,
);
}
@override
String toString() {
return 'GymState(currentPage: $currentPage, showExercisePages: $showExercisePages, exercisePages: ${exercisePages.length} exercises, dayId: $dayId)';
}
}

class GymStateNotifier extends StateNotifier<GymState> {
final _prefs = SharedPreferences.getInstance();

GymStateNotifier() : super(const GymState()) {
debugPrint('GymStateNotifier: Initializing');
_loadSavedState();
}

Future<void> _loadSavedState() async {
debugPrint('GymStateNotifier: Loading saved state');
final SharedPreferences prefs = await _prefs;
final int savedPage = prefs.getInt(GYM_PAGE_KEY) ?? 0;
debugPrint('GymStateNotifier: Loaded saved page: $savedPage');
state = state.copyWith(currentPage: savedPage);
}

Future<void> setCurrentPage(int page) async {
debugPrint('GymStateNotifier: Setting page from ${state.currentPage} to $page');
final SharedPreferences prefs = await _prefs;
await prefs.setInt(GYM_PAGE_KEY, page);
state = state.copyWith(currentPage: page);
debugPrint('GymStateNotifier: New state - $state');
}

void toggleExercisePages() {
state = state.copyWith(showExercisePages: !state.showExercisePages);
}

void setDayId(int dayId) {
state = state.copyWith(dayId: dayId);
}
void setExercisePages(Map<Exercise, int> exercisePages) {
debugPrint('GymStateNotifier: Setting exercise pages - ${exercisePages.length} exercises');
state = state.copyWith(exercisePages: exercisePages);
debugPrint('GymStateNotifier: Exercise pages set - ${exercisePages.entries.map((e) => '${e.key.id}: ${e.value}').join(', ')}');
debugPrint('GymStateNotifier: New state - $state');
}

void clear() {
Future<void> clear() async {
debugPrint('GymStateNotifier: Clearing state');
final SharedPreferences prefs = await _prefs;
await prefs.remove(GYM_PAGE_KEY);
state = state.copyWith(
exercisePages: {},
currentPage: 0,
dayId: null,
);
debugPrint('GymStateNotifier: State cleared - $state');
}
}
140 changes: 91 additions & 49 deletions lib/widgets/routines/gym_mode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,52 +62,81 @@ class GymMode extends ConsumerStatefulWidget {
ConsumerState<GymMode> createState() => _GymModeState();
}

class _GymModeState extends ConsumerState<GymMode> {
var _totalElements = 1;
class _GymModeState extends ConsumerState<GymMode> {
var _totalElements = 1;

/// Map with the first (navigation) page for each exercise
final Map<Exercise, int> _exercisePages = {};
late final PageController _controller;
/// Map with the first (navigation) page for each exercise
final Map<Exercise, int> _exercisePages = {};
late final PageController _controller;

@override
void dispose() {
_controller.dispose();
super.dispose();
}

@override
void initState() {
super.initState();
final initialPage = ref.read(gymStateProvider).currentPage;
_controller = PageController(initialPage: initialPage);
Future.microtask(() => _calculatePages());
}

void _calculatePages() {
for (final slot in widget._dayDataGym.slots) {
_totalElements += slot.setConfigs.length;
@override
void dispose() {
_controller.dispose();
super.dispose();
}

var currentPage = 1;
final Map<Exercise, int> exercisePages = {};
@override
void initState() {
super.initState();

// Initialize the controller with the current page
final initialPage = ref.read(gymStateProvider).currentPage;
_controller = PageController(initialPage: initialPage);

// Delay state modifications until after the widget tree is built
Future.microtask(() {
// Get the saved page and day from the provider
final savedPage = ref.read(gymStateProvider).currentPage;
final savedDayId = ref.read(gymStateProvider).dayId;
debugPrint('Saved Page: $savedPage');
debugPrint('Saved Day ID: $savedDayId');

// Set the dayId in the state
ref.read(gymStateProvider.notifier).setDayId(widget._dayDataGym.day!.id!);
debugPrint('Current Day ID: ${widget._dayDataGym.day!.id}');

// Check if the current day is different from the saved day
if (widget._dayDataGym.day!.id != savedDayId) {
// Reset the saved page to 0
ref.read(gymStateProvider.notifier).setCurrentPage(0);
debugPrint('Different day detected. Resetting to page 0.');
} else {
// Use the saved page
ref.read(gymStateProvider.notifier).setCurrentPage(savedPage);
debugPrint('Same day detected. Using saved page: $savedPage');
}

for (final slot in widget._dayDataGym.slots) {
var firstPage = true;
for (final config in slot.setConfigs) {
final exercise = provider.Provider.of<ExercisesProvider>(context, listen: false)
.findExerciseById(config.exerciseId);
// Calculate the pages
_calculatePages();
});
}

if (firstPage) {
exercisePages[exercise] = currentPage;
currentPage++;
void _calculatePages() {
// for (final slot in widget._dayDataGym.slots) {
// _totalElements += slot.setConfigs.length;
// }
_totalElements = 1;
_exercisePages.clear();
var currentPage = 1;


for (final slot in widget._dayDataGym.slots) {
var firstPage = true;
for (final config in slot.setConfigs) {
final exercise = provider.Provider.of<ExercisesProvider>(context, listen: false)
.findExerciseById(config.exerciseId);

if (firstPage) {
_exercisePages[exercise] = currentPage;
currentPage++;
}
currentPage += 2;
firstPage = false;
}
currentPage += 2;
firstPage = false;
}
}

ref.read(gymStateProvider.notifier).setExercisePages(exercisePages);
}
ref.read(gymStateProvider.notifier).setExercisePages(_exercisePages);
}

List<Widget> getContent() {
final state = ref.watch(gymStateProvider);
Expand Down Expand Up @@ -152,20 +181,33 @@ class _GymModeState extends ConsumerState<GymMode> {

@override
Widget build(BuildContext context) {
final List<Widget> children = [
StartPage(_controller, widget._dayDataDisplay, _exercisePages),
...getContent(),
SessionPage(
provider.Provider.of<RoutinesProvider>(context, listen: false)
.findById(widget._dayDataGym.day!.routineId),
_controller,
widget._start,
_exercisePages,
),
];
return PageView(
controller: _controller,
onPageChanged: (page) => ref.read(gymStateProvider.notifier).setCurrentPage(page),
children: [
StartPage(_controller, widget._dayDataDisplay, _exercisePages),
...getContent(),
SessionPage(
provider.Provider.of<RoutinesProvider>(context, listen: false)
.findById(widget._dayDataGym.day!.routineId),
_controller,
widget._start,
_exercisePages,
),
],
onPageChanged: (page) {
// Update the current page
ref.read(gymStateProvider.notifier).setCurrentPage(page);
debugPrint('Current Page: $page');
debugPrint('Total Pages: ${children.length}');
// Check if the last page is reached
if (page == children.length - 1) {
ref.read(gymStateProvider.notifier).clear();
debugPrint('Last page reached. Resetting state and navigation.');
// Reset the navigation stack
_controller.jumpToPage(0);
}
},
children:children,
);
}
}
Expand Down