Another message
++ Before selected words after. +
+{" 안녕하세요 👋\n世界 "}
+ {label}
++ {children} ++
(null); + const [announcement, setAnnouncement] = useState(""); + const inputRef = useRef(null); + const composing = useRef(false); + const quoteId = useId(); + const hintId = useId(); + + const handleReply = useCallback((nextQuote: Quote) => { + setQuote(nextQuote); + setAnnouncement(`Quote added. Replying to ${nextQuote.from}.`); + inputRef.current?.focus(); + }, []); + + const removeQuote = useCallback(() => { + setQuote(null); + setAnnouncement("Quote removed."); + inputRef.current?.focus(); + }, []); + + const handleSubmit = useCallback( + ({ text }: PromptInputMessage) => { + if (!text.trim()) { + return; + } + + // Local preview. In an app, keep the draft and quote until sending succeeds. + setMessages((current) => [ + ...current, + { from: "user", id: nanoid(), quote: quote ?? undefined, text }, + ]); + setInput(""); + setQuote(null); + setAnnouncement("Reply added to the conversation."); + inputRef.current?.focus(); + }, + [quote] + ); + + const handleChange = useCallback >( + (event) => setInput(event.currentTarget.value), + [] + ); + const handleCompositionStart = useCallback(() => { + composing.current = true; + }, []); + const handleCompositionEnd = useCallback(() => { + composing.current = false; + }, []); + const handleInputKeyDown = useCallback< + KeyboardEventHandler + >((event) => { + // Some IMEs dispatch their confirmation Enter after compositionend. + if (event.key === "Enter" && event.keyCode === 229) { + event.preventDefault(); + } + }, []); + const handleKeyDown = useCallback >( + (event) => { + if ( + event.key !== "Escape" || + !quote || + event.defaultPrevented || + composing.current || + event.nativeEvent.isComposing || + event.keyCode === 229 + ) { + return; + } + event.preventDefault(); + event.stopPropagation(); + removeQuote(); + }, + [quote, removeQuote] + ); + + return ( + ++ ); +}; + +export default Example;+ Select part of a message, then choose Reply to quote it. Without a + selection, Reply quotes the whole message. +
++ ++ {messages.map((message) => ( + ++ ))} + + + {quote && ( + + + {announcement} + ++ + )} ++ {quote.text} + ++ + + {quote + ? "Esc to remove quote" + : "Enter to send · Shift+Enter for a new line"} + + ++