|
|
@ -2,37 +2,41 @@ part of '../neon_news.dart'; |
|
|
|
|
|
|
|
|
|
|
|
class NewsArticlesView extends StatefulWidget { |
|
|
|
class NewsArticlesView extends StatefulWidget { |
|
|
|
const NewsArticlesView({ |
|
|
|
const NewsArticlesView({ |
|
|
|
required this.bloc, |
|
|
|
this.bloc, |
|
|
|
required this.newsBloc, |
|
|
|
|
|
|
|
super.key, |
|
|
|
super.key, |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
final NewsArticlesBloc bloc; |
|
|
|
final NewsArticlesBloc? bloc; |
|
|
|
final NewsBloc newsBloc; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
@override |
|
|
|
State<NewsArticlesView> createState() => _NewsArticlesViewState(); |
|
|
|
State<NewsArticlesView> createState() => _NewsArticlesViewState(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
|
|
|
|
late NewsBloc newsBloc; |
|
|
|
|
|
|
|
late NewsArticlesBloc bloc; |
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
@override |
|
|
|
void initState() { |
|
|
|
void initState() { |
|
|
|
super.initState(); |
|
|
|
super.initState(); |
|
|
|
|
|
|
|
|
|
|
|
widget.bloc.errors.listen((final error) { |
|
|
|
newsBloc = Provider.of<NewsBloc>(context, listen: false); |
|
|
|
|
|
|
|
bloc = widget.bloc ?? newsBloc.mainArticlesBloc; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bloc.errors.listen((final error) { |
|
|
|
NeonException.showSnackbar(context, error); |
|
|
|
NeonException.showSnackbar(context, error); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
@override |
|
|
|
Widget build(final BuildContext context) => ResultBuilder<List<NextcloudNewsFeed>>( |
|
|
|
Widget build(final BuildContext context) => ResultBuilder<List<NextcloudNewsFeed>>( |
|
|
|
stream: widget.newsBloc.feeds, |
|
|
|
stream: newsBloc.feeds, |
|
|
|
builder: (final context, final feeds) => ResultBuilder<List<NextcloudNewsArticle>>( |
|
|
|
builder: (final context, final feeds) => ResultBuilder<List<NextcloudNewsArticle>>( |
|
|
|
stream: widget.bloc.articles, |
|
|
|
stream: bloc.articles, |
|
|
|
builder: (final context, final articles) => SortBoxBuilder<ArticlesSortProperty, NextcloudNewsArticle>( |
|
|
|
builder: (final context, final articles) => SortBoxBuilder<ArticlesSortProperty, NextcloudNewsArticle>( |
|
|
|
sortBox: articlesSortBox, |
|
|
|
sortBox: articlesSortBox, |
|
|
|
sortPropertyOption: widget.newsBloc.options.articlesSortPropertyOption, |
|
|
|
sortPropertyOption: newsBloc.options.articlesSortPropertyOption, |
|
|
|
sortBoxOrderOption: widget.newsBloc.options.articlesSortBoxOrderOption, |
|
|
|
sortBoxOrderOption: newsBloc.options.articlesSortBoxOrderOption, |
|
|
|
input: articles.data, |
|
|
|
input: articles.data, |
|
|
|
builder: (final context, final sorted) => NeonListView<NextcloudNewsArticle>( |
|
|
|
builder: (final context, final sorted) => NeonListView<NextcloudNewsArticle>( |
|
|
|
scrollKey: 'news-articles', |
|
|
|
scrollKey: 'news-articles', |
|
|
@ -41,8 +45,8 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
error: articles.error ?? feeds.error, |
|
|
|
error: articles.error ?? feeds.error, |
|
|
|
onRefresh: () async { |
|
|
|
onRefresh: () async { |
|
|
|
await Future.wait([ |
|
|
|
await Future.wait([ |
|
|
|
widget.bloc.refresh(), |
|
|
|
bloc.refresh(), |
|
|
|
widget.newsBloc.refresh(), |
|
|
|
newsBloc.refresh(), |
|
|
|
]); |
|
|
|
]); |
|
|
|
}, |
|
|
|
}, |
|
|
|
builder: (final context, final article) => _buildArticle( |
|
|
|
builder: (final context, final article) => _buildArticle( |
|
|
@ -52,7 +56,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
), |
|
|
|
), |
|
|
|
topFixedChildren: [ |
|
|
|
topFixedChildren: [ |
|
|
|
StreamBuilder<FilterType>( |
|
|
|
StreamBuilder<FilterType>( |
|
|
|
stream: widget.bloc.filterType, |
|
|
|
stream: bloc.filterType, |
|
|
|
builder: (final context, final selectedFilterTypeSnapshot) => Container( |
|
|
|
builder: (final context, final selectedFilterTypeSnapshot) => Container( |
|
|
|
margin: const EdgeInsets.symmetric(horizontal: 15), |
|
|
|
margin: const EdgeInsets.symmetric(horizontal: 15), |
|
|
|
child: DropdownButton<FilterType>( |
|
|
|
child: DropdownButton<FilterType>( |
|
|
@ -61,7 +65,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
items: [ |
|
|
|
items: [ |
|
|
|
FilterType.all, |
|
|
|
FilterType.all, |
|
|
|
FilterType.unread, |
|
|
|
FilterType.unread, |
|
|
|
if (widget.bloc.listType == null) ...[ |
|
|
|
if (bloc.listType == null) ...[ |
|
|
|
FilterType.starred, |
|
|
|
FilterType.starred, |
|
|
|
], |
|
|
|
], |
|
|
|
].map<DropdownMenuItem<FilterType>>( |
|
|
|
].map<DropdownMenuItem<FilterType>>( |
|
|
@ -87,7 +91,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
}, |
|
|
|
}, |
|
|
|
).toList(), |
|
|
|
).toList(), |
|
|
|
onChanged: (final value) { |
|
|
|
onChanged: (final value) { |
|
|
|
widget.bloc.setFilterType(value!); |
|
|
|
bloc.setFilterType(value!); |
|
|
|
}, |
|
|
|
}, |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
@ -160,9 +164,9 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
trailing: IconButton( |
|
|
|
trailing: IconButton( |
|
|
|
onPressed: () { |
|
|
|
onPressed: () { |
|
|
|
if (article.starred) { |
|
|
|
if (article.starred) { |
|
|
|
widget.bloc.unstarArticle(article); |
|
|
|
bloc.unstarArticle(article); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
widget.bloc.starArticle(article); |
|
|
|
bloc.starArticle(article); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
tooltip: |
|
|
|
tooltip: |
|
|
@ -174,13 +178,13 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
), |
|
|
|
), |
|
|
|
onLongPress: () { |
|
|
|
onLongPress: () { |
|
|
|
if (article.unread) { |
|
|
|
if (article.unread) { |
|
|
|
widget.bloc.markArticleAsRead(article); |
|
|
|
bloc.markArticleAsRead(article); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
widget.bloc.markArticleAsUnread(article); |
|
|
|
bloc.markArticleAsUnread(article); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
onTap: () async { |
|
|
|
onTap: () async { |
|
|
|
final viewType = widget.newsBloc.options.articleViewTypeOption.value; |
|
|
|
final viewType = newsBloc.options.articleViewTypeOption.value; |
|
|
|
String? bodyData; |
|
|
|
String? bodyData; |
|
|
|
try { |
|
|
|
try { |
|
|
|
bodyData = _fixArticleBody(article.body); |
|
|
|
bodyData = _fixArticleBody(article.body); |
|
|
@ -195,10 +199,9 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
builder: (final context) => NewsArticlePage( |
|
|
|
builder: (final context) => NewsArticlePage( |
|
|
|
bloc: NewsArticleBloc( |
|
|
|
bloc: NewsArticleBloc( |
|
|
|
Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!.client, |
|
|
|
Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!.client, |
|
|
|
widget.bloc, |
|
|
|
bloc, |
|
|
|
article, |
|
|
|
article, |
|
|
|
), |
|
|
|
), |
|
|
|
articlesBloc: widget.bloc, |
|
|
|
|
|
|
|
useWebView: false, |
|
|
|
useWebView: false, |
|
|
|
bodyData: bodyData, |
|
|
|
bodyData: bodyData, |
|
|
|
url: article.url, |
|
|
|
url: article.url, |
|
|
@ -213,10 +216,9 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
builder: (final context) => NewsArticlePage( |
|
|
|
builder: (final context) => NewsArticlePage( |
|
|
|
bloc: NewsArticleBloc( |
|
|
|
bloc: NewsArticleBloc( |
|
|
|
Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!.client, |
|
|
|
Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!.client, |
|
|
|
widget.bloc, |
|
|
|
bloc, |
|
|
|
article, |
|
|
|
article, |
|
|
|
), |
|
|
|
), |
|
|
|
articlesBloc: widget.bloc, |
|
|
|
|
|
|
|
useWebView: true, |
|
|
|
useWebView: true, |
|
|
|
url: article.url, |
|
|
|
url: article.url, |
|
|
|
), |
|
|
|
), |
|
|
@ -224,7 +226,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> { |
|
|
|
); |
|
|
|
); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (article.unread) { |
|
|
|
if (article.unread) { |
|
|
|
widget.bloc.markArticleAsRead(article); |
|
|
|
bloc.markArticleAsRead(article); |
|
|
|
} |
|
|
|
} |
|
|
|
if (article.url != null) { |
|
|
|
if (article.url != null) { |
|
|
|
await launchUrlString( |
|
|
|
await launchUrlString( |
|
|
|