import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../data/datasources/settings_datasource.dart'; import '../../data/repositories/settings_repository_impl.dart'; import '../../domain/entities/app_settings.dart'; import '../../domain/repositories/settings_repository.dart'; // --------------------------------------------------------------------------- // Dependency providers // --------------------------------------------------------------------------- final _sharedPreferencesProvider = FutureProvider((ref) { return SharedPreferences.getInstance(); }); final settingsDatasourceProvider = Provider((ref) { final prefsAsync = ref.watch(_sharedPreferencesProvider); return prefsAsync.whenOrNull( data: (prefs) => SettingsDatasource(prefs), ); }); final settingsRepositoryProvider = Provider((ref) { final datasource = ref.watch(settingsDatasourceProvider); if (datasource == null) return null; return SettingsRepositoryImpl(datasource); }); // --------------------------------------------------------------------------- // Settings state notifier // --------------------------------------------------------------------------- class SettingsNotifier extends StateNotifier { final SettingsRepository? _repository; SettingsNotifier(this._repository) : super(const AppSettings()) { _loadSettings(); } Future _loadSettings() async { if (_repository == null) return; try { final settings = await _repository.loadSettings(); state = settings; } catch (_) { // Use defaults on error } } Future setThemeMode(ThemeMode mode) async { state = state.copyWith(themeMode: mode); await _repository?.saveSettings(state); } Future setNotificationsEnabled(bool enabled) async { state = state.copyWith(notificationsEnabled: enabled); await _repository?.saveSettings(state); } Future setSoundEnabled(bool enabled) async { state = state.copyWith(soundEnabled: enabled); await _repository?.saveSettings(state); } Future setHapticFeedback(bool enabled) async { state = state.copyWith(hapticFeedback: enabled); await _repository?.saveSettings(state); } Future setTenant(String? id, String? name) async { state = state.copyWith(selectedTenantId: id, selectedTenantName: name); await _repository?.saveSettings(state); } Future setLanguage(String language) async { state = state.copyWith(language: language); await _repository?.saveSettings(state); } Future setBiometricEnabled(bool enabled) async { state = state.copyWith(biometricEnabled: enabled); await _repository?.saveSettings(state); } Future resetToDefaults() async { await _repository?.resetSettings(); state = const AppSettings(); } } // --------------------------------------------------------------------------- // Main providers // --------------------------------------------------------------------------- final settingsProvider = StateNotifierProvider((ref) { final repository = ref.watch(settingsRepositoryProvider); return SettingsNotifier(repository); }); final themeModeProvider = Provider((ref) { return ref.watch(settingsProvider).themeMode; }); final notificationsEnabledProvider = Provider((ref) { return ref.watch(settingsProvider).notificationsEnabled; });