diff --git a/app/integration_test/drugs_test.dart b/app/integration_test/drugs_test.dart index 982ef2f3..bed501b3 100644 --- a/app/integration_test/drugs_test.dart +++ b/app/integration_test/drugs_test.dart @@ -153,7 +153,7 @@ void main() { findsOneWidget, ); expect( - find.textContaining(context.l10n.drugs_page_no_guidelines_text), + find.textContaining(context.l10n.drugs_page_no_guidelines_recommendation_text), findsOneWidget, ); if (drug.guidelines.isNotEmpty) { diff --git a/app/lib/common/models/drug/drug.dart b/app/lib/common/models/drug/drug.dart index 932a5676..f99d464e 100644 --- a/app/lib/common/models/drug/drug.dart +++ b/app/lib/common/models/drug/drug.dart @@ -2,6 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:hive/hive.dart'; import 'package:trotter/trotter.dart'; +import '../../../app.dart'; import '../../module.dart'; part 'drug.g.dart'; @@ -106,7 +107,7 @@ extension DrugExtension on Drug { ), ); if (partialGuidelines.isEmpty) return null; - final guidelineGenes = guidelines.first.lookupkey.keys.toList(); + final guidelineGenes = guidelines.first.genes; Guideline? partiallyHandledGuideline; var currentMatchingNumber = guidelineGenes.length - 1; while (currentMatchingNumber > 0 && partiallyHandledGuideline == null) { @@ -142,13 +143,40 @@ extension DrugExtension on Drug { if (exactGuideline != null) return exactGuideline; final partiallyHandledGuideline = _getPartiallyHandledGuideline(); if (partiallyHandledGuideline != null) return partiallyHandledGuideline; - return guidelines.firstOrNullWhere( + final completelyUnhandledGuideline = guidelines.firstOrNullWhere( (guideline) => guideline.lookupkey.all( (gene, variants) => variants.any( (variant) => variant == SpecialLookup.anyNotHandled.value ) - ), + ) ); + final context = PharMeApp.navigatorKey.currentContext; + if ( + completelyUnhandledGuideline != null && + completelyUnhandledGuideline.isFdaGuideline && + context != null + ) { + final isCompletelyIndeterminateResult = guidelineGenotypes.map( + (genotypeKey) => UserData.instance.genotypeResults?[genotypeKey] + ).all( + (genotypeResult) => + genotypeResult != null && + genotypeResult.phenotypeDisplayString(context) == indeterminateResult + ); + if (isCompletelyIndeterminateResult) { + final indeterminateFdaFallbackGuideline = Guideline.fromJson( + completelyUnhandledGuideline.toJson(), + ); + indeterminateFdaFallbackGuideline.annotations.implication = + context.l10n.drugs_page_fda_indeterminate_implication_text(name); + indeterminateFdaFallbackGuideline.annotations.recommendation = + context.l10n.drugs_page_no_guidelines_recommendation_text; + indeterminateFdaFallbackGuideline.annotations.warningLevel = + WarningLevel.none; + return indeterminateFdaFallbackGuideline; + } + } + return completelyUnhandledGuideline; } Guideline? get userOrFirstGuideline => userGuideline ?? diff --git a/app/lib/common/models/drug/guideline.dart b/app/lib/common/models/drug/guideline.dart index f8307458..35d4a440 100644 --- a/app/lib/common/models/drug/guideline.dart +++ b/app/lib/common/models/drug/guideline.dart @@ -6,7 +6,7 @@ part 'guideline.g.dart'; @HiveType(typeId: 8) @JsonSerializable() -class Guideline { +class Guideline { Guideline({ required this.id, required this.version, @@ -16,6 +16,12 @@ class Guideline { }); factory Guideline.fromJson(dynamic json) => _$GuidelineFromJson(json); + Map toJson() => _$GuidelineToJson(this); + + bool get isFdaGuideline => externalData.first.source == 'FDA'; + + List get genes => lookupkey.keys.toList(); + @HiveField(0) @JsonKey(name: '_id') String id; diff --git a/app/lib/common/utilities/pdf_utils.dart b/app/lib/common/utilities/pdf_utils.dart index 9f5c5e8c..9637b18d 100644 --- a/app/lib/common/utilities/pdf_utils.dart +++ b/app/lib/common/utilities/pdf_utils.dart @@ -221,7 +221,7 @@ List _buildUserPart( final userGuidelineText = drug.userGuideline != null ? '${drug.userGuideline?.annotations.implication} ' '${drug.userGuideline?.annotations.recommendation}' - : buildContext.l10n.drugs_page_no_guidelines_text; + : buildContext.l10n.drugs_page_no_guidelines_recommendation_text; return [ _buildSubheading(buildContext.l10n.pdf_heading_user_data), _buildTextBlockSpacer(), diff --git a/app/lib/drug/widgets/annotation_cards/guideline.dart b/app/lib/drug/widgets/annotation_cards/guideline.dart index 652827ce..c896fc13 100644 --- a/app/lib/drug/widgets/annotation_cards/guideline.dart +++ b/app/lib/drug/widgets/annotation_cards/guideline.dart @@ -94,7 +94,7 @@ class GuidelineAnnotationCard extends StatelessWidget { WidgetSpan(child: SizedBox(height: PharMeTheme.mediumSpace * 1.3)), TextSpan( text: - implicationText ?? context.l10n.drugs_page_no_guidelines_text, + implicationText ?? context.l10n.drugs_page_no_guidelines_recommendation_text, style: drug.warningLevel != WarningLevel.none ? TextStyle(fontWeight: FontWeight.bold) : TextStyle(fontStyle: FontStyle.italic) diff --git a/app/lib/l10n/app_en.arb b/app/lib/l10n/app_en.arb index b5fb8b38..c770a4cf 100644 --- a/app/lib/l10n/app_en.arb +++ b/app/lib/l10n/app_en.arb @@ -279,8 +279,20 @@ }, "drugs_page_header_guideline": "Gene-based clinical guideline", "@drugs_page_header_guideline": {}, - "drugs_page_no_guidelines_text": "Standard dosing may apply; no recommendation based on your genes can be made at this time. Consult your pharmacist or doctor for more information.", - "@drugs_page_no_guidelines_text": {}, + "drugs_page_no_guidelines_recommendation_text": "Standard dosing may apply; no recommendation based on your genes can be made at this time. Consult your pharmacist or doctor for more information.", + "@drugs_page_no_guidelines_recommendation_text": { + "description": "This should resemble the 'none' recommendation text from Anni" + }, + "drugs_page_fda_indeterminate_implication_text": "More information is needed to comment on your genes' influence on {drugName}. We will keep you informed when the guidelines are updated.", + "@drugs_page_fda_indeterminate_implication_text": { + "description": "This should resemble the 'none' implication text from Anni", + "placeholders": { + "drugName": { + "type": "String", + "example": "ibuprofen" + } + } + }, "drugs_page_sources_description": "Tap here to view the full expert guideline published by {source}", "@drugs_page_sources_description": { "placeholders": {