From a09d2a581f7b435ea55aa32a5fc7bbb093f4d021 Mon Sep 17 00:00:00 2001 From: hunteraraujo Date: Sat, 23 Sep 2023 21:51:07 -0700 Subject: [PATCH] Enhance SettingsViewModel with State Persistence and Sign Out MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit enriches the `SettingsViewModel` by integrating state persistence functionality and a sign-out method, thus ensuring a more robust and user-friendly settings feature. Key Enhancements: 1. **State Persistence**: - Leveraging the `shared_preferences` package, the app now stores and retrieves user preferences related to app settings, ensuring consistency across app restarts. - Preferences like Dark Mode, Developer Mode, Base URL, and Continuous Mode Steps are persistently stored and loaded when the ViewModel is initialized. 2. **Sign Out Method**: - A `signOut` method has been introduced in the ViewModel, utilizing the `AuthService` to facilitate user sign-out processes. - This addition allows for seamless integration of sign-out functionality within the settings interface, granting users the ability to easily terminate sessions. 3. **SettingsView Enhancement**: - The `SettingsView` has been adapted to incorporate a UI element invoking the `signOut` method, enhancing user interaction within the settings environment. This enhancement not only bolsters the resilience and usability of the app’s settings but also lays down a structured approach for potential future additions to user preferences and settings-related functionalities. --- .../lib/viewmodels/settings_viewmodel.dart | 50 +++++++++++++++++-- .../lib/views/settings/settings_view.dart | 7 +++ 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/frontend/lib/viewmodels/settings_viewmodel.dart b/frontend/lib/viewmodels/settings_viewmodel.dart index cda305e7e0..27df8bdb5d 100644 --- a/frontend/lib/viewmodels/settings_viewmodel.dart +++ b/frontend/lib/viewmodels/settings_viewmodel.dart @@ -1,4 +1,6 @@ +import 'package:auto_gpt_flutter_client/services/auth_service.dart'; import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; /// [SettingsViewModel] is responsible for managing the state and logic /// for the [SettingsView]. It extends [ChangeNotifier] to provide @@ -15,32 +17,48 @@ class SettingsViewModel extends ChangeNotifier { String get baseURL => _baseURL; int get continuousModeSteps => _continuousModeSteps; + final AuthService _authService = AuthService(); + + SettingsViewModel() { + _loadPreferences(); // Load stored preferences when the view model is created + } + + // Method to load stored preferences + Future _loadPreferences() async { + final prefs = await SharedPreferences.getInstance(); + _isDarkModeEnabled = prefs.getBool('isDarkModeEnabled') ?? false; + _isDeveloperModeEnabled = prefs.getBool('isDeveloperModeEnabled') ?? false; + _baseURL = prefs.getString('baseURL') ?? ''; + _continuousModeSteps = prefs.getInt('continuousModeSteps') ?? 10; + notifyListeners(); + } + /// Toggles the state of Dark Mode and notifies listeners. void toggleDarkMode(bool value) { _isDarkModeEnabled = value; notifyListeners(); - // TODO: Save to local storage or sync with the server + _saveBoolPreference('isDarkModeEnabled', value); } /// Toggles the state of Developer Mode and notifies listeners. void toggleDeveloperMode(bool value) { _isDeveloperModeEnabled = value; notifyListeners(); - // TODO: Save to local storage or sync with the server + _saveBoolPreference('isDeveloperModeEnabled', value); } /// Updates the state of Base URL and notifies listeners. void updateBaseURL(String value) { _baseURL = value; notifyListeners(); - // TODO: Save to local storage or sync with the server + _saveStringPreference('baseURL', value); } /// Increments the number of Continuous Mode Steps and notifies listeners. void incrementContinuousModeSteps() { _continuousModeSteps += 1; notifyListeners(); - // TODO: Save to local storage or sync with the server + _saveIntPreference('continuousModeSteps', _continuousModeSteps); } /// Decrements the number of Continuous Mode Steps and notifies listeners. @@ -49,7 +67,29 @@ class SettingsViewModel extends ChangeNotifier { // Ensure that the number of steps is at least 1 _continuousModeSteps -= 1; notifyListeners(); - // TODO: Save to local storage or sync with the server + _saveIntPreference('continuousModeSteps', _continuousModeSteps); } } + + // TODO: Create a service for interacting with shared preferences + // Helper methods to save preferences + Future _saveBoolPreference(String key, bool value) async { + final prefs = await SharedPreferences.getInstance(); + prefs.setBool(key, value); + } + + Future _saveStringPreference(String key, String value) async { + final prefs = await SharedPreferences.getInstance(); + prefs.setString(key, value); + } + + Future _saveIntPreference(String key, int value) async { + final prefs = await SharedPreferences.getInstance(); + prefs.setInt(key, value); + } + + // Method to sign out + Future signOut() async { + await _authService.signOut(); + } } diff --git a/frontend/lib/views/settings/settings_view.dart b/frontend/lib/views/settings/settings_view.dart index 97416bbc6d..0529d92576 100644 --- a/frontend/lib/views/settings/settings_view.dart +++ b/frontend/lib/views/settings/settings_view.dart @@ -62,6 +62,13 @@ class SettingsView extends StatelessWidget { ], ), ), + ListTile( + title: Text('Sign Out'), + onTap: () { + viewModel.signOut(); + // Optionally, navigate to a different view or show a message + }, + ), ], ); },