{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import \"./style.pcss\";\r\n\r\nimport type {\r\n  Ref, ChangeEvent, FocusEvent, TextareaHTMLAttributes, FC, ReactElement,\r\n} from \"react\";\r\nimport {\r\n  useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, createRef,\r\n} from \"react\";\r\nimport type {\r\n  IInput,\r\n  IInputStateActions,\r\n  TInputType,\r\n  IResetEventParams,\r\n  IInputRef,\r\n  IInputEventParams,\r\n} from \"./config/types\";\r\nimport type { IComponentBaseProps } from \"../../types/components\";\r\nimport { useCN } from \"../../utils/react/useCN\";\r\nimport { useFormValidation } from \"../../utils/react/useFormValidation\";\r\nimport { useListeners } from \"../../utils/react/useListeners\";\r\nimport { getFieldProps } from \"../form/lib/getFieldProps\";\r\n\r\n/**\r\n * Поле ввода\r\n * @returns {ReactElement}\r\n */\r\nconst Input: FC<IComponentBaseProps & IInput> = ({\r\n  baseClass = \"formInput\",\r\n  name = \"\",\r\n  id,\r\n  type = \"text\",\r\n  placeholder,\r\n  title,\r\n  isRequired = false,\r\n  autoComplete = \"off\",\r\n  maxLength,\r\n  isDisabled = false,\r\n  isChecked = false,\r\n  isReadOnly = false,\r\n  value = \"\",\r\n  tabIndex,\r\n  inputMode,\r\n  form = null,\r\n  listeners = {},\r\n  onChange,\r\n  onValidate,\r\n  onBlur,\r\n  onFocus,\r\n  onReset,\r\n  getCN,\r\n  onKeyDown,\r\n  defaultValue,\r\n  autoFocus,\r\n  extraClasses = {},\r\n  extraAttrs = {},\r\n  ref,\r\n}): ReactElement => {\r\n  const {\r\n    isCanChecked, isTextArea, isHidden, isFile,\r\n  } = getFieldProps({ type });\r\n\r\n  const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\r\n\r\n  const originalValue = useRef(value);\r\n  const originalChecked = useRef(isChecked);\r\n\r\n  const { getCN: getClassName } = useCN(baseClass);\r\n\r\n  const [ inputValueState, setInputValueState ] = useState<string>(value);\r\n  const [ inputCheckedState, setInputCheckedState ] = useState<boolean>(isChecked);\r\n  const [ inputDisabledState, setInputDisabledState ] = useState<boolean>(isDisabled);\r\n  const [ inputRequiredState, setInputRequiredState ] = useState<boolean | string>(isRequired);\r\n  const [ inputReadOnlyState, setInputReadOnlyState ] = useState<boolean>(isReadOnly);\r\n  const [ inputPlaceholderState, setInputPlaceholderState ] = useState<string | undefined>(placeholder);\r\n  const [ inputTypeState, setInputTypeState ] = useState<TInputType>(type);\r\n\r\n  const setValue = useCallback(\r\n    (value: boolean | string) => {\r\n      isCanChecked ? setInputCheckedState(!!value) : setInputValueState(typeof value === \"string\" ? value : \"\");\r\n    }, [ isCanChecked ]\r\n  );\r\n\r\n  const stateActions: IInputStateActions = useMemo(\r\n    () => ({\r\n      setValue,\r\n      setInputCheckedState,\r\n      setInputRequiredState,\r\n      setInputValueState,\r\n      setInputDisabledState,\r\n      setInputPlaceholderState,\r\n      setInputTypeState,\r\n      setInputReadOnlyState,\r\n    }), []\r\n  );\r\n\r\n  const handleChange = useCallback(\r\n    (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n      if (typeof onChange === \"function\") {\r\n        onChange({ event, stateActions });\r\n      } else {\r\n        const target = event.target as HTMLInputElement;\r\n        const { checked, value } = target;\r\n        setValue(isCanChecked ? checked : value);\r\n      }\r\n    }, [ onChange, isCanChecked, setValue, stateActions ]\r\n  );\r\n\r\n  const handleBlur = useCallback(\r\n    (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n      onBlur?.({ event, stateActions });\r\n    }, [ onBlur, stateActions ]\r\n  );\r\n\r\n  const handleFocus = useCallback(\r\n    (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n      onFocus?.({ event, stateActions });\r\n    }, [ onFocus, stateActions ]\r\n  );\r\n\r\n  const handleReset = useCallback(\r\n    (event: Event) => {\r\n      if (typeof onReset === \"function\") {\r\n        onReset({\r\n          event,\r\n          stateActions,\r\n          data: {\r\n            original: {\r\n              isChecked: originalChecked.current,\r\n              value: originalValue.current,\r\n            },\r\n          },\r\n        });\r\n      } else {\r\n        setValue(isCanChecked ? originalChecked.current : originalValue.current);\r\n      }\r\n    }, [ onReset, isCanChecked, setValue ]\r\n  );\r\n\r\n  const commonProps = useMemo(\r\n    () => {\r\n      return {\r\n        id: id === null ? undefined : (id || name || undefined),\r\n        name: name || undefined,\r\n        placeholder: isCanChecked || isHidden ? undefined : inputPlaceholderState,\r\n        maxLength: isCanChecked || isFile || isHidden ? undefined : maxLength,\r\n        tabIndex: isFile || isHidden ? -1 : tabIndex,\r\n        disabled: inputDisabledState,\r\n        required: isRequired ? inputRequiredState : undefined,\r\n        readOnly: inputReadOnlyState,\r\n        autoComplete: isHidden || isFile || isCanChecked ? undefined : autoComplete,\r\n        \"data-js-input-required\": isRequired ? inputRequiredState : undefined,\r\n        form: (typeof form === \"string\" && !!form.length) ? form : undefined,\r\n        title: typeof title === \"string\" ? title : undefined,\r\n        inputMode,\r\n        autoFocus,\r\n        ...extraAttrs,\r\n      };\r\n    }, [\r\n      id,\r\n      name,\r\n      isCanChecked,\r\n      isHidden,\r\n      isFile,\r\n      inputPlaceholderState,\r\n      maxLength,\r\n      tabIndex,\r\n      inputDisabledState,\r\n      isRequired,\r\n      inputRequiredState,\r\n      inputReadOnlyState,\r\n      autoComplete,\r\n      form,\r\n      title,\r\n      inputMode,\r\n      extraAttrs,\r\n    ]\r\n  );\r\n\r\n  const inputSpecificProps = useMemo(\r\n    () => {\r\n      let className: string | undefined;\r\n\r\n      if (isHidden || !baseClass) {\r\n        className = undefined;\r\n      } else if (typeof getCN === \"function\") {\r\n        className = getCN(\"\", extraClasses);\r\n      } else {\r\n        className = getClassName(\"\", extraClasses);\r\n      }\r\n\r\n      return {\r\n        onChange: isFile || isHidden ? undefined : handleChange,\r\n        onBlur: isFile || isHidden ? undefined : handleBlur,\r\n        onFocus: isFile || isHidden ? undefined : handleFocus,\r\n        onKeyDown: isFile || isHidden ? undefined : onKeyDown,\r\n        value: defaultValue === undefined ? inputValueState : undefined,\r\n        defaultValue: defaultValue === undefined ? undefined : defaultValue,\r\n        className,\r\n        checked: isCanChecked ? inputCheckedState : undefined,\r\n      };\r\n    }, [\r\n      isFile,\r\n      isHidden,\r\n      handleChange,\r\n      handleBlur,\r\n      handleFocus,\r\n      onKeyDown,\r\n      defaultValue,\r\n      inputValueState,\r\n      baseClass,\r\n      getCN,\r\n      extraClasses,\r\n      getClassName,\r\n      isCanChecked,\r\n      inputCheckedState,\r\n    ]\r\n  );\r\n\r\n  useListeners({\r\n    listeners: {\r\n      reset: handleReset,\r\n      ...listeners,\r\n    },\r\n    ref: inputRef,\r\n  });\r\n\r\n  useFormValidation(inputRef, onValidate || undefined);\r\n\r\n  useEffect(() => {\r\n    setInputPlaceholderState(placeholder);\r\n  }, [ placeholder ]);\r\n\r\n  useEffect(() => {\r\n    setInputCheckedState(isChecked);\r\n  }, [ isChecked ]);\r\n\r\n  useEffect(() => {\r\n    setInputDisabledState(isDisabled);\r\n  }, [ isDisabled ]);\r\n\r\n  useEffect(() => {\r\n    setInputRequiredState(isRequired);\r\n  }, [ isRequired ]);\r\n\r\n  useEffect(() => {\r\n    setInputValueState(value);\r\n  }, [ value ]);\r\n\r\n  useEffect(() => {\r\n    setInputTypeState(type);\r\n  }, [ type ]);\r\n\r\n  useEffect(() => {\r\n    setInputReadOnlyState(isReadOnly);\r\n  }, [ isReadOnly ]);\r\n\r\n  useImperativeHandle(\r\n    ref, (): IInputRef => ({\r\n      el: inputRef.current,\r\n      getData: () => ({\r\n        value: inputValueState,\r\n        isChecked: inputCheckedState,\r\n      }),\r\n      ref: createRef(),\r\n      utils: null,\r\n      stateActions,\r\n    }), [ inputValueState, inputCheckedState, stateActions ]\r\n  );\r\n\r\n  if (isTextArea) {\r\n    interface ICustomTextareaProps\r\n      extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n      isRequired?: string | boolean;\r\n      \"data-js-input-required\": string | boolean | undefined;\r\n    }\r\n\r\n    const textareaProps: ICustomTextareaProps = {\r\n      ...commonProps,\r\n      ...inputSpecificProps,\r\n      required: typeof inputRequiredState === \"string\"\r\n        ? inputRequiredState === \"true\"\r\n        : inputRequiredState,\r\n      \"data-js-input-required\": inputRequiredState\r\n        ? String(inputRequiredState)\r\n        : undefined,\r\n    };\r\n\r\n    return (\r\n      <textarea\r\n        {...textareaProps}\r\n        ref={inputRef as Ref<HTMLTextAreaElement>}\r\n      />\r\n    );\r\n  }\r\n\r\n  const inputProps = {\r\n    ...commonProps,\r\n    ...inputSpecificProps,\r\n    type: inputTypeState,\r\n    required: Boolean(inputRequiredState),\r\n  };\r\n\r\n  return <input {...inputProps} ref={inputRef as Ref<HTMLInputElement>} />;\r\n};\r\n\r\nexport type {\r\n  IInput,\r\n  IInputEventParams,\r\n  IInputRef,\r\n  IResetEventParams,\r\n};\r\nexport { Input };\r\n"],"names":["Input","baseClass","name","id","type","placeholder","title","isRequired","autoComplete","maxLength","isDisabled","isChecked","isReadOnly","value","tabIndex","inputMode","form","listeners","onChange","onValidate","onBlur","onFocus","onReset","getCN","onKeyDown","defaultValue","autoFocus","extraClasses","extraAttrs","ref","isCanChecked","isTextArea","isHidden","isFile","getFieldProps","inputRef","useRef","originalValue","originalChecked","getClassName","useCN","inputValueState","setInputValueState","useState","inputCheckedState","setInputCheckedState","inputDisabledState","setInputDisabledState","inputRequiredState","setInputRequiredState","inputReadOnlyState","setInputReadOnlyState","inputPlaceholderState","setInputPlaceholderState","inputTypeState","setInputTypeState","setValue","useCallback","stateActions","useMemo","handleChange","event","target","checked","handleBlur","handleFocus","handleReset","data","original","current","commonProps","undefined","disabled","required","readOnly","length","inputSpecificProps","className","useListeners","reset","useFormValidation","useEffect","useImperativeHandle","el","getData","createRef","utils","textareaProps","String","_jsx","inputProps","Boolean"],"mappings":"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"}