92 lines
2.7 KiB
Dart
92 lines
2.7 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:aioa_mobile/core/forms/schema/form_schema.dart';
|
|
import 'package:aioa_mobile/core/forms/schema/form_validator.dart';
|
|
import 'package:aioa_mobile/features/form/data/leave_local_draft_repository.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
final leaveLocalDraftRepositoryProvider = Provider<LeaveLocalDraftRepository>(
|
|
(ref) => LeaveLocalDraftRepository(),
|
|
);
|
|
|
|
final leaveDraftProvider =
|
|
NotifierProvider<LeaveDraftController, DynamicFormState>(
|
|
LeaveDraftController.new,
|
|
);
|
|
|
|
class LeaveDraftController extends Notifier<DynamicFormState> {
|
|
late final LeaveLocalDraftRepository _repository;
|
|
|
|
@override
|
|
DynamicFormState build() {
|
|
_repository = ref.watch(leaveLocalDraftRepositoryProvider);
|
|
unawaited(_restore());
|
|
return const DynamicFormState();
|
|
}
|
|
|
|
Future<void> _restore() async {
|
|
final restored = await _repository.load();
|
|
if (restored == null || state.values.isNotEmpty) return;
|
|
state = DynamicFormState(
|
|
values: restored.values,
|
|
restoredAt: restored.savedAt,
|
|
);
|
|
}
|
|
|
|
void setValue(String field, Object? value) {
|
|
final values = {...state.values, field: value};
|
|
final errors = {...state.errors}..remove(field);
|
|
state = state.copyWith(
|
|
values: values,
|
|
errors: errors,
|
|
clearRestoredAt: true,
|
|
);
|
|
unawaited(_repository.save(values));
|
|
}
|
|
|
|
void applyAiSuggestion() {
|
|
final start = DateTime.now().add(const Duration(days: 1));
|
|
final normalizedStart = DateTime(
|
|
start.year,
|
|
start.month,
|
|
start.day,
|
|
13,
|
|
30,
|
|
);
|
|
final end = normalizedStart.add(const Duration(hours: 4));
|
|
state = DynamicFormState(
|
|
values: {
|
|
'type': 'PERSONAL',
|
|
'startsAt': normalizedStart.toUtc().toIso8601String(),
|
|
'endsAt': end.toUtc().toIso8601String(),
|
|
'reason': '办理个人事务,已提前完成工作交接。',
|
|
},
|
|
);
|
|
unawaited(_repository.save(state.values));
|
|
}
|
|
|
|
void applySuggestion(Map<String, Object?> suggestion) {
|
|
final values = {...state.values, ...suggestion};
|
|
state = DynamicFormState(values: values);
|
|
unawaited(_repository.save(values));
|
|
}
|
|
|
|
Future<void> clear() async {
|
|
await _repository.clear();
|
|
state = const DynamicFormState();
|
|
}
|
|
|
|
bool validate(JsonFormSchema schema) {
|
|
final errors = validateDynamicForm(schema, state.values);
|
|
final startsAt = DateTime.tryParse(
|
|
state.values['startsAt'] as String? ?? '',
|
|
);
|
|
final endsAt = DateTime.tryParse(state.values['endsAt'] as String? ?? '');
|
|
if (startsAt != null && endsAt != null && !endsAt.isAfter(startsAt)) {
|
|
errors['endsAt'] = '结束时间必须晚于开始时间';
|
|
}
|
|
state = state.copyWith(errors: errors);
|
|
return errors.isEmpty;
|
|
}
|
|
}
|