diff --git a/apps/member/src/components/common/Uploader/Uploader.tsx b/apps/member/src/components/common/Uploader/Uploader.tsx index c281a33c..80e27e8d 100644 --- a/apps/member/src/components/common/Uploader/Uploader.tsx +++ b/apps/member/src/components/common/Uploader/Uploader.tsx @@ -1,24 +1,92 @@ -import { ComponentPropsWithRef, forwardRef } from 'react'; -import { Input } from '@clab/design-system'; -import classNames from 'classnames'; +import { useCallback } from 'react'; +import { useDropzone } from 'react-dropzone'; +import { BsImage, BsFileEarmarkArrowUp } from 'react-icons/bs'; +import { Button } from '@clab/design-system'; -interface UploaderProps extends ComponentPropsWithRef<'input'> { - label: string; +interface UploaderProps { + label?: string; + accept: string; + maxFiles?: number; + multiple?: boolean; + onFileAccepted: (file: File | null) => void; } -const Uploader = forwardRef( - ({ label, className, ...rest }, ref) => { - return ( - - ); - }, -); +const Uploader = ({ + label, + accept, + maxFiles = 1, + multiple = false, + onFileAccepted, +}: UploaderProps) => { + /** + * 파일이 인식되었을 때 실행되는 콜백 함수입니다. + */ + const onDrop = useCallback( + (acceptedFiles: File[]) => { + const file = acceptedFiles[0]; + if (file) { + onFileAccepted(file); + } + }, + [onFileAccepted], + ); + /** + * 파일 선택 취소 시 실행되는 콜백 함수입니다. + */ + const onFileDialogCancel = useCallback(() => { + onFileAccepted(null); + }, [onFileAccepted]); + + /** + * Dropzone 라이브러리를 위한 설정값입니다. + */ + const { getRootProps, getInputProps, isDragActive, acceptedFiles } = + useDropzone({ + onDrop, + onFileDialogCancel, + maxFiles: maxFiles, + multiple: multiple, + accept: { [accept]: [] }, + }); + + return ( +
+ {label && } +
+ +
+ {acceptedFiles.length ? ( +
    + {acceptedFiles.map((file, index) => ( +
  • + {file.name} - {file.size} bytes +
  • + ))} +
  • + 총 {acceptedFiles.length}개의 파일이 첨부됐어요,  + 클릭하면 다시 업로드 할 수 있어요. +
  • +
+ ) : isDragActive ? ( + <> + +

파일이 인식됐어요, 지금 놓으시면 돼요!

+ + ) : ( + <> + +

파일을 여기로 끌어다 놓아주세요.

+

또는

+ + + )} +
+
+
+ ); +}; export default Uploader;