feat: add HTML providers for Realbooru and Paheal, hidden posts screen, and UI/search enhancements
This commit is contained in:
@@ -4,11 +4,13 @@ import '../../../backend/backend.dart';
|
||||
import '../../../core/utils/result.dart';
|
||||
|
||||
final viewedControllerProvider =
|
||||
AsyncNotifierProvider<ViewedController, List<Post>>(ViewedController.new);
|
||||
AsyncNotifierProvider<ViewedController, List<ViewedTimelineGroup>>(
|
||||
ViewedController.new,
|
||||
);
|
||||
|
||||
class ViewedController extends AsyncNotifier<List<Post>> {
|
||||
class ViewedController extends AsyncNotifier<List<ViewedTimelineGroup>> {
|
||||
@override
|
||||
Future<List<Post>> build() => _load();
|
||||
Future<List<ViewedTimelineGroup>> build() => _load();
|
||||
|
||||
Future<void> refresh() async {
|
||||
state = AsyncData(await _load());
|
||||
@@ -20,9 +22,44 @@ class ViewedController extends AsyncNotifier<List<Post>> {
|
||||
state = const AsyncData([]);
|
||||
}
|
||||
|
||||
Future<List<Post>> _load() async {
|
||||
Future<List<ViewedTimelineGroup>> _load() async {
|
||||
final result =
|
||||
await ref.read(viewedHistoryServiceProvider).getViewedPosts();
|
||||
return result is Success<List<Post>> ? result.data : const [];
|
||||
await ref.read(viewedHistoryServiceProvider).getViewedPostEntries();
|
||||
if (result is! Success<List<ViewedPostEntry>>) return const [];
|
||||
return groupViewedTimeline(result.data);
|
||||
}
|
||||
}
|
||||
|
||||
class ViewedTimelineGroup {
|
||||
const ViewedTimelineGroup({required this.label, required this.items});
|
||||
|
||||
final String label;
|
||||
final List<ViewedPostEntry> items;
|
||||
}
|
||||
|
||||
List<ViewedTimelineGroup> groupViewedTimeline(
|
||||
List<ViewedPostEntry> entries, {
|
||||
DateTime? now,
|
||||
}) {
|
||||
final today = DateTime(now?.year ?? DateTime.now().year,
|
||||
now?.month ?? DateTime.now().month, now?.day ?? DateTime.now().day);
|
||||
final buckets = <String, List<ViewedPostEntry>>{};
|
||||
for (final entry in entries) {
|
||||
final date =
|
||||
DateTime(entry.viewedAt.year, entry.viewedAt.month, entry.viewedAt.day);
|
||||
final days = today.difference(date).inDays;
|
||||
final label = switch (days) {
|
||||
0 => 'Today',
|
||||
1 => 'Yesterday',
|
||||
_ => _dateLabel(date),
|
||||
};
|
||||
buckets.putIfAbsent(label, () => []).add(entry);
|
||||
}
|
||||
return [
|
||||
for (final entry in buckets.entries)
|
||||
ViewedTimelineGroup(label: entry.key, items: entry.value),
|
||||
];
|
||||
}
|
||||
|
||||
String _dateLabel(DateTime date) =>
|
||||
'${date.year.toString().padLeft(4, '0')}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}';
|
||||
|
||||
Reference in New Issue
Block a user