refactor: change bbcode mention format

Keep origin field into content part for plain mode can display correct
user name
pull/90/head
moonrailgun 2 years ago
parent 5bfa5b91bf
commit f352d68703

@ -36,7 +36,7 @@ regMessageTextDecorators(() => ({
return `[${h}]${plain}[/card]`; return `[${h}]${plain}[/card]`;
}, },
mention: (userId, userName) => `[at=${userId} origin="${userName}"][/at]`, // keep empty content to auto generate with context, useful for friend nickname. NOTE: `origin` is not meaningless just for react-mention to locate text. mention: (userId, userName) => `[at=${userId}]${userName}[/at]`,
emoji: (emojiCode) => `[emoji]${stripColons(emojiCode)}[/emoji]`, emoji: (emojiCode) => `[emoji]${stripColons(emojiCode)}[/emoji]`,
serialize: (plain: string) => (serialize ? serialize(plain) : plain), serialize: (plain: string) => (serialize ? serialize(plain) : plain),
})); }));

@ -4,14 +4,12 @@ import type { TagProps } from '../bbcode/type';
export const MentionTag: React.FC<TagProps> = React.memo((props) => { export const MentionTag: React.FC<TagProps> = React.memo((props) => {
const { node } = props; const { node } = props;
const userName = node.content.join(''); const fallbackName = node.content.join('');
const userId = node.attrs.at; const userId = node.attrs.at;
const hasUserName = userName !== '';
return ( return (
<span className="plugin-bbcode-mention-tag" data-userid={userId}> <span className="plugin-bbcode-mention-tag" data-userid={userId}>
@{hasUserName ? userName : <UserName userId={userId} />} @{<UserName userId={userId} fallbackName={fallbackName} />}
</span> </span>
); );
}); });

@ -1,11 +1,16 @@
import React from 'react'; import React from 'react';
import { useCachedUserInfo, useFriendNickname } from 'tailchat-shared'; import {
isValidStr,
useCachedUserInfo,
useFriendNickname,
} from 'tailchat-shared';
interface UserNameProps { interface UserNameProps {
userId: string; userId: string;
className?: string; className?: string;
style?: React.CSSProperties; style?: React.CSSProperties;
showDiscriminator?: boolean; showDiscriminator?: boolean;
fallbackName?: string;
} }
/** /**
@ -31,7 +36,7 @@ UserNamePure.displayName = 'UserNamePure';
* patch UserName * patch UserName
*/ */
export const UserName: React.FC<UserNameProps> = React.memo((props) => { export const UserName: React.FC<UserNameProps> = React.memo((props) => {
const { userId, showDiscriminator, className, style } = props; const { userId, showDiscriminator, className, style, fallbackName } = props;
const cachedUserInfo = useCachedUserInfo(userId); const cachedUserInfo = useCachedUserInfo(userId);
const friendNickname = useFriendNickname(userId); const friendNickname = useFriendNickname(userId);
@ -43,7 +48,8 @@ export const UserName: React.FC<UserNameProps> = React.memo((props) => {
<span className="opacity-60">({cachedUserInfo.nickname})</span> <span className="opacity-60">({cachedUserInfo.nickname})</span>
</> </>
) : ( ) : (
cachedUserInfo.nickname ?? <span>&nbsp;</span> cachedUserInfo.nickname ??
(isValidStr(fallbackName) ? fallbackName : <span>&nbsp;</span>)
)} )}
{showDiscriminator && ( {showDiscriminator && (

Loading…
Cancel
Save