import { useState } from 'react'; import { DropzoneOptions, useDropzone } from 'react-dropzone'; import styled from 'styled-components'; import { spacing, Stack, Wrap } from '../../spacing'; import { Button } from '../buttonv2/Buttonv2.component'; import { Icon } from '../icon/Icon.component'; import { Text } from '../text/Text.component'; const DropzoneContainer = styled.div<{ isDragActive: boolean; variant: 'inline' | 'large'; }>` padding: ${spacing.r24}; border: ${spacing.f2} dashed ${(props) => !props.isDragActive ? props.theme.textSecondary : props.theme.selectedActive}; box-sizing: border-box; display: flex; ${(props) => (props.variant === 'large' ? `text-align: center;` : ``)} `; const FileList = styled.div` max-height: 100px; overflow-y: auto; flex: 1; width: 100%; `; const FileListItem = styled(Wrap)` align-items: baseline; &:hover { background: ${(props) => props.theme.selectedActive}; } `; const defaultDropzoneLabels = { doesnt_meet_our_requirements: "doesn't meet our requirements", or: 'OR', label: 'Drag and drop files and folders here', buttonLabel: 'Add files', buttonAddMoreLabel: 'Add more files', }; export function Dropzone({ labels, onChange, variant, ...dropzoneOptions }: DropzoneOptions & { variant: 'inline' | 'large'; labels?: Partial; onChange?: (files: File[]) => void; }) { labels = { ...defaultDropzoneLabels, ...labels }; const [acceptedFiles, setAcceptedFiles] = useState([]); const { getRootProps, getInputProps, isDragActive, fileRejections } = useDropzone({ ...dropzoneOptions, onDrop: (acceptedFiles, rejectedFiles, e) => { const { multiple } = dropzoneOptions; setAcceptedFiles((alreadyAcceptedFiles) => { const singleFileAlreadyHasFile = !multiple && alreadyAcceptedFiles.length === 1; const newAcceptedFiles = singleFileAlreadyHasFile ? alreadyAcceptedFiles : [...alreadyAcceptedFiles, ...acceptedFiles]; if (onChange) { onChange(newAcceptedFiles); } return newAcceptedFiles; }); if (dropzoneOptions.onDrop) { dropzoneOptions.onDrop(acceptedFiles, rejectedFiles, e); } }, }); const { multiple } = dropzoneOptions; const { onClick, ...rootProps } = getRootProps(); const removeFile = (fileIndex: number) => { setAcceptedFiles((alreadyAcceptedFiles) => { const newAcceptedFiles = [...alreadyAcceptedFiles]; newAcceptedFiles.splice(fileIndex, 1); if (onChange) { onChange(newAcceptedFiles); } return newAcceptedFiles; }); }; return (
{!multiple && acceptedFiles.length === 1 ? ( {acceptedFiles[0].name}
{fileRejections.length > 0 ? ( fileRejections.map((rejection) => rejection.file.name) + ' ' + labels.doesnt_meet_our_requirements ) : ( <>  )}
); }