realtime-chat-room / src /components /MessageComposer.tsx
Trae Assistant
Add sticker shortcuts and simplify entry
db4a9d5
Raw
History Blame Contribute Delete
2.38 kB
import { FormEvent, KeyboardEvent, useState } from 'react';
import { Laugh, SendHorizontal } from 'lucide-react';
type MessageComposerProps = {
disabled: boolean;
onSend: (text: string) => boolean;
};
const stickerPacks = [
{ label: 'εΌ€εΏƒ', value: 'πŸ˜„' },
{ label: '衞', value: 'πŸ‘' },
{ label: 'ιΌ“ζŽŒ', value: 'πŸ‘' },
{ label: 'ζ”Άεˆ°', value: 'πŸ‘Œ' },
{ label: '思考', value: 'πŸ€”' },
{ label: 'εΊ†η₯', value: 'πŸŽ‰' },
{ label: '加油', value: 'πŸ’ͺ' },
{ label: '笑哭', value: 'πŸ˜‚' },
];
export default function MessageComposer({ disabled, onSend }: MessageComposerProps) {
const [text, setText] = useState('');
function submit() {
if (onSend(text)) {
setText('');
}
}
function handleSubmit(event: FormEvent<HTMLFormElement>) {
event.preventDefault();
submit();
}
function handleKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault();
submit();
}
}
function sendSticker(sticker: string) {
if (disabled) {
return;
}
onSend(sticker);
}
return (
<form className="composer" onSubmit={handleSubmit}>
<div className="sticker-toolbar" aria-label="θ‘¨ζƒ…εŒ…εΏ«ζ·ε‘ι€">
<span>
<Laugh size={16} />
θ‘¨ζƒ…εŒ…
</span>
<div className="sticker-list">
{stickerPacks.map((sticker) => (
<button
aria-label={`发送${sticker.label}葨情`}
className="sticker-button"
disabled={disabled}
key={sticker.label}
onClick={() => sendSticker(sticker.value)}
type="button"
>
{sticker.value}
</button>
))}
</div>
</div>
<div className="composer-row">
<textarea
value={text}
onChange={(event) => setText(event.target.value)}
onKeyDown={handleKeyDown}
placeholder={disabled ? '连ζŽ₯εŽε³ε―ε‘ι€ζΆˆζ―' : 'θΎ“ε…₯梈息,Enter ε‘ι€οΌŒShift + Enter 捒葌'}
maxLength={800}
disabled={disabled}
/>
<button className="send-button" type="submit" disabled={disabled || !text.trim()}>
<SendHorizontal size={18} />
发送
</button>
</div>
</form>
);
}