109 lines
3.5 KiB
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;
|
|
});
|