'use client'; import type { ButtonProps, RecipeProps } from '@chakra-ui/react'; import { Button, FileUpload as ChakraFileUpload, Icon, IconButton, Span, Text, useFileUploadContext, useRecipe, } from '@chakra-ui/react'; import * as React from 'react'; import { LuFile, LuUpload, LuX } from 'react-icons/lu'; export interface FileUploadRootProps extends ChakraFileUpload.RootProps { inputProps?: React.InputHTMLAttributes; } export const FileUploadRoot = React.forwardRef( function FileUploadRoot(props, ref) { const { children, inputProps, ...rest } = props; return ( {children} ); }, ); export interface FileUploadDropzoneProps extends ChakraFileUpload.DropzoneProps { label: React.ReactNode; description?: React.ReactNode; } export const FileUploadDropzone = React.forwardRef( function FileUploadDropzone(props, ref) { const { children, label, description, ...rest } = props; return (
{label}
{description && {description}}
{children}
); }, ); interface VisibilityProps { showSize?: boolean; clearable?: boolean; } interface FileUploadItemProps extends VisibilityProps { file: File; } const FileUploadItem = React.forwardRef(function FileUploadItem(props, ref) { const { file, showSize, clearable } = props; return ( {showSize ? ( ) : ( )} {clearable && ( )} ); }); interface FileUploadListProps extends VisibilityProps, ChakraFileUpload.ItemGroupProps { files?: File[]; } export const FileUploadList = React.forwardRef( function FileUploadList(props, ref) { const { showSize, clearable, files, ...rest } = props; const fileUpload = useFileUploadContext(); const acceptedFiles = files ?? fileUpload.acceptedFiles; if (acceptedFiles.length === 0) return null; return ( {acceptedFiles.map((file) => ( ))} ); }, ); type Assign = Omit & U; interface FileInputProps extends Assign> { placeholder?: React.ReactNode; } export const FileInput = React.forwardRef(function FileInput(props, ref) { const inputRecipe = useRecipe({ key: 'input' }); const [recipeProps, restProps] = inputRecipe.splitVariantProps(props); const { placeholder = 'Select file(s)', ...rest } = restProps; return ( ); }); export const FileUploadLabel = ChakraFileUpload.Label; export const FileUploadClearTrigger = ChakraFileUpload.ClearTrigger; export const FileUploadTrigger = ChakraFileUpload.Trigger; export const FileUploadFileText = ChakraFileUpload.FileText;