import { useCallback, useContext, useEffect, useRef, useState } from 'react'; import TimeAgo from 'react-timeago'; import { v4 } from 'uuid'; import { registerRouter, router, send, unregisterRouter } from '../lib/api'; import { channelContext } from './App'; import type { IMessage} from './Message'; import { Message } from './Message'; function createMessage(from: string, text: string, channel: string, t = 0): IMessage { return { text, from, timestamp: Date.now() - t * 1000, uid: v4(), channel, }; } export default () => { const [messages, setMessages] = useState([]); const [hist, setHist] = useState(false); const textBoxRef = useRef(null); const { channel, setChannel } = useContext(channelContext); useEffect(() => { const actions = router({ 'message:message'(data: IMessage) { setMessages([...messages, data]); }, 'message:recent'(data: { messages: IMessage[] }) { setMessages(data.messages); }, }); registerRouter(actions); return () => { unregisterRouter(actions); }; }, [messages]); useEffect(() => { console.log('sending recents request'); send('message:recent', { channel }); }, [channel]); const sendMessage = useCallback(() => { if(textBoxRef.current === null) return; if(channel === null) return; send('message:message', createMessage('Val', textBoxRef.current.innerText, channel)); textBoxRef.current.innerText = ''; }, [channel]); const keyDown = useCallback((evt: any) => { console.log(evt); if(evt.key === 'Enter') { sendMessage(); } }, [sendMessage]); return ( <>
{messages.map(message => ( ))}
{ textBoxRef.current?.focus(); }}style={{ margin: '8px', marginRight: '3px', borderRadius: '8px', background: '#343746', gridArea: 'message', display: 'grid', placeItems: 'center center', padding: '0px 16px', cursor: 'text', overflow: 'auto', }}>
); };