79 lines
2.7 KiB
Dart
79 lines
2.7 KiB
Dart
import 'dart:convert';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import '../models/home_config.dart';
|
|
|
|
/// Сервис для хранения списка "домов" и текущего выбранного.
|
|
/// Данные лежат в SharedPreferences как JSON-массив.
|
|
class SettingsService {
|
|
static const String _homesKey = 'ignis_homes';
|
|
static const String _currentHomeKey = 'ignis_current_home_id';
|
|
|
|
/// Загрузить все дома
|
|
Future<List<HomeConfig>> getHomes() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final raw = prefs.getString(_homesKey);
|
|
if (raw == null || raw.isEmpty) return [];
|
|
final list = jsonDecode(raw) as List<dynamic>;
|
|
return list.map((e) => HomeConfig.fromJson(e as Map<String, dynamic>)).toList();
|
|
}
|
|
|
|
/// Сохранить весь список домов
|
|
Future<void> saveHomes(List<HomeConfig> homes) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_homesKey, jsonEncode(homes.map((h) => h.toJson()).toList()));
|
|
}
|
|
|
|
/// Добавить или обновить дом
|
|
Future<void> upsertHome(HomeConfig home) async {
|
|
final homes = await getHomes();
|
|
final idx = homes.indexWhere((h) => h.id == home.id);
|
|
if (idx >= 0) {
|
|
homes[idx] = home;
|
|
} else {
|
|
homes.add(home);
|
|
}
|
|
await saveHomes(homes);
|
|
}
|
|
|
|
/// Удалить дом по id
|
|
Future<void> deleteHome(String id) async {
|
|
final homes = await getHomes();
|
|
homes.removeWhere((h) => h.id == id);
|
|
await saveHomes(homes);
|
|
|
|
// Если удалили текущий -- сбрасываем выбор
|
|
final currentId = await getCurrentHomeId();
|
|
if (currentId == id) {
|
|
await setCurrentHomeId(homes.isNotEmpty ? homes.first.id : null);
|
|
}
|
|
}
|
|
|
|
/// Получить id текущего активного дома
|
|
Future<String?> getCurrentHomeId() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
return prefs.getString(_currentHomeKey);
|
|
}
|
|
|
|
/// Установить текущий дом
|
|
Future<void> setCurrentHomeId(String? id) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
if (id == null) {
|
|
await prefs.remove(_currentHomeKey);
|
|
} else {
|
|
await prefs.setString(_currentHomeKey, id);
|
|
}
|
|
}
|
|
|
|
/// Удобный метод: получить текущий HomeConfig или null
|
|
Future<HomeConfig?> getCurrentHome() async {
|
|
final homes = await getHomes();
|
|
final id = await getCurrentHomeId();
|
|
if (id == null && homes.isNotEmpty) return homes.first;
|
|
try {
|
|
return homes.firstWhere((h) => h.id == id);
|
|
} catch (_) {
|
|
return homes.isNotEmpty ? homes.first : null;
|
|
}
|
|
}
|
|
}
|