import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../models/home_config.dart'; import '../geofence_task_sync.dart'; import '../services/geofence_runtime_store.dart'; import '../../auth/providers/auth_providers.dart'; import '../../shared/providers/core_providers.dart'; /// Текущий выбранный дом (null если ни одного нет) final currentHomeProvider = NotifierProvider( () => CurrentHomeNotifier(), ); class CurrentHomeNotifier extends Notifier { @override HomeConfig? build() => null; /// Загрузить текущий дом из SharedPreferences Future load() async { final svc = ref.read(settingsServiceProvider); state = await svc.getCurrentHome(); if (state != null) { await _initApi(state!); } } /// Переключиться на другой дом Future switchTo(HomeConfig home) async { final svc = ref.read(settingsServiceProvider); await svc.setCurrentHomeId(home.id); state = home; await _initApi(home); } /// Выбрать дом как активный и сразу проверить auth-state. /// Если `auth/me` падает, откатываемся к предыдущему дому и auth-state. Future select(HomeConfig home) async { final previousHome = state; final previousAuthState = ref.read(authInfoProvider); try { await switchTo(home); await ref.read(authInfoProvider.notifier).load(failOnError: true); await syncGeofenceTask(ref.read(homesProvider), currentHome: state); } catch (error) { await _restoreSelection(previousHome); ref.read(authInfoProvider.notifier).restore(previousAuthState); await syncGeofenceTask(ref.read(homesProvider), currentHome: state); rethrow; } } Future clear() async { await ref.read(settingsServiceProvider).setCurrentHomeId(null); state = null; await syncGeofenceTask(ref.read(homesProvider), currentHome: null); } /// Инициализировать API-клиент текущим домом Future _initApi(HomeConfig home) async { final apiKey = await ref .read(settingsServiceProvider) .requireHomeApiKey(home.id); ref.read(apiProvider).init(home.url, apiKey); } Future _restoreSelection(HomeConfig? home) async { if (home == null) { await clear(); return; } final svc = ref.read(settingsServiceProvider); await svc.setCurrentHomeId(home.id); state = home; await _initApi(home); } } final homesProvider = NotifierProvider>( () => HomesNotifier(), ); class HomesNotifier extends Notifier> { @override List build() => []; Future load() async { state = await ref.read(settingsServiceProvider).getHomes(); } Future add(HomeConfig home, {required String apiKey}) async { await ref.read(settingsServiceProvider).upsertHome(home, apiKey: apiKey); await load(); } Future remove(String id) async { await ref.read(settingsServiceProvider).deleteHome(id); await GeofenceRuntimeStore().removeHome(id); await load(); } Future update(HomeConfig home, {String? apiKey}) async { await ref.read(settingsServiceProvider).upsertHome(home, apiKey: apiKey); await load(); } }