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( (ref) => LeaveLocalDraftRepository(), ); final leaveDraftProvider = NotifierProvider( LeaveDraftController.new, ); class LeaveDraftController extends Notifier { late final LeaveLocalDraftRepository _repository; @override DynamicFormState build() { _repository = ref.watch(leaveLocalDraftRepositoryProvider); unawaited(_restore()); return const DynamicFormState(); } Future _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 suggestion) { final values = {...state.values, ...suggestion}; state = DynamicFormState(values: values); unawaited(_repository.save(values)); } Future 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; } }