Skip to content

Commit

Permalink
refactor(app): use Widget for DrugList
Browse files Browse the repository at this point in the history
  • Loading branch information
tamslo committed Sep 7, 2024
1 parent 565fdd4 commit d0e1848
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 89 deletions.
77 changes: 42 additions & 35 deletions app/lib/common/widgets/drug_list/builder.dart
Original file line number Diff line number Diff line change
@@ -1,54 +1,61 @@
import '../../module.dart';

class DrugItemsBuildParams {
DrugItemsBuildParams({required this.isEditable, required this.setActivity});
typedef DrugItemBuilder = List<Widget> Function(
BuildContext context,
List<Drug> drugs,
{ required bool showDrugInteractionIndicator }
);

final bool isEditable;
final SetDrugActivityFunction setActivity;
}
class DrugList extends StatelessWidget {
const DrugList({
super.key,
required this.state,
required this.activeDrugs,
this.noDrugsMessage,
this.buildDrugItems = buildDrugCards,
this.showDrugInteractionIndicator = false,
this.searchForDrugClass = true,
this.buildContainer,
});

List<Widget> buildDrugList(
BuildContext context,
DrugListState state,
ActiveDrugs activeDrugs,
{
String? noDrugsMessage,
List<Widget> Function(
BuildContext context,
List<Drug> drugs,
{
DrugItemsBuildParams? buildParams,
bool showDrugInteractionIndicator,
}
) buildDrugItems = buildDrugCards,
bool showDrugInteractionIndicator = false,
bool useDrugClass = true,
DrugItemsBuildParams? drugItemsBuildParams,
}
) {
List<Widget> buildDrugList(
final DrugListState state;
final ActiveDrugs activeDrugs;
final String? noDrugsMessage;
final DrugItemBuilder buildDrugItems;
final bool showDrugInteractionIndicator;
final bool searchForDrugClass;
final Widget Function(List<Widget> children)? buildContainer;

Widget _buildDrugList(
BuildContext context,
List<Drug> drugs,
FilterState filter,
) {
final filteredDrugs = filter.filter(
drugs,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
);
if (filteredDrugs.isEmpty && noDrugsMessage != null) {
return [errorIndicator(noDrugsMessage)];
return errorIndicator(noDrugsMessage!);
}
return buildDrugItems(
final drugItems = buildDrugItems(
context,
filteredDrugs.sortedBy((drug) => drug.name),
buildParams: drugItemsBuildParams,
showDrugInteractionIndicator: showDrugInteractionIndicator,
);
return (buildContainer != null)
? buildContainer!(drugItems)
: Column(children: drugItems);
}

@override
Widget build(BuildContext context) {
return state.when(
initial: SizedBox.shrink,
error: () => errorIndicator(context.l10n.err_generic),
loaded: (allDrugs, filter) => _buildDrugList(context, allDrugs, filter),
loading: loadingIndicator,
);
}
return state.when(
initial: () => [Container()],
error: () => [errorIndicator(context.l10n.err_generic)],
loaded: buildDrugList,
loading: () => [loadingIndicator()],
);
}
8 changes: 4 additions & 4 deletions app/lib/common/widgets/drug_list/cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -122,24 +122,24 @@ class FilterState {
final String genotypeKey;

bool isAccepted(Drug drug, ActiveDrugs activeDrugs, {
required bool useDrugClass,
required bool searchForDrugClass,
}) {
final warningLevelMatches = showWarningLevel[drug.warningLevel] ?? true;
final isDrugAccepted =
drug.matches(query: query, useClass: useDrugClass) &&
drug.matches(query: query, useClass: searchForDrugClass) &&
(activeDrugs.contains(drug.name) || showInactive) &&
warningLevelMatches &&
(genotypeKey.isBlank || (drug.guidelineGenotypes.contains(genotypeKey)));
return isDrugAccepted;
}

List<Drug> filter(List<Drug> drugs, ActiveDrugs activeDrugs, {
required bool useDrugClass,
required bool searchForDrugClass,
}) =>
drugs.filter((drug) => isAccepted(
drug,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
)
).toList();
}
Expand Down
5 changes: 1 addition & 4 deletions app/lib/common/widgets/drug_list/drug_items/drug_cards.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ import 'utils.dart';
List<Widget> buildDrugCards(
BuildContext context,
List<Drug> drugs,
{
DrugItemsBuildParams? buildParams,
bool showDrugInteractionIndicator = false,
}
{ required bool showDrugInteractionIndicator }
) {
drugs.sort((drugA, drugB) {
final warningLevelComparison = -drugA.warningLevel.severity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import '../../../module.dart';
import 'utils.dart';

class DrugItemsBuildParams {
DrugItemsBuildParams({required this.isEditable, required this.setActivity});

final bool isEditable;
final SetDrugActivityFunction setActivity;
}

List<Widget> buildDrugSelectionList(
BuildContext context,
List<Drug> drugs,
{
DrugItemsBuildParams? buildParams,
bool showDrugInteractionIndicator = false,
required bool showDrugInteractionIndicator,
}
) {
if (buildParams == null) throw Exception();
Expand Down
43 changes: 15 additions & 28 deletions app/lib/common/widgets/drug_search/builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,21 @@ class DrugSearch extends HookWidget {
required this.showFilter,
required this.buildDrugItems,
required this.showDrugInteractionIndicator,
required this.useDrugClass,
required this.searchForDrugClass,
required this.cubit,
required this.state,
required this.activeDrugs,
this.keepPosition = false,
this.drugItemsBuildParams,
});

final bool showFilter;
final bool useDrugClass;
final bool searchForDrugClass;
final bool keepPosition;
final List<Widget> Function(
BuildContext context,
List<Drug> drugs,
{
DrugItemsBuildParams? buildParams,
bool showDrugInteractionIndicator,
}
) buildDrugItems;
final DrugItemBuilder buildDrugItems;
final bool showDrugInteractionIndicator;
final DrugListCubit cubit;
final DrugListState state;
final ActiveDrugs activeDrugs;
final DrugItemsBuildParams? drugItemsBuildParams;

@override
Widget build(BuildContext context) {
Expand All @@ -53,28 +44,24 @@ class DrugSearch extends HookWidget {
if (showFilter) FilterButton(
state,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
),
],
),
),
scrollList(
keepPosition: keepPosition,
buildDrugList(
context,
state,
activeDrugs,
buildDrugItems: buildDrugItems,
noDrugsMessage: context.l10n.search_no_drugs(
DrugList(
state: state,
activeDrugs: activeDrugs,
buildDrugItems: buildDrugItems,
showDrugInteractionIndicator: showDrugInteractionIndicator,
noDrugsMessage: context.l10n.search_no_drugs(
showFilter
? context.l10n.search_no_drugs_with_filter_amendment
: ''
),
drugItemsBuildParams: drugItemsBuildParams,
showDrugInteractionIndicator:
showDrugInteractionIndicator,
useDrugClass: useDrugClass,
)
searchForDrugClass: searchForDrugClass,
buildContainer:
(children) => scrollList(keepPosition: keepPosition, children),
),
_maybeBuildInteractionIndicator(context, state, activeDrugs)
?? SizedBox.shrink(),
Expand All @@ -98,7 +85,7 @@ class DrugSearch extends HookWidget {
),
),
SizedBox(width: PharMeTheme.smallToMediumSpace),
TooltipIcon(useDrugClass
TooltipIcon(searchForDrugClass
? context.l10n.search_page_tooltip_search
: context.l10n.search_page_tooltip_search_no_class
),
Expand All @@ -116,7 +103,7 @@ class DrugSearch extends HookWidget {
final filteredDrugs = filter.filter(
drugs,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
);
if (filteredDrugs.any((drug) => isInhibitor(drug.name))) {
return PageIndicatorExplanation(
Expand Down
6 changes: 3 additions & 3 deletions app/lib/common/widgets/drug_search/filter_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ class FilterButton extends StatelessWidget {
this.state,
this.activeDrugs,
{
required this.useDrugClass,
required this.searchForDrugClass,
}
);

final DrugListState state;
final ActiveDrugs activeDrugs;
final bool useDrugClass;
final bool searchForDrugClass;

@override
Widget build(BuildContext context) {
Expand All @@ -34,7 +34,7 @@ class FilterButton extends StatelessWidget {
final currentNumberOfDrugs = filter.filter(
allDrugs,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
).length;
return totalNumberOfDrugs != currentNumberOfDrugs;
},
Expand Down
6 changes: 3 additions & 3 deletions app/lib/common/widgets/drug_search/filter_menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ class FilterMenuItem {

class FilterMenu extends HookWidget {
const FilterMenu(this.cubit, this.state, this.activeDrugs,
{required this.useDrugClass});
{required this.searchForDrugClass});

final DrugListCubit cubit;
final DrugListState state;
final ActiveDrugs activeDrugs;
final bool useDrugClass;
final bool searchForDrugClass;

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -115,7 +115,7 @@ class FilterMenu extends HookWidget {
required List<Drug> drugs,
}) {
return itemFilter
.filter(drugs, activeDrugs, useDrugClass: useDrugClass)
.filter(drugs, activeDrugs, searchForDrugClass: searchForDrugClass)
.length;
}

Expand Down
20 changes: 14 additions & 6 deletions app/lib/drug_selection/pages/drug_selection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,20 @@ class DrugSelectionPage extends HookWidget {
state: builderState,
activeDrugs: activeDrugs,
keepPosition: true,
useDrugClass: false,
buildDrugItems: buildDrugSelectionList,
drugItemsBuildParams: DrugItemsBuildParams(
isEditable: _isEditable(state),
setActivity: context.read<DrugSelectionCubit>().updateDrugActivity,
),
searchForDrugClass: false,
buildDrugItems: (
context,
drugs,
{ required showDrugInteractionIndicator }
) =>
buildDrugSelectionList(
context,
drugs,
showDrugInteractionIndicator: showDrugInteractionIndicator,
buildParams: DrugItemsBuildParams(
isEditable: _isEditable(state),
setActivity: context.read<DrugSelectionCubit>().updateDrugActivity,
)),
showDrugInteractionIndicator: !concludesOnboarding,
),
);
Expand Down
7 changes: 5 additions & 2 deletions app/lib/report/pages/gene.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,11 @@ class GenePage extends HookWidget {
),
),
SizedBox(height: PharMeTheme.smallSpace),
...buildDrugList(context, state, activeDrugs,
noDrugsMessage: context.l10n.gene_page_no_relevant_drugs)
DrugList(
state: state,
activeDrugs: activeDrugs,
noDrugsMessage: context.l10n.gene_page_no_relevant_drugs,
),
],
),
),
Expand Down
6 changes: 3 additions & 3 deletions app/lib/search/pages/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class SearchPage extends HookWidget {
await cubit.loadDrugs(useCache: false);
}
});
const useDrugClass = true;
const searchForDrugClass = true;
return withFilterData(
cubit: cubit,
builder: (context, cubit, state, activeDrugs) => PopScope(
Expand All @@ -31,14 +31,14 @@ class SearchPage extends HookWidget {
cubit: cubit,
state: state,
activeDrugs: activeDrugs,
searchForDrugClass: searchForDrugClass,
showDrugInteractionIndicator: false,
useDrugClass: useDrugClass,
),
drawer: FilterMenu(
cubit,
state,
activeDrugs,
useDrugClass: useDrugClass,
searchForDrugClass: searchForDrugClass,
),
),
),
Expand Down

0 comments on commit d0e1848

Please sign in to comment.