{"version":3,"file":"FileInput.cjs","sources":["../../../src/components/FileInput/FileInput.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useMergedRef, useUncontrolled } from '@raikou/hooks';\nimport {\n  BoxProps,\n  ElementProps,\n  factory,\n  Factory,\n  StylesApiProps,\n  useProps,\n  useResolvedStylesApi,\n} from '../../core';\nimport { CloseButton } from '../CloseButton';\nimport { FileButton } from '../FileButton';\nimport { __BaseInputProps, __InputStylesNames, Input, InputVariant } from '../Input';\nimport { InputBase } from '../InputBase/InputBase';\n\nexport interface FileInputProps<Multiple = false>\n  extends BoxProps,\n    __BaseInputProps,\n    StylesApiProps<FileInputFactory>,\n    ElementProps<'button', 'value' | 'defaultValue' | 'onChange' | 'placeholder'> {\n  component?: any;\n\n  /** Called when value changes */\n  onChange?: (payload: Multiple extends true ? File[] : File | null) => void;\n\n  /** Controlled component value */\n  value?: Multiple extends true ? File[] : File | null;\n\n  /** Uncontrolled component default value */\n  defaultValue?: Multiple extends true ? File[] : File | null;\n\n  /** Determines whether user can pick more than one file, `false` by default */\n  multiple?: Multiple;\n\n  /** File input accept attribute, for example, `\"image/png,image/jpeg\"` */\n  accept?: string;\n\n  /** Input name attribute */\n  name?: string;\n\n  /** Input form attribute */\n  form?: string;\n\n  /** Value renderer. By default, file name is displayed. */\n  valueComponent?: React.FC<{ value: null | File | File[] }>;\n\n  /** Determines whether clear button should be displayed in the right section, `false` by default */\n  clearable?: boolean;\n\n  /** Props passed down to the clear button */\n  clearButtonProps?: React.ComponentPropsWithoutRef<'button'>;\n\n  /** If set, the input value cannot be changed  */\n  readOnly?: boolean;\n\n  /** Specifies that, optionally, a new file should be captured, and which device should be used to capture that new media of a type defined by the accept attribute. */\n  capture?: boolean | 'user' | 'environment';\n\n  /** Props passed down to the hidden input element which is used to capture files */\n  fileInputProps?: React.ComponentPropsWithoutRef<'input'>;\n\n  /** Input placeholder */\n  placeholder?: React.ReactNode;\n\n  /** Reference of the function that should be called when value changes to null or empty array */\n  resetRef?: React.ForwardedRef<() => void>;\n}\n\nexport type FileInputFactory = Factory<{\n  props: FileInputProps;\n  ref: HTMLButtonElement;\n  stylesNames: __InputStylesNames | 'placeholder';\n  variant: InputVariant;\n}>;\n\nconst DefaultValue: FileInputProps['valueComponent'] = ({ value }) => (\n  <div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n    {Array.isArray(value) ? value.map((file) => file.name).join(', ') : value?.name}\n  </div>\n);\n\nconst defaultProps: Partial<FileInputProps> = {\n  valueComponent: DefaultValue,\n};\n\nconst _FileInput = factory<FileInputFactory>((_props, ref) => {\n  const props = useProps('FileInput', defaultProps, _props);\n  const {\n    unstyled,\n    vars,\n    onChange,\n    value,\n    defaultValue,\n    multiple,\n    accept,\n    name,\n    form,\n    valueComponent,\n    clearable,\n    clearButtonProps,\n    readOnly,\n    capture,\n    fileInputProps,\n    rightSection,\n    size,\n    placeholder,\n    component,\n    resetRef: resetRefProp,\n    classNames,\n    styles,\n    ...others\n  } = props;\n\n  const resetRef = useRef<() => void>(null);\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<FileInputFactory>({\n    classNames,\n    styles,\n    props,\n  });\n\n  const [_value, setValue] = useUncontrolled<null | File | File[]>({\n    value,\n    defaultValue,\n    onChange: onChange as any,\n    finalValue: multiple ? [] : null,\n  });\n\n  const hasValue = Array.isArray(_value) ? _value.length !== 0 : _value !== null;\n\n  const _rightSection =\n    rightSection ||\n    (clearable && hasValue && !readOnly ? (\n      <CloseButton\n        {...clearButtonProps}\n        variant=\"subtle\"\n        onClick={() => setValue(multiple ? [] : null)}\n        size={size}\n        unstyled={unstyled}\n      />\n    ) : null);\n\n  useEffect(() => {\n    if ((Array.isArray(_value) && _value.length === 0) || _value === null) {\n      resetRef.current?.();\n    }\n  }, [_value]);\n\n  const ValueComponent = valueComponent!;\n\n  return (\n    <FileButton\n      onChange={setValue}\n      multiple={multiple}\n      accept={accept}\n      name={name}\n      form={form}\n      resetRef={useMergedRef(resetRef, resetRefProp)}\n      disabled={readOnly}\n      capture={capture}\n      inputProps={fileInputProps}\n    >\n      {(fileButtonProps) => (\n        <InputBase\n          component={component || 'button'}\n          ref={ref}\n          rightSection={_rightSection}\n          {...fileButtonProps}\n          {...others}\n          __staticSelector=\"FileInput\"\n          multiline\n          type=\"button\"\n          pointer\n          __stylesApiProps={props}\n          unstyled={unstyled}\n          size={size}\n          classNames={classNames}\n          styles={styles}\n        >\n          {!hasValue ? (\n            <Input.Placeholder\n              __staticSelector=\"FileInput\"\n              classNames={resolvedClassNames}\n              styles={resolvedStyles}\n            >\n              {placeholder}\n            </Input.Placeholder>\n          ) : (\n            <ValueComponent value={_value} />\n          )}\n        </InputBase>\n      )}\n    </FileButton>\n  );\n});\n\n_FileInput.classes = InputBase.classes;\n_FileInput.displayName = '@raikou/core/FileInput';\n\ntype FileInputComponent = (<Multiple extends boolean = false>(\n  props: FileInputProps<Multiple> & {\n    ref?: React.ForwardedRef<HTMLButtonElement>;\n  }\n) => React.JSX.Element) & { extend: typeof _FileInput.extend };\n\nexport const FileInput: FileInputComponent = _FileInput as any;\n"],"names":["jsx","factory","useProps","useRef","useResolvedStylesApi","useUncontrolled","CloseButton","useEffect","FileButton","useMergedRef","InputBase","Input"],"mappings":"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"}