This repository has been archived on 2023-11-14. You can view files and clone it, but cannot push or open issues/pull-requests.
viscord/packages/renderer/src/pages/Chat.tsx

139 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-07-20 16:04:09 -04:00
import { useCallback, useEffect, useRef, useState } from 'react';
import TimeAgo from 'react-timeago';
import { v4 } from 'uuid';
import { registerRouter, router, send, unregisterRouter } from '../lib/api';
2022-07-21 15:22:00 -04:00
import type { IMessage} from './Message';
import { Message } from './Message';
2022-07-20 16:04:09 -04:00
2022-07-21 15:22:00 -04:00
function createMessage(from: string, text: string, t = 0): IMessage {
2022-07-20 16:04:09 -04:00
return {
text,
from,
timestamp: Date.now() - t * 1000,
uid: v4(),
};
}
export default () => {
2022-07-21 15:22:00 -04:00
const [messages, setMessages] = useState<IMessage[]>([]);
2022-07-21 05:38:58 -04:00
const [hist, setHist] = useState(false);
2022-07-20 16:04:09 -04:00
const textBoxRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const actions = router({
2022-07-21 15:22:00 -04:00
message(data: IMessage) {
2022-07-20 16:04:09 -04:00
setMessages([...messages, data]);
},
2022-07-21 15:22:00 -04:00
'message:recent'(data: { messages: IMessage[] }) {
2022-07-21 05:38:58 -04:00
setMessages([...data.messages, ...messages]);
2022-07-21 04:18:39 -04:00
},
2022-07-20 16:04:09 -04:00
});
registerRouter(actions);
return () => {
unregisterRouter(actions);
};
}, [messages]);
2022-07-21 04:18:39 -04:00
useEffect(() => {
2022-07-21 05:38:58 -04:00
if(!hist) {
2022-07-21 04:18:39 -04:00
console.log('sending recents request');
2022-07-21 15:22:00 -04:00
send('message:recent');
2022-07-21 05:38:58 -04:00
setHist(true);
2022-07-21 04:18:39 -04:00
}
2022-07-21 05:38:58 -04:00
}, [hist]);
2022-07-21 04:18:39 -04:00
2022-07-20 16:04:09 -04:00
const sendMessage = useCallback(() => {
if(textBoxRef.current === null) return;
2022-07-21 15:22:00 -04:00
send('message:message', createMessage('Val', textBoxRef.current.innerText));
2022-07-20 16:04:09 -04:00
textBoxRef.current.innerText = '';
}, []);
const keyDown = useCallback((evt: any) => {
console.log(evt);
if(evt.key === 'Enter') {
sendMessage();
}
}, [sendMessage]);
return (
<>
<div
style={{
height: '100%',
width: '100%',
display: 'grid',
gridTemplateColumns: '1fr 64px',
gridTemplateRows: '1fr 64px',
gridTemplateAreas: '"content content" "message send"',
}}
>
<div style={{
// borderBottom: '1px solid #bd93f9',
gridArea: 'content',
position: 'relative',
}}>
<div style={{
position: 'absolute',
bottom: '0px',
width: '100%',
}}>
{messages.map(message => (
2022-07-21 15:22:00 -04:00
<Message message={message}></Message>
2022-07-20 16:04:09 -04:00
))}
</div>
</div>
<div onClick={() => {
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',
}}>
<div
ref={textBoxRef}
onKeyDown={keyDown}
className="input"
role="textbox"
contentEditable
style={{
background: 'inherit',
outline: 'none',
boxSizing: 'border-box',
borderRadius: '8px',
width: '100%',
resize: 'none',
}}
></div>
</div>
<div style={{
width: '100%',
height: '100%',
padding: '8px',
boxSizing: 'border-box',
}}>
<div onClick={sendMessage} style={{
background: '#bd93f9',
width: '100%',
height: '100%',
// borderRadius: '50%',
borderRadius: '8px',
cursor: 'pointer',
display: 'grid',
placeItems: 'center center',
fontSize: '32px',
}}>
</div>
</div>
</div>
</>
);
};