| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | 
							- import type { FC } from 'react'
 
- import { createPortal } from 'react-dom'
 
- import 'react-pdf-highlighter/dist/style.css'
 
- import { PdfHighlighter, PdfLoader } from 'react-pdf-highlighter'
 
- import { t } from 'i18next'
 
- import { RiCloseLine, RiZoomInLine, RiZoomOutLine } from '@remixicon/react'
 
- import React, { useState } from 'react'
 
- import { useHotkeys } from 'react-hotkeys-hook'
 
- import Loading from '@/app/components/base/loading'
 
- import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
 
- import Tooltip from '@/app/components/base/tooltip'
 
- type PdfPreviewProps = {
 
-   url: string
 
-   onCancel: () => void
 
- }
 
- const PdfPreview: FC<PdfPreviewProps> = ({
 
-   url,
 
-   onCancel,
 
- }) => {
 
-   const media = useBreakpoints()
 
-   const [scale, setScale] = useState(1)
 
-   const [position, setPosition] = useState({ x: 0, y: 0 })
 
-   const isMobile = media === MediaType.mobile
 
-   const zoomIn = () => {
 
-     setScale(prevScale => Math.min(prevScale * 1.2, 15))
 
-     setPosition({ x: position.x - 50, y: position.y - 50 })
 
-   }
 
-   const zoomOut = () => {
 
-     setScale((prevScale) => {
 
-       const newScale = Math.max(prevScale / 1.2, 0.5)
 
-       if (newScale === 1)
 
-         setPosition({ x: 0, y: 0 })
 
-       else
 
-         setPosition({ x: position.x + 50, y: position.y + 50 })
 
-       return newScale
 
-     })
 
-   }
 
-   useHotkeys('esc', onCancel)
 
-   useHotkeys('up', zoomIn)
 
-   useHotkeys('down', zoomOut)
 
-   return createPortal(
 
-     <div
 
-       className={`fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 ${!isMobile && 'p-8'}`}
 
-       onClick={e => e.stopPropagation()}
 
-       tabIndex={-1}
 
-     >
 
-       <div
 
-         className='h-[95vh] max-h-full w-[100vw] max-w-full overflow-hidden'
 
-         style={{ transform: `scale(${scale})`, transformOrigin: 'center', scrollbarWidth: 'none', msOverflowStyle: 'none' }}
 
-       >
 
-         <PdfLoader
 
-           workerSrc='/pdf.worker.min.mjs'
 
-           url={url}
 
-           beforeLoad={<div className='flex h-64 items-center justify-center'><Loading type='app' /></div>}
 
-         >
 
-           {(pdfDocument) => {
 
-             return (
 
-               <PdfHighlighter
 
-                 pdfDocument={pdfDocument}
 
-                 enableAreaSelection={event => event.altKey}
 
-                 scrollRef={() => { }}
 
-                 onScrollChange={() => { }}
 
-                 onSelectionFinished={() => null}
 
-                 highlightTransform={() => { return <div/> }}
 
-                 highlights={[]}
 
-               />
 
-             )
 
-           }}
 
-         </PdfLoader>
 
-       </div>
 
-       <Tooltip popupContent={t('common.operation.zoomOut')}>
 
-         <div className='absolute right-24 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
 
-           onClick={zoomOut}>
 
-           <RiZoomOutLine className='h-4 w-4 text-gray-500'/>
 
-         </div>
 
-       </Tooltip>
 
-       <Tooltip popupContent={t('common.operation.zoomIn')}>
 
-         <div className='absolute right-16 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
 
-           onClick={zoomIn}>
 
-           <RiZoomInLine className='h-4 w-4 text-gray-500'/>
 
-         </div>
 
-       </Tooltip>
 
-       <Tooltip popupContent={t('common.operation.cancel')}>
 
-         <div
 
-           className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/8 backdrop-blur-[2px]'
 
-           onClick={onCancel}>
 
-           <RiCloseLine className='h-4 w-4 text-gray-500'/>
 
-         </div>
 
-       </Tooltip>
 
-     </div>,
 
-     document.body,
 
-   )
 
- }
 
- export default PdfPreview
 
 
  |