From 3403deb33c449b37c231325bdc718a334acabc54 Mon Sep 17 00:00:00 2001 From: Jesse Cheng Date: Sun, 8 Dec 2024 18:37:16 -0500 Subject: [PATCH] Abstract reusable logic into utility functions with added documentation --- game/lib/challenges/challenges_page.dart | 70 ++++-------------------- game/lib/journeys/journeys_page.dart | 69 ++++------------------- game/lib/utils/utility_functions.dart | 42 ++++++++++++++ 3 files changed, 62 insertions(+), 119 deletions(-) diff --git a/game/lib/challenges/challenges_page.dart b/game/lib/challenges/challenges_page.dart index 589bb22f..998d581c 100644 --- a/game/lib/challenges/challenges_page.dart +++ b/game/lib/challenges/challenges_page.dart @@ -135,70 +135,20 @@ class _ChallengesPageState extends State { final challengeLocation = challenge.location?.name ?? ""; - bool eventMatchesDifficultySelection = true; - bool eventMatchesCategorySelection = true; - bool eventMatchesLocationSelection = true; - bool eventMatchesSearchText = true; - String? searchTerm = widget.mySearchText; + bool eventMatchesFiltersResult = eventMatchesFilters( + event: event, + difficulty: widget.myDifficulty, + locations: widget.myLocations, + categories: widget.myCategories, + searchText: widget.mySearchText, + challengeLocation: challengeLocation, + ); - if (widget.myDifficulty?.length == 0 || - widget.myDifficulty == event.difficulty?.name) - eventMatchesDifficultySelection = true; - else - eventMatchesDifficultySelection = false; - - if (widget.myLocations?.isNotEmpty ?? false) { - if (widget.myLocations?.contains(challengeLocation) ?? - false) - eventMatchesLocationSelection = true; - else - eventMatchesLocationSelection = false; - } else - eventMatchesLocationSelection = true; - - if (widget.myCategories?.isNotEmpty ?? false) { - if (widget.myCategories - ?.contains(event.category?.name) ?? - false) - eventMatchesCategorySelection = true; - else - eventMatchesCategorySelection = false; - } else - eventMatchesCategorySelection = true; - - if (searchTerm?.length == 0) { - eventMatchesSearchText = true; - } else { - // search term length > 0 - if (searchTerm != null && - challengeLocation - .toLowerCase() - .contains(searchTerm.toLowerCase())) { - eventMatchesSearchText = true; - } else { - eventMatchesSearchText = false; - if (searchTerm != null && - (event.name ?? "") - .toLowerCase() - .contains(searchTerm.toLowerCase())) { - eventMatchesSearchText = true; - } else - eventMatchesSearchText = false; - } - } - - var imageUrl = challenge.imageUrl; - if (imageUrl == null || imageUrl.length == 0) { - imageUrl = - "https://upload.wikimedia.org/wikipedia/commons/b/b1/Missing-image-232x150.png"; - } + var imageUrl = getValidImageUrl(challenge.imageUrl); if (!complete && !timeTillExpire.isNegative && - eventMatchesDifficultySelection && - eventMatchesCategorySelection && - eventMatchesLocationSelection && - eventMatchesSearchText) { + eventMatchesFiltersResult) { eventData.add(ChallengeCellDto( location: friendlyLocation[challenge.location] ?? "", diff --git a/game/lib/journeys/journeys_page.dart b/game/lib/journeys/journeys_page.dart index 18a451cc..e53b1076 100644 --- a/game/lib/journeys/journeys_page.dart +++ b/game/lib/journeys/journeys_page.dart @@ -159,70 +159,21 @@ class _JourneysPageState extends State { Duration timeTillExpire = endtime.difference(now); final challengeLocation = challenge.location?.name ?? ""; - final challengeName = challenge.name ?? ""; - bool eventMatchesDifficultySelection = true; - bool eventMatchesCategorySelection = true; - bool eventMatchesLocationSelection = true; - bool eventMatchesSearchText = true; - String? searchTerm = widget.mySearchText; + bool eventMatchesFiltersResult = eventMatchesFilters( + event: event, + difficulty: widget.myDifficulty, + locations: widget.myLocations, + categories: widget.myCategories, + searchText: widget.mySearchText, + challengeLocation: challengeLocation, + ); - if (searchTerm?.length == 0) { - eventMatchesSearchText = true; - if (widget.myDifficulty?.length == 0 || - widget.myDifficulty == event.difficulty?.name) - eventMatchesDifficultySelection = true; - else - eventMatchesDifficultySelection = false; - - if (widget.myLocations?.isNotEmpty ?? false) { - if (widget.myLocations?.contains(challengeLocation) ?? - false) - eventMatchesLocationSelection = true; - else - eventMatchesLocationSelection = false; - } else - eventMatchesLocationSelection = true; - - if (widget.myCategories?.isNotEmpty ?? false) { - if (widget.myCategories - ?.contains(event.category?.name) ?? - false) - eventMatchesCategorySelection = true; - else - eventMatchesCategorySelection = false; - } else - eventMatchesCategorySelection = true; - } else { - if (searchTerm != null && - challengeLocation - .toLowerCase() - .contains(searchTerm.toLowerCase())) { - eventMatchesSearchText = true; - } else { - eventMatchesSearchText = false; - if (searchTerm != null && - challengeName - .toLowerCase() - .contains(searchTerm.toLowerCase())) { - eventMatchesSearchText = true; - } else - eventMatchesSearchText = false; - } - } - - var imageUrl = challenge.imageUrl; - if (imageUrl == null || imageUrl.length == 0) { - imageUrl = - "https://upload.wikimedia.org/wikipedia/commons/b/b1/Missing-image-232x150.png"; - } + var imageUrl = getValidImageUrl(challenge.imageUrl); if (!complete && !timeTillExpire.isNegative && - eventMatchesDifficultySelection && - eventMatchesCategorySelection && - eventMatchesLocationSelection && - eventMatchesSearchText) { + eventMatchesFiltersResult) { eventData.add(JourneyCellDto( location: friendlyLocation[challenge.location] ?? "", name: event.name ?? "", diff --git a/game/lib/utils/utility_functions.dart b/game/lib/utils/utility_functions.dart index 92a3771a..d8bf03f5 100644 --- a/game/lib/utils/utility_functions.dart +++ b/game/lib/utils/utility_functions.dart @@ -206,3 +206,45 @@ final Map friendlyCategory = { EventCategoryDto.HISTORICAL: "Historical", EventCategoryDto.NATURE: "Nature", }; + +/// Matches an event based on difficulty, location, category, and search text +bool eventMatchesFilters({ + required EventDto event, + required String? difficulty, + required List? locations, + required List? categories, + required String? searchText, + required String challengeLocation, +}) { + // Check difficulty + final matchesDifficulty = + (difficulty?.length ?? 0) == 0 || difficulty == event.difficulty?.name; + + // Check locations + final matchesLocation = locations == null || + locations.isEmpty || + locations.contains(challengeLocation); + + // Check categories + final matchesCategory = categories == null || + categories.isEmpty || + categories.contains(event.category?.name); + + // Check search text + final searchTerm = searchText?.toLowerCase() ?? ''; + final matchesSearch = searchTerm.isEmpty || + challengeLocation.toLowerCase().contains(searchTerm) || + (event.name ?? "").toLowerCase().contains(searchTerm); + + return matchesDifficulty && + matchesLocation && + matchesCategory && + matchesSearch; +} + +/// Returns a valid image URL or a default placeholder if the input is null or empty +String getValidImageUrl(String? imageUrl) { + return (imageUrl == null || imageUrl.isEmpty) + ? "https://upload.wikimedia.org/wikipedia/commons/b/b1/Missing-image-232x150.png" + : imageUrl; +}