diff --git a/lib/domain/controllers/controllers.dart b/lib/domain/controllers/controllers.dart index 5939fe5..596c7d7 100644 --- a/lib/domain/controllers/controllers.dart +++ b/lib/domain/controllers/controllers.dart @@ -4,6 +4,7 @@ export 'package:infinite_horizons/domain/controllers/notifications_controller.da export 'package:infinite_horizons/domain/controllers/permissions_controller.dart'; export 'package:infinite_horizons/domain/controllers/player_controller.dart'; export 'package:infinite_horizons/domain/controllers/preferences_controller.dart'; +export 'package:infinite_horizons/domain/controllers/url_launcher_controller.dart'; export 'package:infinite_horizons/domain/controllers/vibration_controller.dart'; export 'package:infinite_horizons/domain/controllers/wake_lock_controller.dart'; export 'package:infinite_horizons/domain/controllers/web_browser_controller.dart'; diff --git a/lib/domain/controllers/url_launcher_controller.dart b/lib/domain/controllers/url_launcher_controller.dart new file mode 100644 index 0000000..7b574aa --- /dev/null +++ b/lib/domain/controllers/url_launcher_controller.dart @@ -0,0 +1,12 @@ +import 'package:url_launcher/url_launcher.dart'; + +part 'package:infinite_horizons/infrastructure/url_launcher_repository.dart'; + +abstract class UrlLauncherController { + static UrlLauncherController? _instance; + + static UrlLauncherController get instance => + _instance ??= _UrlLauncherRepository(); + + Future openUrl(String url); +} diff --git a/lib/infrastructure/url_launcher_repository.dart b/lib/infrastructure/url_launcher_repository.dart new file mode 100644 index 0000000..32adf7f --- /dev/null +++ b/lib/infrastructure/url_launcher_repository.dart @@ -0,0 +1,6 @@ +part of 'package:infinite_horizons/domain/controllers/url_launcher_controller.dart'; + +class _UrlLauncherRepository extends UrlLauncherController { + @override + Future openUrl(String url) => launchUrl(Uri.parse(url)); +} diff --git a/lib/presentation/molecules/page_enclosure_molecule.dart b/lib/presentation/molecules/page_enclosure_molecule.dart index afa8b42..e1d319b 100644 --- a/lib/presentation/molecules/page_enclosure_molecule.dart +++ b/lib/presentation/molecules/page_enclosure_molecule.dart @@ -14,6 +14,7 @@ class PageEnclosureMolecule extends StatelessWidget { this.scaffold = true, this.topBarRightOnTap, this.expendChild = true, + this.topBarRightIcon, super.key, }); @@ -27,6 +28,7 @@ class PageEnclosureMolecule extends StatelessWidget { final TopBarType topBarType; final VoidCallback? topBarRightOnTap; final bool expendChild; + final IconData? topBarRightIcon; Widget topBarHelper() { return Column( @@ -37,6 +39,7 @@ class PageEnclosureMolecule extends StatelessWidget { margin: false, translate: topBarTranslate, rightOnTap: topBarRightOnTap, + rightIcon: topBarRightIcon, ), if (subTitle != null) TextAtom( diff --git a/lib/presentation/molecules/top_bar_molecule.dart b/lib/presentation/molecules/top_bar_molecule.dart index 854e42b..b0531d1 100644 --- a/lib/presentation/molecules/top_bar_molecule.dart +++ b/lib/presentation/molecules/top_bar_molecule.dart @@ -9,12 +9,14 @@ class TopBarMolecule extends StatelessWidget { this.rightOnTap, this.translate = true, this.margin = true, + this.rightIcon, }); final TopBarType topBarType; final String? title; final VoidCallback? leftOnTap; final VoidCallback? rightOnTap; + final IconData? rightIcon; final bool translate; final bool margin; @@ -108,7 +110,7 @@ class TopBarMolecule extends StatelessWidget { variant: ButtonVariant.lowEmphasisIcon, onPressed: rightOnTap!, translate: translate, - icon: Icons.more_vert, + icon: rightIcon ?? Icons.more_vert, ) else TextAtom( diff --git a/lib/presentation/pages/tip_resources_page.dart b/lib/presentation/pages/tip_resources_page.dart index fafaa8a..cb54297 100644 --- a/lib/presentation/pages/tip_resources_page.dart +++ b/lib/presentation/pages/tip_resources_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:infinite_horizons/domain/controllers/controllers.dart'; import 'package:infinite_horizons/presentation/molecules/molecules.dart'; import 'package:infinite_horizons/presentation/pages/pages.dart'; @@ -16,7 +17,9 @@ class TipResourcePage extends StatelessWidget { title: "resource", margin: false, topBarType: TopBarType.back, + topBarRightOnTap: () => UrlLauncherController.instance.openUrl(url), expendChild: false, + topBarRightIcon: Icons.open_in_new, child: PdfViewerMolecule( url: url, ), @@ -31,6 +34,8 @@ class TipResourcePage extends StatelessWidget { margin: false, topBarType: TopBarType.back, expendChild: false, + topBarRightIcon: Icons.open_in_new, + topBarRightOnTap: () => UrlLauncherController.instance.openUrl(url), child: WebViewMolecule( url: url, ), diff --git a/lib/presentation/pages/youtube_player_page.dart b/lib/presentation/pages/youtube_player_page.dart index 053eebc..a4e24ee 100644 --- a/lib/presentation/pages/youtube_player_page.dart +++ b/lib/presentation/pages/youtube_player_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:infinite_horizons/domain/controllers/controllers.dart'; import 'package:infinite_horizons/presentation/atoms/atoms.dart'; import 'package:infinite_horizons/presentation/core/global_variables.dart'; import 'package:infinite_horizons/presentation/molecules/molecules.dart'; @@ -30,9 +31,12 @@ class _YoutubePlayerPageState extends State { body: Column( children: [ if (!isFullScreen) - const TopBarMolecule( + TopBarMolecule( topBarType: TopBarType.back, title: 'resource', + rightIcon: Icons.open_in_new, + rightOnTap: () => + UrlLauncherController.instance.openUrl(widget.url), ), const SeparatorAtom(variant: SeparatorVariant.closeWidgets), Expanded(