Add QoL feed, download and quality improvements

This commit is contained in:
2026-05-24 13:02:06 +03:00
parent 7f79addb14
commit ec29ed21d2
25 changed files with 942 additions and 62 deletions
@@ -15,13 +15,14 @@ class FeedController extends AsyncNotifier<FeedState> {
final providerIds = providers.map((provider) => provider.id).toSet();
final initial = FeedState(
providers: providers,
ratingFilter: settings.defaultRatingFilter,
topPeriodFilter: TopPeriodFilter.values.firstWhere(
(value) => value.name == settings.defaultTopPeriodFilter,
(value) => value.name == settings.lastFeedTopPeriod,
orElse: () => TopPeriodFilter.none,
),
selectedTags: settings.lastFeedTags,
selectedProviderIds:
settings.selectedFeedProviderIds.where(providerIds.contains).toList(),
settings.lastFeedProviderIds.where(providerIds.contains).toList(),
ratingFilter: settings.lastFeedRating ?? settings.defaultRatingFilter,
);
state = AsyncData(initial);
await loadInitial();
@@ -66,6 +67,7 @@ class FeedController extends AsyncNotifier<FeedState> {
state = AsyncData(
current.copyWith(selectedTags: tags, posts: [], tagSuggestions: []),
);
await saveSession(scrollOffset: 0);
await ref.read(searchServiceProvider).saveSearch(query, 0);
await refresh();
final count = state.value?.posts.length ?? 0;
@@ -99,7 +101,11 @@ class FeedController extends AsyncNotifier<FeedState> {
current.copyWith(selectedProviderIds: providerIds, posts: []));
final settings = await _settings();
await ref.read(settingsServiceProvider).updateSettings(
settings.copyWith(selectedFeedProviderIds: providerIds));
settings.copyWith(
selectedFeedProviderIds: providerIds,
lastFeedProviderIds: providerIds,
),
);
await refresh();
}
@@ -110,6 +116,7 @@ class FeedController extends AsyncNotifier<FeedState> {
await ref.read(settingsServiceProvider).updateSettings(
settings.copyWith(defaultTopPeriodFilter: period.name),
);
await saveSession(scrollOffset: 0);
await refresh();
}
@@ -120,6 +127,7 @@ class FeedController extends AsyncNotifier<FeedState> {
ratingFilter: rating, clearRating: rating == null, posts: []),
);
await refresh();
await saveSession(scrollOffset: 0);
}
Future<void> clearFilters() async {
@@ -134,12 +142,32 @@ class FeedController extends AsyncNotifier<FeedState> {
),
);
final settings = await _settings();
await ref
.read(settingsServiceProvider)
.updateSettings(settings.copyWith(selectedFeedProviderIds: []));
await ref.read(settingsServiceProvider).updateSettings(settings.copyWith(
selectedFeedProviderIds: [],
lastFeedTags: [],
lastFeedProviderIds: [],
clearLastFeedRating: true,
lastFeedTopPeriod: TopPeriodFilter.none.name,
lastFeedScrollOffset: 0,
));
await refresh();
}
Future<void> saveSession({double? scrollOffset}) async {
final current = state.value;
if (current == null) return;
final settings = await _settings();
await ref.read(settingsServiceProvider).updateSettings(
settings.copyWith(
lastFeedTags: current.selectedTags,
lastFeedProviderIds: current.selectedProviderIds,
lastFeedRating: current.ratingFilter,
lastFeedTopPeriod: current.topPeriodFilter.name,
lastFeedScrollOffset: scrollOffset ?? settings.lastFeedScrollOffset,
),
);
}
Future<List<Post>> _load({
required bool refresh,
required FeedState current,