From 497c2e6d2eb789fa5c03b09d7abf34b56908b79b Mon Sep 17 00:00:00 2001 From: daniel-michel <65034538+daniel-michel@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:24:35 +0100 Subject: [PATCH] refactor: use short names for genres --- lib/api/wikidata_movie_api.dart | 23 ++++++++++++++++------- lib/model/delayed_function_caller.dart | 11 ++++++++--- lib/model/live_search.dart | 7 +++++-- lib/view/movie_item.dart | 4 +--- test/view/movie_item_test.dart | 3 --- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lib/api/wikidata_movie_api.dart b/lib/api/wikidata_movie_api.dart index f75d04c..695e7a3 100644 --- a/lib/api/wikidata_movie_api.dart +++ b/lib/api/wikidata_movie_api.dart @@ -25,6 +25,7 @@ class WikidataProperties { static const String reviewScore = "P444"; static const String fskFilmRating = "P1981"; static const String placeOfPublication = "P291"; + static const String shortName = "P1813"; } class WikidataEntities { @@ -236,16 +237,24 @@ Future> _getLabelsForEntities( final start = i * batchSize; final end = min((i + 1) * batchSize, entityIds.length); Response response = await _wikidataApi.get( - "&action=wbgetentities&format=json&props=labels&ids=${entityIds.sublist(start, end).join("|")}"); + "&action=wbgetentities&format=json&props=labels|claims&ids=${entityIds.sublist(start, end).join("|")}"); Map result = jsonDecode(response.body); Map batchEntities = result["entities"]; for (String entityId in batchEntities.keys) { - Map labels = batchEntities[entityId]["labels"]; - String label = labels.containsKey("en") - ? labels["en"]["value"] - : labels[labels.keys.first]["value"]; - labels[entityId] = label; - _labelCache[entityId] = label; + String? shortName = selectInJson(batchEntities[entityId], + "claims.${WikidataProperties.shortName}.*.mainsnak.datavalue.value") + .where((value) => value["language"] == "en") + .map((value) => (value["text"] as String)) + .firstOrNull; + Map responseLabels = batchEntities[entityId]["labels"]; + if (shortName != null) { + _labelCache[entityId] = labels[entityId] = shortName; + continue; + } + String label = responseLabels.containsKey("en") + ? responseLabels["en"]["value"] + : responseLabels[responseLabels.keys.first]["value"]; + _labelCache[entityId] = labels[entityId] = label; } } return labels; diff --git a/lib/model/delayed_function_caller.dart b/lib/model/delayed_function_caller.dart index d478b96..ef447e1 100644 --- a/lib/model/delayed_function_caller.dart +++ b/lib/model/delayed_function_caller.dart @@ -3,16 +3,21 @@ import 'dart:async'; class DelayedFunctionCaller { final void Function() function; final Duration duration; + final bool resetTimerOnCall; Timer? _timer; - DelayedFunctionCaller(this.function, this.duration); + DelayedFunctionCaller(this.function, this.duration, + {this.resetTimerOnCall = false}); get scheduled => _timer != null && _timer!.isActive; void call() { - // If a timer is already active, return. if (_timer != null && _timer!.isActive) { - return; + // If a timer is already active and we don't want to reset it, return. + if (!resetTimerOnCall) { + return; + } + _timer!.cancel(); } // Create a timer that calls the function after the specified duration. diff --git a/lib/model/live_search.dart b/lib/model/live_search.dart index f306524..5fba03a 100644 --- a/lib/model/live_search.dart +++ b/lib/model/live_search.dart @@ -6,13 +6,16 @@ import 'package:release_schedule/model/movie_manager.dart'; class LiveSearch extends ChangeNotifier { String searchTerm = ""; List searchResults = []; - Duration minTimeBetweenRequests = const Duration(milliseconds: 200); late final DelayedFunctionCaller _searchCaller; final MovieManager manager; bool searchingOnline = false; LiveSearch(this.manager) { - _searchCaller = DelayedFunctionCaller(searchOnline, minTimeBetweenRequests); + _searchCaller = DelayedFunctionCaller( + searchOnline, + const Duration(milliseconds: 750), + resetTimerOnCall: true, + ); } get loading => searchingOnline || _searchCaller.scheduled; diff --git a/lib/view/movie_item.dart b/lib/view/movie_item.dart index 421fe93..577d2b5 100644 --- a/lib/view/movie_item.dart +++ b/lib/view/movie_item.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:release_schedule/model/date_format.dart'; import 'package:release_schedule/model/movie.dart'; import 'package:release_schedule/view/movie_page.dart'; @@ -14,8 +13,7 @@ class MovieItem extends StatelessWidget { builder: (context, widget) { return ListTile( title: Text(movie.title), - subtitle: Text( - "${dateRelativeToNow(movie.releaseDate.date)}, ${movie.releaseDate.toString()}, ${movie.genres?.join(", ") ?? ""}"), + subtitle: Text(movie.genres?.join(", ") ?? ""), trailing: IconButton( icon: Icon(movie.bookmarked ? Icons.bookmark_added diff --git a/test/view/movie_item_test.dart b/test/view/movie_item_test.dart index 33ba401..f009683 100644 --- a/test/view/movie_item_test.dart +++ b/test/view/movie_item_test.dart @@ -24,9 +24,6 @@ void main() { expect(find.text('Test Movie'), findsOneWidget); - final formattedDate = movie.releaseDate.toString(); - expect(find.textContaining(formattedDate), findsOneWidget); - expect(find.textContaining('Action, Adventure'), findsOneWidget); });