{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import \"./style.pcss\";\r\nimport type {\r\n  FC,\r\n  HTMLAttributes,\r\n  RefObject,\r\n  ReactElement,\r\n} from \"react\";\r\nimport {\r\n  useEffect,\r\n  isValidElement,\r\n  useRef,\r\n  cloneElement,\r\n  Children,\r\n  useImperativeHandle,\r\n  useMemo,\r\n} from \"react\";\r\nimport type {\r\n  IFilesUploader,\r\n  TInputChangeEvent,\r\n  IOnFilesChangeArg,\r\n  IFilesUploaderRef,\r\n} from \"./config/types\";\r\nimport { FilesUploaderCtx } from \"./context/index\";\r\nimport { getConvertedFileTypes } from \"./lib/index\";\r\nimport { useFilesUploader } from \"./lib/useFilesUploader\";\r\nimport { FilesUploaderList } from \"./ui/FilesUploaderList\";\r\nimport { FilesUploaderText } from \"./ui/FilesUploaderText\";\r\nimport { FilesUploaderTip } from \"./ui/FilesUploaderTip\";\r\nimport type { IComponentBaseProps } from \"../../types/components/index\";\r\nimport { useCN } from \"../../utils/react/useCN\";\r\nimport { useListeners } from \"../../utils/react/useListeners\";\r\nimport { useSSGRender } from \"../../utils/react/useSSGRender\";\r\nimport type { IInputRef } from \"../input\";\r\nimport { Input } from \"../input\";\r\n\r\n/**\r\n * Компонент загрузчика файлов\r\n * @returns {ReactElement}\r\n * */\r\nconst FilesUploader: FC<IFilesUploader & IComponentBaseProps> = (props): ReactElement => {\r\n\r\n  const {\r\n    baseClass = \"filesUploader\",\r\n    extraClasses = {},\r\n    extraAttrs = {},\r\n    fileTypes = [ \"jpg\", \"jpeg\", \"png\", \"pdf\", \"doc\", \"docx\", \"txt\" ],\r\n    maxSizeType = \"all\",\r\n    name = \"files\",\r\n    isDisabled = false,\r\n    maxSize = 5,\r\n    onFilesChange = null,\r\n    items = [],\r\n    maxFiles = 1,\r\n    isRequired = false,\r\n    children = null,\r\n    slotFilesList = null,\r\n    slotFileItem = null,\r\n    slotTip = null,\r\n    slotText = null,\r\n    id = null,\r\n    form = null,\r\n    onFileDelete = null,\r\n    onFileRender = null,\r\n    onMount = null,\r\n    onUnmount = null,\r\n    ref,\r\n  } = props;\r\n\r\n  const { getCN } = useCN(baseClass);\r\n\r\n  const containerRef: RefObject<HTMLDivElement | null> = useRef(null);\r\n\r\n  const inputRef: RefObject<HTMLInputElement | null> = useRef(null);\r\n\r\n  const hiddenInputRef: RefObject<IInputRef | null> = useRef(null);\r\n\r\n  const isMultiple = maxFiles > 1;\r\n\r\n  const {\r\n    isLoading,\r\n    isDragging,\r\n    isError,\r\n    handleDragStart,\r\n    handleDragEnter,\r\n    handleDragLeave,\r\n    handleDragOver,\r\n    handleDrop,\r\n    filesMap,\r\n    handleChangeFiles,\r\n    handleFileItemDeleteClick,\r\n    setFilesMap,\r\n  } = useFilesUploader(items, isDisabled, fileTypes, maxSize, maxFiles, hiddenInputRef, inputRef, onFilesChange, onFileDelete, maxSizeType);\r\n\r\n  useEffect(() => {\r\n    if (typeof onMount === \"function\") {\r\n      onMount();\r\n    }\r\n\r\n    return () => {\r\n      if (typeof onUnmount === \"function\") {\r\n        onUnmount();\r\n      }\r\n    };\r\n  }, []);\r\n\r\n  const handleChange = (e: TInputChangeEvent) => {\r\n    e.stopPropagation();\r\n    handleChangeFiles(e);\r\n  };\r\n\r\n  const handleReset = (e: Event) => {\r\n    e.preventDefault();\r\n    setFilesMap(new Map());\r\n  };\r\n\r\n  useListeners({\r\n    ref: hiddenInputRef,\r\n    listeners: {\r\n      \"reset\": handleReset,\r\n    },\r\n  });\r\n\r\n  useImperativeHandle(ref, (): IFilesUploaderRef => ({\r\n    el: containerRef.current,\r\n    ref: null,\r\n    getData: () => null,\r\n    utils: null,\r\n    stateActions: {\r\n      setFiles: setFilesMap,\r\n    },\r\n  }), [ filesMap, setFilesMap ]);\r\n\r\n  const computedStates = {\r\n    isError, isDisabled, isDragging, isMultiple, isLoading,\r\n  };\r\n\r\n  const context = useMemo(() => ({\r\n    filesMap,\r\n    maxSize,\r\n    maxFiles,\r\n    getCN,\r\n    fileTypes,\r\n    isDisabled,\r\n    isLoading,\r\n    isError,\r\n    isDragging,\r\n    isMultiple,\r\n    onDeleteClick: handleFileItemDeleteClick,\r\n    onFileRender,\r\n    hiddenInputRef,\r\n    setFilesMap,\r\n    slotFileItem,\r\n    maxSizeType,\r\n  }), [ filesMap, maxFiles, maxSize, fileTypes, isDisabled, isError, isDragging, isMultiple, onFileRender, handleFileItemDeleteClick, setFilesMap, slotFileItem, maxSizeType ]);\r\n\r\n  const SSGComponent = useSSGRender(\"data-js-files-uploader\", props);\r\n\r\n  if (SSGComponent) {\r\n    return SSGComponent;\r\n  }\r\n\r\n  return (\r\n    <FilesUploaderCtx value={context}>\r\n      <div\r\n        ref={containerRef}\r\n        className={getCN(\"\", { ...computedStates, ...extraClasses })}\r\n        {...extraAttrs}\r\n        onDragStart={handleDragStart}\r\n        onDragEnter={handleDragEnter}\r\n        onDragLeave={handleDragLeave}\r\n        onDragOver={handleDragOver}\r\n        onDrop={handleDrop}\r\n      >\r\n        <Input defaultValue={\"\"} isRequired={isRequired ? \"file\" : undefined} form={form ?? \"\"} type={\"file\"} baseClass={getCN(\"input\")} data-js-component-input={\"filesUploader\"} id={id || name} name={name} ref={hiddenInputRef} extraAttrs={{\r\n          \"data-js-input-validation-bubble\": \"true\",\r\n          \"data-js-component-input\": \"filesUploader\",\r\n        }} />\r\n        <label className={getCN(\"container\")}>\r\n          <input\r\n            type={\"file\"}\r\n            accept={getConvertedFileTypes(fileTypes)}\r\n            multiple={maxFiles > 1}\r\n            className={getCN(\"input\")}\r\n            disabled={isDisabled || isLoading}\r\n            onChange={handleChange}\r\n            ref={inputRef}\r\n          />\r\n          <div className={getCN(\"zone\")}>\r\n            {(!!slotText && isValidElement(slotText)) ? cloneElement(slotText, {\r\n              ...(slotText?.props ?? {}),\r\n              ...computedStates,\r\n            }) : <FilesUploaderText />}\r\n          </div>\r\n        </label>\r\n        {(!!slotTip && isValidElement(slotTip)) ? cloneElement(slotTip, {\r\n          ...(slotTip?.props ?? {}),\r\n          ...computedStates,\r\n        }) : <FilesUploaderTip />}\r\n        {!!filesMap.size && ((!!slotFilesList && isValidElement(slotFilesList)) ? cloneElement(slotFilesList, {\r\n          ...(slotFilesList?.props ?? {}),\r\n          filesMap,\r\n          handleFileItemDeleteClick,\r\n          ...computedStates,\r\n        } as HTMLAttributes<HTMLElement>) : <FilesUploaderList />)}\r\n        {!!children && Children.map(children, ((child, index) => {\r\n          if (isValidElement(child)) {\r\n            return cloneElement(child, {\r\n              ...(child?.props ?? {}),\r\n              filesMap,\r\n              key: `${index}`,\r\n              ...computedStates,\r\n            } as HTMLAttributes<HTMLElement>);\r\n          }\r\n          return child;\r\n        }))}\r\n      </div>\r\n    </FilesUploaderCtx>\r\n  );\r\n};\r\n\r\nexport type { IFilesUploader, IFilesUploaderRef, IOnFilesChangeArg };\r\n\r\nexport { FilesUploader };\r\n"],"names":["FilesUploader","props","baseClass","extraClasses","extraAttrs","fileTypes","maxSizeType","name","isDisabled","maxSize","onFilesChange","items","maxFiles","isRequired","children","slotFilesList","slotFileItem","slotTip","slotText","id","form","onFileDelete","onFileRender","onMount","onUnmount","ref","getCN","useCN","containerRef","useRef","inputRef","hiddenInputRef","isMultiple","isLoading","isDragging","isError","handleDragStart","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","filesMap","handleChangeFiles","handleFileItemDeleteClick","setFilesMap","useFilesUploader","useEffect","handleChange","e","stopPropagation","handleReset","preventDefault","Map","useListeners","listeners","reset","useImperativeHandle","el","current","getData","utils","stateActions","setFiles","computedStates","context","useMemo","onDeleteClick","SSGComponent","useSSGRender","_jsx","FilesUploaderCtx","value","_jsxs","className","onDragStart","onDragEnter","onDragLeave","onDragOver","onDrop","Input","defaultValue","undefined","type","accept","getConvertedFileTypes","multiple","disabled","onChange","isValidElement","cloneElement","FilesUploaderText","FilesUploaderTip","size","FilesUploaderList","Children","map","child","index","key"],"mappings":"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"}