import React, { BaseSyntheticEvent } from "react"; import { asyncInputEvent } from "./handler-wrapper"; interface SearchInputProps { placeholder?: string; initialValue?: string; type?: string; className?: string; debounceTime?: number; tabIndex?: number; getInputValueSetter?: (fn: (v: string) => any) => any; onClick?: (e: React.MouseEvent) => any; onDoubleClick?: (e: React.MouseEvent) => any; onMouseDown?: (e: React.MouseEvent) => any; onMouseEnter?: (e: React.MouseEvent) => any; onMouseLeave?: (e: React.MouseEvent) => any; onChange?: (e: React.FormEvent) => any; onChangeAsync?: (e: React.FormEvent) => any; onFocus?: (e: React.FocusEvent) => any; onBlur?: (e: React.FocusEvent) => any; onKeyUp?: (e: React.KeyboardEvent) => any; onKeyDown?: (e: React.KeyboardEvent) => any; onKeyPress?: (e: React.KeyboardEvent) => any; onSubmit?: (e: React.FormEvent) => any; } const SearchInputCore = ( { placeholder = "PlaceHolder", type = "text", initialValue = "", className = "", debounceTime = 400, getInputValueSetter = () => {}, onClick = () => {}, onDoubleClick = () => {}, onMouseDown = () => {}, onMouseEnter = () => {}, onMouseLeave = () => {}, onChange = () => {}, onChangeAsync = () => {}, onFocus = () => {}, onBlur = () => {}, onKeyUp = () => {}, onKeyDown = () => {}, onKeyPress = () => {}, onSubmit = () => {}, tabIndex = 0 }: SearchInputProps, ref: React.Ref ) => { const [value, setValue] = React.useState(initialValue); const handlerDefaults = React.useCallback((e, cb) => { // e.preventDefault(); // e.stopPropagation(); cb(e); }, []); const inputHandlers = React.useCallback( asyncInputEvent>( (e) => { e.preventDefault(); e.stopPropagation(); onChangeAsync(e); }, (e) => { e.preventDefault(); e.stopPropagation(); setValue(e.target.value); onChange(e); }, debounceTime ), [setValue] ); React.useLayoutEffect(() => { getInputValueSetter(setValue); }, [setValue, getInputValueSetter]); return ( handlerDefaults(e, onClick)} onDoubleClick={(e) => handlerDefaults(e, onDoubleClick)} onMouseEnter={(e) => handlerDefaults(e, onMouseEnter)} onMouseLeave={(e) => handlerDefaults(e, onMouseLeave)} onMouseDown={(e) => handlerDefaults(e, onMouseDown)} onChange={inputHandlers} // works exactly as onInput because of reacts implementation onFocus={(e) => handlerDefaults(e, onFocus)} onBlur={(e) => handlerDefaults(e, onBlur)} onKeyUp={(e) => handlerDefaults(e, onKeyUp)} onKeyDown={(e) => handlerDefaults(e, onKeyDown)} onKeyPress={(e) => handlerDefaults(e, onKeyPress)} onSubmit={(e) => handlerDefaults(e, onSubmit)} /> ); }; const SearchInput = React.forwardRef(SearchInputCore); function SearchInputWrapper() { const [state /*setState*/] = React.useState("hebele"); const inputValueSetter = React.useRef<(v: string) => any>(() => {}); setTimeout(() => { // setState('deneme'); inputValueSetter.current("deneme"); }, 5000); return ( (inputValueSetter.current = fn)} onClick={(e) => { // console.log("[CLICK]", "input clicked"); }} onDoubleClick={(e) => { // console.log("[DOUBLECLICK]", "input double clicked"); }} /> ); } export { SearchInputWrapper, SearchInput };