90 lines
2.3 KiB
Dart
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();
|
|
}
|
|
}
|