From c35d106aef1313a41f4208103c8be86cfd673224 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 18:50:03 +0100 Subject: [PATCH 1/6] chore(deps): update ht-data-inmemory to latest version - Update resolved-ref from abef81e to 7945773 in pubspec.lock --- pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.lock b/pubspec.lock index a0790ec..0975732 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -416,7 +416,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: abef81e5294d70ace82d3e87f1efc94fca6a8445 + resolved-ref: "7945773edb4251d294071820c4ce1b6332f032ec" url: "https://github.com/headlines-toolkit/ht-data-inmemory.git" source: git version: "0.0.0" From 3dc4112cfeeb053a6602d878b2c3ec985c035ed0 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 18:59:24 +0100 Subject: [PATCH 2/6] feat(headlines-search): add TopicItemWidget for search results - Create TopicItemWidget to display Topic search results - Replace temporary ListTile with TopicItemWidget in search results - Add navigation to Topic details page on item tap --- .../view/headlines_search_page.dart | 4 +-- .../widgets/topic_item_widget.dart | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 lib/headlines-search/widgets/topic_item_widget.dart diff --git a/lib/headlines-search/view/headlines_search_page.dart b/lib/headlines-search/view/headlines_search_page.dart index 6c7f221..1e3cc12 100644 --- a/lib/headlines-search/view/headlines_search_page.dart +++ b/lib/headlines-search/view/headlines_search_page.dart @@ -9,6 +9,7 @@ import 'package:ht_main/app/bloc/app_bloc.dart'; import 'package:ht_main/headlines-search/bloc/headlines_search_bloc.dart'; // import 'package:ht_main/headlines-search/widgets/country_item_widget.dart'; import 'package:ht_main/headlines-search/widgets/source_item_widget.dart'; +import 'package:ht_main/headlines-search/widgets/topic_item_widget.dart'; import 'package:ht_main/l10n/l10n.dart'; import 'package:ht_main/router/routes.dart'; import 'package:ht_main/shared/extensions/content_type_extensions.dart'; @@ -332,8 +333,7 @@ class _HeadlinesSearchViewState extends State<_HeadlinesSearchView> { } return tile; } else if (feedItem is Topic) { - // TODO(user): Create a TopicItemWidget similar to CategoryItemWidget - return ListTile(title: Text(feedItem.name)); + return TopicItemWidget(topic: feedItem); } else if (feedItem is Source) { return SourceItemWidget(source: feedItem); } else if (feedItem is Ad) { diff --git a/lib/headlines-search/widgets/topic_item_widget.dart b/lib/headlines-search/widgets/topic_item_widget.dart new file mode 100644 index 0000000..4376985 --- /dev/null +++ b/lib/headlines-search/widgets/topic_item_widget.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ht_main/entity_details/view/entity_details_page.dart'; +import 'package:ht_main/router/routes.dart'; +import 'package:ht_shared/ht_shared.dart'; + +/// A simple widget to display a Topic search result. +class TopicItemWidget extends StatelessWidget { + const TopicItemWidget({required this.topic, super.key}); + + final Topic topic; + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(topic.name), + subtitle: topic.description.isNotEmpty + ? Text( + topic.description, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ) + : null, + onTap: () { + context.push( + Routes.topicDetails, + extra: EntityDetailsPageArguments(entity: topic), + ); + }, + ); + } +} From f78bf9fb0bac9f5d7f5d6a6ca7a882b93dd42420 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 19:06:20 +0100 Subject: [PATCH 3/6] feat(ht_main): add timeago localization and import updates - Remove unused import of kIsWeb - Add imports for ht_ui_kit and timeago packages - Implement timeago localization for English and Arabic --- lib/bootstrap.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/bootstrap.dart b/lib/bootstrap.dart index c44323d..6592a2a 100644 --- a/lib/bootstrap.dart +++ b/lib/bootstrap.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ht_auth_api/ht_auth_api.dart'; @@ -16,7 +15,9 @@ import 'package:ht_main/app/config/config.dart' as app_config; import 'package:ht_main/app/services/demo_data_migration_service.dart'; import 'package:ht_main/bloc_observer.dart'; import 'package:ht_shared/ht_shared.dart'; +import 'package:ht_ui_kit/ht_ui_kit.dart'; import 'package:logging/logging.dart'; +import 'package:timeago/timeago.dart' as timeago; Future bootstrap( app_config.AppConfig appConfig, @@ -25,6 +26,9 @@ Future bootstrap( WidgetsFlutterBinding.ensureInitialized(); Bloc.observer = const AppBlocObserver(); + timeago.setLocaleMessages('en', EnTimeagoMessages()); + timeago.setLocaleMessages('ar', ArTimeagoMessages()); + final logger = Logger('bootstrap'); final kvStorage = await HtKvStorageSharedPreferences.getInstance(); From f438cca91f7d57b8eea2a521376dbf8ead984516 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 19:06:43 +0100 Subject: [PATCH 4/6] feat(shared): implement timeago package for relative timestamps - Add timeago package to dependencies - Replace custom date formatting with timeago.format() function --- lib/shared/widgets/headline_tile_text_only.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/shared/widgets/headline_tile_text_only.dart b/lib/shared/widgets/headline_tile_text_only.dart index 3bc4c0e..a895095 100644 --- a/lib/shared/widgets/headline_tile_text_only.dart +++ b/lib/shared/widgets/headline_tile_text_only.dart @@ -4,6 +4,7 @@ import 'package:ht_main/entity_details/view/entity_details_page.dart'; import 'package:ht_main/router/routes.dart'; import 'package:ht_shared/ht_shared.dart'; import 'package:ht_ui_kit/ht_ui_kit.dart'; +import 'package:timeago/timeago.dart' as timeago; /// {@template headline_tile_text_only} /// A widget to display a headline item with text only. @@ -108,8 +109,7 @@ class _HeadlineMetadataRow extends StatelessWidget { @override Widget build(BuildContext context) { - // TODO(anyone): Use a proper timeago library. - final formattedDate = headline.createdAt.toString(); + final formattedDate = timeago.format(headline.createdAt); // Use bodySmall for a reasonable base size, with muted accent color final metadataTextStyle = textTheme.bodySmall?.copyWith( From 92024bdfada50343b5ffba037bbf345f4d97d733 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 19:07:26 +0100 Subject: [PATCH 5/6] fix(ui_kit): use timeago package for relative timestamps - Replace custom timestamp formatting with timeago package - Add import for timeago package - Update build method to use timeago.format() for createdAt date --- lib/shared/widgets/headline_tile_image_start.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/shared/widgets/headline_tile_image_start.dart b/lib/shared/widgets/headline_tile_image_start.dart index 45a0853..6b9de30 100644 --- a/lib/shared/widgets/headline_tile_image_start.dart +++ b/lib/shared/widgets/headline_tile_image_start.dart @@ -4,6 +4,7 @@ import 'package:ht_main/entity_details/view/entity_details_page.dart'; import 'package:ht_main/router/routes.dart'; import 'package:ht_shared/ht_shared.dart'; import 'package:ht_ui_kit/ht_ui_kit.dart'; +import 'package:timeago/timeago.dart' as timeago; /// {@template headline_tile_image_start} /// A shared widget to display a headline item with a small image at the start. @@ -136,8 +137,7 @@ class _HeadlineMetadataRow extends StatelessWidget { @override Widget build(BuildContext context) { - // TODO(anyone): Use a proper timeago library. - final formattedDate = headline.createdAt.toString(); + final formattedDate = timeago.format(headline.createdAt); // Use bodySmall for a reasonable base size, with muted accent color final metadataTextStyle = textTheme.bodySmall?.copyWith( From 8ba9eca15987e2afe25c72ff7c0b015e3f8ec764 Mon Sep 17 00:00:00 2001 From: fulleni Date: Mon, 21 Jul 2025 19:08:56 +0100 Subject: [PATCH 6/6] fix(shared): use timeago package for relative timestamps - Replace placeholder timestamp with relative time using timeago package - Remove TODO comment about using a proper timeago library --- lib/shared/widgets/headline_tile_image_top.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/shared/widgets/headline_tile_image_top.dart b/lib/shared/widgets/headline_tile_image_top.dart index 440de32..6ae541e 100644 --- a/lib/shared/widgets/headline_tile_image_top.dart +++ b/lib/shared/widgets/headline_tile_image_top.dart @@ -4,6 +4,7 @@ import 'package:ht_main/entity_details/view/entity_details_page.dart'; import 'package:ht_main/router/routes.dart'; import 'package:ht_shared/ht_shared.dart'; import 'package:ht_ui_kit/ht_ui_kit.dart'; +import 'package:timeago/timeago.dart' as timeago; /// {@template headline_tile_image_top} /// A shared widget to display a headline item with a large image at the top. @@ -147,8 +148,7 @@ class _HeadlineMetadataRow extends StatelessWidget { @override Widget build(BuildContext context) { - // TODO(anyone): Use a proper timeago library. - final formattedDate = headline.createdAt.toString(); + final formattedDate = timeago.format(headline.createdAt); // Use bodySmall for a reasonable base size, with muted accent color final metadataTextStyle = textTheme.bodySmall?.copyWith(