| import { useDialogComposition } from "@/components/ui/dialog"; |
| import { useComposition } from "@/hooks/useComposition"; |
| import { cn } from "@/lib/utils"; |
| import * as React from "react"; |
|
|
| function Input({ |
| className, |
| type, |
| onKeyDown, |
| onCompositionStart, |
| onCompositionEnd, |
| ...props |
| }: React.ComponentProps<"input">) { |
| |
| const dialogComposition = useDialogComposition(); |
|
|
| |
| const { |
| onCompositionStart: handleCompositionStart, |
| onCompositionEnd: handleCompositionEnd, |
| onKeyDown: handleKeyDown, |
| } = useComposition<HTMLInputElement>({ |
| onKeyDown: (e) => { |
| |
| const isComposing = (e.nativeEvent as any).isComposing || dialogComposition.justEndedComposing(); |
|
|
| |
| |
| if (e.key === "Enter" && isComposing) { |
| return; |
| } |
|
|
| |
| onKeyDown?.(e); |
| }, |
| onCompositionStart: e => { |
| dialogComposition.setComposing(true); |
| onCompositionStart?.(e); |
| }, |
| onCompositionEnd: e => { |
| |
| dialogComposition.markCompositionEnd(); |
| |
| |
| setTimeout(() => { |
| dialogComposition.setComposing(false); |
| }, 100); |
| onCompositionEnd?.(e); |
| }, |
| }); |
|
|
| return ( |
| <input |
| type={type} |
| data-slot="input" |
| className={cn( |
| "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", |
| "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", |
| "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", |
| className |
| )} |
| onCompositionStart={handleCompositionStart} |
| onCompositionEnd={handleCompositionEnd} |
| onKeyDown={handleKeyDown} |
| {...props} |
| /> |
| ); |
| } |
|
|
| export { Input }; |
|
|