import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useRef, useState } from 'react'; import { ChatEntryType, LocalizeText } from '../../api'; import { Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { useChatHistory } from '../../hooks'; import { NitroInput } from '../../layout'; export const ChatHistoryView: FC<{}> = props => { const [isVisible, setIsVisible] = useState(false); const [searchText, setSearchText] = useState(''); const {chatHistory = []} = useChatHistory(); const elementRef = useRef(null); const isFirstRender = useRef(true); const prevChatLength = useRef(0); const filteredChatHistory = useMemo(() => { let result = chatHistory; if (searchText.length > 0) { const text = searchText.toLowerCase(); result = chatHistory.filter(entry => (entry.message && entry.message.toLowerCase().includes(text)) || (entry.name && entry.name.toLowerCase().includes(text)) ); } return [...result]; }, [chatHistory, searchText]); useEffect(() => { if (!elementRef.current || !isVisible) return; const element = elementRef.current; const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight); const isAtBottom = maxScrollTop === 0 || Math.abs(element.scrollTop - maxScrollTop) <= 50; if (isFirstRender.current) { element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' }); isFirstRender.current = false; } else if (filteredChatHistory.length > prevChatLength.current) { element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' }); } prevChatLength.current = filteredChatHistory.length; }, [filteredChatHistory, isVisible]); useEffect(() => { const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const parts = url.split('/'); if (parts.length < 2) return; switch (parts[1]) { case 'show': setIsVisible(true); return; case 'hide': setIsVisible(false); return; case 'toggle': setIsVisible(prevValue => !prevChatLength.current); return; } }, eventUrlPrefix: 'chat-history/' }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); if (!isVisible) return null; return ( setIsVisible(false)} /> setSearchText(event.target.value)} />
{filteredChatHistory.map((row, index) => ( {row.timestamp} {row.type === ChatEntryType.TYPE_CHAT && (
{row.imageUrl && row.imageUrl.length > 0 && (
)}
)} {row.type === ChatEntryType.TYPE_ROOM_INFO && ( <> {row.name} )} ))}
); };