import { ChatBox } from '@/components/ChatBox'; import { ChatInputMentionsContextProvider } from '@/components/ChatBox/ChatInputBox/context'; import React, { useCallback, useLayoutEffect, useState } from 'react'; import { useGroupPanelInfo, useGroupMemberInfos, useGroupMemberMute, useUserId, t, humanizeMsDuration, useInterval, } from 'tailchat-shared'; import { GroupPanelWrapper } from './Wrapper'; interface TextPanelProps { groupId: string; panelId: string; } export const TextPanel: React.FC = React.memo( ({ groupId, panelId }) => { const groupMembers = useGroupMemberInfos(groupId); const panelInfo = useGroupPanelInfo(groupId, panelId); const userId = useUserId(); const muteUntil = useGroupMemberMute(groupId, userId ?? ''); const [placeholder, setPlaceholder] = useState( undefined ); const updatePlaceholder = useCallback(() => { if (muteUntil) { setPlaceholder( muteUntil ? t('禁言中, 还剩 {{remain}}', { remain: humanizeMsDuration( new Date().valueOf() - new Date(muteUntil).valueOf() ), }) : undefined ); } else { setPlaceholder(undefined); } }, [muteUntil]); useInterval( updatePlaceholder, 10000 // 10s 检查一次,因为 humanizeMsDuration 不会精确到秒 ); useLayoutEffect(() => { // 当到期时间发生变化后立即更新 updatePlaceholder(); }, [muteUntil]); if (panelInfo === undefined) { return null; } return ( ({ id: m._id, display: m.nickname, }))} disabled={Boolean(muteUntil)} placeholder={placeholder} > ); } ); TextPanel.displayName = 'TextPanel';