import { cloneElement, useContext, useState, useEffect, isValidElement, } from "react"; import type { HTMLAttributes, ReactElement, MouseEvent } from "react"; import { Btn } from "../../btn"; import { Locale } from "../../locale"; import type { IFilesUploaderItem } from "../config/types"; import { FilesUploaderCtx } from "../context/index"; import { getFileSizeInMb } from "../lib/index"; /** * Компонент вывода элемента списка загруженных файлов * @param file - файл * @returns * */ export const FilesUploaderItem = ({ file }: { file: Required | File; }): ReactElement => { const { getCN, slotFileItem, isDisabled, isLoading, onDeleteClick, onFileRender, setFilesMap, } = useContext(FilesUploaderCtx); const name = file?.name ?? ; const size = getFileSizeInMb(file?.size ?? 0).toFixed(2); const link = ("href" in file && typeof file?.href === "string" && file.href.length) ? file.href : null; const [ isFileLoading, setIsFileLoading ] = useState(isLoading); const onDelete = (e: MouseEvent) => { e.preventDefault(); setIsFileLoading(true); onDeleteClick(file) .finally(() => { setIsFileLoading(false); }); }; useEffect(() => { if (typeof onFileRender === "function") { onFileRender({ file, stateActions: { setFiles: setFilesMap, setIsLoading: setIsFileLoading, }, }); } }, []); return (
  • {(!!slotFileItem && isValidElement(slotFileItem)) ? cloneElement(slotFileItem, { ...(slotFileItem?.props ?? {}), isDisabled, file, onDeleteClick, } as HTMLAttributes) : (
    {!!link ? {name} :
    {name}
    }
    {size} 
    )}
  • ); };