import * as React from 'react'; import { delegateTriggerEvent, useClientSide } from '@modal-sh/react-utils'; import clsx from 'clsx'; export interface CommonPreviewProps = Partial> { file?: F; disabled?: boolean; enhanced?: boolean; mini?: boolean; } export type FileSelectBoxDerivedElement = HTMLInputElement; export interface FileSelectBoxProps< F extends Partial = Partial, P extends CommonPreviewProps = CommonPreviewProps > extends Omit, 'size' | 'type' | 'style' | 'label' | 'list'> { /** * Should the component display a border? */ border?: boolean, /** * Should the component occupy the whole width of its parent? */ block?: boolean, /** * Short textual description indicating the nature of the component's value. */ label?: React.ReactNode, /** * Short textual description as guidelines for valid input values. */ hint?: React.ReactNode, enhanced?: boolean, /** * Is the label hidden? */ hiddenLabel?: boolean, previewComponent: React.ElementType

, } export const FileSelectBox = React.forwardRef( ( { label = '', hint = '', border = false, block = false, enhanced: enhancedProp = false, hiddenLabel = false, multiple = false, onChange, disabled = false, className, id: idProp, previewComponent: FilePreviewComponent, ...etcProps }: FileSelectBoxProps, forwardedRef, ) => { const { clientSide } = useClientSide({ clientSide: enhancedProp }); const [fileList, setFileList] = React.useState(); const [lastUpdated, setLastUpdated] = React.useState(); const defaultRef = React.useRef(null); const ref = forwardedRef ?? defaultRef; const labelId = React.useId(); const defaultId = React.useId(); const id = idProp ?? defaultId; const doSetFileList: React.ChangeEventHandler = (e) => { if (enhancedProp) { setFileList(e.currentTarget.files as FileList); setLastUpdated(Date.now()); } onChange?.(e); }; const doClearFileList: React.MouseEventHandler = (e) => { e.preventDefault(); if (!(typeof ref === 'object' && ref)) { return; } const { current } = ref; if (!current) { return; } current.value = ''; setFileList(undefined); setLastUpdated(Date.now()); setTimeout(() => { delegateTriggerEvent('change', current); }); }; const cancelEvent = (e: React.DragEvent) => { e.stopPropagation(); e.preventDefault(); }; const handleDropZone: React.DragEventHandler = async (e) => { cancelEvent(e); if (!(typeof ref === 'object' && ref)) { return; } const { current } = ref; if (!current) { return; } const { dataTransfer } = e; const { files } = dataTransfer; if (!(files && files.length > 0)) { return; } setFileList(current.files = files); setLastUpdated(Date.now()); setTimeout(() => { delegateTriggerEvent('change', current); }); }; const filesCount = fileList?.length ?? 0; return (

); } ); FileSelectBox.displayName = 'FileSelectBox';