allow the users to hide / show all widgets in the home screen

This commit is contained in:
Diya Hituvalli
2025-12-08 13:57:42 -05:00
parent 9e24714cbd
commit c0d04cbb11
3 changed files with 81 additions and 24 deletions

View File

@@ -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<String, bool> 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<void> _loadDashboardVisibility() async {
final jsonString = await prefs.getString(PREFS_DASHBOARD_VISIBILITY);
if (jsonString != null) {
try {
final decoded = jsonDecode(jsonString) as Map<String, dynamic>;
dashboardWidgetVisibility =
decoded.map((k, v) => MapEntry(k, v as bool));
} catch (_) {
// If parsing fails, keep defaults
}
}
Future<void> _loadHideNutrition() async {
final val = await prefs.getBool('hideNutrition');
hideNutrition = val ?? false;
notifyListeners();
}
bool isDashboardWidgetVisible(String key) {
return dashboardWidgetVisibility[key] ?? true;
}
Future<void> 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<void> fetchAndSetProfile() async {
final userData = await baseProvider.fetch(baseProvider.makeUrl(PROFILE_URL));

View File

@@ -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(),
],
),
),

View File

@@ -49,13 +49,39 @@ class SettingsPage extends StatelessWidget {
const SettingsTheme(),
Consumer<UserProvider>(
builder: (context, user, _) {
return SwitchListTile(
title: const Text('Show nutrition section on dashboard'),
value: !user.hideNutrition,
onChanged: (v) {
Provider.of<UserProvider>(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),
),
],
);
},
),