A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.9 KiB

part of '../neon_news.dart';
2 years ago
enum FilterType {
all,
unread,
starred,
}
enum ListType {
feed,
folder,
}
abstract class NewsArticlesBlocEvents {
void setFilterType(final FilterType type);
void markArticleAsRead(final NewsArticle article);
2 years ago
void markArticleAsUnread(final NewsArticle article);
2 years ago
void starArticle(final NewsArticle article);
2 years ago
void unstarArticle(final NewsArticle article);
2 years ago
}
abstract class NewsArticlesBlocStates {
BehaviorSubject<Result<List<NewsArticle>>> get articles;
2 years ago
BehaviorSubject<FilterType> get filterType;
}
2 years ago
class NewsMainArticlesBloc extends NewsArticlesBloc {
NewsMainArticlesBloc(
super._newsBloc,
super.options,
super.account,
);
2 years ago
}
class NewsArticlesBloc extends InteractiveBloc implements NewsArticlesBlocEvents, NewsArticlesBlocStates {
2 years ago
NewsArticlesBloc(
this._newsBloc,
this.options,
this.account, {
2 years ago
this.id,
this.listType,
}) {
filterType.add(options.defaultArticlesFilterOption.value);
if (listType != null && filterType.value == FilterType.starred) {
filterType.add(FilterType.all);
2 years ago
}
if (this is! NewsMainArticlesBloc) {
unawaited(refresh());
}
2 years ago
}
final NewsBloc _newsBloc;
final NewsAppSpecificOptions options;
final Account account;
final int? id;
final ListType? listType;
@override
void dispose() {
unawaited(articles.close());
unawaited(filterType.close());
super.dispose();
}
@override
BehaviorSubject<Result<List<NewsArticle>>> articles = BehaviorSubject<Result<List<NewsArticle>>>();
@override
BehaviorSubject<FilterType> filterType = BehaviorSubject<FilterType>();
@override
Future<void> refresh() async {
if (this is! NewsMainArticlesBloc) {
await reload();
}
await _newsBloc.refresh();
2 years ago
}
Future<void> reload() async {
2 years ago
// The API for pagination is pretty useless in this case sadly. So no pagination for us :(
// https://github.com/nextcloud/news/blob/master/docs/api/api-v1-2.md#get-items
// https://github.com/nextcloud/news/blob/48ee5ce4d135da20079961a62ae37958d6a6b628/lib/Db/ListType.php#L21
late final NewsListType type;
2 years ago
bool? getRead;
if (listType != null) {
switch (filterType.value) {
2 years ago
case FilterType.all:
break;
case FilterType.unread:
getRead = false;
default:
throw Exception('FilterType ${filterType.value} not allowed');
2 years ago
}
}
switch (listType) {
case ListType.feed:
type = NewsListType.feed;
2 years ago
case ListType.folder:
type = NewsListType.folder;
2 years ago
case null:
switch (filterType.value) {
2 years ago
case FilterType.starred:
type = NewsListType.starred;
2 years ago
case FilterType.all:
type = NewsListType.allItems;
2 years ago
case FilterType.unread:
type = NewsListType.unread;
2 years ago
}
}
await RequestManager.instance.wrapNextcloud<List<NewsArticle>, NewsListArticles>(
account.id,
'news-articles-${type.index}-$id-$getRead',
articles,
() async => account.client.news.listArticles(
type: type.index,
id: id ?? 0,
getRead: getRead ?? true ? 1 : 0,
),
(final response) => response.items.toList(),
2 years ago
);
}
@override
void markArticleAsRead(final NewsArticle article) {
wrapAction(() async => account.client.news.markArticleAsRead(itemId: article.id));
}
2 years ago
@override
void markArticleAsUnread(final NewsArticle article) {
wrapAction(() async => account.client.news.markArticleAsUnread(itemId: article.id));
2 years ago
}
@override
void setFilterType(final FilterType type) {
wrapAction(() async => filterType.add(type));
}
2 years ago
@override
void starArticle(final NewsArticle article) {
wrapAction(() async => account.client.news.starArticle(itemId: article.id));
}
2 years ago
@override
void unstarArticle(final NewsArticle article) {
wrapAction(() async => account.client.news.unstarArticle(itemId: article.id));
}
2 years ago
}