APP_NEW/lib/Provider/Form/form_provider.dart
2025-03-11 21:17:14 +08:00

90 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:lamiter/Class/Question/question.dart';
enum FormSubmitType { database, diagnosisProvider }
abstract class FormProvider<Form, Result> extends ChangeNotifier {
late FormSubmitType submitType;
late List<Question> questions;
late bool submitting;
late bool loading;
Future<void> start(Form? prevForm);
Future<Map<String, dynamic>> submitDBHandler(
BuildContext context, Form? prevForm);
Future<Map<String, dynamic>> submitDPHandler(BuildContext context);
Future<Map<String, dynamic>> submit(
BuildContext context, Form? prevForm) async {
FocusManager.instance.primaryFocus?.unfocus();
updateSubmitting(true);
switch (submitType) {
case FormSubmitType.database:
final response = await submitDBHandler(context, prevForm);
updateSubmitting(false);
return response;
case FormSubmitType.diagnosisProvider:
final response = await submitDPHandler(context);
updateSubmitting(false);
return response;
}
}
void init(FormSubmitType type) {
submitType = type;
questions = [];
submitting = false;
loading = false;
notifyListeners();
}
void updateSubmitting(bool b) {
submitting = b;
notifyListeners();
}
void updateLoading(bool b) {
loading = b;
notifyListeners();
}
bool isReadyToSubmit() {
if (submitting) return false;
for (Question question in questions) {
if (!question.isAnswerRequiredAndLegal()) return false;
}
return true;
}
dynamic getAnswer(String id) {
Question? question = _findQuestionById(id);
return question?.answer;
}
void setAnswer(String id, dynamic answer) {
Question? question = _findQuestionById(id);
question?.answer = answer;
question?.setAnswerLayout(answer);
notifyListeners();
}
void setAndLockAnswer(String id, dynamic answer) {
setAnswer(id, answer);
_lockAnswer(id);
}
void _lockAnswer(String id) {
Question? question = _findQuestionById(id);
question?.lockAnswerLayouot();
notifyListeners();
}
Question? _findQuestionById(String id) {
List<Question> temp =
questions.where((question) => question.id == id).toList();
return temp.isEmpty ? null : temp.first;
}
void refresh() {
notifyListeners();
}
}