"use client" import * as React from "react" import { composeEventHandlers } from "@radix-ui/primitive" import { Primitive } from "@radix-ui/react-primitive" import { FileRejection, FileWithPath, useDropzone, type DropzoneOptions, type DropzoneState, } from "react-dropzone" export type DropzoneContextProps = DropzoneState & DropzoneOptions const DropzoneContext = React.createContext( {} as DropzoneContextProps ) export const useDropzoneContext = () => React.useContext(DropzoneContext) export interface DropzoneProps extends DropzoneOptions { children: React.ReactNode | ((state: DropzoneContextProps) => React.ReactNode) } export const Dropzone = ({ children, ...props }: DropzoneProps) => { const state = useDropzone(props) const context = { ...state, ...props } return ( {typeof children === "function" ? children(context) : children} ) } Dropzone.displayName = "Dropzone" export const DropzoneInput = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >((props, ref) => { const { getInputProps, disabled } = useDropzoneContext() return ( ) }) DropzoneInput.displayName = "DropzoneInput" export const DropzoneZone = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >((props, ref) => { const { getRootProps, isFocused, isDragActive, isDragAccept, isDragReject, isFileDialogActive, preventDropOnDocument, noClick, noKeyboard, noDrag, noDragEventsBubbling, disabled, } = useDropzoneContext() return ( ) }) DropzoneZone.displayName = "DropzoneZone" export const DropzoneTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ onClick, ...props }, ref) => { const { open } = useDropzoneContext() return ( ) }) DropzoneTrigger.displayName = "DropzoneTrigger" export interface DropzoneDragAcceptedProps { children?: React.ReactNode } export const DropzoneDragAccepted = ({ children, }: DropzoneDragAcceptedProps) => { const { isDragAccept } = useDropzoneContext() if (!isDragAccept) { return null } return children } export interface DropzoneDragRejectedProps { children?: React.ReactNode } export const DropzoneDragRejected = ({ children, }: DropzoneDragRejectedProps) => { const { isDragReject } = useDropzoneContext() if (!isDragReject) { return null } return children } export interface DropzoneDragDefaultProps { children?: React.ReactNode } export const DropzoneDragDefault = ({ children }: DropzoneDragDefaultProps) => { const { isDragActive } = useDropzoneContext() if (isDragActive) { return null } return children } export interface DropzoneAcceptedProps { children: (acceptedFiles: Readonly) => React.ReactNode } export const DropzoneAccepted = ({ children }: DropzoneAcceptedProps) => { const { acceptedFiles } = useDropzoneContext() return children(acceptedFiles) } export interface DropzoneRejectedProps { children: (fileRejections: Readonly) => React.ReactNode } export const DropzoneRejected = ({ children }: DropzoneRejectedProps) => { const { fileRejections } = useDropzoneContext() return children(fileRejections) } const Root = Dropzone const Input = DropzoneInput const Zone = DropzoneZone const Trigger = DropzoneTrigger const DragAccepted = DropzoneDragAccepted const DragRejected = DropzoneDragRejected const DragDefault = DropzoneDragDefault const Accepted = DropzoneAccepted const Rejected = DropzoneRejected export { Root, Input, Zone, Trigger, DragAccepted, DragRejected, DragDefault, Accepted, Rejected, }