From e1c34e92a801d03c77e7f52d733e148f153475ba Mon Sep 17 00:00:00 2001 From: Daniel Lucas Silva Date: Tue, 3 Aug 2021 07:43:55 -0300 Subject: [PATCH 1/2] Add gesture recognizer for link attributes --- packages/zefyr/lib/src/widgets/common.dart | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/zefyr/lib/src/widgets/common.dart b/packages/zefyr/lib/src/widgets/common.dart index 2e5cbc4f9..8f5e73344 100644 --- a/packages/zefyr/lib/src/widgets/common.dart +++ b/packages/zefyr/lib/src/widgets/common.dart @@ -5,7 +5,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter/gestures.dart'; import 'package:notus/notus.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'editable_box.dart'; import 'horizontal_rule.dart'; @@ -36,6 +38,13 @@ class ZefyrLine extends StatefulWidget { class _ZefyrLineState extends State { final LayerLink _link = LayerLink(); + TapGestureRecognizer _recognizer; + + @override + void dispose() { + _recognizer?.dispose(); + super.dispose(); + } @override Widget build(BuildContext context) { @@ -131,6 +140,24 @@ class _ZefyrLineState extends State { final TextNode segment = node; final attrs = segment.style; + if (attrs.contains(NotusAttribute.link)) { + _recognizer ??= TapGestureRecognizer(); + + _recognizer.onTap = () async { + final url = attrs.value(NotusAttribute.link); + + await canLaunch(url).then((isOk) { + if (isOk) launch(url); + }); + }; + + return TextSpan( + text: segment.value, + style: _getTextStyle(attrs, theme), + recognizer: _recognizer, + ); + } + return TextSpan( text: segment.value, style: _getTextStyle(attrs, theme), From 53c24589f45016e48c73460a39f267f0b808d036 Mon Sep 17 00:00:00 2001 From: Daniel Lucas Silva Date: Tue, 3 Aug 2021 07:46:57 -0300 Subject: [PATCH 2/2] Adding other schemes for link --- packages/zefyr/lib/src/widgets/buttons.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/zefyr/lib/src/widgets/buttons.dart b/packages/zefyr/lib/src/widgets/buttons.dart index f6378c1e4..408541f9c 100644 --- a/packages/zefyr/lib/src/widgets/buttons.dart +++ b/packages/zefyr/lib/src/widgets/buttons.dart @@ -10,6 +10,8 @@ import 'scope.dart'; import 'theme.dart'; import 'toolbar.dart'; +const List _kSchemes = ['http', 'https', 'tel', 'whatsapp', 'mailto']; + /// A button used in [ZefyrToolbar]. /// /// Create an instance of this widget with [ZefyrButton.icon] or @@ -361,10 +363,10 @@ class _LinkButtonState extends State { if (_inputController.text.isNotEmpty) { try { var uri = Uri.parse(_inputController.text); - if ((uri.isScheme('https') || uri.isScheme('http')) && - uri.host.isNotEmpty) { + if (_kSchemes.contains(uri.scheme) && uri.host.isNotEmpty) { toolbar.editor.formatSelection( - NotusAttribute.link.fromString(_inputController.text)); + NotusAttribute.link.fromString(_inputController.text), + ); } else { error = true; }