diff --git a/lib/app/view/app.dart b/lib/app/view/app.dart index 33c261a..34fdb65 100644 --- a/lib/app/view/app.dart +++ b/lib/app/view/app.dart @@ -112,9 +112,11 @@ class App extends StatelessWidget { ), BlocProvider( create: (context) => DashboardBloc( - dashboardSummaryRepository: context - .read>(), + dashboardSummaryRepository: + context.read>(), headlinesRepository: context.read>(), + topicsRepository: context.read>(), + sourcesRepository: context.read>(), ), ), ], diff --git a/lib/content_management/view/archived_sources_page.dart b/lib/content_management/view/archived_sources_page.dart index 32f66c1..c8a4f57 100644 --- a/lib/content_management/view/archived_sources_page.dart +++ b/lib/content_management/view/archived_sources_page.dart @@ -45,7 +45,6 @@ class _ArchivedSourcesView extends StatelessWidget { context.read().add( const LoadSourcesRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); } }, child: BlocBuilder( diff --git a/lib/content_management/view/archived_topics_page.dart b/lib/content_management/view/archived_topics_page.dart index a2f9672..315ffe0 100644 --- a/lib/content_management/view/archived_topics_page.dart +++ b/lib/content_management/view/archived_topics_page.dart @@ -45,7 +45,6 @@ class _ArchivedTopicsView extends StatelessWidget { context .read() .add(const LoadTopicsRequested(limit: kDefaultRowsPerPage)); - context.read().add( DashboardSummaryLoaded()); } }, child: BlocBuilder( diff --git a/lib/content_management/view/create_headline_page.dart b/lib/content_management/view/create_headline_page.dart index eab8a59..ecc66f8 100644 --- a/lib/content_management/view/create_headline_page.dart +++ b/lib/content_management/view/create_headline_page.dart @@ -89,7 +89,6 @@ class _CreateHeadlineViewState extends State<_CreateHeadlineView> { // Refresh the list to show the new headline const LoadHeadlinesRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == CreateHeadlineStatus.failure) { diff --git a/lib/content_management/view/create_source_page.dart b/lib/content_management/view/create_source_page.dart index 59c96e4..2f3ef8c 100644 --- a/lib/content_management/view/create_source_page.dart +++ b/lib/content_management/view/create_source_page.dart @@ -89,7 +89,6 @@ class _CreateSourceViewState extends State<_CreateSourceView> { // Refresh the list to show the new source const LoadSourcesRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == CreateSourceStatus.failure) { diff --git a/lib/content_management/view/create_topic_page.dart b/lib/content_management/view/create_topic_page.dart index 80822d2..6fdac2a 100644 --- a/lib/content_management/view/create_topic_page.dart +++ b/lib/content_management/view/create_topic_page.dart @@ -86,7 +86,6 @@ class _CreateTopicViewState extends State<_CreateTopicView> { // Refresh the list to show the new topic const LoadTopicsRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == CreateTopicStatus.failure) { diff --git a/lib/content_management/view/edit_headline_page.dart b/lib/content_management/view/edit_headline_page.dart index eb2ada1..2c7dd21 100644 --- a/lib/content_management/view/edit_headline_page.dart +++ b/lib/content_management/view/edit_headline_page.dart @@ -117,7 +117,6 @@ class _EditHeadlineViewState extends State<_EditHeadlineView> { context.read().add( const LoadHeadlinesRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == EditHeadlineStatus.failure) { diff --git a/lib/content_management/view/edit_source_page.dart b/lib/content_management/view/edit_source_page.dart index 1637aa4..3ef6aba 100644 --- a/lib/content_management/view/edit_source_page.dart +++ b/lib/content_management/view/edit_source_page.dart @@ -114,7 +114,6 @@ class _EditSourceViewState extends State<_EditSourceView> { context.read().add( const LoadSourcesRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == EditSourceStatus.failure) { diff --git a/lib/content_management/view/edit_topic_page.dart b/lib/content_management/view/edit_topic_page.dart index 6cf8948..04c3008 100644 --- a/lib/content_management/view/edit_topic_page.dart +++ b/lib/content_management/view/edit_topic_page.dart @@ -111,7 +111,6 @@ class _EditTopicViewState extends State<_EditTopicView> { context.read().add( const LoadTopicsRequested(limit: kDefaultRowsPerPage), ); - context.read().add(DashboardSummaryLoaded()); context.pop(); } if (state.status == EditTopicStatus.failure) { diff --git a/lib/dashboard/bloc/dashboard_bloc.dart b/lib/dashboard/bloc/dashboard_bloc.dart index 6047199..cd5a442 100644 --- a/lib/dashboard/bloc/dashboard_bloc.dart +++ b/lib/dashboard/bloc/dashboard_bloc.dart @@ -1,7 +1,10 @@ +import 'dart:async'; + import 'package:bloc/bloc.dart'; import 'package:core/core.dart'; import 'package:data_repository/data_repository.dart'; import 'package:equatable/equatable.dart'; +import 'package:stream_transform/stream_transform.dart'; part 'dashboard_event.dart'; part 'dashboard_state.dart'; @@ -12,17 +15,39 @@ class DashboardBloc extends Bloc { DashboardBloc({ required DataRepository dashboardSummaryRepository, required DataRepository headlinesRepository, + required DataRepository topicsRepository, + required DataRepository sourcesRepository, }) : _dashboardSummaryRepository = dashboardSummaryRepository, _headlinesRepository = headlinesRepository, super(const DashboardState()) { - on(_onDashboardSummaryLoaded); + on(_onDashboardSummaryRequested); + on<_DashboardEntityUpdated>(_onDashboardEntityUpdated); + + _entityUpdatedSubscription = headlinesRepository.entityUpdated + .merge(topicsRepository.entityUpdated) + .merge(sourcesRepository.entityUpdated) + .listen((_) => add(const _DashboardEntityUpdated())); } final DataRepository _dashboardSummaryRepository; final DataRepository _headlinesRepository; + late final StreamSubscription _entityUpdatedSubscription; + + @override + Future close() { + _entityUpdatedSubscription.cancel(); + return super.close(); + } + + void _onDashboardEntityUpdated( + _DashboardEntityUpdated event, + Emitter emit, + ) { + add(DashboardSummaryRequested()); + } - Future _onDashboardSummaryLoaded( - DashboardSummaryLoaded event, + Future _onDashboardSummaryRequested( + DashboardSummaryRequested event, Emitter emit, ) async { emit(state.copyWith(status: DashboardStatus.loading)); diff --git a/lib/dashboard/bloc/dashboard_event.dart b/lib/dashboard/bloc/dashboard_event.dart index 9b3d391..e840095 100644 --- a/lib/dashboard/bloc/dashboard_event.dart +++ b/lib/dashboard/bloc/dashboard_event.dart @@ -9,4 +9,9 @@ sealed class DashboardEvent extends Equatable { } /// Event to load the dashboard summary data. -final class DashboardSummaryLoaded extends DashboardEvent {} +final class DashboardSummaryRequested extends DashboardEvent {} + +/// Internal event triggered when a listened-to entity is updated. +final class _DashboardEntityUpdated extends DashboardEvent { + const _DashboardEntityUpdated(); +} diff --git a/lib/dashboard/view/dashboard_page.dart b/lib/dashboard/view/dashboard_page.dart index 0be4698..f63f908 100644 --- a/lib/dashboard/view/dashboard_page.dart +++ b/lib/dashboard/view/dashboard_page.dart @@ -23,7 +23,7 @@ class _DashboardPageState extends State { void initState() { super.initState(); // Dispatch the event to load dashboard data when the page is initialized. - context.read().add(DashboardSummaryLoaded()); + context.read().add(DashboardSummaryRequested()); } @override @@ -44,7 +44,7 @@ class _DashboardPageState extends State { return FailureStateWidget( exception: state.exception!, onRetry: () { - context.read().add(DashboardSummaryLoaded()); + context.read().add(DashboardSummaryRequested()); }, ); } diff --git a/pubspec.lock b/pubspec.lock index f661456..835d245 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -134,7 +134,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "5a7bd9f597e98209bc7f5ac897cf64552306c02f" + resolved-ref: d9fbbf33d8bb53724e2dd29d488a0c8eb9cbf6e8 url: "https://github.com/flutter-news-app-full-source-code/data-repository.git" source: git version: "0.0.0"