import { useCallback, useContext, useEffect, useRef, useState } from 'react'; import { v4 } from 'uuid'; import { useAPI } from '../lib/useRouter'; 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); const { send } = useAPI({ 'message:message'(data: IMessage) { if(data.channel !== channel) return; setMessages([...messages, data]); }, 'message:recent'(data: { messages: IMessage[] }) { setMessages(data.messages); }, }, [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) => { 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', }}>
); };