import { useCallback, useContext, useEffect, useRef, useState } from 'react'; import { v4 } from 'uuid'; import { useApi } from '../lib/useApi'; import { ChannelContext, ClientIdContext } from './App'; import type { IMessage} from './Message'; import { Message } from './Message'; import { MdSend } from 'react-icons/md' 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 CHATBOX_SIZE = 64; const PADDING = 8; const textBoxRef = useRef(null); const { channel, setChannel } = useContext(ChannelContext); const { clientId } = useContext(ClientIdContext); const { send } = useApi({ 'message:message'(data: IMessage) { if(data.channel !== channel) return; setMessages([...messages, data]); }, 'message:recent'(data: { messages: IMessage[] }) { setMessages(data.messages.reverse()); }, }, [messages]); useEffect(() => { console.log('sending recents request'); send('message:recent', { channel }); }, [channel]); const sendMessage = useCallback(() => { if(textBoxRef.current === null) return; if(channel === null) return; if(clientId === null) return; send( 'message:message', createMessage( clientId, 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: PADDING + 'px', marginRight: '0px', borderRadius: ((CHATBOX_SIZE - PADDING*2) / 2) + 'px', background: '#343746', gridArea: 'message', display: 'grid', placeItems: 'center center', padding: '0px 16px', cursor: 'text', overflow: 'auto', }}>
); };