spotube/lib/provider/history/recent.dart
2024-06-30 18:00:50 +06:00

61 lines
1.7 KiB
Dart

import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/database/database.dart';
class RecentlyPlayedItemNotifier extends AsyncNotifier<List<HistoryTableData>> {
@override
build() async {
final database = ref.watch(databaseProvider);
final uniqueItemIds = await (database.selectOnly(database.historyTable,
distinct: true)
..addColumns([database.historyTable.itemId, database.historyTable.id])
..where(
database.historyTable.type.isIn([
HistoryEntryType.playlist.name,
HistoryEntryType.album.name,
]),
)
..limit(10)
..orderBy([
OrderingTerm(
expression: database.historyTable.createdAt,
mode: OrderingMode.desc,
),
]))
.map(
(row) => row.read(database.historyTable.id),
)
.get()
.then((value) => value.whereNotNull().toList());
final query = database.select(database.historyTable)
..where(
(tbl) => tbl.id.isIn(uniqueItemIds),
)
..orderBy([
(tbl) => OrderingTerm(
expression: tbl.createdAt,
mode: OrderingMode.desc,
),
]);
final subscription = query.watch().listen((event) {
state = AsyncData(event);
});
ref.onDispose(() => subscription.cancel());
final items = await query.get();
return items;
}
}
final recentlyPlayedItems =
AsyncNotifierProvider<RecentlyPlayedItemNotifier, List<HistoryTableData>>(
() => RecentlyPlayedItemNotifier(),
);