diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index 9f17ab1d7..321f80cf4 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; +import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/dialog/report.dart'; import 'package:PiliPlus/common/widgets/extra_hit_test_widget.dart'; import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text; @@ -38,6 +39,7 @@ import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; +import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/url_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -1162,6 +1164,8 @@ class ReplyItemGrpc extends StatelessWidget { child: SelectableText( message, style: const TextStyle(fontSize: 15, height: 1.7), + contextMenuBuilder: (_, editableTextState) => + _filterMenuBuilder(context, editableTextState), ), ), ), @@ -1201,4 +1205,56 @@ class ReplyItemGrpc extends StatelessWidget { ), ); } + + static Widget _filterMenuBuilder( + BuildContext context, + EditableTextState editableTextState, + ) { + final items = editableTextState.contextMenuButtonItems; + if (!editableTextState.textEditingValue.selection.isCollapsed) { + items.add( + ContextMenuButtonItem( + onPressed: () { + Navigator.of(context).pop(); + final select = editableTextState.textEditingValue; + String text = RegExp.escape( + select.selection.textInside(select.text), + ); + if (ReplyGrpc.enableFilter) text = '|$text'; + + showConfirmDialog( + context: context, + title: const Text('是否确认评论过滤的变更:'), + content: Text.rich( + TextSpan( + text: ReplyGrpc.replyRegExp.pattern, + children: [ + TextSpan( + text: text, + style: const TextStyle( + color: Colors.green, + fontWeight: .bold, + ), + ), + ], + ), + ), + onConfirm: () { + final filter = ReplyGrpc.replyRegExp.pattern + text; + ReplyGrpc.replyRegExp = RegExp(filter, caseSensitive: true); + ReplyGrpc.enableFilter = true; + GStorage.setting.put(SettingBoxKey.banWordForReply, filter); + SmartDialog.showToast('已保存'); + }, + ); + }, + label: '加入过滤', + ), + ); + } + return AdaptiveTextSelectionToolbar.buttonItems( + buttonItems: items, + anchors: editableTextState.contextMenuAnchors, + ); + } }