{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/hooks/useFileReader/index.ts"],"sourcesContent":["import { useState } from 'react';\nimport {\n  type FileContent,\n  getFiles,\n  getReaderPromise,\n  inValidFileType,\n} from './useFileReader.utils';\n\ntype ReadType = 'readAsText' | 'readAsDataURL' | 'readAsArrayBuffer';\n\ninterface ReadFileOptions {\n  file: FileList | File;\n  readType: ReadType;\n  accepts?: string[];\n}\n\ninterface UseFileReaderReturnType {\n  readFile: ({\n    file,\n    readType,\n    accepts,\n  }: ReadFileOptions) => Promise<FileContent[]>;\n  fileContents: FileContent[];\n  isLoading: boolean;\n}\n\n/**\n * @description `File` 객체를 원하는 읽기 메서드(`readAsText`,`readAsDataURL`,`readAsArrayBuffer`)로 읽고, 읽은 파일 컨텐츠를 반환하는 커스텀 훅입니다.\n *\n * @returns {UseFileReaderReturnType} - 파일 읽기 함수, 파일 내용, 로딩 상태를 포함하는 객체를 반환합니다.\n * @property {{file, readType, accepts}: ReadFileOptions} readFile - 파일을 읽는 비동기 함수입니다.\n * - `file`: 읽을 파일 또는 파일 목록입니다.\n * - `readType`: 파일을 읽는 방법을 지정합니다. ('readAsText', 'readAsDataURL', 'readAsArrayBuffer' 중 하나)\n * - `accepts`: 허용되는 파일 유형의 배열입니다.\n * @property {FileContent[]} fileContents - 읽은 파일의 내용을 저장하는 상태입니다.\n * @property {boolean} isLoading - 파일을 읽는 동안 로딩 상태를 나타내는 상태입니다.\n *\n * @example\n * ```tsx\n * const { readFile, fileContents, isLoading } = useFileReader();\n *\n * const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n *   if(!e.target.files) return;\n *   readFile({ file: e.target.files, readType: 'readAsText' });\n * }\n * ```\n */\nexport function useFileReader(): UseFileReaderReturnType {\n  const [fileContents, setFileContents] = useState<FileContent[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const readFile = async ({\n    file,\n    readType,\n    accepts = [],\n  }: ReadFileOptions) => {\n    if (inValidFileType(file)) {\n      return [];\n    }\n\n    const files = getFiles(file, accepts);\n\n    setIsLoading(true);\n    setFileContents([]);\n\n    const readerPromises = files.map((file) => {\n      const reader = new FileReader();\n\n      try {\n        reader[readType](file);\n      } catch {\n        return Promise.reject(`Failed to read file ${file.name}`);\n      }\n\n      return getReaderPromise(reader, file);\n    });\n\n    const settledPromises = await Promise.allSettled(readerPromises);\n    const contents: FileContent[] = settledPromises.map((el, idx) => {\n      const isFulfilled = el.status === 'fulfilled';\n\n      return {\n        status: el.status,\n        readValue: isFulfilled ? el.value : el.reason,\n        originFile: isFulfilled ? files[idx] : null,\n      };\n    });\n\n    setFileContents(contents);\n    setIsLoading(false);\n\n    return contents;\n  };\n\n  return { readFile, fileContents, isLoading };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAgB,gBAAyC;CACvD,MAAM,CAAC,cAAc,mBAAmB,SAAwB,EAAE,CAAC;CACnE,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CAEjD,MAAM,WAAW,OAAO,EACtB,MACA,UACA,UAAU,EAAE,OACS;EACrB,IAAI,gBAAgB,KAAK,EACvB,OAAO,EAAE;EAGX,MAAM,QAAQ,SAAS,MAAM,QAAQ;EAErC,aAAa,KAAK;EAClB,gBAAgB,EAAE,CAAC;EAEnB,MAAM,iBAAiB,MAAM,KAAK,SAAS;GACzC,MAAM,SAAS,IAAI,YAAY;GAE/B,IAAI;IACF,OAAO,UAAU,KAAK;WAChB;IACN,OAAO,QAAQ,OAAO,uBAAuB,KAAK,OAAO;;GAG3D,OAAO,iBAAiB,QAAQ,KAAK;IACrC;EAGF,MAAM,YAA0B,MADF,QAAQ,WAAW,eAAe,EAChB,KAAK,IAAI,QAAQ;GAC/D,MAAM,cAAc,GAAG,WAAW;GAElC,OAAO;IACL,QAAQ,GAAG;IACX,WAAW,cAAc,GAAG,QAAQ,GAAG;IACvC,YAAY,cAAc,MAAM,OAAO;IACxC;IACD;EAEF,gBAAgB,SAAS;EACzB,aAAa,MAAM;EAEnB,OAAO;;CAGT,OAAO;EAAE;EAAU;EAAc;EAAW"}