diff --git a/lib/app/hooks/use_on_source.dart b/lib/app/hooks/use_on_source.dart new file mode 100644 index 0000000..935b9fc --- /dev/null +++ b/lib/app/hooks/use_on_source.dart @@ -0,0 +1,22 @@ +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +import '../state/services.dart'; +import '../state/source.dart'; + +void useOnSourceChange(WidgetRef ref, void Function(int sourceId) callback) { + final sourceId = ref.watch(sourceIdProvider); + + useEffect(() { + callback(sourceId); + return; + }, [sourceId]); +} + +void useOnSourceSync(WidgetRef ref, void Function() callback) { + final syncService = ref.watch(syncServiceProvider); + + useOnListenableChange(syncService, () { + callback(); + }); +} diff --git a/lib/app/lists/albums_grid.dart b/lib/app/lists/albums_grid.dart index d2afc86..b508b5e 100644 --- a/lib/app/lists/albums_grid.dart +++ b/lib/app/lists/albums_grid.dart @@ -1,13 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import '../../sources/models.dart'; +import '../hooks/use_on_source.dart'; import '../hooks/use_paging_controller.dart'; import '../state/database.dart'; -import '../state/source.dart'; import 'list_items.dart'; const kPageSize = 60; @@ -18,8 +17,6 @@ class AlbumsGrid extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final db = ref.watch(databaseProvider); - final sourceId = ref.watch(sourceIdProvider); - final controller = usePagingController( getNextPageKey: (state) => state.lastPageIsEmpty ? null : state.nextIntPageKey, @@ -29,10 +26,8 @@ class AlbumsGrid extends HookConsumerWidget { ), ); - useEffect(() { - controller.refresh(); - return; - }, [sourceId]); + useOnSourceChange(ref, (_) => controller.refresh()); + useOnSourceSync(ref, controller.refresh); return PagingListener( controller: controller, diff --git a/lib/app/lists/artists_list.dart b/lib/app/lists/artists_list.dart index 3ff808a..6e027b8 100644 --- a/lib/app/lists/artists_list.dart +++ b/lib/app/lists/artists_list.dart @@ -1,28 +1,23 @@ import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import '../../sources/models.dart'; +import '../../database/dao/library_dao.dart'; +import '../hooks/use_on_source.dart'; import '../hooks/use_paging_controller.dart'; import '../state/database.dart'; -import '../state/source.dart'; import 'list_items.dart'; const kPageSize = 30; -typedef _ArtistItem = ({Artist artist, int? albumCount}); - class ArtistsList extends HookConsumerWidget { const ArtistsList({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final db = ref.watch(databaseProvider); - final sourceId = ref.watch(sourceIdProvider); - - final controller = usePagingController( + final controller = usePagingController( getNextPageKey: (state) => state.lastPageIsEmpty ? null : state.nextIntPageKey, fetchPage: (pageKey) => db.libraryDao.listArtists( @@ -31,10 +26,8 @@ class ArtistsList extends HookConsumerWidget { ), ); - useEffect(() { - controller.refresh(); - return; - }, [sourceId]); + useOnSourceChange(ref, (_) => controller.refresh()); + useOnSourceSync(ref, controller.refresh); return PagingListener( controller: controller, @@ -42,7 +35,7 @@ class ArtistsList extends HookConsumerWidget { return PagedSliverList( state: state, fetchNextPage: fetchNextPage, - builderDelegate: PagedChildBuilderDelegate<_ArtistItem>( + builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, item, index) { final (:artist, :albumCount) = item; diff --git a/lib/database/dao/library_dao.dart b/lib/database/dao/library_dao.dart index 888187a..e2e8773 100644 --- a/lib/database/dao/library_dao.dart +++ b/lib/database/dao/library_dao.dart @@ -5,6 +5,8 @@ import '../database.dart'; part 'library_dao.g.dart'; +typedef AristListItem = ({models.Artist artist, int? albumCount}); + @DriftAccessor(include: {'../tables.drift'}) class LibraryDao extends DatabaseAccessor with _$LibraryDaoMixin { @@ -25,7 +27,7 @@ class LibraryDao extends DatabaseAccessor return query.get(); } - Future> listArtists({ + Future> listArtists({ required int limit, required int offset, }) async { diff --git a/lib/services/sync_service.dart b/lib/services/sync_service.dart index a0b82f9..7696d23 100644 --- a/lib/services/sync_service.dart +++ b/lib/services/sync_service.dart @@ -1,13 +1,14 @@ import 'package:async/async.dart'; import 'package:collection/collection.dart'; import 'package:drift/drift.dart'; +import 'package:flutter/foundation.dart'; import '../database/database.dart'; import '../sources/music_source.dart'; const kSliceSize = 200; -class SyncService { +class SyncService with ChangeNotifier { SyncService({ required this.source, required this.db, @@ -28,6 +29,7 @@ class SyncService { syncPlaylistSongs(), ]); }); + notifyListeners(); } Future syncArtists() async {