diff --git a/lib/providers/user.dart b/lib/providers/user.dart index 24c2446d..27f7516d 100644 --- a/lib/providers/user.dart +++ b/lib/providers/user.dart @@ -17,6 +17,7 @@ */ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -29,13 +30,23 @@ class UserProvider with ChangeNotifier { ThemeMode themeMode = ThemeMode.system; final WgerBaseProvider baseProvider; late SharedPreferencesAsync prefs; - bool hideNutrition = false; + // bool hideNutrition = false; + + // New: visibility state for dashboard widgets + Map dashboardWidgetVisibility = { + 'routines': true, + 'weight': true, + 'measurements': true, + 'calendar': true, + 'nutrition': true, + }; + + static const String PREFS_DASHBOARD_VISIBILITY = 'dashboardWidgetVisibility'; UserProvider(this.baseProvider, {SharedPreferencesAsync? prefs}) { this.prefs = prefs ?? PreferenceHelper.asyncPref; _loadThemeMode(); - _loadHideNutrition(); - + _loadDashboardVisibility(); } static const PROFILE_URL = 'userprofile'; @@ -69,13 +80,34 @@ class UserProvider with ChangeNotifier { notifyListeners(); } + Future _loadDashboardVisibility() async { + final jsonString = await prefs.getString(PREFS_DASHBOARD_VISIBILITY); + + if (jsonString != null) { + try { + final decoded = jsonDecode(jsonString) as Map; + dashboardWidgetVisibility = + decoded.map((k, v) => MapEntry(k, v as bool)); + } catch (_) { + // If parsing fails, keep defaults + } + } - Future _loadHideNutrition() async { - final val = await prefs.getBool('hideNutrition'); - hideNutrition = val ?? false; notifyListeners(); } + bool isDashboardWidgetVisible(String key) { + return dashboardWidgetVisibility[key] ?? true; + } + + Future setDashboardWidgetVisible(String key, bool visible) async { + dashboardWidgetVisibility[key] = visible; + await prefs.setString( + PREFS_DASHBOARD_VISIBILITY, + jsonEncode(dashboardWidgetVisibility), + ); + notifyListeners(); + } // Change mode on switch button click void setThemeMode(ThemeMode mode) async { @@ -91,12 +123,6 @@ class UserProvider with ChangeNotifier { notifyListeners(); } - void setHideNutrition(bool value) async { - hideNutrition = value; - await prefs.setBool('hideNutrition', value); - notifyListeners(); - } - /// Fetch the current user's profile Future fetchAndSetProfile() async { final userData = await baseProvider.fetch(baseProvider.makeUrl(PROFILE_URL)); diff --git a/lib/screens/dashboard.dart b/lib/screens/dashboard.dart index e3ad1b7d..802a91e6 100644 --- a/lib/screens/dashboard.dart +++ b/lib/screens/dashboard.dart @@ -42,11 +42,16 @@ class DashboardScreen extends StatelessWidget { padding: const EdgeInsets.all(10), child: Column( children: [ - DashboardRoutineWidget(), - DashboardWeightWidget(), - DashboardMeasurementWidget(), - DashboardCalendarWidget(), - if (!user.hideNutrition) DashboardNutritionWidget(), + if (user.isDashboardWidgetVisible('routines')) + const DashboardRoutineWidget(), + if (user.isDashboardWidgetVisible('weight')) + const DashboardWeightWidget(), + if (user.isDashboardWidgetVisible('measurements')) + const DashboardMeasurementWidget(), + if (user.isDashboardWidgetVisible('calendar')) + const DashboardCalendarWidget(), + if (user.isDashboardWidgetVisible('nutrition')) + const DashboardNutritionWidget(), ], ), ), diff --git a/lib/widgets/core/settings.dart b/lib/widgets/core/settings.dart index d2e233da..a0f55136 100644 --- a/lib/widgets/core/settings.dart +++ b/lib/widgets/core/settings.dart @@ -49,13 +49,39 @@ class SettingsPage extends StatelessWidget { const SettingsTheme(), Consumer( builder: (context, user, _) { - return SwitchListTile( - title: const Text('Show nutrition section on dashboard'), - value: !user.hideNutrition, - onChanged: (v) { - Provider.of(context, listen: false) - .setHideNutrition(!v); - }, + return Column( + children: [ + SwitchListTile( + title: const Text('Show routines on dashboard'), + value: user.isDashboardWidgetVisible('routines'), + onChanged: (v) => + user.setDashboardWidgetVisible('routines', v), + ), + SwitchListTile( + title: const Text('Show weight on dashboard'), + value: user.isDashboardWidgetVisible('weight'), + onChanged: (v) => + user.setDashboardWidgetVisible('weight', v), + ), + SwitchListTile( + title: const Text('Show measurements on dashboard'), + value: user.isDashboardWidgetVisible('measurements'), + onChanged: (v) => + user.setDashboardWidgetVisible('measurements', v), + ), + SwitchListTile( + title: const Text('Show calendar on dashboard'), + value: user.isDashboardWidgetVisible('calendar'), + onChanged: (v) => + user.setDashboardWidgetVisible('calendar', v), + ), + SwitchListTile( + title: const Text('Show nutrition on dashboard'), + value: user.isDashboardWidgetVisible('nutrition'), + onChanged: (v) => + user.setDashboardWidgetVisible('nutrition', v), + ), + ], ); }, ),