import { IconBtn } from '@/components/IconBtn'; import { UserName } from '@/components/UserName'; import { fetchImagePrimaryColor } from '@/utils/image-helper'; import { Space, Tag, Tooltip } from 'antd'; import React, { useEffect } from 'react'; import { useNavigate } from 'react-router'; import { getTextColorHex } from 'tailchat-design'; import { createDMConverse, getGroupConfigWithInfo, GroupInfo, t, useAsyncRequest, UserBaseInfo, useUserId, } from 'tailchat-shared'; import { UserProfileContainer } from '../../UserProfileContainer'; import { usePluginUserExtraInfo } from './usePluginUserExtraInfo'; export const GroupUserPopover: React.FC<{ userInfo: UserBaseInfo; groupInfo: GroupInfo; }> = React.memo((props) => { const { userInfo, groupInfo } = props; const userId = userInfo._id; const userExtra = userInfo.extra ?? {}; const roleNames = getUserRoleNames(userId, groupInfo); const { hideGroupMemberDiscriminator, disableCreateConverseFromGroup } = getGroupConfigWithInfo(groupInfo); const pluginUserExtraInfoEl = usePluginUserExtraInfo(userExtra); const navigate = useNavigate(); const currentUserId = useUserId(); const allowSendMessage = !hideGroupMemberDiscriminator && !disableCreateConverseFromGroup && currentUserId !== userId; const [, handleCreateConverse] = useAsyncRequest(async () => { const converse = await createDMConverse([userId]); navigate(`/main/personal/converse/${converse._id}`); }, [navigate]); useEffect(() => { if (userInfo.avatar) { fetchImagePrimaryColor(userInfo.avatar).then((rgba) => { console.log('fetchImagePrimaryColor', rgba); }); } }, [userInfo.avatar]); return (
{!hideGroupMemberDiscriminator && ( #{userInfo.discriminator} )}
{groupInfo.owner === userId && {t('创建者')}} {userInfo.temporary && {t('游客')}} {roleNames.map((name) => ( {name} ))}
{pluginUserExtraInfoEl}
{allowSendMessage && ( )}
); }); GroupUserPopover.displayName = 'GroupUserPopover'; /** * 获取用户的角色名列表 */ function getUserRoleNames(userId: string, groupInfo: GroupInfo) { const roles = groupInfo.members.find((m) => m.userId === userId)?.roles ?? []; const roleNames = groupInfo.roles .filter((r) => roles.includes(r._id)) .map((r) => r.name); return roleNames; }