{"version":3,"file":"PDFViewer.cjs","sources":["../../../src/components/FileViewer/PDFViewer.tsx"],"sourcesContent":["'use client'\n\nimport { type ComponentProps, type FC, memo, useCallback, useMemo, useState } from 'react'\nimport { Document, Page, pdfjs } from 'react-pdf'\n\nimport { Scroller } from '../Scroller'\n\nimport { ReactPDFStyle } from './generatedReactPDFStyle'\n\nimport type { ViewerProps } from './types'\n\nif (typeof window !== 'undefined') {\n  // iOS 17.3以下ではPromise.withResolversが未定義のため、polyfillを適用する\n  // @ts-expect-error\n  if (typeof window.Promise.withResolvers === 'undefined') {\n    // @ts-expect-error\n    window.Promise.withResolvers = function () {\n      let resolve, reject\n      const promise = new Promise((res, rej) => {\n        resolve = res\n        reject = rej\n      })\n      return { promise, resolve, reject }\n    }\n    // web workerもpolyfillされたものを読み込む\n    pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs`\n  } else {\n    // TODO: バンドラの関係でCDNから読み込んでいるが、smarthr-uiから配信するようにしたい\n    // pdfjs.GlobalWorkerOptions.workerSrc = new URL(\n    //   'pdfjs-dist/build/pdf.worker.min.mjs',\n    //   import.meta.url,\n    // ).toString()\n    pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`\n  }\n}\n\nconst options = {\n  // TODO: バンドラの関係でCDNから読み込んでいるが、smarthr-uiから配信するようにしたい\n  // 非latin文字を読み込むためのオプション\n  // 参考: https://github.com/wojtekmaj/react-pdf?tab=readme-ov-file#support-for-non-latin-characters\n  // cMapUrl: '/cmaps/',\n  cMapUrl: `//unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,\n} satisfies ComponentProps<typeof Document>['options']\n\nexport const PDFViewer: FC<ViewerProps> = memo(\n  ({ scale, rotation, file, width, onLoad, onPDFLoaded, onPassword, onLoadError }) => {\n    const [pdfNumPages, setPdfNumPages] = useState(1)\n\n    const onDocumentLoadSuccess = useCallback<\n      NonNullable<ComponentProps<typeof Document>['onLoadSuccess']>\n    >(({ numPages }) => {\n      setPdfNumPages(numPages)\n    }, [])\n\n    const onPageLoad: ComponentProps<typeof Page>['onLoadSuccess'] = useMemo(() => {\n      if (!onLoad && !onPDFLoaded) {\n        return undefined\n      }\n\n      return (page) => {\n        if (onPDFLoaded && rotation === undefined) {\n          onPDFLoaded(page.rotate)\n        }\n        // DocumentのLoadだとページごとの読み込みが考慮されないため\n        if (onLoad && page.pageNumber === pdfNumPages) {\n          onLoad()\n        }\n      }\n    }, [onLoad, onPDFLoaded, pdfNumPages, rotation])\n\n    return (\n      <>\n        {/* TODO: 外部CSSをsmarthr-uiから読み込んでもらえるようにする機構ができたら消す */}\n        <ReactPDFStyle />\n        <Scroller direction=\"both\" className=\"shr-h-full\">\n          <Document\n            options={options}\n            file={file.url}\n            onLoadSuccess={onDocumentLoadSuccess}\n            onLoadError={onLoadError}\n            rotate={rotation}\n            className=\"shr-flex shr-w-fit shr-flex-col shr-items-center shr-gap-1\"\n            externalLinkTarget=\"_blank\"\n            loading={null}\n            onPassword={onPassword}\n          >\n            {Array.from({ length: pdfNumPages }).map((_, i) => (\n              <Page\n                key={`page_${i}`}\n                pageNumber={i + 1}\n                width={width}\n                scale={scale}\n                className=\"shr-w-full\"\n                onLoadSuccess={onPageLoad}\n                loading={null}\n              />\n            ))}\n          </Document>\n        </Scroller>\n      </>\n    )\n  },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;AAWA;;;;;AAKI;;;;;AAKE;AACA;AACF;;;;;;;;;;;;AAWJ;AAEA;;;;;AAKE;;AAGK;;;;;AAUH;AACE;AACE;;;AAIA;AACE;;;;AAIA;;AAEJ;;;AAkCJ;;"}