Browse Source

neon: Fix articles without URLs

pull/115/head
jld3103 2 years ago
parent
commit
90d4a58d6c
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 2
      packages/neon/lib/src/apps/news/blocs/article.dart
  2. 41
      packages/neon/lib/src/apps/news/pages/article.dart
  3. 19
      packages/neon/lib/src/apps/news/widgets/articles_view.dart

2
packages/neon/lib/src/apps/news/blocs/article.dart

@ -64,7 +64,6 @@ class NewsArticleBloc extends $NewsArticleBloc {
_unreadSubject.add(article.unread); _unreadSubject.add(article.unread);
_starredSubject.add(article.starred); _starredSubject.add(article.starred);
url = article.url;
} }
void _wrapArticleAction(final Future Function() call) { void _wrapArticleAction(final Future Function() call) {
@ -79,7 +78,6 @@ class NewsArticleBloc extends $NewsArticleBloc {
final NextcloudClient _client; final NextcloudClient _client;
final NewsArticlesBloc _newsArticlesBloc; final NewsArticlesBloc _newsArticlesBloc;
late final String url;
final _unreadSubject = BehaviorSubject<bool>(); final _unreadSubject = BehaviorSubject<bool>();
final _starredSubject = BehaviorSubject<bool>(); final _starredSubject = BehaviorSubject<bool>();
final _errorsStreamController = StreamController<Exception>(); final _errorsStreamController = StreamController<Exception>();

41
packages/neon/lib/src/apps/news/pages/article.dart

@ -6,13 +6,16 @@ class NewsArticlePage extends StatefulWidget {
required this.articlesBloc, required this.articlesBloc,
required this.useWebView, required this.useWebView,
this.bodyData, this.bodyData,
this.url,
super.key, super.key,
}) : assert(useWebView || bodyData != null, 'bodyData has to be set when not using a WebView'); }) : assert(useWebView || bodyData != null, 'bodyData has to be set when not using a WebView'),
assert(!useWebView || url != null, 'url has to be set when using a WebView');
final NewsArticleBloc bloc; final NewsArticleBloc bloc;
final NewsArticlesBloc articlesBloc; final NewsArticlesBloc articlesBloc;
final bool useWebView; final bool useWebView;
final String? bodyData; final String? bodyData;
final String? url;
@override @override
State<NewsArticlePage> createState() => _NewsArticlePageState(); State<NewsArticlePage> createState() => _NewsArticlePageState();
@ -75,7 +78,7 @@ class _NewsArticlePageState extends State<NewsArticlePage> {
return (await _webviewController!.currentUrl())!; return (await _webviewController!.currentUrl())!;
} }
return widget.bloc.url; return widget.url!;
} }
@override @override
@ -129,21 +132,23 @@ class _NewsArticlePageState extends State<NewsArticlePage> {
); );
}, },
), ),
IconButton( if (widget.url != null) ...[
onPressed: () async { IconButton(
await launchUrlString( onPressed: () async {
await _getURL(), await launchUrlString(
mode: LaunchMode.externalApplication, await _getURL(),
); mode: LaunchMode.externalApplication,
}, );
icon: const Icon(Icons.open_in_new), },
), icon: const Icon(Icons.open_in_new),
IconButton( ),
onPressed: () async { IconButton(
await Share.share(await _getURL()); onPressed: () async {
}, await Share.share(await _getURL());
icon: const Icon(Icons.share), },
), icon: const Icon(Icons.share),
),
],
], ],
), ),
body: widget.useWebView body: widget.useWebView
@ -155,7 +160,7 @@ class _NewsArticlePageState extends State<NewsArticlePage> {
javascriptMode: JavascriptMode.unrestricted, javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (final controller) async { onWebViewCreated: (final controller) async {
_webviewController = controller; _webviewController = controller;
await controller.loadUrl(widget.bloc.url); await controller.loadUrl(widget.url!);
}, },
onPageStarted: (final _) { onPageStarted: (final _) {
setState(() { setState(() {

19
packages/neon/lib/src/apps/news/widgets/articles_view.dart

@ -218,7 +218,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
debugPrint(s.toString()); debugPrint(s.toString());
} }
if (viewType == ArticleViewType.direct && bodyData != null) { if ((viewType == ArticleViewType.direct || article.url == null) && bodyData != null) {
await Navigator.of(context).push( await Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (final context) => NewsArticlePage( builder: (final context) => NewsArticlePage(
@ -231,11 +231,13 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
articlesBloc: widget.bloc, articlesBloc: widget.bloc,
useWebView: false, useWebView: false,
bodyData: bodyData, bodyData: bodyData,
url: article.url,
), ),
), ),
); );
} else if (Provider.of<NeonPlatform>(context, listen: false).canUseWebView && } else if (viewType == ArticleViewType.internalBrowser &&
viewType == ArticleViewType.internalBrowser) { article.url != null &&
Provider.of<NeonPlatform>(context, listen: false).canUseWebView) {
await Navigator.of(context).push( await Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (final context) => NewsArticlePage( builder: (final context) => NewsArticlePage(
@ -247,6 +249,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
), ),
articlesBloc: widget.bloc, articlesBloc: widget.bloc,
useWebView: true, useWebView: true,
url: article.url,
), ),
), ),
); );
@ -254,10 +257,12 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
if (article.unread) { if (article.unread) {
bloc.markArticleAsRead(article); bloc.markArticleAsRead(article);
} }
await launchUrlString( if (article.url != null) {
article.url, await launchUrlString(
mode: LaunchMode.externalApplication, article.url!,
); mode: LaunchMode.externalApplication,
);
}
} }
}, },
); );

Loading…
Cancel
Save