feat: type schedule and auth models
This commit is contained in:
@@ -5,10 +5,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import '../app/error_message.dart';
|
||||
import '../app/load_state.dart';
|
||||
import '../models/api_key_info.dart';
|
||||
import '../models/auth_info.dart';
|
||||
import '../models/ignis_device.dart';
|
||||
import '../models/ignis_group.dart';
|
||||
import '../models/ignis_scene.dart';
|
||||
import '../models/home_config.dart';
|
||||
import '../models/schedule_task.dart';
|
||||
import '../services/api_client.dart';
|
||||
import '../services/settings_service.dart';
|
||||
import '../services/geofence_worker.dart';
|
||||
@@ -624,32 +627,22 @@ class ScenesNotifier extends Notifier<LoadState<List<IgnisScene>>> {
|
||||
|
||||
// ─── Расписания ──────────────────────────────────────────────
|
||||
|
||||
final tasksProvider = NotifierProvider<TasksNotifier, LoadState<List<dynamic>>>(
|
||||
() => TasksNotifier(),
|
||||
);
|
||||
final tasksProvider =
|
||||
NotifierProvider<TasksNotifier, LoadState<List<ScheduleTask>>>(
|
||||
() => TasksNotifier(),
|
||||
);
|
||||
|
||||
class TasksNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
class TasksNotifier extends Notifier<LoadState<List<ScheduleTask>>> {
|
||||
@override
|
||||
LoadState<List<dynamic>> build() => const LoadState.idle(<dynamic>[]);
|
||||
LoadState<List<ScheduleTask>> build() =>
|
||||
const LoadState.idle(<ScheduleTask>[]);
|
||||
|
||||
Future<void> load() async {
|
||||
state = LoadState.loading(state.data);
|
||||
try {
|
||||
final api = ref.read(apiProvider);
|
||||
final res = await api.getTasks();
|
||||
final data = res.data;
|
||||
late final List<dynamic> tasks;
|
||||
if (data is List) {
|
||||
tasks = List<dynamic>.from(data);
|
||||
} else if (data is Map) {
|
||||
final value = data['tasks'] ?? data['data'] ?? data.values.toList();
|
||||
if (value is! List) {
|
||||
throw FormatException('tasks должен быть списком расписаний');
|
||||
}
|
||||
tasks = List<dynamic>.from(value);
|
||||
} else {
|
||||
throw FormatException('tasks должен быть списком расписаний');
|
||||
}
|
||||
final tasks = ScheduleTask.listFromApi(res.data);
|
||||
|
||||
state = tasks.isEmpty ? LoadState.empty(tasks) : LoadState.data(tasks);
|
||||
} catch (e) {
|
||||
@@ -774,32 +767,20 @@ class EventLogNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
// ─── API-ключи ───────────────────────────────────────────────
|
||||
|
||||
final apiKeysProvider =
|
||||
NotifierProvider<ApiKeysNotifier, LoadState<List<dynamic>>>(
|
||||
NotifierProvider<ApiKeysNotifier, LoadState<List<ApiKeyInfo>>>(
|
||||
() => ApiKeysNotifier(),
|
||||
);
|
||||
|
||||
class ApiKeysNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
class ApiKeysNotifier extends Notifier<LoadState<List<ApiKeyInfo>>> {
|
||||
@override
|
||||
LoadState<List<dynamic>> build() => const LoadState.idle(<dynamic>[]);
|
||||
LoadState<List<ApiKeyInfo>> build() => const LoadState.idle(<ApiKeyInfo>[]);
|
||||
|
||||
Future<void> load() async {
|
||||
state = LoadState.loading(state.data);
|
||||
try {
|
||||
final api = ref.read(apiProvider);
|
||||
final res = await api.getApiKeys();
|
||||
final data = res.data;
|
||||
late final List<dynamic> keys;
|
||||
if (data is List) {
|
||||
keys = List<dynamic>.from(data);
|
||||
} else if (data is Map) {
|
||||
final value = data['data'] ?? data['keys'] ?? data.values.toList();
|
||||
if (value is! List) {
|
||||
throw FormatException('api-keys должен быть списком ключей');
|
||||
}
|
||||
keys = List<dynamic>.from(value);
|
||||
} else {
|
||||
throw FormatException('api-keys должен быть списком ключей');
|
||||
}
|
||||
final keys = ApiKeyInfo.listFromApi(res.data);
|
||||
|
||||
state = keys.isEmpty ? LoadState.empty(keys) : LoadState.data(keys);
|
||||
} catch (e) {
|
||||
@@ -833,29 +814,26 @@ class ApiKeysNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
|
||||
// ─── Информация об авторизации ────────────────────────────────
|
||||
|
||||
final authInfoProvider =
|
||||
NotifierProvider<AuthInfoNotifier, Map<String, dynamic>?>(
|
||||
() => AuthInfoNotifier(),
|
||||
);
|
||||
final authInfoProvider = NotifierProvider<AuthInfoNotifier, AuthInfo?>(
|
||||
() => AuthInfoNotifier(),
|
||||
);
|
||||
|
||||
class AuthInfoNotifier extends Notifier<Map<String, dynamic>?> {
|
||||
class AuthInfoNotifier extends Notifier<AuthInfo?> {
|
||||
@override
|
||||
Map<String, dynamic>? build() => null;
|
||||
AuthInfo? build() => null;
|
||||
|
||||
Future<void> load({bool failOnError = false}) async {
|
||||
try {
|
||||
final api = ref.read(apiProvider);
|
||||
final res = await api.getAuthMe();
|
||||
if (res.data is Map) {
|
||||
state = Map<String, dynamic>.from(res.data);
|
||||
}
|
||||
state = AuthInfo.fromApi(res.data);
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка загрузки auth/me: $e");
|
||||
if (failOnError) rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
bool get isAdmin => state?['is_admin'] == true;
|
||||
bool get isAdmin => state?.isAdmin == true;
|
||||
}
|
||||
|
||||
// ─── Геофенс: управление фоновым таском ─────────────────────
|
||||
|
||||
Reference in New Issue
Block a user