silphius/app/react/components/dom/chat/input.jsx

89 lines
2.2 KiB
React
Raw Normal View History

2024-07-14 07:24:15 -05:00
import {useEffect, useState} from 'react';
2024-07-20 04:32:33 -05:00
import {useClient} from '@/react/context/client.js';
2024-07-14 07:24:15 -05:00
import styles from './input.module.css';
export default function ChatInput({
2024-07-14 16:33:58 -05:00
setChatHistoryCaret,
2024-07-14 07:24:15 -05:00
chatHistory,
2024-07-14 16:33:58 -05:00
chatHistoryCaret,
chatInputRef,
2024-07-14 07:24:15 -05:00
message,
2024-07-14 16:33:58 -05:00
pendingMessage,
2024-07-14 07:24:15 -05:00
setChatHistory,
setMessage,
2024-07-14 16:33:58 -05:00
setPendingMessage,
2024-07-14 07:24:15 -05:00
}) {
const client = useClient();
const [disabled, setDisabled] = useState(true);
useEffect(() => {
setDisabled(false);
}, []);
return (
<form
className={styles.input}
onSubmit={(event) => {
if (message) {
client.send({
type: 'Action',
payload: {type: 'chat', value: message},
});
setChatHistory([message, ...chatHistory]);
2024-07-14 16:33:58 -05:00
setChatHistoryCaret(-1);
setPendingMessage('');
2024-07-14 07:24:15 -05:00
setMessage('');
}
event.preventDefault();
}}
>
<input
disabled={disabled}
onChange={(event) => {
setMessage(event.target.value);
}}
onKeyDown={(event) => {
switch (event.key) {
case 'ArrowDown': {
2024-07-14 16:33:58 -05:00
if (-1 === chatHistoryCaret) {
2024-07-14 07:24:15 -05:00
break;
}
2024-07-14 16:33:58 -05:00
else if (0 === chatHistoryCaret) {
setMessage(pendingMessage);
setPendingMessage('');
2024-07-14 07:24:15 -05:00
}
2024-07-14 16:33:58 -05:00
else {
setMessage(chatHistory[chatHistoryCaret - 1])
}
setChatHistoryCaret(chatHistoryCaret - 1);
2024-07-14 07:24:15 -05:00
break;
}
case 'ArrowUp': {
2024-07-14 16:33:58 -05:00
if (chatHistory.length - 1 === chatHistoryCaret) {
2024-07-14 07:24:15 -05:00
break;
}
2024-07-14 16:33:58 -05:00
if (-1 === chatHistoryCaret) {
setPendingMessage(message);
2024-07-14 07:24:15 -05:00
}
2024-07-14 16:33:58 -05:00
setMessage(chatHistory[chatHistoryCaret + 1])
setChatHistoryCaret(chatHistoryCaret + 1);
2024-07-14 07:24:15 -05:00
break;
}
}
}}
onMouseDown={(event) => {
event.stopPropagation();
}}
maxLength="255"
ref={(element) => {
2024-07-14 16:33:58 -05:00
chatInputRef.current = element;
2024-07-14 07:24:15 -05:00
if (element) {
element.focus();
}
}}
type="text"
value={message}
/>
</form>
);
}