it0/it0_app/lib/features/settings/presentation/providers/settings_providers.dart

109 lines
3.5 KiB
Dart

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<SharedPreferences>((ref) {
return SharedPreferences.getInstance();
});
final settingsDatasourceProvider = Provider<SettingsDatasource?>((ref) {
final prefsAsync = ref.watch(_sharedPreferencesProvider);
return prefsAsync.whenOrNull(
data: (prefs) => SettingsDatasource(prefs),
);
});
final settingsRepositoryProvider = Provider<SettingsRepository?>((ref) {
final datasource = ref.watch(settingsDatasourceProvider);
if (datasource == null) return null;
return SettingsRepositoryImpl(datasource);
});
// ---------------------------------------------------------------------------
// Settings state notifier
// ---------------------------------------------------------------------------
class SettingsNotifier extends StateNotifier<AppSettings> {
final SettingsRepository? _repository;
SettingsNotifier(this._repository) : super(const AppSettings()) {
_loadSettings();
}
Future<void> _loadSettings() async {
if (_repository == null) return;
try {
final settings = await _repository.loadSettings();
state = settings;
} catch (_) {
// Use defaults on error
}
}
Future<void> setThemeMode(ThemeMode mode) async {
state = state.copyWith(themeMode: mode);
await _repository?.saveSettings(state);
}
Future<void> setNotificationsEnabled(bool enabled) async {
state = state.copyWith(notificationsEnabled: enabled);
await _repository?.saveSettings(state);
}
Future<void> setSoundEnabled(bool enabled) async {
state = state.copyWith(soundEnabled: enabled);
await _repository?.saveSettings(state);
}
Future<void> setHapticFeedback(bool enabled) async {
state = state.copyWith(hapticFeedback: enabled);
await _repository?.saveSettings(state);
}
Future<void> setTenant(String? id, String? name) async {
state = state.copyWith(selectedTenantId: id, selectedTenantName: name);
await _repository?.saveSettings(state);
}
Future<void> setLanguage(String language) async {
state = state.copyWith(language: language);
await _repository?.saveSettings(state);
}
Future<void> setBiometricEnabled(bool enabled) async {
state = state.copyWith(biometricEnabled: enabled);
await _repository?.saveSettings(state);
}
Future<void> resetToDefaults() async {
await _repository?.resetSettings();
state = const AppSettings();
}
}
// ---------------------------------------------------------------------------
// Main providers
// ---------------------------------------------------------------------------
final settingsProvider =
StateNotifierProvider<SettingsNotifier, AppSettings>((ref) {
final repository = ref.watch(settingsRepositoryProvider);
return SettingsNotifier(repository);
});
final themeModeProvider = Provider<ThemeMode>((ref) {
return ref.watch(settingsProvider).themeMode;
});
final notificationsEnabledProvider = Provider<bool>((ref) {
return ref.watch(settingsProvider).notificationsEnabled;
});