Compare commits

..

2 Commits

Author SHA1 Message Date
austinried
064440b0ee refresh lists on source change and sync 2025-11-22 17:39:57 +09:00
austinried
798a907cca active source switching and reactivity 2025-11-22 17:00:14 +09:00
6 changed files with 32 additions and 19 deletions

View File

@ -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();
});
}

View File

@ -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<int, Album>(
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,

View File

@ -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 = 30;
@ -20,8 +19,6 @@ class ArtistsList extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final db = ref.watch(databaseProvider);
final sourceId = ref.watch(sourceIdProvider);
final controller = usePagingController<int, _ArtistItem>(
getNextPageKey: (state) =>
state.lastPageIsEmpty ? null : state.nextIntPageKey,
@ -31,10 +28,8 @@ class ArtistsList extends HookConsumerWidget {
),
);
useEffect(() {
controller.refresh();
return;
}, [sourceId]);
useOnSourceChange(ref, (_) => controller.refresh());
useOnSourceSync(ref, controller.refresh);
return PagingListener(
controller: controller,

View File

@ -12,7 +12,7 @@ final databaseInitializer = FutureProvider<SubtracksDatabase>((ref) async {
SourcesCompanion.insert(
id: Value(1),
name: 'test subsonic',
// isActive: Value(true),
isActive: Value(true),
),
);
await db

View File

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:material_symbols_icons/symbols.dart';
import '../app/state/settings.dart';
import '../app/state/source.dart';
class CoverArtImage extends HookConsumerWidget {

View File

@ -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<void> syncArtists() async {