feat: surface admin load errors
This commit is contained in:
@@ -622,36 +622,42 @@ class ScenesNotifier extends Notifier<List<dynamic>> {
|
||||
|
||||
// ─── Расписания ──────────────────────────────────────────────
|
||||
|
||||
final tasksProvider = NotifierProvider<TasksNotifier, List<dynamic>>(
|
||||
final tasksProvider = NotifierProvider<TasksNotifier, LoadState<List<dynamic>>>(
|
||||
() => TasksNotifier(),
|
||||
);
|
||||
|
||||
class TasksNotifier extends Notifier<List<dynamic>> {
|
||||
class TasksNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
@override
|
||||
List<dynamic> build() => [];
|
||||
LoadState<List<dynamic>> build() => const LoadState.idle(<dynamic>[]);
|
||||
|
||||
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) {
|
||||
state = data;
|
||||
tasks = List<dynamic>.from(data);
|
||||
} else if (data is Map) {
|
||||
state = data['tasks'] ?? data['data'] ?? data.values.toList();
|
||||
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 должен быть списком расписаний');
|
||||
}
|
||||
|
||||
state = tasks.isEmpty ? LoadState.empty(tasks) : LoadState.data(tasks);
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка загрузки расписаний: $e");
|
||||
state = LoadState.error(state.data, describeLoadError(e));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> cancel(String jobId) async {
|
||||
try {
|
||||
await ref.read(apiProvider).cancelTask(jobId);
|
||||
await load();
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка отмены задачи: $e");
|
||||
}
|
||||
await ref.read(apiProvider).cancelTask(jobId);
|
||||
await load();
|
||||
}
|
||||
|
||||
/// Создать одноразовый таймер
|
||||
@@ -765,60 +771,61 @@ class EventLogNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
|
||||
// ─── API-ключи ───────────────────────────────────────────────
|
||||
|
||||
final apiKeysProvider = NotifierProvider<ApiKeysNotifier, List<dynamic>>(
|
||||
() => ApiKeysNotifier(),
|
||||
);
|
||||
final apiKeysProvider =
|
||||
NotifierProvider<ApiKeysNotifier, LoadState<List<dynamic>>>(
|
||||
() => ApiKeysNotifier(),
|
||||
);
|
||||
|
||||
class ApiKeysNotifier extends Notifier<List<dynamic>> {
|
||||
class ApiKeysNotifier extends Notifier<LoadState<List<dynamic>>> {
|
||||
@override
|
||||
List<dynamic> build() => [];
|
||||
LoadState<List<dynamic>> build() => const LoadState.idle(<dynamic>[]);
|
||||
|
||||
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) {
|
||||
state = data;
|
||||
keys = List<dynamic>.from(data);
|
||||
} else if (data is Map) {
|
||||
state = data['data'] ?? data['keys'] ?? data.values.toList();
|
||||
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 должен быть списком ключей');
|
||||
}
|
||||
|
||||
state = keys.isEmpty ? LoadState.empty(keys) : LoadState.data(keys);
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка загрузки API-ключей: $e");
|
||||
state = LoadState.error(state.data, describeLoadError(e));
|
||||
}
|
||||
}
|
||||
|
||||
Future<String?> create(String name, {bool isAdmin = false}) async {
|
||||
try {
|
||||
final api = ref.read(apiProvider);
|
||||
final res = await api.createApiKey(name, isAdmin: isAdmin);
|
||||
await load();
|
||||
if (res.data is Map) {
|
||||
return res.data['key']?.toString();
|
||||
Future<String> create(String name, {bool isAdmin = false}) async {
|
||||
final api = ref.read(apiProvider);
|
||||
final res = await api.createApiKey(name, isAdmin: isAdmin);
|
||||
await load();
|
||||
if (res.data is Map) {
|
||||
final key = res.data['key']?.toString();
|
||||
if (key != null && key.isNotEmpty) {
|
||||
return key;
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка создания ключа: $e");
|
||||
return null;
|
||||
}
|
||||
throw const FormatException('backend не вернул созданный API key');
|
||||
}
|
||||
|
||||
Future<void> revoke(String key) async {
|
||||
try {
|
||||
await ref.read(apiProvider).revokeApiKey(key);
|
||||
await load();
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка отзыва ключа: $e");
|
||||
}
|
||||
await ref.read(apiProvider).revokeApiKey(key);
|
||||
await load();
|
||||
}
|
||||
|
||||
Future<void> activate(String key) async {
|
||||
try {
|
||||
await ref.read(apiProvider).activateApiKey(key);
|
||||
await load();
|
||||
} catch (e) {
|
||||
debugPrint("Ошибка активации ключа: $e");
|
||||
}
|
||||
await ref.read(apiProvider).activateApiKey(key);
|
||||
await load();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user