import React, { CSSProperties, useEffect, useMemo, useRef, useState } from 'react' import { isMobile } from 'renderer/viewer/lib/simpleUtils' import styles from './input.module.css' interface Props extends Omit, 'width'> { rootStyles?: React.CSSProperties autoFocus?: boolean inputRef?: React.RefObject validateInput?: (value: string) => CSSProperties | undefined width?: number } const Input = ({ autoFocus, rootStyles, inputRef, validateInput, defaultValue, width, ...inputProps }: Props) => { if (width) rootStyles = { ...rootStyles, width } const ref = useRef(null!) const [validationStyle, setValidationStyle] = useState({}) const [value, setValue] = useState(defaultValue ?? '') useEffect(() => { setValue(inputProps.value === '' || inputProps.value ? inputProps.value : value) }, [inputProps.value]) useEffect(() => { if (inputRef) (inputRef as any).current = ref.current if (!autoFocus || isMobile()) return // Don't make screen keyboard popup on mobile ref.current.focus() }, []) useEffect(() => { setValidationStyle(validateInput?.(value as any) ?? {}) }, [value, validateInput]) return
{ setValue(e.target.value) inputProps.onChange?.(e) }} />
} export default Input export const INPUT_LABEL_WIDTH = 190 export const InputWithLabel = ({ label, span, ...props }: React.ComponentProps & { label, span? }) => { return
}