import 'dart:io'; import 'package:refilc/models/settings.dart'; import 'package:refilc_mobile_ui/common/dialog_button.dart'; import 'package:flutter/material.dart'; import 'package:refilc/models/news.dart'; import 'package:refilc/utils/format.dart'; import 'package:flutter_custom_tabs/flutter_custom_tabs.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:provider/provider.dart'; import 'package:refilc_mobile_ui/screens/settings/settings_screen.i18n.dart'; class NewsView extends StatelessWidget { const NewsView(this.news, {super.key}); final News news; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 100.0, horizontal: 32.0), child: Material( borderRadius: BorderRadius.circular(12.0), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0), child: Column( children: [ // Content Expanded( child: ListView( physics: const BouncingScrollPhysics(), children: [ Padding( padding: const EdgeInsets.only( left: 8.0, right: 6.0, top: 14.0, bottom: 8.0), child: Text( news.title, maxLines: 3, style: const TextStyle( fontWeight: FontWeight.w600, fontSize: 18.0), ), ), SelectableLinkify( text: news.content.escapeHtml(), options: const LinkifyOptions(looseUrl: true, removeWww: true), onOpen: (link) { launchUrl( Uri.parse(link.url), customTabsOptions: CustomTabsOptions( showTitle: true, colorSchemes: CustomTabsColorSchemes( defaultPrams: CustomTabsColorSchemeParams( toolbarColor: Theme.of(context) .scaffoldBackgroundColor), ), ), ); }, style: const TextStyle( fontWeight: FontWeight.w500, fontSize: 14.0), ), ], ), ), // Actions Row( mainAxisAlignment: MainAxisAlignment.end, children: [ if (news.link != "") DialogButton( label: news.openLabel != "" ? news.openLabel : "open".i18n.toUpperCase(), onTap: () => launchUrl( Uri.parse(news.link), customTabsOptions: CustomTabsOptions( showTitle: true, colorSchemes: CustomTabsColorSchemes( defaultPrams: CustomTabsColorSchemeParams( toolbarColor: Theme.of(context).scaffoldBackgroundColor), ), ), ), ), DialogButton( label: "done".i18n, onTap: () => Navigator.of(context).maybePop(), ), ], ), ], ), ), ), ); } static Future show(News news, {required BuildContext context, bool force = false}) { if (news.title == "") return Future.value(null); bool popup = news.platform == 'all' || force; if (Provider.of(context, listen: false).newsEnabled || news.emergency || force) { switch (news.platform.trim().toLowerCase()) { case "android": if (Platform.isAndroid) popup = true; break; case "ios": if (Platform.isIOS) popup = true; break; case "linux": if (Platform.isLinux) popup = true; break; case "windows": if (Platform.isWindows) popup = true; break; case "macos": if (Platform.isMacOS) popup = true; break; case "all": popup = true; break; default: popup = true; } } else { popup = false; } if (popup) { return showDialog( context: context, builder: (context) => NewsView(news), barrierDismissible: true); } else { return Future.value(null); } } }