import 'package:flutter/foundation.dart'; import '../models/settings.dart'; import '../services/settings_service.dart'; class SettingsViewModel extends ChangeNotifier { final SettingsService settingsService; SettingsViewModel({required this.settingsService}); AppSettings _settings = AppSettings.defaults; bool _isLoading = false; bool _hasLoaded = false; String? _errorMessage; AppSettings get settings => _settings; bool get isLoading => _isLoading; bool get hasLoaded => _hasLoaded; String? get errorMessage => _errorMessage; Future ensureLoaded() async { if (_hasLoaded || _isLoading) return; await load(); } Future load() async { if (_isLoading) return; _isLoading = true; _errorMessage = null; notifyListeners(); try { _settings = await settingsService.getSettings(); } catch (_) { _errorMessage = 'Could not load settings.'; } finally { _hasLoaded = true; _isLoading = false; notifyListeners(); } } /// Just flips the preference flag. Caller is responsible for having /// already set/verified the actual PIN via PinLockViewModel first. Future updatePinRequired(bool value) => _save(_settings.copyWith(pinRequired: value)); Future updateThemeMode(AppThemeMode mode) => _save(_settings.copyWith(themeMode: mode)); Future _save(AppSettings updated) async { final previous = _settings; _settings = updated; _errorMessage = null; notifyListeners(); try { await settingsService.saveSettings(updated); } catch (_) { _settings = previous; _errorMessage = 'Could not save settings.'; notifyListeners(); } } }