💄 Fixes and improvements

This commit is contained in:
LittleSheep 2024-08-07 01:47:53 +08:00
parent 7c0c1ec94f
commit eb02a47e9a
5 changed files with 27 additions and 21 deletions

View File

@ -32,7 +32,7 @@ class Sticker {
required this.account, required this.account,
}); });
String get textPlaceholder => '${pack?.prefix}$alias'.camelCase!; String get textPlaceholder => '${pack?.prefix}$alias';
String get textWarpedPlaceholder => ':$textPlaceholder:'; String get textWarpedPlaceholder => ':$textPlaceholder:';
String get imageUrl => ServiceFinder.buildUrl( String get imageUrl => ServiceFinder.buildUrl(

View File

@ -8,6 +8,9 @@ class StickerProvider extends GetxController {
final RxList<Sticker> availableStickers = RxList.empty(growable: true); final RxList<Sticker> availableStickers = RxList.empty(growable: true);
Future<void> refreshAvailableStickers() async { Future<void> refreshAvailableStickers() async {
availableStickers.clear();
aliasImageMapping.clear();
final client = ServiceFinder.configureClient('files'); final client = ServiceFinder.configureClient('files');
final resp = await client.get( final resp = await client.get(
'/stickers/manifest?take=100', '/stickers/manifest?take=100',
@ -20,7 +23,7 @@ class StickerProvider extends GetxController {
for (final pack in out) { for (final pack in out) {
for (final sticker in (pack.stickers ?? List<Sticker>.empty())) { for (final sticker in (pack.stickers ?? List<Sticker>.empty())) {
sticker.pack = pack; sticker.pack = pack;
aliasImageMapping['${pack.prefix}${sticker.alias}'.camelCase!] = aliasImageMapping[sticker.textPlaceholder.toUpperCase()] =
sticker.imageUrl; sticker.imageUrl;
availableStickers.add(sticker); availableStickers.add(sticker);
} }

View File

@ -70,7 +70,7 @@ class _StickerScreenState extends State<StickerScreen> {
); );
return ListTile( return ListTile(
title: Text(item.name), title: Text(item.name),
subtitle: Text(':${'$prefix${item.alias}'.camelCase}:'), subtitle: Text(item.textWarpedPlaceholder),
contentPadding: const EdgeInsets.only(left: 16, right: 14), contentPadding: const EdgeInsets.only(left: 16, right: 14),
trailing: Row( trailing: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -174,9 +174,10 @@ class _StickerScreenState extends State<StickerScreen> {
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
children: item.stickers children: item.stickers?.map((x) {
?.map((x) => _buildEmoteEntry(x, item.prefix)) x.pack = item;
.toList() ?? return _buildEmoteEntry(x, item.prefix);
}).toList() ??
List.empty(), List.empty(),
); );
}, },

View File

@ -239,7 +239,7 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
if (suggestion.type == 'emotes') { if (suggestion.type == 'emotes') {
insertText = suggestion.content; insertText = suggestion.content;
startText = replaceText.replaceFirstMapped( startText = replaceText.replaceFirstMapped(
RegExp(r':(?:([a-z0-9_+-]+)~)?([a-z0-9_+-]+)$'), RegExp(r':(?:([-\w]+)~)?([-\w]+)$'),
(Match m) => insertText, (Match m) => insertText,
); );
} }
@ -247,7 +247,7 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
if (suggestion.type == 'users') { if (suggestion.type == 'users') {
insertText = suggestion.content; insertText = suggestion.content;
startText = replaceText.replaceFirstMapped( startText = replaceText.replaceFirstMapped(
RegExp(r'(?:\s|^)@([a-z0-9_+-]+)$'), RegExp(r'(?:\s|^)@([-\w]+)$'),
(Match m) => insertText, (Match m) => insertText,
); );
} }
@ -349,15 +349,17 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
final searchText = _textController.text final searchText = _textController.text
.substring(0, _textController.selection.baseOffset); .substring(0, _textController.selection.baseOffset);
final emojiMatch = final emojiMatch = RegExp(r':(?:([-\w]+)~)?([-\w]+)$')
RegExp(r':(?:([a-z0-9_+-]+)~)?([a-z0-9_+-]+)$') .firstMatch(searchText);
.firstMatch(searchText);
if (emojiMatch != null) { if (emojiMatch != null) {
final StickerProvider stickers = Get.find(); final StickerProvider stickers = Get.find();
final emoteSearch = emojiMatch[2]!; final emoteSearch = emojiMatch[2]!;
return stickers.availableStickers return stickers.availableStickers
.where((x) => .where(
x.textWarpedPlaceholder.contains(emoteSearch)) (x) => x.textWarpedPlaceholder
.toUpperCase()
.contains(emoteSearch.toUpperCase()),
)
.map( .map(
(x) => ChatMessageSuggestion( (x) => ChatMessageSuggestion(
type: 'emotes', type: 'emotes',
@ -379,8 +381,8 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
.toList(); .toList();
} }
final userMatch = RegExp(r'(?:\s|^)@([a-z0-9_+-]+)$') final userMatch =
.firstMatch(searchText); RegExp(r'(?:\s|^)@([-\w]+)$').firstMatch(searchText);
if (userMatch != null) { if (userMatch != null) {
final userSearch = userMatch[1]!.toLowerCase(); final userSearch = userMatch[1]!.toLowerCase();
final AuthProvider auth = Get.find(); final AuthProvider auth = Get.find();

View File

@ -24,9 +24,9 @@ class MarkdownTextContent extends StatelessWidget {
}); });
Widget _buildContent(BuildContext context) { Widget _buildContent(BuildContext context) {
final emojiMatch = RegExp(r':([a-z0-9_+-]+):').allMatches(content); final emojiRegex = RegExp(r':([-\w]+):');
final isOnlyEmoji = final emojiMatch = emojiRegex.allMatches(content);
content.replaceAll(RegExp(r':([a-z0-9_+-]+):'), '').trim().isEmpty; final isOnlyEmoji = content.replaceAll(emojiRegex, '').trim().isEmpty;
return Markdown( return Markdown(
shrinkWrap: true, shrinkWrap: true,
@ -89,7 +89,7 @@ class MarkdownTextContent extends StatelessWidget {
switch (segments[0]) { switch (segments[0]) {
case 'stickers': case 'stickers':
final StickerProvider sticker = Get.find(); final StickerProvider sticker = Get.find();
url = sticker.aliasImageMapping[segments[1]]!; url = sticker.aliasImageMapping[segments[1].toUpperCase()]!;
if (emojiMatch.length <= 1 && isOnlyEmoji) { if (emojiMatch.length <= 1 && isOnlyEmoji) {
width = 112; width = 112;
height = 112; height = 112;
@ -161,12 +161,12 @@ class _UserNameCardInlineSyntax extends InlineSyntax {
} }
class _CustomEmoteInlineSyntax extends InlineSyntax { class _CustomEmoteInlineSyntax extends InlineSyntax {
_CustomEmoteInlineSyntax() : super(r':([a-z0-9_+-]+):'); _CustomEmoteInlineSyntax() : super(r':([-\w]+):');
@override @override
bool onMatch(markdown.InlineParser parser, Match match) { bool onMatch(markdown.InlineParser parser, Match match) {
final StickerProvider sticker = Get.find(); final StickerProvider sticker = Get.find();
final alias = match[1]!; final alias = match[1]!.toUpperCase();
if (sticker.aliasImageMapping[alias] == null) { if (sticker.aliasImageMapping[alias] == null) {
parser.advanceBy(1); parser.advanceBy(1);
return false; return false;