Files
ignis_app/lib/features/schedules/providers/tasks_providers.dart
2026-04-27 23:21:47 +07:00

73 lines
1.9 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../app/error_message.dart';
import '../../../app/load_state.dart';
import '../../../models/schedule_task.dart';
import '../../shared/providers/core_providers.dart';
final tasksProvider =
NotifierProvider<TasksNotifier, LoadState<List<ScheduleTask>>>(
() => TasksNotifier(),
);
class TasksNotifier extends Notifier<LoadState<List<ScheduleTask>>> {
@override
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 tasks = ScheduleTask.listFromApi(res.data);
state = tasks.isEmpty ? LoadState.empty(tasks) : LoadState.data(tasks);
} catch (e) {
state = LoadState.error(state.data, describeLoadError(e));
}
}
Future<void> cancel(String jobId) async {
await ref.read(apiProvider).cancelTask(jobId);
await load();
}
Future<void> addOnce({
required String targetId,
required bool targetState,
int? hoursFromNow,
String? runAt,
bool isGroup = true,
}) async {
final params = <String, dynamic>{
'target_id': targetId,
'state': targetState,
'is_group': isGroup,
};
if (hoursFromNow != null) params['hours_from_now'] = hoursFromNow;
if (runAt != null) params['run_at'] = runAt;
await ref.read(apiProvider).scheduleOnce(params);
await load();
}
Future<void> addCron({
required String targetId,
required String hour,
required String minute,
String dayOfWeek = '*',
bool isGroup = true,
bool targetState = true,
}) async {
await ref.read(apiProvider).scheduleCron({
'target_id': targetId,
'hour': hour,
'minute': minute,
'day_of_week': dayOfWeek,
'is_group': isGroup,
'state': targetState,
});
await load();
}
}