Add filter to subscription-list

This commit is contained in:
2025-11-09 22:51:37 +01:00
parent febc0a8f43
commit 1aadd9c368
4 changed files with 110 additions and 7 deletions

View File

@@ -117,7 +117,7 @@ class _AccountRootPageState extends State<AccountRootPage> {
_futureSubscriptionCount = ImmediateFuture.ofFuture(() async {
if (!userAcc.isAuth()) throw new Exception('not logged in');
final subs = await APIClient.getSubscriptionList(userAcc);
final subs = await APIClient.getSubscriptionList(userAcc, SubscriptionFilter.ALL);
return subs.length;
}());
@@ -153,7 +153,7 @@ class _AccountRootPageState extends State<AccountRootPage> {
// refresh all data and then replace teh futures used in build()
final channelsAll = await APIClient.getChannelList(userAcc, ChannelSelector.all);
final subs = await APIClient.getSubscriptionList(userAcc);
final subs = await APIClient.getSubscriptionList(userAcc, SubscriptionFilter.ALL);
final clients = await APIClient.getClientList(userAcc);
final keys = await APIClient.getKeyTokenList(userAcc);
final senderNames = await APIClient.getSenderNameList(userAcc);

View File

@@ -3,6 +3,7 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:provider/provider.dart';
import 'package:simplecloudnotifier/api/api_client.dart';
import 'package:simplecloudnotifier/components/badge_display/badge_display.dart';
import 'package:simplecloudnotifier/components/filter_chips/filter_chips.dart';
import 'package:simplecloudnotifier/components/layout/scaffold.dart';
import 'package:simplecloudnotifier/models/channel.dart';
import 'package:simplecloudnotifier/models/subscription.dart';
@@ -13,6 +14,29 @@ import 'package:simplecloudnotifier/state/app_auth.dart';
import 'package:simplecloudnotifier/pages/subscription_list/subscription_list_item.dart';
import 'package:simplecloudnotifier/state/scn_data_cache.dart';
enum SubscriptionListFilter {
ALL,
INACTIVE,
OWN,
EXTERNAL,
INCOMING;
SubscriptionFilter toAPIFilter() {
switch (this) {
case ALL:
return SubscriptionFilter.ALL;
case INACTIVE:
return SubscriptionFilter.OWNED_INACTIVE;
case OWN:
return SubscriptionFilter.OWNED_ACTIVE;
case EXTERNAL:
return SubscriptionFilter.EXTERNAL_ALL;
case INCOMING:
return SubscriptionFilter.INCOMING_ALL;
}
}
}
class SubscriptionListPage extends StatefulWidget {
const SubscriptionListPage({super.key});
@@ -26,6 +50,8 @@ class _SubscriptionListPageState extends State<SubscriptionListPage> {
final userCache = Map<String, UserPreview>();
final channelCache = Map<String, ChannelPreview>();
SubscriptionListFilter filter = SubscriptionListFilter.ALL;
@override
void initState() {
super.initState();
@@ -60,7 +86,7 @@ class _SubscriptionListPageState extends State<SubscriptionListPage> {
}
try {
final items = (await APIClient.getSubscriptionList(acc)).toList();
final items = (await APIClient.getSubscriptionList(acc, filter.toAPIFilter())).toList();
items.sort((a, b) => -1 * a.timestampCreated.compareTo(b.timestampCreated));
@@ -106,6 +132,22 @@ class _SubscriptionListPageState extends State<SubscriptionListPage> {
extraPadding: EdgeInsets.fromLTRB(0, 0, 0, 16),
hidden: !AppSettings().showInfoAlerts,
),
FilterChips<SubscriptionListFilter>(
options: [
(SubscriptionListFilter.ALL, 'All'),
(SubscriptionListFilter.OWN, 'Own'),
(SubscriptionListFilter.EXTERNAL, 'External'),
(SubscriptionListFilter.INCOMING, 'Incoming'),
(SubscriptionListFilter.INACTIVE, 'Inactive'),
],
value: filter,
onChanged: (newFilter) {
setState(() {
filter = newFilter;
_pagingController.refresh();
});
},
),
Expanded(
child: _buildList(context),
)