add TLD validity check
This commit is contained in:
@@ -13,6 +13,7 @@ import 'package:stream_chat_flutter/src/commands_overlay.dart';
|
|||||||
import 'package:stream_chat_flutter/src/emoji/emoji.dart';
|
import 'package:stream_chat_flutter/src/emoji/emoji.dart';
|
||||||
import 'package:stream_chat_flutter/src/emoji_overlay.dart';
|
import 'package:stream_chat_flutter/src/emoji_overlay.dart';
|
||||||
import 'package:stream_chat_flutter/src/extension.dart';
|
import 'package:stream_chat_flutter/src/extension.dart';
|
||||||
|
import 'package:stream_chat_flutter/src/message_input/tld.dart';
|
||||||
import 'package:stream_chat_flutter/src/multi_overlay.dart';
|
import 'package:stream_chat_flutter/src/multi_overlay.dart';
|
||||||
import 'package:stream_chat_flutter/src/quoted_message_widget.dart';
|
import 'package:stream_chat_flutter/src/quoted_message_widget.dart';
|
||||||
import 'package:stream_chat_flutter/src/user_mentions_overlay.dart';
|
import 'package:stream_chat_flutter/src/user_mentions_overlay.dart';
|
||||||
@@ -932,7 +933,8 @@ class MessageInputState extends State<MessageInput>
|
|||||||
if (_lastSearchedContainsUrlText == value) return;
|
if (_lastSearchedContainsUrlText == value) return;
|
||||||
_lastSearchedContainsUrlText = value;
|
_lastSearchedContainsUrlText = value;
|
||||||
|
|
||||||
final matchedUrls = _urlRegex.allMatches(value);
|
final matchedUrls = _urlRegex.allMatches(value).toList()
|
||||||
|
..removeWhere((it) => it.group(0)?.split('.').last.isValidTLD() == false);
|
||||||
|
|
||||||
// Reset the og attachment if the text doesn't contain any url
|
// Reset the og attachment if the text doesn't contain any url
|
||||||
if (matchedUrls.isEmpty) {
|
if (matchedUrls.isEmpty) {
|
||||||
|
|||||||
+15
-5
@@ -1,8 +1,12 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:stream_chat_flutter/src/message_input/tld.dart';
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
/// A function that takes a [BuildContext] and returns a [TextStyle].
|
/// A function that takes a [BuildContext] and returns a [TextStyle].
|
||||||
typedef TextStyleBuilder = TextStyle Function(BuildContext context);
|
typedef TextStyleBuilder = TextStyle? Function(
|
||||||
|
BuildContext context,
|
||||||
|
String text,
|
||||||
|
);
|
||||||
|
|
||||||
/// Controller for the [StreamTextField] widget.
|
/// Controller for the [StreamTextField] widget.
|
||||||
class MessageTextFieldController extends TextEditingController {
|
class MessageTextFieldController extends TextEditingController {
|
||||||
@@ -32,9 +36,12 @@ class MessageTextFieldController extends TextEditingController {
|
|||||||
final pattern = textPatternStyle ??
|
final pattern = textPatternStyle ??
|
||||||
{
|
{
|
||||||
RegExp(r'(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+'):
|
RegExp(r'(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+'):
|
||||||
(context) => TextStyle(
|
(context, text) {
|
||||||
color: MessageInputTheme.of(context).linkHighlightColor,
|
if (!text.split('.').last.isValidTLD()) return null;
|
||||||
),
|
return TextStyle(
|
||||||
|
color: MessageInputTheme.of(context).linkHighlightColor,
|
||||||
|
);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
if (pattern.isEmpty) {
|
if (pattern.isEmpty) {
|
||||||
return super.buildTextSpan(
|
return super.buildTextSpan(
|
||||||
@@ -51,7 +58,10 @@ class MessageTextFieldController extends TextEditingController {
|
|||||||
final key = pattern.keys.firstWhere((it) => it.hasMatch(text));
|
final key = pattern.keys.firstWhere((it) => it.hasMatch(text));
|
||||||
return TextSpan(
|
return TextSpan(
|
||||||
text: text,
|
text: text,
|
||||||
style: pattern[key]?.call(context),
|
style: pattern[key]?.call(
|
||||||
|
context,
|
||||||
|
text,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user