diff options
Diffstat (limited to 'packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx')
| -rw-r--r-- | packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx b/packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx new file mode 100644 index 0000000..e11d0dc --- /dev/null +++ b/packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx @@ -0,0 +1,53 @@ +import type { ChangeEventHandler } from "react"; +import { useEffect, useRef } from "react"; +import { EVENT } from "../../constants"; +import { KEYS } from "../../keys"; + +interface TTDDialogInputProps { + input: string; + placeholder: string; + onChange: ChangeEventHandler<HTMLTextAreaElement>; + onKeyboardSubmit?: () => void; +} + +export const TTDDialogInput = ({ + input, + placeholder, + onChange, + onKeyboardSubmit, +}: TTDDialogInputProps) => { + const ref = useRef<HTMLTextAreaElement>(null); + + const callbackRef = useRef(onKeyboardSubmit); + callbackRef.current = onKeyboardSubmit; + + useEffect(() => { + if (!callbackRef.current) { + return; + } + const textarea = ref.current; + if (textarea) { + const handleKeyDown = (event: KeyboardEvent) => { + if (event[KEYS.CTRL_OR_CMD] && event.key === KEYS.ENTER) { + event.preventDefault(); + callbackRef.current?.(); + } + }; + textarea.addEventListener(EVENT.KEYDOWN, handleKeyDown); + return () => { + textarea.removeEventListener(EVENT.KEYDOWN, handleKeyDown); + }; + } + }, []); + + return ( + <textarea + className="ttd-dialog-input" + onChange={onChange} + value={input} + placeholder={placeholder} + autoFocus + ref={ref} + /> + ); +}; |
