import { ChatlineData, ChatRecordData, UserProfileComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; import { TryVisitRoom } from '../../../../api'; import { ModToolsOpenRoomInfoEvent } from '../../../../events/mod-tools/ModToolsOpenRoomInfoEvent'; import { dispatchUiEvent, SendMessageHook } from '../../../../hooks'; import { ChatlogViewProps } from './ChatlogView.types'; export const ChatlogView: FC = props => { const { records = null } = props; const simpleRowRenderer: ListRowRenderer = (props: ListRowProps) => { const item = records[0].chatlog[props.index]; return (
{item.timestamp}
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
{item.message}
); }; const advancedRowRenderer: ListRowRenderer = (props: ListRowProps) => { let chatlogEntry: ChatlineData; let currentRecord: ChatRecordData; let isRoomInfo = false; let totalIndex = 0; for(let i = 0; i < records.length; i++) { currentRecord = records[i]; totalIndex++; // row for room info totalIndex = totalIndex + currentRecord.chatlog.length; if(props.index > (totalIndex - 1)) { continue; // it is not in current one } if( (props.index + 1) === (totalIndex - currentRecord.chatlog.length)) { isRoomInfo = true; break; } const index = props.index - (totalIndex - currentRecord.chatlog.length); chatlogEntry = currentRecord.chatlog[index]; break; } return ( {isRoomInfo && } {!isRoomInfo &&
{chatlogEntry.timestamp}
SendMessageHook(new UserProfileComposer(chatlogEntry.userId))}>{chatlogEntry.userName}
{chatlogEntry.message}
}
); } const getNumRowsForAdvanced = useCallback(() => { let count = 0; for(let i = 0; i < records.length; i++) { count++; // add room info row count = count + records[i].chatlog.length; } return count; }, [records]); const cache = new CellMeasurerCache({ defaultHeight: 25, fixedWidth: true }); const RoomInfo = useCallback(({ roomId, roomName, uniqueKey, style }) => { return (
Room: {roomName}
); }, []); return ( <> { (records && records.length) && <> {(records.length === 1) && }
Time
User
Message
{({ height, width }) => { cache.clearAll(); return ( 1 ? getNumRowsForAdvanced() : records[0].chatlog.length} rowHeight={cache.rowHeight} className={'chatlog-container'} rowRenderer={records.length > 1 ? advancedRowRenderer : simpleRowRenderer} deferredMeasurementCache={cache} /> ) } }
} ); }