diff --git a/patient/ios/Runner.xcworkspace/contents.xcworkspacedata b/patient/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/patient/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/patient/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/patient/lib/core/core.dart b/patient/lib/core/core.dart index 9b2c70c..a0a48e9 100644 --- a/patient/lib/core/core.dart +++ b/patient/lib/core/core.dart @@ -1,4 +1,5 @@ export './entities/entities.dart'; export './result/result.dart'; export './repository/repository.dart'; -export './core.dart'; \ No newline at end of file +export './core.dart'; +export './utils/utils.dart'; \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_answer_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_answer_entity.dart new file mode 100644 index 0000000..68a6310 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_answer_entity.dart @@ -0,0 +1,21 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +import 'assessment_question_answer_entity.dart'; + +part 'assessment_answer_entity.mapper.dart'; + +@MappableClass() +class AssessmentAnswerEntity with AssessmentAnswerEntityMappable { + + @MappableField(key: 'assessment_id') + final String assessmentId; + + @MappableField(key: 'questions') + final List questions; + + AssessmentAnswerEntity({ + required this.assessmentId, + required this.questions, + }); + +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_answer_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_answer_entity.mapper.dart new file mode 100644 index 0000000..a05718a --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_answer_entity.mapper.dart @@ -0,0 +1,150 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_answer_entity.dart'; + +class AssessmentAnswerEntityMapper + extends ClassMapperBase { + AssessmentAnswerEntityMapper._(); + + static AssessmentAnswerEntityMapper? _instance; + static AssessmentAnswerEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentAnswerEntityMapper._()); + AssessmentQuestionAnswerEntityMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentAnswerEntity'; + + static String _$assessmentId(AssessmentAnswerEntity v) => v.assessmentId; + static const Field _f$assessmentId = + Field('assessmentId', _$assessmentId, key: r'assessment_id'); + static List _$questions( + AssessmentAnswerEntity v) => + v.questions; + static const Field> _f$questions = + Field('questions', _$questions); + + @override + final MappableFields fields = const { + #assessmentId: _f$assessmentId, + #questions: _f$questions, + }; + + static AssessmentAnswerEntity _instantiate(DecodingData data) { + return AssessmentAnswerEntity( + assessmentId: data.dec(_f$assessmentId), + questions: data.dec(_f$questions)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentAnswerEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentAnswerEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentAnswerEntityMappable { + String toJson() { + return AssessmentAnswerEntityMapper.ensureInitialized() + .encodeJson(this as AssessmentAnswerEntity); + } + + Map toMap() { + return AssessmentAnswerEntityMapper.ensureInitialized() + .encodeMap(this as AssessmentAnswerEntity); + } + + AssessmentAnswerEntityCopyWith + get copyWith => _AssessmentAnswerEntityCopyWithImpl( + this as AssessmentAnswerEntity, $identity, $identity); + @override + String toString() { + return AssessmentAnswerEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentAnswerEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentAnswerEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentAnswerEntity, other); + } + + @override + int get hashCode { + return AssessmentAnswerEntityMapper.ensureInitialized() + .hashValue(this as AssessmentAnswerEntity); + } +} + +extension AssessmentAnswerEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentAnswerEntity, $Out> { + AssessmentAnswerEntityCopyWith<$R, AssessmentAnswerEntity, $Out> + get $asAssessmentAnswerEntity => + $base.as((v, t, t2) => _AssessmentAnswerEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentAnswerEntityCopyWith< + $R, + $In extends AssessmentAnswerEntity, + $Out> implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentQuestionAnswerEntity, + AssessmentQuestionAnswerEntityCopyWith<$R, AssessmentQuestionAnswerEntity, + AssessmentQuestionAnswerEntity>> get questions; + $R call( + {String? assessmentId, List? questions}); + AssessmentAnswerEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentAnswerEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentAnswerEntity, $Out> + implements + AssessmentAnswerEntityCopyWith<$R, AssessmentAnswerEntity, $Out> { + _AssessmentAnswerEntityCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentAnswerEntityMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentQuestionAnswerEntity, + AssessmentQuestionAnswerEntityCopyWith<$R, AssessmentQuestionAnswerEntity, + AssessmentQuestionAnswerEntity>> get questions => ListCopyWith( + $value.questions, + (v, t) => v.copyWith.$chain(t), + (v) => call(questions: v)); + @override + $R call( + {String? assessmentId, + List? questions}) => + $apply(FieldCopyWithData({ + if (assessmentId != null) #assessmentId: assessmentId, + if (questions != null) #questions: questions + })); + @override + AssessmentAnswerEntity $make(CopyWithData data) => AssessmentAnswerEntity( + assessmentId: data.get(#assessmentId, or: $value.assessmentId), + questions: data.get(#questions, or: $value.questions)); + + @override + AssessmentAnswerEntityCopyWith<$R2, AssessmentAnswerEntity, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentAnswerEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/assessment_entities/assessment_entities.dart b/patient/lib/core/entities/assessment_entities/assessment_entities.dart new file mode 100644 index 0000000..7233435 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_entities.dart @@ -0,0 +1,7 @@ +export './assessment_entities.dart'; +export './assessment_result_entity.dart'; +export './assessment_answer_entity.dart'; +export './assessment_entity.dart'; +export './assessment_question_entity.dart'; +export './assessment_question_answer_entity.dart'; +export './assessment_option_entity.dart'; \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_entity.dart new file mode 100644 index 0000000..1865830 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_entity.dart @@ -0,0 +1,59 @@ + +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_question_entity.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; + +part 'assessment_entity.mapper.dart'; + +@MappableClass() +class AssessmentEntity with AssessmentEntityMappable { + + @MappableField(key: 'id') + final String assessmentId; + + @MappableField(key: 'created_at') + final String createdAt; + + @MappableField(key: 'name') + final String name; + + @MappableField(key: 'description') + final String description; + + @MappableField(key: 'category') + final String category; + + @MappableField(key: 'cutoff_score') + final int cutoffScore; + + @MappableField(key: 'image_url') + final String imageUrl; + + @MappableField(key: 'questions') + final List questions; + + AssessmentEntity({ + required this.assessmentId, + required this.createdAt, + required this.name, + required this.description, + required this.category, + required this.cutoffScore, + required this.imageUrl, + required this.questions, + }); + + AssessmentModel toModel() { + return AssessmentModel( + assessmentId: assessmentId, + createdAt: createdAt, + name: name, + description: description, + category: category, + cutoffScore: cutoffScore, + imageUrl: imageUrl, + questions: questions.map((e) => e.toModel()).toList(), + ); + } + +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_entity.mapper.dart new file mode 100644 index 0000000..ffc15c1 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_entity.mapper.dart @@ -0,0 +1,197 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_entity.dart'; + +class AssessmentEntityMapper extends ClassMapperBase { + AssessmentEntityMapper._(); + + static AssessmentEntityMapper? _instance; + static AssessmentEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentEntityMapper._()); + AssessmentQuestionEntityMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentEntity'; + + static String _$assessmentId(AssessmentEntity v) => v.assessmentId; + static const Field _f$assessmentId = + Field('assessmentId', _$assessmentId, key: r'id'); + static String _$createdAt(AssessmentEntity v) => v.createdAt; + static const Field _f$createdAt = + Field('createdAt', _$createdAt, key: r'created_at'); + static String _$name(AssessmentEntity v) => v.name; + static const Field _f$name = Field('name', _$name); + static String _$description(AssessmentEntity v) => v.description; + static const Field _f$description = + Field('description', _$description); + static String _$category(AssessmentEntity v) => v.category; + static const Field _f$category = + Field('category', _$category); + static int _$cutoffScore(AssessmentEntity v) => v.cutoffScore; + static const Field _f$cutoffScore = + Field('cutoffScore', _$cutoffScore, key: r'cutoff_score'); + static String _$imageUrl(AssessmentEntity v) => v.imageUrl; + static const Field _f$imageUrl = + Field('imageUrl', _$imageUrl, key: r'image_url'); + static List _$questions(AssessmentEntity v) => + v.questions; + static const Field> + _f$questions = Field('questions', _$questions); + + @override + final MappableFields fields = const { + #assessmentId: _f$assessmentId, + #createdAt: _f$createdAt, + #name: _f$name, + #description: _f$description, + #category: _f$category, + #cutoffScore: _f$cutoffScore, + #imageUrl: _f$imageUrl, + #questions: _f$questions, + }; + + static AssessmentEntity _instantiate(DecodingData data) { + return AssessmentEntity( + assessmentId: data.dec(_f$assessmentId), + createdAt: data.dec(_f$createdAt), + name: data.dec(_f$name), + description: data.dec(_f$description), + category: data.dec(_f$category), + cutoffScore: data.dec(_f$cutoffScore), + imageUrl: data.dec(_f$imageUrl), + questions: data.dec(_f$questions)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentEntityMappable { + String toJson() { + return AssessmentEntityMapper.ensureInitialized() + .encodeJson(this as AssessmentEntity); + } + + Map toMap() { + return AssessmentEntityMapper.ensureInitialized() + .encodeMap(this as AssessmentEntity); + } + + AssessmentEntityCopyWith + get copyWith => _AssessmentEntityCopyWithImpl( + this as AssessmentEntity, $identity, $identity); + @override + String toString() { + return AssessmentEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentEntity, other); + } + + @override + int get hashCode { + return AssessmentEntityMapper.ensureInitialized() + .hashValue(this as AssessmentEntity); + } +} + +extension AssessmentEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentEntity, $Out> { + AssessmentEntityCopyWith<$R, AssessmentEntity, $Out> + get $asAssessmentEntity => + $base.as((v, t, t2) => _AssessmentEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentEntityCopyWith<$R, $In extends AssessmentEntity, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentQuestionEntity, + AssessmentQuestionEntityCopyWith<$R, AssessmentQuestionEntity, + AssessmentQuestionEntity>> get questions; + $R call( + {String? assessmentId, + String? createdAt, + String? name, + String? description, + String? category, + int? cutoffScore, + String? imageUrl, + List? questions}); + AssessmentEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentEntity, $Out> + implements AssessmentEntityCopyWith<$R, AssessmentEntity, $Out> { + _AssessmentEntityCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentEntityMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentQuestionEntity, + AssessmentQuestionEntityCopyWith<$R, AssessmentQuestionEntity, + AssessmentQuestionEntity>> get questions => ListCopyWith( + $value.questions, + (v, t) => v.copyWith.$chain(t), + (v) => call(questions: v)); + @override + $R call( + {String? assessmentId, + String? createdAt, + String? name, + String? description, + String? category, + int? cutoffScore, + String? imageUrl, + List? questions}) => + $apply(FieldCopyWithData({ + if (assessmentId != null) #assessmentId: assessmentId, + if (createdAt != null) #createdAt: createdAt, + if (name != null) #name: name, + if (description != null) #description: description, + if (category != null) #category: category, + if (cutoffScore != null) #cutoffScore: cutoffScore, + if (imageUrl != null) #imageUrl: imageUrl, + if (questions != null) #questions: questions + })); + @override + AssessmentEntity $make(CopyWithData data) => AssessmentEntity( + assessmentId: data.get(#assessmentId, or: $value.assessmentId), + createdAt: data.get(#createdAt, or: $value.createdAt), + name: data.get(#name, or: $value.name), + description: data.get(#description, or: $value.description), + category: data.get(#category, or: $value.category), + cutoffScore: data.get(#cutoffScore, or: $value.cutoffScore), + imageUrl: data.get(#imageUrl, or: $value.imageUrl), + questions: data.get(#questions, or: $value.questions)); + + @override + AssessmentEntityCopyWith<$R2, AssessmentEntity, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t) => + _AssessmentEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/assessment_entities/assessment_option_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_option_entity.dart new file mode 100644 index 0000000..48e2a04 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_option_entity.dart @@ -0,0 +1,32 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; + +part 'assessment_option_entity.mapper.dart'; + +@MappableClass() +class AssessmentOptionEntity with AssessmentOptionEntityMappable { + + @MappableField(key: 'option_id') + final String optionId; + + @MappableField(key: 'text') + final String text; + + @MappableField(key: 'score') + final int score; + + AssessmentOptionEntity({ + required this.optionId, + required this.text, + required this.score, + }); + + AssessmentOptionModel toModel() { + return AssessmentOptionModel( + optionId: optionId, + text: text, + score: score, + ); + } + +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_option_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_option_entity.mapper.dart new file mode 100644 index 0000000..2018a45 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_option_entity.mapper.dart @@ -0,0 +1,136 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_option_entity.dart'; + +class AssessmentOptionEntityMapper + extends ClassMapperBase { + AssessmentOptionEntityMapper._(); + + static AssessmentOptionEntityMapper? _instance; + static AssessmentOptionEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentOptionEntityMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentOptionEntity'; + + static String _$optionId(AssessmentOptionEntity v) => v.optionId; + static const Field _f$optionId = + Field('optionId', _$optionId, key: r'option_id'); + static String _$text(AssessmentOptionEntity v) => v.text; + static const Field _f$text = + Field('text', _$text); + static int _$score(AssessmentOptionEntity v) => v.score; + static const Field _f$score = + Field('score', _$score); + + @override + final MappableFields fields = const { + #optionId: _f$optionId, + #text: _f$text, + #score: _f$score, + }; + + static AssessmentOptionEntity _instantiate(DecodingData data) { + return AssessmentOptionEntity( + optionId: data.dec(_f$optionId), + text: data.dec(_f$text), + score: data.dec(_f$score)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentOptionEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentOptionEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentOptionEntityMappable { + String toJson() { + return AssessmentOptionEntityMapper.ensureInitialized() + .encodeJson(this as AssessmentOptionEntity); + } + + Map toMap() { + return AssessmentOptionEntityMapper.ensureInitialized() + .encodeMap(this as AssessmentOptionEntity); + } + + AssessmentOptionEntityCopyWith + get copyWith => _AssessmentOptionEntityCopyWithImpl( + this as AssessmentOptionEntity, $identity, $identity); + @override + String toString() { + return AssessmentOptionEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentOptionEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentOptionEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentOptionEntity, other); + } + + @override + int get hashCode { + return AssessmentOptionEntityMapper.ensureInitialized() + .hashValue(this as AssessmentOptionEntity); + } +} + +extension AssessmentOptionEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentOptionEntity, $Out> { + AssessmentOptionEntityCopyWith<$R, AssessmentOptionEntity, $Out> + get $asAssessmentOptionEntity => + $base.as((v, t, t2) => _AssessmentOptionEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentOptionEntityCopyWith< + $R, + $In extends AssessmentOptionEntity, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? optionId, String? text, int? score}); + AssessmentOptionEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentOptionEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentOptionEntity, $Out> + implements + AssessmentOptionEntityCopyWith<$R, AssessmentOptionEntity, $Out> { + _AssessmentOptionEntityCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentOptionEntityMapper.ensureInitialized(); + @override + $R call({String? optionId, String? text, int? score}) => + $apply(FieldCopyWithData({ + if (optionId != null) #optionId: optionId, + if (text != null) #text: text, + if (score != null) #score: score + })); + @override + AssessmentOptionEntity $make(CopyWithData data) => AssessmentOptionEntity( + optionId: data.get(#optionId, or: $value.optionId), + text: data.get(#text, or: $value.text), + score: data.get(#score, or: $value.score)); + + @override + AssessmentOptionEntityCopyWith<$R2, AssessmentOptionEntity, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentOptionEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.dart new file mode 100644 index 0000000..1985ab4 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.dart @@ -0,0 +1,18 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'assessment_question_answer_entity.mapper.dart'; + +@MappableClass() +class AssessmentQuestionAnswerEntity with AssessmentQuestionAnswerEntityMappable { + + @MappableField(key: 'question_id') + final String questionId; + + @MappableField(key: 'answer_id') + final String answerId; + + AssessmentQuestionAnswerEntity({ + required this.questionId, + required this.answerId, + }); +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.mapper.dart new file mode 100644 index 0000000..e46233b --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_question_answer_entity.mapper.dart @@ -0,0 +1,135 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_question_answer_entity.dart'; + +class AssessmentQuestionAnswerEntityMapper + extends ClassMapperBase { + AssessmentQuestionAnswerEntityMapper._(); + + static AssessmentQuestionAnswerEntityMapper? _instance; + static AssessmentQuestionAnswerEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals + .use(_instance = AssessmentQuestionAnswerEntityMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentQuestionAnswerEntity'; + + static String _$questionId(AssessmentQuestionAnswerEntity v) => v.questionId; + static const Field _f$questionId = + Field('questionId', _$questionId, key: r'question_id'); + static String _$answerId(AssessmentQuestionAnswerEntity v) => v.answerId; + static const Field _f$answerId = + Field('answerId', _$answerId, key: r'answer_id'); + + @override + final MappableFields fields = const { + #questionId: _f$questionId, + #answerId: _f$answerId, + }; + + static AssessmentQuestionAnswerEntity _instantiate(DecodingData data) { + return AssessmentQuestionAnswerEntity( + questionId: data.dec(_f$questionId), answerId: data.dec(_f$answerId)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentQuestionAnswerEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentQuestionAnswerEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentQuestionAnswerEntityMappable { + String toJson() { + return AssessmentQuestionAnswerEntityMapper.ensureInitialized() + .encodeJson( + this as AssessmentQuestionAnswerEntity); + } + + Map toMap() { + return AssessmentQuestionAnswerEntityMapper.ensureInitialized() + .encodeMap( + this as AssessmentQuestionAnswerEntity); + } + + AssessmentQuestionAnswerEntityCopyWith + get copyWith => _AssessmentQuestionAnswerEntityCopyWithImpl( + this as AssessmentQuestionAnswerEntity, $identity, $identity); + @override + String toString() { + return AssessmentQuestionAnswerEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentQuestionAnswerEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentQuestionAnswerEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentQuestionAnswerEntity, other); + } + + @override + int get hashCode { + return AssessmentQuestionAnswerEntityMapper.ensureInitialized() + .hashValue(this as AssessmentQuestionAnswerEntity); + } +} + +extension AssessmentQuestionAnswerEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentQuestionAnswerEntity, $Out> { + AssessmentQuestionAnswerEntityCopyWith<$R, AssessmentQuestionAnswerEntity, + $Out> + get $asAssessmentQuestionAnswerEntity => $base.as( + (v, t, t2) => _AssessmentQuestionAnswerEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentQuestionAnswerEntityCopyWith< + $R, + $In extends AssessmentQuestionAnswerEntity, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? questionId, String? answerId}); + AssessmentQuestionAnswerEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentQuestionAnswerEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentQuestionAnswerEntity, $Out> + implements + AssessmentQuestionAnswerEntityCopyWith<$R, + AssessmentQuestionAnswerEntity, $Out> { + _AssessmentQuestionAnswerEntityCopyWithImpl( + super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentQuestionAnswerEntityMapper.ensureInitialized(); + @override + $R call({String? questionId, String? answerId}) => $apply(FieldCopyWithData({ + if (questionId != null) #questionId: questionId, + if (answerId != null) #answerId: answerId + })); + @override + AssessmentQuestionAnswerEntity $make(CopyWithData data) => + AssessmentQuestionAnswerEntity( + questionId: data.get(#questionId, or: $value.questionId), + answerId: data.get(#answerId, or: $value.answerId)); + + @override + AssessmentQuestionAnswerEntityCopyWith<$R2, AssessmentQuestionAnswerEntity, + $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t) => + _AssessmentQuestionAnswerEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/assessment_entities/assessment_question_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_question_entity.dart new file mode 100644 index 0000000..f418e6b --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_question_entity.dart @@ -0,0 +1,33 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_option_entity.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; + +part 'assessment_question_entity.mapper.dart'; + +@MappableClass() +class AssessmentQuestionEntity with AssessmentQuestionEntityMappable { + + @MappableField(key: 'question_id') + final String questionId; + + @MappableField(key: 'text') + final String text; + + @MappableField(key: 'options') + final List options; + + AssessmentQuestionEntity({ + required this.questionId, + required this.text, + required this.options, + }); + + AssessmentQuestionModel toModel() { + return AssessmentQuestionModel( + questionId: questionId, + text: text, + options: options.map((e) => e.toModel()).toList(), + ); + } + +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_question_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_question_entity.mapper.dart new file mode 100644 index 0000000..5553f45 --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_question_entity.mapper.dart @@ -0,0 +1,157 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_question_entity.dart'; + +class AssessmentQuestionEntityMapper + extends ClassMapperBase { + AssessmentQuestionEntityMapper._(); + + static AssessmentQuestionEntityMapper? _instance; + static AssessmentQuestionEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals + .use(_instance = AssessmentQuestionEntityMapper._()); + AssessmentOptionEntityMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentQuestionEntity'; + + static String _$questionId(AssessmentQuestionEntity v) => v.questionId; + static const Field _f$questionId = + Field('questionId', _$questionId, key: r'question_id'); + static String _$text(AssessmentQuestionEntity v) => v.text; + static const Field _f$text = + Field('text', _$text); + static List _$options(AssessmentQuestionEntity v) => + v.options; + static const Field> + _f$options = Field('options', _$options); + + @override + final MappableFields fields = const { + #questionId: _f$questionId, + #text: _f$text, + #options: _f$options, + }; + + static AssessmentQuestionEntity _instantiate(DecodingData data) { + return AssessmentQuestionEntity( + questionId: data.dec(_f$questionId), + text: data.dec(_f$text), + options: data.dec(_f$options)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentQuestionEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentQuestionEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentQuestionEntityMappable { + String toJson() { + return AssessmentQuestionEntityMapper.ensureInitialized() + .encodeJson(this as AssessmentQuestionEntity); + } + + Map toMap() { + return AssessmentQuestionEntityMapper.ensureInitialized() + .encodeMap(this as AssessmentQuestionEntity); + } + + AssessmentQuestionEntityCopyWith + get copyWith => _AssessmentQuestionEntityCopyWithImpl( + this as AssessmentQuestionEntity, $identity, $identity); + @override + String toString() { + return AssessmentQuestionEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentQuestionEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentQuestionEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentQuestionEntity, other); + } + + @override + int get hashCode { + return AssessmentQuestionEntityMapper.ensureInitialized() + .hashValue(this as AssessmentQuestionEntity); + } +} + +extension AssessmentQuestionEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentQuestionEntity, $Out> { + AssessmentQuestionEntityCopyWith<$R, AssessmentQuestionEntity, $Out> + get $asAssessmentQuestionEntity => $base + .as((v, t, t2) => _AssessmentQuestionEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentQuestionEntityCopyWith< + $R, + $In extends AssessmentQuestionEntity, + $Out> implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentOptionEntity, + AssessmentOptionEntityCopyWith<$R, AssessmentOptionEntity, + AssessmentOptionEntity>> get options; + $R call( + {String? questionId, + String? text, + List? options}); + AssessmentQuestionEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentQuestionEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentQuestionEntity, $Out> + implements + AssessmentQuestionEntityCopyWith<$R, AssessmentQuestionEntity, $Out> { + _AssessmentQuestionEntityCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentQuestionEntityMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentOptionEntity, + AssessmentOptionEntityCopyWith<$R, AssessmentOptionEntity, + AssessmentOptionEntity>> get options => ListCopyWith( + $value.options, (v, t) => v.copyWith.$chain(t), (v) => call(options: v)); + @override + $R call( + {String? questionId, + String? text, + List? options}) => + $apply(FieldCopyWithData({ + if (questionId != null) #questionId: questionId, + if (text != null) #text: text, + if (options != null) #options: options + })); + @override + AssessmentQuestionEntity $make(CopyWithData data) => AssessmentQuestionEntity( + questionId: data.get(#questionId, or: $value.questionId), + text: data.get(#text, or: $value.text), + options: data.get(#options, or: $value.options)); + + @override + AssessmentQuestionEntityCopyWith<$R2, AssessmentQuestionEntity, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentQuestionEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/assessment_entities/assessment_result_entity.dart b/patient/lib/core/entities/assessment_entities/assessment_result_entity.dart new file mode 100644 index 0000000..522fe3f --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_result_entity.dart @@ -0,0 +1,33 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/model/assessment_models/assessment_result_model.dart'; + +part 'assessment_result_entity.mapper.dart'; + +@MappableClass() +class AssessmentResultEntity with AssessmentResultEntityMappable { + + @MappableField(key: 'assessment_score') + final int assessmentScore; + + @MappableField(key: 'is_autistic') + final bool isAutistic; + + @MappableField(key: 'message') + final String message; + + AssessmentResultEntity({ + required this.assessmentScore, + required this.isAutistic, + required this.message, + }); + + + AssessmentResultModel toModel() { + return AssessmentResultModel( + assessmentScore: assessmentScore, + isAutistic: isAutistic, + message: message, + ); + } + +} \ No newline at end of file diff --git a/patient/lib/core/entities/assessment_entities/assessment_result_entity.mapper.dart b/patient/lib/core/entities/assessment_entities/assessment_result_entity.mapper.dart new file mode 100644 index 0000000..fceef2d --- /dev/null +++ b/patient/lib/core/entities/assessment_entities/assessment_result_entity.mapper.dart @@ -0,0 +1,136 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_result_entity.dart'; + +class AssessmentResultEntityMapper + extends ClassMapperBase { + AssessmentResultEntityMapper._(); + + static AssessmentResultEntityMapper? _instance; + static AssessmentResultEntityMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentResultEntityMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentResultEntity'; + + static int _$assessmentScore(AssessmentResultEntity v) => v.assessmentScore; + static const Field _f$assessmentScore = + Field('assessmentScore', _$assessmentScore, key: r'assessment_score'); + static bool _$isAutistic(AssessmentResultEntity v) => v.isAutistic; + static const Field _f$isAutistic = + Field('isAutistic', _$isAutistic, key: r'is_autistic'); + static String _$message(AssessmentResultEntity v) => v.message; + static const Field _f$message = + Field('message', _$message); + + @override + final MappableFields fields = const { + #assessmentScore: _f$assessmentScore, + #isAutistic: _f$isAutistic, + #message: _f$message, + }; + + static AssessmentResultEntity _instantiate(DecodingData data) { + return AssessmentResultEntity( + assessmentScore: data.dec(_f$assessmentScore), + isAutistic: data.dec(_f$isAutistic), + message: data.dec(_f$message)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentResultEntity fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentResultEntity fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentResultEntityMappable { + String toJson() { + return AssessmentResultEntityMapper.ensureInitialized() + .encodeJson(this as AssessmentResultEntity); + } + + Map toMap() { + return AssessmentResultEntityMapper.ensureInitialized() + .encodeMap(this as AssessmentResultEntity); + } + + AssessmentResultEntityCopyWith + get copyWith => _AssessmentResultEntityCopyWithImpl( + this as AssessmentResultEntity, $identity, $identity); + @override + String toString() { + return AssessmentResultEntityMapper.ensureInitialized() + .stringifyValue(this as AssessmentResultEntity); + } + + @override + bool operator ==(Object other) { + return AssessmentResultEntityMapper.ensureInitialized() + .equalsValue(this as AssessmentResultEntity, other); + } + + @override + int get hashCode { + return AssessmentResultEntityMapper.ensureInitialized() + .hashValue(this as AssessmentResultEntity); + } +} + +extension AssessmentResultEntityValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentResultEntity, $Out> { + AssessmentResultEntityCopyWith<$R, AssessmentResultEntity, $Out> + get $asAssessmentResultEntity => + $base.as((v, t, t2) => _AssessmentResultEntityCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentResultEntityCopyWith< + $R, + $In extends AssessmentResultEntity, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({int? assessmentScore, bool? isAutistic, String? message}); + AssessmentResultEntityCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentResultEntityCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentResultEntity, $Out> + implements + AssessmentResultEntityCopyWith<$R, AssessmentResultEntity, $Out> { + _AssessmentResultEntityCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentResultEntityMapper.ensureInitialized(); + @override + $R call({int? assessmentScore, bool? isAutistic, String? message}) => + $apply(FieldCopyWithData({ + if (assessmentScore != null) #assessmentScore: assessmentScore, + if (isAutistic != null) #isAutistic: isAutistic, + if (message != null) #message: message + })); + @override + AssessmentResultEntity $make(CopyWithData data) => AssessmentResultEntity( + assessmentScore: data.get(#assessmentScore, or: $value.assessmentScore), + isAutistic: data.get(#isAutistic, or: $value.isAutistic), + message: data.get(#message, or: $value.message)); + + @override + AssessmentResultEntityCopyWith<$R2, AssessmentResultEntity, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentResultEntityCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/core/entities/auth_entities/personal_info_entity.dart b/patient/lib/core/entities/auth_entities/personal_info_entity.dart index 56af823..1d7e88a 100644 --- a/patient/lib/core/entities/auth_entities/personal_info_entity.dart +++ b/patient/lib/core/entities/auth_entities/personal_info_entity.dart @@ -1,6 +1,7 @@ import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/model/auth_models/personal_info_model.dart'; part 'personal_info_entity.mapper.dart'; @@ -53,4 +54,20 @@ class PersonalInfoEntity with PersonalInfoEntityMappable { this.country, this.gender, }); + + PersonalInfoModel toModel() { + return PersonalInfoModel( + patientId: patientId, + patientName: patientName, + age: age, + isAdult: isAdult, + phoneNo: phoneNo, + email: email, + guardianName: guardianName ?? '', + guardianRelation: guardianRelation ?? '', + country: country ?? '', + gender: gender ?? '', + ); + } + } \ No newline at end of file diff --git a/patient/lib/core/entities/entities.dart b/patient/lib/core/entities/entities.dart index 4dca940..36ad623 100644 --- a/patient/lib/core/entities/entities.dart +++ b/patient/lib/core/entities/entities.dart @@ -1,2 +1,4 @@ export 'auth_entities/auth_entities.dart'; -export 'patient_entities/patient_entities.dart'; \ No newline at end of file +export 'patient_entities/patient_entities.dart'; +export 'assessment_entities/assessment_entities.dart'; +export './entities.dart'; \ No newline at end of file diff --git a/patient/lib/core/entities/patient_entities/patient_schedule_appointment_entity.mapper.dart b/patient/lib/core/entities/patient_entities/patient_schedule_appointment_entity.mapper.dart index 7a583d7..c026971 100644 --- a/patient/lib/core/entities/patient_entities/patient_schedule_appointment_entity.mapper.dart +++ b/patient/lib/core/entities/patient_entities/patient_schedule_appointment_entity.mapper.dart @@ -35,7 +35,7 @@ class PatientScheduleAppointmentEntityMapper Field('therapistId', _$therapistId, key: r'therapist_id'); static int _$mode(PatientScheduleAppointmentEntity v) => v.mode; static const Field _f$mode = - Field('mode', _$mode, key: r'model'); + Field('mode', _$mode); static int _$duration(PatientScheduleAppointmentEntity v) => v.duration; static const Field _f$duration = Field('duration', _$duration); diff --git a/patient/lib/core/repository/assessment_repository.dart b/patient/lib/core/repository/assessment_repository.dart index e91a40e..ea5f226 100644 --- a/patient/lib/core/repository/assessment_repository.dart +++ b/patient/lib/core/repository/assessment_repository.dart @@ -1,5 +1,10 @@ +import 'package:patient/core/entities/assessment_entities/assessment_answer_entity.dart'; +import 'package:patient/core/result/action_result.dart'; + abstract interface class AssessmentsRepository { // The abstract repository class will define the methods that the repository must implement. Future>> fetchAssessmentById(String id); - Future submitAssessment(Map assessment); + Future submitAssessment(AssessmentAnswerEntity answers); + + Future fetchAllAssessments(); } diff --git a/patient/lib/core/repository/auth/auth_repository.dart b/patient/lib/core/repository/auth/auth_repository.dart index cf4b7af..101cfb9 100644 --- a/patient/lib/core/repository/auth/auth_repository.dart +++ b/patient/lib/core/repository/auth/auth_repository.dart @@ -26,4 +26,22 @@ abstract interface class AuthRepository { /// - If an error occurs while inserting the record, it is caught and returned as a failure. Future storePersonalInfo(PersonalInfoEntity personalInfoEntity); + + /// Checks if the patient already exists in the `patient` table. + /// + /// This method checks if the patient already exists in the `patient` table + /// using the `patient_id` from the [PersonalInfoEntity]. + /// + /// - **Returns:** + /// - A [Future] of [ActionResult], which can either be: + /// - [ActionResultSuccess] with a success message and status code `200` if the patient + /// exists in the `patient` table. + /// - [ActionResultFailure] with an error message and status code `400` if the patient + /// does not exist in the `patient` table. + /// + /// - **Exceptions:** + /// - If an error occurs while checking if the patient exists, it is caught and returned as a failure. + + Future checkIfPatientExists(); + } diff --git a/patient/lib/core/utils/api_status_enum.dart b/patient/lib/core/utils/api_status_enum.dart new file mode 100644 index 0000000..ff096f3 --- /dev/null +++ b/patient/lib/core/utils/api_status_enum.dart @@ -0,0 +1,13 @@ +enum ApiStatus { + initial, + loading, + success, + failure, +} + +extension ApiStatusX on ApiStatus { + bool get isInitial => this == ApiStatus.initial; + bool get isLoading => this == ApiStatus.loading; + bool get isSuccess => this == ApiStatus.success; + bool get isFailure => this == ApiStatus.failure; +} diff --git a/patient/lib/core/utils/utils.dart b/patient/lib/core/utils/utils.dart new file mode 100644 index 0000000..7b288c8 --- /dev/null +++ b/patient/lib/core/utils/utils.dart @@ -0,0 +1,2 @@ +export './utils.dart'; +export './api_status_enum.dart'; \ No newline at end of file diff --git a/patient/lib/main.dart b/patient/lib/main.dart index 82d99b1..ad0162c 100644 --- a/patient/lib/main.dart +++ b/patient/lib/main.dart @@ -4,8 +4,10 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:patient/core/theme/theme.dart'; import 'package:patient/presentation/splash_screen.dart'; +import 'package:patient/presentation/widgets/snackbar_service.dart'; import 'package:patient/provider/assessment_provider.dart'; import 'package:patient/provider/auth_provider.dart'; +import 'package:patient/repository/supabase_auth_repository.dart'; import 'package:patient/provider/reports_provider.dart'; @@ -34,7 +36,13 @@ Future main() async { MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => AssessmentProvider()), - ChangeNotifierProvider(create: (_) => AuthProvider()), + ChangeNotifierProvider( + create: (_) => AuthProvider( + authRepository: SupabaseAuthRepository( + supabaseClient: Supabase.instance.client, + ), + ), + ), ChangeNotifierProvider(create: (_) => ReportsProvider()), ChangeNotifierProvider(create: (_) => TaskProvider()), @@ -50,6 +58,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( + scaffoldMessengerKey: SnackbarService.scaffoldMessengerKey, debugShowCheckedModeBanner: false, title: 'Patient App', theme: AppTheme.lightTheme(), diff --git a/patient/lib/model/assessment_models/assessment_answer_model.dart b/patient/lib/model/assessment_models/assessment_answer_model.dart new file mode 100644 index 0000000..f29fcbd --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_answer_model.dart @@ -0,0 +1,29 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_answer_entity.dart'; + +import 'assessment_question_answer_model.dart'; + +part 'assessment_answer_model.mapper.dart'; + +@MappableClass() +class AssessmentAnswerModel with AssessmentAnswerModelMappable { + + @MappableField(key: 'assessment_id') + final String assessmentId; + + @MappableField(key: 'questions') + final List questions; + + AssessmentAnswerModel({ + required this.assessmentId, + required this.questions, + }); + + AssessmentAnswerEntity toEntity() { + return AssessmentAnswerEntity( + assessmentId: assessmentId, + questions: questions.map((e) => e.toEntity()).toList(), + ); + } + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_answer_model.mapper.dart b/patient/lib/model/assessment_models/assessment_answer_model.mapper.dart new file mode 100644 index 0000000..e0e1924 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_answer_model.mapper.dart @@ -0,0 +1,148 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_answer_model.dart'; + +class AssessmentAnswerModelMapper + extends ClassMapperBase { + AssessmentAnswerModelMapper._(); + + static AssessmentAnswerModelMapper? _instance; + static AssessmentAnswerModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentAnswerModelMapper._()); + AssessmentQuestionAnswerModelMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentAnswerModel'; + + static String _$assessmentId(AssessmentAnswerModel v) => v.assessmentId; + static const Field _f$assessmentId = + Field('assessmentId', _$assessmentId, key: r'assessment_id'); + static List _$questions( + AssessmentAnswerModel v) => + v.questions; + static const Field> + _f$questions = Field('questions', _$questions); + + @override + final MappableFields fields = const { + #assessmentId: _f$assessmentId, + #questions: _f$questions, + }; + + static AssessmentAnswerModel _instantiate(DecodingData data) { + return AssessmentAnswerModel( + assessmentId: data.dec(_f$assessmentId), + questions: data.dec(_f$questions)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentAnswerModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentAnswerModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentAnswerModelMappable { + String toJson() { + return AssessmentAnswerModelMapper.ensureInitialized() + .encodeJson(this as AssessmentAnswerModel); + } + + Map toMap() { + return AssessmentAnswerModelMapper.ensureInitialized() + .encodeMap(this as AssessmentAnswerModel); + } + + AssessmentAnswerModelCopyWith + get copyWith => _AssessmentAnswerModelCopyWithImpl( + this as AssessmentAnswerModel, $identity, $identity); + @override + String toString() { + return AssessmentAnswerModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentAnswerModel); + } + + @override + bool operator ==(Object other) { + return AssessmentAnswerModelMapper.ensureInitialized() + .equalsValue(this as AssessmentAnswerModel, other); + } + + @override + int get hashCode { + return AssessmentAnswerModelMapper.ensureInitialized() + .hashValue(this as AssessmentAnswerModel); + } +} + +extension AssessmentAnswerModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentAnswerModel, $Out> { + AssessmentAnswerModelCopyWith<$R, AssessmentAnswerModel, $Out> + get $asAssessmentAnswerModel => + $base.as((v, t, t2) => _AssessmentAnswerModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentAnswerModelCopyWith< + $R, + $In extends AssessmentAnswerModel, + $Out> implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentQuestionAnswerModel, + AssessmentQuestionAnswerModelCopyWith<$R, AssessmentQuestionAnswerModel, + AssessmentQuestionAnswerModel>> get questions; + $R call( + {String? assessmentId, List? questions}); + AssessmentAnswerModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentAnswerModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentAnswerModel, $Out> + implements AssessmentAnswerModelCopyWith<$R, AssessmentAnswerModel, $Out> { + _AssessmentAnswerModelCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentAnswerModelMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentQuestionAnswerModel, + AssessmentQuestionAnswerModelCopyWith<$R, AssessmentQuestionAnswerModel, + AssessmentQuestionAnswerModel>> get questions => ListCopyWith( + $value.questions, + (v, t) => v.copyWith.$chain(t), + (v) => call(questions: v)); + @override + $R call( + {String? assessmentId, + List? questions}) => + $apply(FieldCopyWithData({ + if (assessmentId != null) #assessmentId: assessmentId, + if (questions != null) #questions: questions + })); + @override + AssessmentAnswerModel $make(CopyWithData data) => AssessmentAnswerModel( + assessmentId: data.get(#assessmentId, or: $value.assessmentId), + questions: data.get(#questions, or: $value.questions)); + + @override + AssessmentAnswerModelCopyWith<$R2, AssessmentAnswerModel, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentAnswerModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/assessment_models/assessment_model.dart b/patient/lib/model/assessment_models/assessment_model.dart new file mode 100644 index 0000000..b1645f7 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_model.dart @@ -0,0 +1,44 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/model/assessment_models/assessment_question_model.dart'; + + +part 'assessment_model.mapper.dart'; + +@MappableClass() +class AssessmentModel with AssessmentModelMappable { + @MappableField(key: 'id') + final String assessmentId; + + @MappableField(key: 'created_at') + final String createdAt; + + @MappableField(key: 'name') + final String name; + + @MappableField(key: 'description') + final String description; + + @MappableField(key: 'category') + final String category; + + @MappableField(key: 'cutoff_score') + final int cutoffScore; + + @MappableField(key: 'image_url') + final String imageUrl; + + @MappableField(key: 'questions') + final List questions; + + AssessmentModel({ + required this.assessmentId, + required this.createdAt, + required this.name, + required this.description, + required this.category, + required this.cutoffScore, + required this.questions, + required this.imageUrl, + }); + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_model.mapper.dart b/patient/lib/model/assessment_models/assessment_model.mapper.dart new file mode 100644 index 0000000..06c94b5 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_model.mapper.dart @@ -0,0 +1,196 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_model.dart'; + +class AssessmentModelMapper extends ClassMapperBase { + AssessmentModelMapper._(); + + static AssessmentModelMapper? _instance; + static AssessmentModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentModelMapper._()); + AssessmentQuestionModelMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentModel'; + + static String _$assessmentId(AssessmentModel v) => v.assessmentId; + static const Field _f$assessmentId = + Field('assessmentId', _$assessmentId, key: r'id'); + static String _$createdAt(AssessmentModel v) => v.createdAt; + static const Field _f$createdAt = + Field('createdAt', _$createdAt, key: r'created_at'); + static String _$name(AssessmentModel v) => v.name; + static const Field _f$name = Field('name', _$name); + static String _$description(AssessmentModel v) => v.description; + static const Field _f$description = + Field('description', _$description); + static String _$category(AssessmentModel v) => v.category; + static const Field _f$category = + Field('category', _$category); + static int _$cutoffScore(AssessmentModel v) => v.cutoffScore; + static const Field _f$cutoffScore = + Field('cutoffScore', _$cutoffScore, key: r'cutoff_score'); + static List _$questions(AssessmentModel v) => + v.questions; + static const Field> + _f$questions = Field('questions', _$questions); + static String _$imageUrl(AssessmentModel v) => v.imageUrl; + static const Field _f$imageUrl = + Field('imageUrl', _$imageUrl, key: r'image_url'); + + @override + final MappableFields fields = const { + #assessmentId: _f$assessmentId, + #createdAt: _f$createdAt, + #name: _f$name, + #description: _f$description, + #category: _f$category, + #cutoffScore: _f$cutoffScore, + #questions: _f$questions, + #imageUrl: _f$imageUrl, + }; + + static AssessmentModel _instantiate(DecodingData data) { + return AssessmentModel( + assessmentId: data.dec(_f$assessmentId), + createdAt: data.dec(_f$createdAt), + name: data.dec(_f$name), + description: data.dec(_f$description), + category: data.dec(_f$category), + cutoffScore: data.dec(_f$cutoffScore), + questions: data.dec(_f$questions), + imageUrl: data.dec(_f$imageUrl)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentModelMappable { + String toJson() { + return AssessmentModelMapper.ensureInitialized() + .encodeJson(this as AssessmentModel); + } + + Map toMap() { + return AssessmentModelMapper.ensureInitialized() + .encodeMap(this as AssessmentModel); + } + + AssessmentModelCopyWith + get copyWith => _AssessmentModelCopyWithImpl( + this as AssessmentModel, $identity, $identity); + @override + String toString() { + return AssessmentModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentModel); + } + + @override + bool operator ==(Object other) { + return AssessmentModelMapper.ensureInitialized() + .equalsValue(this as AssessmentModel, other); + } + + @override + int get hashCode { + return AssessmentModelMapper.ensureInitialized() + .hashValue(this as AssessmentModel); + } +} + +extension AssessmentModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentModel, $Out> { + AssessmentModelCopyWith<$R, AssessmentModel, $Out> get $asAssessmentModel => + $base.as((v, t, t2) => _AssessmentModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentModelCopyWith<$R, $In extends AssessmentModel, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentQuestionModel, + AssessmentQuestionModelCopyWith<$R, AssessmentQuestionModel, + AssessmentQuestionModel>> get questions; + $R call( + {String? assessmentId, + String? createdAt, + String? name, + String? description, + String? category, + int? cutoffScore, + List? questions, + String? imageUrl}); + AssessmentModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentModel, $Out> + implements AssessmentModelCopyWith<$R, AssessmentModel, $Out> { + _AssessmentModelCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentModelMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentQuestionModel, + AssessmentQuestionModelCopyWith<$R, AssessmentQuestionModel, + AssessmentQuestionModel>> get questions => ListCopyWith( + $value.questions, + (v, t) => v.copyWith.$chain(t), + (v) => call(questions: v)); + @override + $R call( + {String? assessmentId, + String? createdAt, + String? name, + String? description, + String? category, + int? cutoffScore, + List? questions, + String? imageUrl}) => + $apply(FieldCopyWithData({ + if (assessmentId != null) #assessmentId: assessmentId, + if (createdAt != null) #createdAt: createdAt, + if (name != null) #name: name, + if (description != null) #description: description, + if (category != null) #category: category, + if (cutoffScore != null) #cutoffScore: cutoffScore, + if (questions != null) #questions: questions, + if (imageUrl != null) #imageUrl: imageUrl + })); + @override + AssessmentModel $make(CopyWithData data) => AssessmentModel( + assessmentId: data.get(#assessmentId, or: $value.assessmentId), + createdAt: data.get(#createdAt, or: $value.createdAt), + name: data.get(#name, or: $value.name), + description: data.get(#description, or: $value.description), + category: data.get(#category, or: $value.category), + cutoffScore: data.get(#cutoffScore, or: $value.cutoffScore), + questions: data.get(#questions, or: $value.questions), + imageUrl: data.get(#imageUrl, or: $value.imageUrl)); + + @override + AssessmentModelCopyWith<$R2, AssessmentModel, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t) => + _AssessmentModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/assessment_models/assessment_models.dart b/patient/lib/model/assessment_models/assessment_models.dart new file mode 100644 index 0000000..14d6262 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_models.dart @@ -0,0 +1,7 @@ +export './assessment_models.dart'; +export './assessment_question_model.dart'; +export './assessment_option_model.dart'; +export './assessment_model.dart'; +export './assessment_answer_model.dart'; +export './assessment_result_model.dart'; +export './assessment_question_answer_model.dart'; \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_option_model.dart b/patient/lib/model/assessment_models/assessment_option_model.dart new file mode 100644 index 0000000..8f8bdbe --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_option_model.dart @@ -0,0 +1,23 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'assessment_option_model.mapper.dart'; + +@MappableClass() +class AssessmentOptionModel with AssessmentOptionModelMappable { + + @MappableField(key: 'option_id') + final String optionId; + + @MappableField(key: 'text') + final String text; + + @MappableField(key: 'score') + final int score; + + AssessmentOptionModel({ + required this.optionId, + required this.text, + required this.score, + }); + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_option_model.mapper.dart b/patient/lib/model/assessment_models/assessment_option_model.mapper.dart new file mode 100644 index 0000000..4a179c5 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_option_model.mapper.dart @@ -0,0 +1,135 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_option_model.dart'; + +class AssessmentOptionModelMapper + extends ClassMapperBase { + AssessmentOptionModelMapper._(); + + static AssessmentOptionModelMapper? _instance; + static AssessmentOptionModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentOptionModelMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentOptionModel'; + + static String _$optionId(AssessmentOptionModel v) => v.optionId; + static const Field _f$optionId = + Field('optionId', _$optionId, key: r'option_id'); + static String _$text(AssessmentOptionModel v) => v.text; + static const Field _f$text = + Field('text', _$text); + static int _$score(AssessmentOptionModel v) => v.score; + static const Field _f$score = + Field('score', _$score); + + @override + final MappableFields fields = const { + #optionId: _f$optionId, + #text: _f$text, + #score: _f$score, + }; + + static AssessmentOptionModel _instantiate(DecodingData data) { + return AssessmentOptionModel( + optionId: data.dec(_f$optionId), + text: data.dec(_f$text), + score: data.dec(_f$score)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentOptionModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentOptionModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentOptionModelMappable { + String toJson() { + return AssessmentOptionModelMapper.ensureInitialized() + .encodeJson(this as AssessmentOptionModel); + } + + Map toMap() { + return AssessmentOptionModelMapper.ensureInitialized() + .encodeMap(this as AssessmentOptionModel); + } + + AssessmentOptionModelCopyWith + get copyWith => _AssessmentOptionModelCopyWithImpl( + this as AssessmentOptionModel, $identity, $identity); + @override + String toString() { + return AssessmentOptionModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentOptionModel); + } + + @override + bool operator ==(Object other) { + return AssessmentOptionModelMapper.ensureInitialized() + .equalsValue(this as AssessmentOptionModel, other); + } + + @override + int get hashCode { + return AssessmentOptionModelMapper.ensureInitialized() + .hashValue(this as AssessmentOptionModel); + } +} + +extension AssessmentOptionModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentOptionModel, $Out> { + AssessmentOptionModelCopyWith<$R, AssessmentOptionModel, $Out> + get $asAssessmentOptionModel => + $base.as((v, t, t2) => _AssessmentOptionModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentOptionModelCopyWith< + $R, + $In extends AssessmentOptionModel, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? optionId, String? text, int? score}); + AssessmentOptionModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentOptionModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentOptionModel, $Out> + implements AssessmentOptionModelCopyWith<$R, AssessmentOptionModel, $Out> { + _AssessmentOptionModelCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentOptionModelMapper.ensureInitialized(); + @override + $R call({String? optionId, String? text, int? score}) => + $apply(FieldCopyWithData({ + if (optionId != null) #optionId: optionId, + if (text != null) #text: text, + if (score != null) #score: score + })); + @override + AssessmentOptionModel $make(CopyWithData data) => AssessmentOptionModel( + optionId: data.get(#optionId, or: $value.optionId), + text: data.get(#text, or: $value.text), + score: data.get(#score, or: $value.score)); + + @override + AssessmentOptionModelCopyWith<$R2, AssessmentOptionModel, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentOptionModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/assessment_models/assessment_question_answer_model.dart b/patient/lib/model/assessment_models/assessment_question_answer_model.dart new file mode 100644 index 0000000..faf71b7 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_question_answer_model.dart @@ -0,0 +1,27 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_question_answer_entity.dart'; + +part 'assessment_question_answer_model.mapper.dart'; + +@MappableClass() +class AssessmentQuestionAnswerModel with AssessmentQuestionAnswerModelMappable { + + @MappableField(key: 'question_id') + final String questionId; + + @MappableField(key: 'answer_id') + final String answerId; + + AssessmentQuestionAnswerModel({ + required this.questionId, + required this.answerId, + }); + + AssessmentQuestionAnswerEntity toEntity() { + return AssessmentQuestionAnswerEntity( + questionId: questionId, + answerId: answerId, + ); + } + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_question_answer_model.mapper.dart b/patient/lib/model/assessment_models/assessment_question_answer_model.mapper.dart new file mode 100644 index 0000000..7b11446 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_question_answer_model.mapper.dart @@ -0,0 +1,134 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_question_answer_model.dart'; + +class AssessmentQuestionAnswerModelMapper + extends ClassMapperBase { + AssessmentQuestionAnswerModelMapper._(); + + static AssessmentQuestionAnswerModelMapper? _instance; + static AssessmentQuestionAnswerModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals + .use(_instance = AssessmentQuestionAnswerModelMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentQuestionAnswerModel'; + + static String _$questionId(AssessmentQuestionAnswerModel v) => v.questionId; + static const Field _f$questionId = + Field('questionId', _$questionId, key: r'question_id'); + static String _$answerId(AssessmentQuestionAnswerModel v) => v.answerId; + static const Field _f$answerId = + Field('answerId', _$answerId, key: r'answer_id'); + + @override + final MappableFields fields = const { + #questionId: _f$questionId, + #answerId: _f$answerId, + }; + + static AssessmentQuestionAnswerModel _instantiate(DecodingData data) { + return AssessmentQuestionAnswerModel( + questionId: data.dec(_f$questionId), answerId: data.dec(_f$answerId)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentQuestionAnswerModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentQuestionAnswerModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentQuestionAnswerModelMappable { + String toJson() { + return AssessmentQuestionAnswerModelMapper.ensureInitialized() + .encodeJson( + this as AssessmentQuestionAnswerModel); + } + + Map toMap() { + return AssessmentQuestionAnswerModelMapper.ensureInitialized() + .encodeMap( + this as AssessmentQuestionAnswerModel); + } + + AssessmentQuestionAnswerModelCopyWith + get copyWith => _AssessmentQuestionAnswerModelCopyWithImpl( + this as AssessmentQuestionAnswerModel, $identity, $identity); + @override + String toString() { + return AssessmentQuestionAnswerModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentQuestionAnswerModel); + } + + @override + bool operator ==(Object other) { + return AssessmentQuestionAnswerModelMapper.ensureInitialized() + .equalsValue(this as AssessmentQuestionAnswerModel, other); + } + + @override + int get hashCode { + return AssessmentQuestionAnswerModelMapper.ensureInitialized() + .hashValue(this as AssessmentQuestionAnswerModel); + } +} + +extension AssessmentQuestionAnswerModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentQuestionAnswerModel, $Out> { + AssessmentQuestionAnswerModelCopyWith<$R, AssessmentQuestionAnswerModel, $Out> + get $asAssessmentQuestionAnswerModel => $base.as( + (v, t, t2) => _AssessmentQuestionAnswerModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentQuestionAnswerModelCopyWith< + $R, + $In extends AssessmentQuestionAnswerModel, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? questionId, String? answerId}); + AssessmentQuestionAnswerModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentQuestionAnswerModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentQuestionAnswerModel, $Out> + implements + AssessmentQuestionAnswerModelCopyWith<$R, AssessmentQuestionAnswerModel, + $Out> { + _AssessmentQuestionAnswerModelCopyWithImpl( + super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentQuestionAnswerModelMapper.ensureInitialized(); + @override + $R call({String? questionId, String? answerId}) => $apply(FieldCopyWithData({ + if (questionId != null) #questionId: questionId, + if (answerId != null) #answerId: answerId + })); + @override + AssessmentQuestionAnswerModel $make(CopyWithData data) => + AssessmentQuestionAnswerModel( + questionId: data.get(#questionId, or: $value.questionId), + answerId: data.get(#answerId, or: $value.answerId)); + + @override + AssessmentQuestionAnswerModelCopyWith<$R2, AssessmentQuestionAnswerModel, + $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t) => + _AssessmentQuestionAnswerModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/assessment_models/assessment_question_model.dart b/patient/lib/model/assessment_models/assessment_question_model.dart new file mode 100644 index 0000000..743c5fd --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_question_model.dart @@ -0,0 +1,26 @@ + +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:patient/model/assessment_models/assessment_option_model.dart'; + +part 'assessment_question_model.mapper.dart'; + + +@MappableClass() +class AssessmentQuestionModel with AssessmentQuestionModelMappable { + + @MappableField(key: 'question_id') + final String questionId; + + @MappableField(key: 'text') + final String text; + + @MappableField(key: 'options') + final List options; + + AssessmentQuestionModel({ + required this.questionId, + required this.text, + required this.options, + }); + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_question_model.mapper.dart b/patient/lib/model/assessment_models/assessment_question_model.mapper.dart new file mode 100644 index 0000000..d808c63 --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_question_model.mapper.dart @@ -0,0 +1,155 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_question_model.dart'; + +class AssessmentQuestionModelMapper + extends ClassMapperBase { + AssessmentQuestionModelMapper._(); + + static AssessmentQuestionModelMapper? _instance; + static AssessmentQuestionModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals + .use(_instance = AssessmentQuestionModelMapper._()); + AssessmentOptionModelMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'AssessmentQuestionModel'; + + static String _$questionId(AssessmentQuestionModel v) => v.questionId; + static const Field _f$questionId = + Field('questionId', _$questionId, key: r'question_id'); + static String _$text(AssessmentQuestionModel v) => v.text; + static const Field _f$text = + Field('text', _$text); + static List _$options(AssessmentQuestionModel v) => + v.options; + static const Field> + _f$options = Field('options', _$options); + + @override + final MappableFields fields = const { + #questionId: _f$questionId, + #text: _f$text, + #options: _f$options, + }; + + static AssessmentQuestionModel _instantiate(DecodingData data) { + return AssessmentQuestionModel( + questionId: data.dec(_f$questionId), + text: data.dec(_f$text), + options: data.dec(_f$options)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentQuestionModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentQuestionModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentQuestionModelMappable { + String toJson() { + return AssessmentQuestionModelMapper.ensureInitialized() + .encodeJson(this as AssessmentQuestionModel); + } + + Map toMap() { + return AssessmentQuestionModelMapper.ensureInitialized() + .encodeMap(this as AssessmentQuestionModel); + } + + AssessmentQuestionModelCopyWith + get copyWith => _AssessmentQuestionModelCopyWithImpl( + this as AssessmentQuestionModel, $identity, $identity); + @override + String toString() { + return AssessmentQuestionModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentQuestionModel); + } + + @override + bool operator ==(Object other) { + return AssessmentQuestionModelMapper.ensureInitialized() + .equalsValue(this as AssessmentQuestionModel, other); + } + + @override + int get hashCode { + return AssessmentQuestionModelMapper.ensureInitialized() + .hashValue(this as AssessmentQuestionModel); + } +} + +extension AssessmentQuestionModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentQuestionModel, $Out> { + AssessmentQuestionModelCopyWith<$R, AssessmentQuestionModel, $Out> + get $asAssessmentQuestionModel => $base + .as((v, t, t2) => _AssessmentQuestionModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentQuestionModelCopyWith< + $R, + $In extends AssessmentQuestionModel, + $Out> implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith< + $R, + AssessmentOptionModel, + AssessmentOptionModelCopyWith<$R, AssessmentOptionModel, + AssessmentOptionModel>> get options; + $R call( + {String? questionId, String? text, List? options}); + AssessmentQuestionModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentQuestionModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentQuestionModel, $Out> + implements + AssessmentQuestionModelCopyWith<$R, AssessmentQuestionModel, $Out> { + _AssessmentQuestionModelCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentQuestionModelMapper.ensureInitialized(); + @override + ListCopyWith< + $R, + AssessmentOptionModel, + AssessmentOptionModelCopyWith<$R, AssessmentOptionModel, + AssessmentOptionModel>> get options => ListCopyWith( + $value.options, (v, t) => v.copyWith.$chain(t), (v) => call(options: v)); + @override + $R call( + {String? questionId, + String? text, + List? options}) => + $apply(FieldCopyWithData({ + if (questionId != null) #questionId: questionId, + if (text != null) #text: text, + if (options != null) #options: options + })); + @override + AssessmentQuestionModel $make(CopyWithData data) => AssessmentQuestionModel( + questionId: data.get(#questionId, or: $value.questionId), + text: data.get(#text, or: $value.text), + options: data.get(#options, or: $value.options)); + + @override + AssessmentQuestionModelCopyWith<$R2, AssessmentQuestionModel, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentQuestionModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/assessment_models/assessment_result_model.dart b/patient/lib/model/assessment_models/assessment_result_model.dart new file mode 100644 index 0000000..85a248b --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_result_model.dart @@ -0,0 +1,24 @@ + +import 'package:dart_mappable/dart_mappable.dart'; + +part 'assessment_result_model.mapper.dart'; + +@MappableClass() +class AssessmentResultModel with AssessmentResultModelMappable { + + @MappableField(key: 'assessment_score') + final int assessmentScore; + + @MappableField(key: 'is_autistic') + final bool isAutistic; + + @MappableField(key: 'message') + final String message; + + AssessmentResultModel({ + required this.assessmentScore, + required this.isAutistic, + required this.message, + }); + +} \ No newline at end of file diff --git a/patient/lib/model/assessment_models/assessment_result_model.mapper.dart b/patient/lib/model/assessment_models/assessment_result_model.mapper.dart new file mode 100644 index 0000000..7d2099f --- /dev/null +++ b/patient/lib/model/assessment_models/assessment_result_model.mapper.dart @@ -0,0 +1,135 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'assessment_result_model.dart'; + +class AssessmentResultModelMapper + extends ClassMapperBase { + AssessmentResultModelMapper._(); + + static AssessmentResultModelMapper? _instance; + static AssessmentResultModelMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = AssessmentResultModelMapper._()); + } + return _instance!; + } + + @override + final String id = 'AssessmentResultModel'; + + static int _$assessmentScore(AssessmentResultModel v) => v.assessmentScore; + static const Field _f$assessmentScore = + Field('assessmentScore', _$assessmentScore, key: r'assessment_score'); + static bool _$isAutistic(AssessmentResultModel v) => v.isAutistic; + static const Field _f$isAutistic = + Field('isAutistic', _$isAutistic, key: r'is_autistic'); + static String _$message(AssessmentResultModel v) => v.message; + static const Field _f$message = + Field('message', _$message); + + @override + final MappableFields fields = const { + #assessmentScore: _f$assessmentScore, + #isAutistic: _f$isAutistic, + #message: _f$message, + }; + + static AssessmentResultModel _instantiate(DecodingData data) { + return AssessmentResultModel( + assessmentScore: data.dec(_f$assessmentScore), + isAutistic: data.dec(_f$isAutistic), + message: data.dec(_f$message)); + } + + @override + final Function instantiate = _instantiate; + + static AssessmentResultModel fromMap(Map map) { + return ensureInitialized().decodeMap(map); + } + + static AssessmentResultModel fromJson(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin AssessmentResultModelMappable { + String toJson() { + return AssessmentResultModelMapper.ensureInitialized() + .encodeJson(this as AssessmentResultModel); + } + + Map toMap() { + return AssessmentResultModelMapper.ensureInitialized() + .encodeMap(this as AssessmentResultModel); + } + + AssessmentResultModelCopyWith + get copyWith => _AssessmentResultModelCopyWithImpl( + this as AssessmentResultModel, $identity, $identity); + @override + String toString() { + return AssessmentResultModelMapper.ensureInitialized() + .stringifyValue(this as AssessmentResultModel); + } + + @override + bool operator ==(Object other) { + return AssessmentResultModelMapper.ensureInitialized() + .equalsValue(this as AssessmentResultModel, other); + } + + @override + int get hashCode { + return AssessmentResultModelMapper.ensureInitialized() + .hashValue(this as AssessmentResultModel); + } +} + +extension AssessmentResultModelValueCopy<$R, $Out> + on ObjectCopyWith<$R, AssessmentResultModel, $Out> { + AssessmentResultModelCopyWith<$R, AssessmentResultModel, $Out> + get $asAssessmentResultModel => + $base.as((v, t, t2) => _AssessmentResultModelCopyWithImpl(v, t, t2)); +} + +abstract class AssessmentResultModelCopyWith< + $R, + $In extends AssessmentResultModel, + $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({int? assessmentScore, bool? isAutistic, String? message}); + AssessmentResultModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t); +} + +class _AssessmentResultModelCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, AssessmentResultModel, $Out> + implements AssessmentResultModelCopyWith<$R, AssessmentResultModel, $Out> { + _AssessmentResultModelCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + AssessmentResultModelMapper.ensureInitialized(); + @override + $R call({int? assessmentScore, bool? isAutistic, String? message}) => + $apply(FieldCopyWithData({ + if (assessmentScore != null) #assessmentScore: assessmentScore, + if (isAutistic != null) #isAutistic: isAutistic, + if (message != null) #message: message + })); + @override + AssessmentResultModel $make(CopyWithData data) => AssessmentResultModel( + assessmentScore: data.get(#assessmentScore, or: $value.assessmentScore), + isAutistic: data.get(#isAutistic, or: $value.isAutistic), + message: data.get(#message, or: $value.message)); + + @override + AssessmentResultModelCopyWith<$R2, AssessmentResultModel, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _AssessmentResultModelCopyWithImpl($value, $cast, t); +} diff --git a/patient/lib/model/model.dart b/patient/lib/model/model.dart index c56e1d4..3abb371 100644 --- a/patient/lib/model/model.dart +++ b/patient/lib/model/model.dart @@ -1,3 +1,4 @@ export './model.dart'; export './auth_models/auth_model.dart'; -export 'patient_models/patient_models.dart'; \ No newline at end of file +export 'patient_models/patient_models.dart'; +export './assessment_models/assessment_models.dart'; \ No newline at end of file diff --git a/patient/lib/presentation/assessments/assessment_screen.dart b/patient/lib/presentation/assessments/assessment_screen.dart index d4e35c1..993af76 100644 --- a/patient/lib/presentation/assessments/assessment_screen.dart +++ b/patient/lib/presentation/assessments/assessment_screen.dart @@ -1,10 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:patient/core/core.dart'; import 'package:patient/core/theme/theme.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; +import 'package:patient/presentation/widgets/snackbar_service.dart'; import 'package:patient/provider/assessment_provider.dart'; import 'package:provider/provider.dart'; class AssessmentScreen extends StatefulWidget { - const AssessmentScreen({super.key}); + const AssessmentScreen({ + super.key, + required this.assessment, + }); + + final AssessmentModel assessment; @override AssessmentScreenState createState() => AssessmentScreenState(); @@ -14,25 +22,28 @@ class AssessmentScreenState extends State { @override void initState() { super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); WidgetsBinding.instance.addPostFrameCallback((_) { - Provider.of(context, listen: false) - .fetchAssessmentBySelectedId(); + final assessmentProvider = context.read(); + if(assessmentProvider.submitAssessmentStatus.isSuccess) { + SnackbarService.showSuccess('${assessmentProvider.assessmentResultModel?.message}'); + } else if(assessmentProvider.submitAssessmentStatus.isFailure) { + SnackbarService.showError('Something went wrong. Please try again later.'); + } }); } @override Widget build(BuildContext context) { + Provider.of(context, listen: true).submitAssessmentStatus; return Scaffold( body: SafeArea( child: Consumer( builder: (context, provider, child) { - if (provider.assessment == null) { - return const Center( - child: CircularProgressIndicator( - color: AppTheme.secondaryColor, - ), - ); - } return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), @@ -40,9 +51,9 @@ class AssessmentScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8), - const Text( - "Autism Quotient (AQ)", - style: TextStyle( + Text( + widget.assessment.name, + style: const TextStyle( fontSize: 25, fontWeight: FontWeight.bold, color: Colors.black, @@ -60,16 +71,18 @@ class AssessmentScreenState extends State { child: Padding( padding: const EdgeInsets.only(left: 16.0), child: ListView.builder( - itemCount: - (provider.assessment!['questions'] as List).length, + itemCount: widget.assessment.questions.length, itemBuilder: (context, index) { - final question = - provider.assessment!['questions'][index]; + final question = widget.assessment.questions[index]; return QuestionCard( question: question, questionIndex: index, - onAnswerSelected: (value) { - provider.selectAnswer(index, value); + onAnswerSelected: (String optionId) { + context.read() + .assessmentAnswers = AssessmentQuestionAnswerModel( + questionId: question.questionId, + answerId: optionId, + ); }, ); }, @@ -85,7 +98,7 @@ class AssessmentScreenState extends State { height: 50, child: ElevatedButton( onPressed: () { - // Implement Submit Assessment logic here + context.read().submitAssessment(); }, style: ElevatedButton.styleFrom( backgroundColor: AppTheme.secondaryColor, @@ -118,7 +131,7 @@ class AssessmentScreenState extends State { // Reusable QuestionCard Widget with Custom Checkbox class QuestionCard extends StatelessWidget { - final Map question; + final AssessmentQuestionModel question; final int questionIndex; final ValueChanged onAnswerSelected; @@ -131,14 +144,13 @@ class QuestionCard extends StatelessWidget { @override Widget build(BuildContext context) { - final provider = Provider.of(context, listen: false); return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ const SizedBox(height: 30), Text( - question['text'] as String, + question.text, style: const TextStyle( fontSize: 16, color: AppTheme.textColor, @@ -146,10 +158,13 @@ class QuestionCard extends StatelessWidget { ), ), const SizedBox(height: 10), - ...List>.from(question['options']).map((option) { - final optionText = option['text'] as String; + ...question.options.map((option) { + final assessmentAnswers = context.read().assessmentAnswerModel; + final optionText = option.text; final isSelected = - provider.selectedAnswers[questionIndex] == optionText; + assessmentAnswers?.questions.any((element) => + element.questionId == question.questionId && + element.answerId == option.optionId) ?? false; return SizedBox( height: 30, child: Row( @@ -158,7 +173,7 @@ class QuestionCard extends StatelessWidget { value: isSelected, onChanged: (bool? value) { if (value == true) { - onAnswerSelected(optionText); + onAnswerSelected(option.optionId); } else { onAnswerSelected(''); } diff --git a/patient/lib/presentation/assessments/assessments_list_screen.dart b/patient/lib/presentation/assessments/assessments_list_screen.dart index acd7e4d..1a225f5 100644 --- a/patient/lib/presentation/assessments/assessments_list_screen.dart +++ b/patient/lib/presentation/assessments/assessments_list_screen.dart @@ -5,14 +5,26 @@ import 'package:patient/presentation/assessments/widgets/assessment_card.dart'; import 'package:patient/provider/assessment_provider.dart'; import 'package:provider/provider.dart'; -class AssessmentsListScreen extends StatelessWidget { +class AssessmentsListScreen extends StatefulWidget { const AssessmentsListScreen({super.key}); + @override + State createState() => _AssessmentsListScreenState(); +} + +class _AssessmentsListScreenState extends State { + + @override + void initState() { + super.initState(); + context.read().fetchAllAssessments(); + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); final assessmentProvider = - Provider.of(context, listen: false); + Provider.of(context, listen: true); return Scaffold( backgroundColor: AppTheme.backgroundColor, body: SafeArea( @@ -35,30 +47,39 @@ class AssessmentsListScreen extends StatelessWidget { ), ), const SizedBox(height: 24), - Expanded( - child: ListView.separated( - physics: const BouncingScrollPhysics(), - itemCount: assessmentProvider.assessments.length, - separatorBuilder: (context, index) => - const SizedBox(height: 16), - itemBuilder: (context, index) { - final assessment = assessmentProvider.assessments[index]; - return AssessmentCard( - assessment: assessment, - onTap: () { - // Handle assessment selection - //update the assessment id in the provider by using the setAssessmentId method for e.g: - // Provider.of(context, listen: false) - // .setAssessmentId(assessment.id); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const AssessmentScreen())); - }, + Consumer( + builder: (context, provider, child) { + if (assessmentProvider.allAssessments.isEmpty) { + return const Center( + child: CircularProgressIndicator(), ); - }, - ), + } + return Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + itemCount: assessmentProvider.allAssessments.length, + separatorBuilder: (context, index) => + const SizedBox(height: 16), + itemBuilder: (context, index) { + final assessment = assessmentProvider.allAssessments[index]; + return AssessmentCard( + assessment: assessment, + onTap: () { + context.read().selectedAssessmentId = assessment.assessmentId; + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AssessmentScreen( + assessment: assessment, + ), + ), + ); + }, + ); + }, + ), + ); + } ), ], ), diff --git a/patient/lib/presentation/assessments/widgets/assessment_card.dart b/patient/lib/presentation/assessments/widgets/assessment_card.dart index 7d18d90..78ee571 100644 --- a/patient/lib/presentation/assessments/widgets/assessment_card.dart +++ b/patient/lib/presentation/assessments/widgets/assessment_card.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:patient/core/theme/theme.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; import 'package:patient/presentation/assessments/models/assessment_card_model.dart'; import 'package:patient/presentation/assessments/widgets/assessment_icon.dart'; class AssessmentCard extends StatelessWidget { - final AssessmentCardModel assessment; + final AssessmentModel assessment; final VoidCallback onTap; const AssessmentCard({ @@ -33,7 +34,7 @@ class AssessmentCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - assessment.title, + assessment.name, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w700, @@ -52,7 +53,7 @@ class AssessmentCard extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - AssessmentIcon(assessment: assessment), + AssessmentIcon(icon: assessment.imageUrl,), ], ), ], diff --git a/patient/lib/presentation/assessments/widgets/assessment_icon.dart b/patient/lib/presentation/assessments/widgets/assessment_icon.dart index 90add2a..34e8b28 100644 --- a/patient/lib/presentation/assessments/widgets/assessment_icon.dart +++ b/patient/lib/presentation/assessments/widgets/assessment_icon.dart @@ -1,18 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:patient/presentation/assessments/models/assessment_card_model.dart'; class AssessmentIcon extends StatelessWidget { - final AssessmentCardModel assessment; + final String icon; const AssessmentIcon({ super.key, - required this.assessment, + required this.icon, }); @override Widget build(BuildContext context) { - return Image.asset( - assessment.iconPath, + return Image.network( + icon, width: 80, height: 80, fit: BoxFit.contain, diff --git a/patient/lib/presentation/auth/auth_screen.dart b/patient/lib/presentation/auth/auth_screen.dart index f66f0f0..989b801 100644 --- a/patient/lib/presentation/auth/auth_screen.dart +++ b/patient/lib/presentation/auth/auth_screen.dart @@ -3,11 +3,14 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:patient/presentation/auth/personal_details_screen.dart'; +import 'package:patient/presentation/home/home_screen.dart'; import 'package:patient/presentation/widgets/google_signin_button.dart'; +import 'package:patient/presentation/widgets/snackbar_service.dart'; +import 'package:patient/provider/auth_provider.dart'; +import 'package:provider/provider.dart'; import '../widgets/welcome_header.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:patient/presentation/auth/personal_details_screen.dart'; class AuthScreen extends StatefulWidget { @@ -21,21 +24,22 @@ class _AuthScreenState extends State { final PageController _pageController = PageController(initialPage: 0); int _currentPage = 0; late Timer _timer; + bool hasNavigated = false; final supabase = Supabase.instance.client; StreamSubscription? _authSubscription; final List _contents = [ - OnboardingContent( + const OnboardingContent( image: 'assets/illustration.png', title: 'Daily Activities', description: 'Personalized Daily Activities, Tracked Effortlessly!', ), - OnboardingContent( + const OnboardingContent( image: 'assets/illustration1.png', title: 'Therapy Goals', description: 'Set and achieve your therapy goals with ease!', ), - OnboardingContent( + const OnboardingContent( image: 'assets/illustration2.png', title: 'Health Tracking', description: 'Monitor your health metrics with ease and accuracy!', @@ -64,18 +68,8 @@ class _AuthScreenState extends State { final fullName = session.user.userMetadata?['full_name']; final email = session.user.email ?? 'Unknown User'; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Signed in as ${fullName ?? email}'), - duration: const Duration(seconds: 2), - ), - ); - - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => const PersonalDetailsScreen(), - ), - ); + SnackbarService.showSuccess('Signed in as ${fullName ?? email}'); + context.read().checkIfPatientExists(); } void _startAutoScroll() { @@ -101,8 +95,34 @@ class _AuthScreenState extends State { super.dispose(); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + final authProvider = context.read(); + Widget? nextScreen; + + if (authProvider.authNavigationStatus.isHome) { + final userName = supabase.auth.currentSession?.user.userMetadata?['full_name']; + nextScreen = HomeScreen(userName: userName ?? 'User'); + } else if (authProvider.authNavigationStatus.isPersonalDetails) { + nextScreen = const PersonalDetailsScreen(); + } else if(authProvider.authNavigationStatus.isError) { + SnackbarService.showError('An error occurred. Please try again.'); + return; + } + + if (nextScreen != null) { + Navigator.pushReplacement( + context, MaterialPageRoute(builder: (_) => nextScreen!)); + } + }); + } + @override Widget build(BuildContext context) { + Provider.of(context, listen: true).authNavigationStatus; return Scaffold( body: Column( children: [ @@ -132,11 +152,14 @@ class _AuthScreenState extends State { ), ), - const Positioned( + // Google Sign-in Button + Positioned( bottom: 40, left: 0, right: 0, - child: GoogleSignInButton(), + child: GoogleSignInButton( + onPressed: () => context.read().signInWithGoogle(), + ), ), ], ), diff --git a/patient/lib/presentation/auth/personal_details_screen.dart b/patient/lib/presentation/auth/personal_details_screen.dart index 018ddab..77e17c7 100644 --- a/patient/lib/presentation/auth/personal_details_screen.dart +++ b/patient/lib/presentation/auth/personal_details_screen.dart @@ -1,6 +1,11 @@ import 'package:country_picker/country_picker.dart'; import 'package:flutter/material.dart'; -import 'package:patient/presentation/home/home_screen.dart'; +import 'package:patient/core/core.dart'; +import 'package:patient/model/auth_models/personal_info_model.dart'; +import 'package:patient/presentation/assessments/assessments_list_screen.dart'; +import 'package:patient/presentation/widgets/snackbar_service.dart'; +import 'package:patient/provider/auth_provider.dart'; +import 'package:provider/provider.dart'; class PersonalDetailsScreen extends StatefulWidget { const PersonalDetailsScreen({super.key}); @@ -30,29 +35,74 @@ class _PersonalDetailsScreenState extends State { final _formKey = GlobalKey(); final Map _validationErrors = {}; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + if(!mounted) { + return; + } + final authProvider = context.read(); + + void showErrorSnackBar(String errorMessage) { + SnackbarService.showError(errorMessage); + } + + if(authProvider.apiStatus.isSuccess) { + SnackbarService.showSuccess('Personal Info saved successfully'); + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => const AssessmentsListScreen(), + ), + ); + } else if(authProvider.apiStatus.isFailure) { + showErrorSnackBar(authProvider.apiErrorMessage); + } + }); + + } + + + PersonalInfoModel get getPersonalInfo { + + int parseAge(String age) { + return int.tryParse(age) ?? 0; + } + + bool isAdult(String age) { + return parseAge(age) >= 18; + } + + return PersonalInfoModel( + patientId: '', + patientName: isAssessmentForChild + ? childNameController.text + : adultNameController.text, + age: isAssessmentForChild ? parseAge(childAgeController.text) : parseAge(adultAgeController.text), + isAdult: isAssessmentForChild ? isAdult(childAgeController.text) : isAdult(adultAgeController.text), + phoneNo: phoneController.text, + email: '', + guardianName: isAssessmentForChild ? adultNameController.text : '', + guardianRelation: isAssessmentForChild ? guardianPhoneController.text : phoneController.text, + country: selectedCountry?.displayName ?? '', + gender: isAssessmentForChild ? selectedChildGender ?? '' : selectedGender ?? '', + ); + } + @override Widget build(BuildContext context) { + Provider.of(context, listen: true).apiStatus; return Scaffold( bottomNavigationBar: Padding( padding: const EdgeInsets.fromLTRB(20, 20, 20, 40), child: FilledButton( onPressed: () { if (_formKey.currentState?.validate() ?? false) { - String userName = isAssessmentForChild - ? childNameController.text - : adultNameController.text; - if (isAssessmentForChild) { - // TODO: Call Child API and route accordingly - } else { - // TODO: Call Adult API and route accordingly - } - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => HomeScreen(userName: userName), - // builder: (context) => AutismLevelSlider(currentLevel: 1, // Replace with dynamic data from backend - // maxLevel: 10,), - ), - ); + final personalInfoModel = getPersonalInfo; + final authProvider = context.read(); + authProvider.storePatientPersonalInfo(personalInfoModel); } }, child: const Text( diff --git a/patient/lib/presentation/operations/therapy_goals.dart b/patient/lib/presentation/operations/therapy_goals.dart index ba6faf6..4399033 100644 --- a/patient/lib/presentation/operations/therapy_goals.dart +++ b/patient/lib/presentation/operations/therapy_goals.dart @@ -18,10 +18,11 @@ class TherapyGoalsScreenState extends State { @override void initState() { super.initState(); - Future.microtask(() { - Provider.of(context, listen: false) - .fetchAssessmentBySelectedId(); - }); + // Refactor this code to use existing provider `allAssessment` instead of fetching data again + // Future.microtask(() { + // Provider.of(context, listen: false) + // .fetchAssessmentBySelectedId(); + // }); } @override @@ -225,7 +226,7 @@ class TherapyGoalsScreenState extends State { Widget _buildContent(int index) { final assessmentProvider = Provider.of(context); - final assessment = assessmentProvider.assessment; + final assessment = null;//assessmentProvider.assessment; if (assessment == null || !assessment.containsKey('questions')) { return Center( diff --git a/patient/lib/presentation/widgets/google_signin_button.dart b/patient/lib/presentation/widgets/google_signin_button.dart index 7ba64ad..1225540 100644 --- a/patient/lib/presentation/widgets/google_signin_button.dart +++ b/patient/lib/presentation/widgets/google_signin_button.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:patient/presentation/auth/personal_details_screen.dart'; -import 'package:patient/provider/auth_provider.dart'; -import 'package:provider/provider.dart'; - -import '../auth/personal_details_screen.dart'; - class GoogleSignInButton extends StatelessWidget { - const GoogleSignInButton({Key? key}) : super(key: key); + const GoogleSignInButton({ + super.key, + required this.onPressed + }); + + final Function() onPressed; @override Widget build(BuildContext context) { @@ -18,7 +17,7 @@ class GoogleSignInButton extends StatelessWidget { width: double.infinity, height: 50, child: ElevatedButton( - onPressed: () => _handleGoogleSignIn(context), + onPressed: () => onPressed(), style: ElevatedButton.styleFrom( backgroundColor: Colors.white, @@ -53,20 +52,4 @@ class GoogleSignInButton extends StatelessWidget { ), ); } - - - -Future _handleGoogleSignIn(BuildContext context) async { - final authProvider = context.read(); // Store provider reference - - try { - await authProvider.signInWithGoogle(); // Perform sign-in - final fullName = authProvider.getFullName(); - // print(fullName); - // Fetch full name after sign-in - } catch (error) { - // Handle error (you can log it or handle it elsewhere) - print('Sign-in failed: $error'); - } - } -} +} \ No newline at end of file diff --git a/patient/lib/presentation/widgets/snackbar_service.dart b/patient/lib/presentation/widgets/snackbar_service.dart new file mode 100644 index 0000000..ca4863e --- /dev/null +++ b/patient/lib/presentation/widgets/snackbar_service.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class SnackbarService { + static final GlobalKey _scaffoldMessengerKey = + GlobalKey(); + + static GlobalKey get scaffoldMessengerKey => + _scaffoldMessengerKey; + + static void showSuccess(String message) { + _showSnackbar(message, Colors.green); + } + + static void showError(String message) { + _showSnackbar(message, Colors.red); + } + + static void showInfo(String message) { + _showSnackbar(message, Colors.blue); + } + + static void _showSnackbar(String message, Color color) { + final snackBar = SnackBar( + content: Text(message, style: const TextStyle(color: Colors.white)), + backgroundColor: color, + behavior: SnackBarBehavior.floating, + duration: const Duration(seconds: 3), + ); + + _scaffoldMessengerKey.currentState?.showSnackBar(snackBar); + } +} diff --git a/patient/lib/provider/assessment_provider.dart b/patient/lib/provider/assessment_provider.dart index bdf8620..005bca9 100644 --- a/patient/lib/provider/assessment_provider.dart +++ b/patient/lib/provider/assessment_provider.dart @@ -1,80 +1,68 @@ import 'package:flutter/material.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:patient/presentation/assessments/models/assessment_card_model.dart'; +import 'package:patient/core/core.dart'; +import 'package:patient/model/assessment_models/assessment_models.dart'; import 'package:patient/repository/supabase_assessments_repository.dart'; class AssessmentProvider with ChangeNotifier { final SupabaseAssessmentsRepository _repository = SupabaseAssessmentsRepository(); - Map? _assessment; - Map _selectedAnswers = {}; - String? _assessmentId; + String? _assessmentId; String? get assessmentId => _assessmentId; - Map? get assessment => _assessment; - Map get selectedAnswers => _selectedAnswers; - final List assessments = [ - const AssessmentCardModel( - id: 'autism_quotient', - title: 'Autism Quotient(AQ)', - description: 'A quick referral guide to adults with suspected autism', - iconPath: 'assets/autism_icon.png', - ), - const AssessmentCardModel( - id: 'asrs_5', - title: 'ASRS-5', - description: - 'The Adult ADHD Self-Report Scale for DSM-5 (ASRS-5) is a self-report screening scale for ADHD in adults', - iconPath: 'assets/adhd_icon.png', - ), - const AssessmentCardModel( - id: 'aq_10', - title: 'AQ-10', - description: - 'The AQ-10 is a quick questionnaire that primary care practitioners can use to see if a person should be referred for an autism assessment.', - iconPath: 'assets/aq10_icon.png', - ), - ]; - Future fetchAssessmentBySelectedId() async { - try { - //for testing purposes, the assessment id is hardcoded in the .env file and directly passing it if the assessment id is not set - //otherwise, the assessment id is fetched from the assessment id set by the user - final assessments = await _repository.fetchAssessmentById( - _assessmentId ?? dotenv.env['Austim_Spectrum_Assement_Id']!); - if (assessments.isNotEmpty) { - _assessment = assessments.first; - _selectedAnswers = { - for (int i = 0; i < _assessment!['questions'].length; i++) i: null - }; - } else { - _assessment = null; - _selectedAnswers.clear(); - } - notifyListeners(); - } catch (e) { - // debugPrint('Error fetching assessment: $e'); - _assessment = null; - _selectedAnswers.clear(); - notifyListeners(); + List _allAssessments = []; + List get allAssessments => _allAssessments; + + String _selectedAssesssmentId = ''; + + AssessmentAnswerModel _assessmentAnswerModel = AssessmentAnswerModel(questions: [], assessmentId: ''); + AssessmentAnswerModel? get assessmentAnswerModel => _assessmentAnswerModel; + + ApiStatus _submitAssessmentStatus = ApiStatus.initial; + ApiStatus get submitAssessmentStatus => _submitAssessmentStatus; + + AssessmentResultModel? _assessmentResultModel; + AssessmentResultModel? get assessmentResultModel => _assessmentResultModel; + + + set assessmentAnswers(AssessmentQuestionAnswerModel answers) { + final index = _assessmentAnswerModel.questions.indexWhere((element) => element.questionId == answers.questionId); + if(index != -1) { + _assessmentAnswerModel.questions[index] = answers; + } else { + _assessmentAnswerModel.questions.add(answers); } + notifyListeners(); + } + + String get selectedAssessmentId => _selectedAssesssmentId; + set selectedAssessmentId(String value) { + _selectedAssesssmentId = value; + _assessmentAnswerModel = _assessmentAnswerModel.copyWith(assessmentId: value, questions: []); + notifyListeners(); } - void selectAnswer(int questionIndex, String answer) { - if (_assessment != null && - questionIndex >= 0 && - questionIndex < _assessment!['questions'].length) { - _selectedAnswers[questionIndex] = answer; - notifyListeners(); + + void fetchAllAssessments() async { + final result = await _repository.fetchAllAssessments(); + if (result is ActionResultSuccess) { + _allAssessments = result.data; } + notifyListeners(); } //implement the submitAssessment method to submit the assessment when the submitted_assessment table is created - Future submitAssessment() async {} - - //setAssessmentId method can be used to set the assessment id - void setAssessmentId(String id) { - _assessmentId = id; + Future submitAssessment() async { + _submitAssessmentStatus = ApiStatus.initial; + notifyListeners(); + final result = await _repository.submitAssessment(_assessmentAnswerModel.toEntity()); + if (result is ActionResultSuccess) { + _submitAssessmentStatus = ApiStatus.success; + _assessmentResultModel = result.data; + } else { + _submitAssessmentStatus = ApiStatus.failure; + } notifyListeners(); } + } diff --git a/patient/lib/provider/auth_provider.dart b/patient/lib/provider/auth_provider.dart index 9f1ed6e..6a843c7 100644 --- a/patient/lib/provider/auth_provider.dart +++ b/patient/lib/provider/auth_provider.dart @@ -1,76 +1,139 @@ -import 'package:flutter/material.dart'; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'dart:io' show Platform; - -class AuthProvider extends ChangeNotifier { - final supabase = Supabase.instance.client; - bool _isAuthenticated = false; - - bool get isAuthenticated => _isAuthenticated; - - void login() { - _isAuthenticated = true; - notifyListeners(); - } - - Future signInWithGoogle() async { - try { - if (kIsWeb) { - await _handleWebSignIn(); - } else { - await _handleMobileSignIn(); - } - _isAuthenticated = true; - notifyListeners(); - } catch (error) { - throw Exception('Sign in failed: $error'); - } - } - - Future _handleWebSignIn() async { - final supabaseUrl = dotenv.env['SUPABASE_URL'] ?? - (throw Exception("Supabase URL not found in .env")); - - await supabase.auth.signInWithOAuth( - OAuthProvider.google, - redirectTo: "$supabaseUrl/auth/v1/callback", - authScreenLaunchMode: LaunchMode.platformDefault, - ); - } - - Future _handleMobileSignIn() async { - final webClientId = dotenv.env['GOOGLE_WEB_CLIENT_ID'] ?? - (throw Exception("WEB_CLIENT_ID not found in .env")); - final iosClientId = dotenv.env['GOOGLE_IOS_CLIENT_ID']; - - final GoogleSignIn googleSignIn = GoogleSignIn( - clientId: Platform.isIOS ? iosClientId : null, - serverClientId: webClientId, - scopes: ['email', 'profile'], - ); - - final GoogleSignInAccount? googleUser = await googleSignIn.signIn(); - if (googleUser == null) throw 'Sign in cancelled'; - - final GoogleSignInAuthentication googleAuth = - await googleUser.authentication; - - if (googleAuth.idToken == null) throw 'No ID Token found'; - if (googleAuth.accessToken == null) throw 'No Access Token found'; - - await supabase.auth.signInWithIdToken( - provider: OAuthProvider.google, - idToken: googleAuth.idToken!, - accessToken: googleAuth.accessToken, - ); - } - - String? getFullName() { - final session = supabase.auth.currentSession; - if (session == null) return null; - return session.user.userMetadata?['full_name'] ?? 'User'; - } -} +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:patient/core/repository/auth/auth.dart'; +import 'package:patient/core/utils/utils.dart'; +import 'package:patient/model/auth_models/personal_info_model.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +import '../core/result/result.dart'; + + +enum AuthNavigationStatus { + unknown, + home, + personalDetails, + error, +} +extension AuthNavigationStatusX on AuthNavigationStatus { + bool get isUnknown => this == AuthNavigationStatus.unknown; + bool get isHome => this == AuthNavigationStatus.home; + bool get isPersonalDetails => this == AuthNavigationStatus.personalDetails; + bool get isError => this == AuthNavigationStatus.error; +} + +class AuthProvider extends ChangeNotifier { + + AuthProvider({ + required AuthRepository authRepository, + }): _authRepository = authRepository; + + final AuthRepository _authRepository; + + ApiStatus _apiStatus = ApiStatus.initial; + ApiStatus get apiStatus => _apiStatus; + + String _apiErrorMessage = ''; + String get apiErrorMessage => _apiErrorMessage; + + final supabase = Supabase.instance.client; + + AuthNavigationStatus _authNavigationStatus = AuthNavigationStatus.unknown; + AuthNavigationStatus get authNavigationStatus => _authNavigationStatus; + + Future signInWithGoogle() async { + try { + if (kIsWeb) { + await _handleWebSignIn(); + } else { + await _handleMobileSignIn(); + } + } catch (error) { + throw Exception('Sign in failed: $error'); + } + } + + Future _handleWebSignIn() async { + final supabaseUrl = dotenv.env['SUPABASE_URL'] ?? + (throw Exception("Supabase URL not found in .env")); + + await supabase.auth.signInWithOAuth( + OAuthProvider.google, + redirectTo: "$supabaseUrl/auth/v1/callback", + authScreenLaunchMode: LaunchMode.platformDefault, + ); + } + + Future _handleMobileSignIn() async { + final webClientId = dotenv.env['GOOGLE_WEB_CLIENT_ID'] ?? + (throw Exception("WEB_CLIENT_ID not found in .env")); + final iosClientId = dotenv.env['GOOGLE_IOS_CLIENT_ID']; + + final GoogleSignIn googleSignIn = GoogleSignIn( + clientId: Platform.isIOS ? iosClientId : null, + serverClientId: webClientId, + scopes: ['email', 'profile'], + ); + + final GoogleSignInAccount? googleUser = await googleSignIn.signIn(); + if (googleUser == null) throw 'Sign in cancelled'; + + final GoogleSignInAuthentication googleAuth = + await googleUser.authentication; + + if (googleAuth.idToken == null) throw 'No ID Token found'; + if (googleAuth.accessToken == null) throw 'No Access Token found'; + + await supabase.auth.signInWithIdToken( + provider: OAuthProvider.google, + idToken: googleAuth.idToken!, + accessToken: googleAuth.accessToken, + ); + } + + String? getFullName() { + final session = supabase.auth.currentSession; + if (session == null) return null; + return session.user.userMetadata?['full_name'] ?? 'User'; + } + + Future checkIfPatientExists() async { + final ActionResult result = await _authRepository.checkIfPatientExists(); + _authNavigationStatus = AuthNavigationStatus.unknown; + notifyListeners(); + if(result is ActionResultSuccess) { + final bool patientExists = result.data as bool; + if(patientExists) { + _authNavigationStatus = AuthNavigationStatus.home; + } else { + _authNavigationStatus = AuthNavigationStatus.personalDetails; + } + } else { + _authNavigationStatus = AuthNavigationStatus.error; + } + notifyListeners(); + } + + void storePatientPersonalInfo(PersonalInfoModel personalInfoModel) async { + _apiStatus = ApiStatus.initial; + _apiErrorMessage = ''; + notifyListeners(); + final ActionResult result = await _authRepository.storePersonalInfo(personalInfoModel.toEntity()); + if(result is ActionResultSuccess) { + _apiStatus = ApiStatus.success; + } else { + _apiStatus = ApiStatus.failure; + _apiErrorMessage = result.errorMessage ?? 'An error occurred. Please try again.'; + } + notifyListeners(); + } + + void resetApiStatus() { + _apiStatus = ApiStatus.initial; + _apiErrorMessage = ''; + notifyListeners(); + } +} diff --git a/patient/lib/repository/supabase_assessments_repository.dart b/patient/lib/repository/supabase_assessments_repository.dart index b24b5da..2853855 100644 --- a/patient/lib/repository/supabase_assessments_repository.dart +++ b/patient/lib/repository/supabase_assessments_repository.dart @@ -1,9 +1,16 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_answer_entity.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_entity.dart'; +import 'package:patient/core/entities/assessment_entities/assessment_result_entity.dart' show AssessmentResultEntity, AssessmentResultEntityMapper; import 'package:patient/core/repository/assessment_repository.dart'; +import 'package:patient/core/result/result.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class SupabaseAssessmentsRepository implements AssessmentsRepository { final SupabaseClient _supabase = Supabase.instance.client; + @override Future>> fetchAssessmentById(String id) async { final response = await _supabase @@ -17,5 +24,38 @@ class SupabaseAssessmentsRepository implements AssessmentsRepository { } @override - Future submitAssessment(Map assessment) async {} + Future fetchAllAssessments() async { + try { + final response = await _supabase.from('assessments').select('*'); + final data = response.map((e) => AssessmentEntityMapper.fromMap(e)).toList(); + return ActionResultSuccess(data: data.map((e) => e.toModel()).toList(), statusCode: 200); + } catch (e) { + return ActionResultFailure(errorMessage: e.toString(), statusCode: 500); + } + } + + @override + Future submitAssessment(AssessmentAnswerEntity answers) async { + try { + final jwtToken = dotenv.env['SUPABASE_ANON_KEY']!; + final resposne = await _supabase.functions.invoke( + 'evaluate-assessments', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $jwtToken', + }, + body: answers.toMap(), + ); + if (resposne.data != null) { + final data = AssessmentResultEntityMapper.fromMap(resposne.data); + return ActionResultSuccess(data: data.toModel(), statusCode: 200); + } else { + return ActionResultFailure( + errorMessage: 'Some error Occurred', statusCode: 400); + } + } catch (e) { + return ActionResultFailure(errorMessage: e.toString(), statusCode: 500); + } + + } } diff --git a/patient/lib/repository/supabase_auth_repository.dart b/patient/lib/repository/supabase_auth_repository.dart index 84f7ccc..a781a58 100644 --- a/patient/lib/repository/supabase_auth_repository.dart +++ b/patient/lib/repository/supabase_auth_repository.dart @@ -33,5 +33,32 @@ class SupabaseAuthRepository implements AuthRepository { ); } } + + @override + Future checkIfPatientExists() async { + try { + final response = await _supabaseClient.from('patient') + .select('*') + .eq('id', _supabaseClient.auth.currentUser!.id) + .maybeSingle(); + + if(response != null) { + return ActionResultSuccess( + data: true, + statusCode: 200 + ); + } else { + return ActionResultSuccess( + data: false, + statusCode: 400 + ); + } + } catch(e) { + return ActionResultFailure( + errorMessage: e.toString(), + statusCode: 400, + ); + } + } } \ No newline at end of file diff --git a/supabase/schemas/schema.sql b/supabase/schemas/schema.sql index b12e4b2..1962d43 100644 --- a/supabase/schemas/schema.sql +++ b/supabase/schemas/schema.sql @@ -79,6 +79,7 @@ CREATE TABLE assessments ( description TEXT, category TEXT, cutoff_score INT2, + image_url TEXT, questions JSONB NOT NULL ); diff --git a/supabase/scripts/seed_assessments.js b/supabase/scripts/seed_assessments.js index 049066c..3362fab 100644 --- a/supabase/scripts/seed_assessments.js +++ b/supabase/scripts/seed_assessments.js @@ -15,6 +15,7 @@ const assessments = [ description: "A brief screening tool for autism spectrum traits in adults aged 16 and over. It consists of 10 statements to assess behaviors and preferences.", category: "Autism Assessment", cutoff_score: 6, + image_url: "https://gezbvdcskabwweanvfhu.supabase.co/storage/v1/object/public/neurotrack//aq10_icon.png", questions: [ { question_id: generateRandomUUID(), @@ -123,6 +124,7 @@ const assessments = [ description: "A 25-item self-report measure designed to assess camouflaging strategies in individuals aged 16 years and older.", category: "Autism Assessment", cutoff_score: 100, + image_url: "https://gezbvdcskabwweanvfhu.supabase.co/storage/v1/object/public/neurotrack//autism_icon.png", questions: [ { question_id: generateRandomUUID(),