refactor: split providers into feature modules
This commit is contained in:
72
lib/features/schedules/providers/tasks_providers.dart
Normal file
72
lib/features/schedules/providers/tasks_providers.dart
Normal file
@@ -0,0 +1,72 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user