diff --git a/assets/images/svg/colored_dots_icon.svg b/assets/images/svg/colored_dots_icon.svg
new file mode 100644
index 0000000..7f05dc5
--- /dev/null
+++ b/assets/images/svg/colored_dots_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart
index efefee1..7003aa7 100644
--- a/lib/core/api_consts.dart
+++ b/lib/core/api_consts.dart
@@ -841,7 +841,7 @@ class ApiConsts {
static final String getRiskFactors = '$symptomsCheckerApi/GetRiskFactors';
static final String getSuggestions = '$symptomsCheckerApi/GetSuggestion';
static final String diagnosis = '$symptomsCheckerApi/GetDiagnosis';
- static final String explain = '$symptomsCheckerApi/explain';
+ static final String explain = '$symptomsCheckerApi/ExplainDiagnosisResult';
//E-REFERRAL SERVICES
static final getAllRelationshipTypes = "Services/Patients.svc/REST/GetAllRelationshipTypes";
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 26da9fa..4bf2117 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -253,6 +253,7 @@ class AppAssets {
static const String homeBorderedIcon = '$svgBasePath/home_bordered.svg';
static const String symptomCheckerIcon = '$svgBasePath/symptom_checker_icon.svg';
static const String symptomCheckerBottomIcon = '$svgBasePath/symptom_bottom_icon.svg';
+ static const String coloredDotsIcon = '$svgBasePath/colored_dots_icon.svg';
// Water Monitor
static const String waterBottle = '$svgBasePath/water_bottle.svg';
@@ -352,4 +353,3 @@ class AppAnimations {
static const String ambulanceAlert = '$lottieBasePath/ambulance_alert.json';
static const String rrtAmbulance = '$lottieBasePath/rrt_ambulance.json';
}
-
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
index 6dc3bf6..6613702 100644
--- a/lib/core/enums.dart
+++ b/lib/core/enums.dart
@@ -311,3 +311,150 @@ extension ServiceTypeEnumExt on ServiceTypeEnum {
enum PossibleConditionsSeverityEnum { seekMedicalAdvice, monitorOnly, emergency }
enum HealthTrackerTypeEnum { bloodSugar, bloodPressure, weightTracker }
+
+// Severity Enum
+enum SeverityEnum { mild, moderate, severe }
+
+extension SeverityEnumExtension on SeverityEnum {
+ int get toInt {
+ switch (this) {
+ case SeverityEnum.mild:
+ return 0;
+ case SeverityEnum.moderate:
+ return 1;
+ case SeverityEnum.severe:
+ return 2;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case SeverityEnum.mild:
+ return isArabic ? 'خفيف' : 'Mild';
+ case SeverityEnum.moderate:
+ return isArabic ? 'متوسط' : 'Moderate';
+ case SeverityEnum.severe:
+ return isArabic ? 'شديد' : 'Severe';
+ }
+ }
+
+ static SeverityEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return SeverityEnum.mild;
+ case 1:
+ return SeverityEnum.moderate;
+ case 2:
+ return SeverityEnum.severe;
+ default:
+ return null;
+ }
+ }
+}
+
+// Triage Level Enum
+enum TriageLevelEnum { emergencyAmbulance, emergency, consultation24, consultation, selfCare }
+
+extension TriageLevelEnumExtension on TriageLevelEnum {
+ int get toInt {
+ switch (this) {
+ case TriageLevelEnum.emergencyAmbulance:
+ return 0;
+ case TriageLevelEnum.emergency:
+ return 1;
+ case TriageLevelEnum.consultation24:
+ return 2;
+ case TriageLevelEnum.consultation:
+ return 3;
+ case TriageLevelEnum.selfCare:
+ return 4;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case TriageLevelEnum.emergencyAmbulance:
+ return isArabic ? 'طوارئ - إسعاف' : 'Emergency - Ambulance';
+ case TriageLevelEnum.emergency:
+ return isArabic ? 'طوارئ' : 'Emergency';
+ case TriageLevelEnum.consultation24:
+ return isArabic ? 'استشارة خلال 24 ساعة' : 'Consultation within 24 hours';
+ case TriageLevelEnum.consultation:
+ return isArabic ? 'استشارة' : 'Consultation';
+ case TriageLevelEnum.selfCare:
+ return isArabic ? 'رعاية ذاتية' : 'Self Care';
+ }
+ }
+
+ static TriageLevelEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return TriageLevelEnum.emergencyAmbulance;
+ case 1:
+ return TriageLevelEnum.emergency;
+ case 2:
+ return TriageLevelEnum.consultation24;
+ case 3:
+ return TriageLevelEnum.consultation;
+ case 4:
+ return TriageLevelEnum.selfCare;
+ default:
+ return null;
+ }
+ }
+}
+
+// Question Type Enum
+enum QuestionTypeEnum { single, groupSingle, groupMultiple, duration }
+
+extension QuestionTypeEnumExtension on QuestionTypeEnum {
+ int get toInt {
+ switch (this) {
+ case QuestionTypeEnum.single:
+ return 0;
+ case QuestionTypeEnum.groupSingle:
+ return 1;
+ case QuestionTypeEnum.groupMultiple:
+ return 2;
+ case QuestionTypeEnum.duration:
+ return 3;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case QuestionTypeEnum.single:
+ return isArabic ? 'سؤال واحد' : 'Single';
+ case QuestionTypeEnum.groupSingle:
+ return isArabic ? 'مجموعة - اختيار واحد' : 'Group Single';
+ case QuestionTypeEnum.groupMultiple:
+ return isArabic ? 'مجموعة - اختيار متعدد' : 'Group Multiple';
+ case QuestionTypeEnum.duration:
+ return isArabic ? 'المدة' : 'Duration';
+ }
+ }
+
+ static QuestionTypeEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return QuestionTypeEnum.single;
+ case 1:
+ return QuestionTypeEnum.groupSingle;
+ case 2:
+ return QuestionTypeEnum.groupMultiple;
+ case 3:
+ return QuestionTypeEnum.duration;
+ default:
+ return null;
+ }
+ }
+}
+
+
+
diff --git a/lib/features/symptoms_checker/models/conditions_model.dart b/lib/features/symptoms_checker/models/conditions_model.dart
index 774d8c3..af66c21 100644
--- a/lib/features/symptoms_checker/models/conditions_model.dart
+++ b/lib/features/symptoms_checker/models/conditions_model.dart
@@ -1,97 +1,97 @@
-import 'package:flutter/material.dart';
-import 'package:hmg_patient_app_new/core/enums.dart';
-
-class ConditionsModel {
- final IconData icon;
- final String title;
- final int percentage;
- final String tagText;
- final String clinic;
- final List symptoms;
- final String description;
- final String? monitorNote;
- final String? appointmentLabel;
- final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
-
- ConditionsModel({
- required this.icon,
- required this.title,
- required this.percentage,
- required this.tagText,
- required this.clinic,
- required this.symptoms,
- required this.description,
- required this.possibleConditionsSeverityEnum,
- this.monitorNote,
- this.appointmentLabel,
- });
-}
-
-List dummyConditions = [
- ConditionsModel(
- icon: Icons.psychology_alt,
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
- title: "Migraine",
- percentage: 87,
- tagText: "Seek Medical Advice",
- clinic: "Internal Medicine Clinic",
- symptoms: ["Headache", "Nausea", "Sensitivity to light"],
- description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
- appointmentLabel: "Book Appointment",
- ),
- ConditionsModel(
- icon: Icons.deblur,
- title: "Tension Headache",
- percentage: 37,
- tagText: "Monitor",
- monitorNote: "No need to visit doctor",
- clinic: "GP Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
- ),
- ConditionsModel(
- icon: Icons.medication_liquid,
- title: "Meningitis",
- percentage: 28,
- tagText: "Emergency",
- clinic: "Neurology Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
- ),
- ConditionsModel(
- icon: Icons.psychology_alt,
- title: "Migraine",
- percentage: 87,
- tagText: "Seek Medical Advice",
- clinic: "Internal Medicine Clinic",
- symptoms: ["Headache", "Nausea", "Sensitivity to light"],
- description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
- ),
- ConditionsModel(
- icon: Icons.deblur,
- title: "Tension Headache",
- percentage: 37,
- tagText: "Monitor",
- monitorNote: "No need to visit doctor",
- clinic: "GP Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
- ),
- ConditionsModel(
- icon: Icons.medication_liquid,
- title: "Meningitis",
- percentage: 28,
- tagText: "Emergency",
- clinic: "Neurology Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
- ),
-];
+// import 'package:flutter/material.dart';
+// import 'package:hmg_patient_app_new/core/enums.dart';
+//
+// class ConditionsModel {
+// final IconData icon;
+// final String title;
+// final int percentage;
+// final String tagText;
+// final String clinic;
+// final List symptoms;
+// final String description;
+// final String? monitorNote;
+// final String? appointmentLabel;
+// final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
+//
+// ConditionsModel({
+// required this.icon,
+// required this.title,
+// required this.percentage,
+// required this.tagText,
+// required this.clinic,
+// required this.symptoms,
+// required this.description,
+// required this.possibleConditionsSeverityEnum,
+// this.monitorNote,
+// this.appointmentLabel,
+// });
+// }
+//
+// List dummyConditions = [
+// ConditionsModel(
+// icon: Icons.psychology_alt,
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+// title: "Migraine",
+// percentage: 87,
+// tagText: "Seek Medical Advice",
+// clinic: "Internal Medicine Clinic",
+// symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+// description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+// appointmentLabel: "Book Appointment",
+// ),
+// ConditionsModel(
+// icon: Icons.deblur,
+// title: "Tension Headache",
+// percentage: 37,
+// tagText: "Monitor",
+// monitorNote: "No need to visit doctor",
+// clinic: "GP Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+// ),
+// ConditionsModel(
+// icon: Icons.medication_liquid,
+// title: "Meningitis",
+// percentage: 28,
+// tagText: "Emergency",
+// clinic: "Neurology Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+// ),
+// ConditionsModel(
+// icon: Icons.psychology_alt,
+// title: "Migraine",
+// percentage: 87,
+// tagText: "Seek Medical Advice",
+// clinic: "Internal Medicine Clinic",
+// symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+// description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+// ),
+// ConditionsModel(
+// icon: Icons.deblur,
+// title: "Tension Headache",
+// percentage: 37,
+// tagText: "Monitor",
+// monitorNote: "No need to visit doctor",
+// clinic: "GP Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+// ),
+// ConditionsModel(
+// icon: Icons.medication_liquid,
+// title: "Meningitis",
+// percentage: 28,
+// tagText: "Emergency",
+// clinic: "Neurology Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+// ),
+// ];
diff --git a/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart b/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
index f0d7e90..60a3ad3 100644
--- a/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
+++ b/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
@@ -1,3 +1,5 @@
+import 'package:hmg_patient_app_new/core/enums.dart';
+
class TriageDataDetails {
final TriageQuestion? question;
final List? conditions;
@@ -171,7 +173,7 @@ class TriageCondition {
final String? name;
final String? commonName;
final double? probability;
- final dynamic conditionDetails;
+ final ConditionDetails? conditionDetails;
TriageCondition({
this.id,
@@ -187,7 +189,7 @@ class TriageCondition {
name: json['name'],
commonName: json['common_name'],
probability: json['probability']?.toDouble(),
- conditionDetails: json['condition_details'],
+ conditionDetails: json['condition_details'] != null ? ConditionDetails.fromJson(json['condition_details']) : null,
);
}
@@ -197,7 +199,7 @@ class TriageCondition {
'name': name,
'common_name': commonName,
'probability': probability,
- 'condition_details': conditionDetails,
+ 'condition_details': conditionDetails?.toJson(),
};
}
@@ -207,3 +209,75 @@ class TriageCondition {
return '${(probability! * 100).toStringAsFixed(1)}%';
}
}
+
+class ConditionDetails {
+ final String? icd10Code;
+ final ConditionCategory? category;
+ final SeverityEnum? severity;
+ final TriageLevelEnum? triageLevel;
+ final String? hint;
+ final bool? hasPatientEducation;
+ final String? prevalence;
+ final String? acuteness;
+
+ ConditionDetails({
+ this.icd10Code,
+ this.category,
+ this.severity,
+ this.triageLevel,
+ this.hint,
+ this.hasPatientEducation,
+ this.prevalence,
+ this.acuteness,
+ });
+
+ factory ConditionDetails.fromJson(Map json) {
+ return ConditionDetails(
+ icd10Code: json['icd10_code'],
+ category: json['category'] != null ? ConditionCategory.fromJson(json['category']) : null,
+ severity: json['severity'] != null ? SeverityEnumExtension.fromInt(json['severity']) : null,
+ triageLevel: json['triage_level'] != null ? TriageLevelEnumExtension.fromInt(json['triage_level']) : null,
+ hint: json['hint'],
+ hasPatientEducation: json['has_patient_education'],
+ prevalence: json['prevalence'],
+ acuteness: json['acuteness'],
+ );
+ }
+
+ Map toJson() {
+ return {
+ 'icd10_code': icd10Code,
+ 'category': category?.toJson(),
+ 'severity': severity?.toInt,
+ 'triage_level': triageLevel?.toInt,
+ 'hint': hint,
+ 'has_patient_education': hasPatientEducation,
+ 'prevalence': prevalence,
+ 'acuteness': acuteness,
+ };
+ }
+}
+
+class ConditionCategory {
+ final String? id;
+ final String? name;
+
+ ConditionCategory({
+ this.id,
+ this.name,
+ });
+
+ factory ConditionCategory.fromJson(Map json) {
+ return ConditionCategory(
+ id: json['id'],
+ name: json['name'],
+ );
+ }
+
+ Map toJson() {
+ return {
+ 'id': id,
+ 'name': name,
+ };
+ }
+}
diff --git a/lib/features/symptoms_checker/symptoms_checker_repo.dart b/lib/features/symptoms_checker/symptoms_checker_repo.dart
index c55c2f0..154b13a 100644
--- a/lib/features/symptoms_checker/symptoms_checker_repo.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_repo.dart
@@ -12,50 +12,42 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models
import 'package:hmg_patient_app_new/services/logger_service.dart';
abstract class SymptomsCheckerRepo {
- Future>>
- getUserDetails({
+ Future>> getUserDetails({
required String userName,
required String password,
});
- Future>>
- getBodySymptomsByName({
+ Future>> getBodySymptomsByName({
required List organNames,
required String userSessionToken,
required int gender,
});
- Future>>
- getRiskFactors({
+ Future>> getRiskFactors({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
required String language,
required String userSessionToken,
- required int gender,
required String sessionId,
});
- Future>>
- getSuggestions({
+ Future>> getSuggestions({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
required String language,
required String userSessionToken,
required String sessionId,
- required int gender,
});
- Future>>
- getDiagnosisForTriage({
+ Future>> getDiagnosisForTriage({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
List