mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Update react-pdf and improve PDFViewer
This commit is contained in:
parent
feb9618d44
commit
53e75b9ddd
37
rsconcept/frontend/package-lock.json
generated
37
rsconcept/frontend/package-lock.json
generated
|
@ -22,7 +22,7 @@
|
||||||
"react-icons": "^4.12.0",
|
"react-icons": "^4.12.0",
|
||||||
"react-intl": "^6.6.8",
|
"react-intl": "^6.6.8",
|
||||||
"react-loader-spinner": "^5.4.5",
|
"react-loader-spinner": "^5.4.5",
|
||||||
"react-pdf": "^7.7.3",
|
"react-pdf": "^9.0.0",
|
||||||
"react-router-dom": "^6.23.1",
|
"react-router-dom": "^6.23.1",
|
||||||
"react-select": "^5.8.0",
|
"react-select": "^5.8.0",
|
||||||
"react-tabs": "^6.0.2",
|
"react-tabs": "^6.0.2",
|
||||||
|
@ -8972,27 +8972,27 @@
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/path2d-polyfill": {
|
"node_modules/path2d": {
|
||||||
"version": "2.0.1",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.0.tgz",
|
||||||
"integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==",
|
"integrity": "sha512-KdPAykQX6kmLSOO6Jpu2KNcCED7CKjmaBNGGNuctOsG0hgYO1OdYQaan6cYXJiG0WmXOwZZPILPBimu5QAIw3A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/pdfjs-dist": {
|
"node_modules/pdfjs-dist": {
|
||||||
"version": "3.11.174",
|
"version": "4.3.136",
|
||||||
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz",
|
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.3.136.tgz",
|
||||||
"integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==",
|
"integrity": "sha512-gzfnt1qc4yA+U46golPGYtU4WM2ssqP2MvFjKga8GEKOrEnzRPrA/9jogLLPYHiA3sGBPJ+p7BdAq+ytmw3jEg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18"
|
"node": ">=18"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"canvas": "^2.11.2",
|
"canvas": "^2.11.2",
|
||||||
"path2d-polyfill": "^2.0.1"
|
"path2d": "^0.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/picocolors": {
|
"node_modules/picocolors": {
|
||||||
|
@ -9517,18 +9517,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-pdf": {
|
"node_modules/react-pdf": {
|
||||||
"version": "7.7.3",
|
"version": "9.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.7.3.tgz",
|
"resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.0.0.tgz",
|
||||||
"integrity": "sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==",
|
"integrity": "sha512-J+pza8R2p9oNEOJOHIQJI4o5rFK7ji7bBl2IvsHvz1OOyphvuzVDo5tOJwWAFAbxYauCH3Kt8jOvcMJUOpxYZQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
"dequal": "^2.0.3",
|
"dequal": "^2.0.3",
|
||||||
"make-cancellable-promise": "^1.3.1",
|
"make-cancellable-promise": "^1.3.1",
|
||||||
"make-event-props": "^1.6.0",
|
"make-event-props": "^1.6.0",
|
||||||
"merge-refs": "^1.2.1",
|
"merge-refs": "^1.3.0",
|
||||||
"pdfjs-dist": "3.11.174",
|
"pdfjs-dist": "4.3.136",
|
||||||
"prop-types": "^15.6.2",
|
|
||||||
"tiny-invariant": "^1.0.0",
|
"tiny-invariant": "^1.0.0",
|
||||||
"warning": "^4.0.0"
|
"warning": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
@ -9536,9 +9535,9 @@
|
||||||
"url": "https://github.com/wojtekmaj/react-pdf?sponsor=1"
|
"url": "https://github.com/wojtekmaj/react-pdf?sponsor=1"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
||||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
||||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
"@types/react": {
|
"@types/react": {
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
"react-icons": "^4.12.0",
|
"react-icons": "^4.12.0",
|
||||||
"react-intl": "^6.6.8",
|
"react-intl": "^6.6.8",
|
||||||
"react-loader-spinner": "^5.4.5",
|
"react-loader-spinner": "^5.4.5",
|
||||||
"react-pdf": "^7.7.3",
|
"react-pdf": "^9.0.0",
|
||||||
"react-router-dom": "^6.23.1",
|
"react-router-dom": "^6.23.1",
|
||||||
"react-select": "^5.8.0",
|
"react-select": "^5.8.0",
|
||||||
"react-tabs": "^6.0.2",
|
"react-tabs": "^6.0.2",
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { UsersState } from '@/context/UsersContext';
|
||||||
|
|
||||||
import ErrorFallback from './ErrorFallback';
|
import ErrorFallback from './ErrorFallback';
|
||||||
|
|
||||||
pdfjs.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.js', import.meta.url).toString();
|
pdfjs.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();
|
||||||
|
|
||||||
const resetState = () => {
|
const resetState = () => {
|
||||||
console.log('Resetting state after error fallback');
|
console.log('Resetting state after error fallback');
|
||||||
|
|
|
@ -11,21 +11,23 @@ import Overlay from '../Overlay';
|
||||||
import PageControls from './PageControls';
|
import PageControls from './PageControls';
|
||||||
|
|
||||||
const MAXIMUM_WIDTH = 1000;
|
const MAXIMUM_WIDTH = 1000;
|
||||||
const MINIMUM_WIDTH = 320;
|
const MINIMUM_WIDTH = 300;
|
||||||
|
|
||||||
interface PDFViewerProps {
|
interface PDFViewerProps {
|
||||||
file?: string | ArrayBuffer | Blob;
|
file?: string | ArrayBuffer | Blob;
|
||||||
|
offsetXpx?: number;
|
||||||
|
minWidth?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
function PDFViewer({ file }: PDFViewerProps) {
|
function PDFViewer({ file, offsetXpx, minWidth = MINIMUM_WIDTH }: PDFViewerProps) {
|
||||||
const windowSize = useWindowSize();
|
const windowSize = useWindowSize();
|
||||||
|
|
||||||
const [pageCount, setPageCount] = useState(0);
|
const [pageCount, setPageCount] = useState(0);
|
||||||
const [pageNumber, setPageNumber] = useState(1);
|
const [pageNumber, setPageNumber] = useState(1);
|
||||||
|
|
||||||
const pageWidth = useMemo(() => {
|
const pageWidth = useMemo(() => {
|
||||||
return Math.max(MINIMUM_WIDTH, Math.min((windowSize?.width ?? 0) - 10, MAXIMUM_WIDTH));
|
return Math.max(minWidth, Math.min((windowSize?.width ?? 0) - (offsetXpx ?? 0) - 10, MAXIMUM_WIDTH));
|
||||||
}, [windowSize]);
|
}, [windowSize, offsetXpx, minWidth]);
|
||||||
|
|
||||||
function onDocumentLoadSuccess({ numPages }: PDFDocumentProxy) {
|
function onDocumentLoadSuccess({ numPages }: PDFDocumentProxy) {
|
||||||
setPageCount(numPages);
|
setPageCount(numPages);
|
||||||
|
@ -42,14 +44,14 @@ function PDFViewer({ file }: PDFViewerProps) {
|
||||||
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
||||||
</Overlay>
|
</Overlay>
|
||||||
<Page
|
<Page
|
||||||
className='pointer-events-none select-none sm:translate-x-0'
|
className='overflow-hidden pointer-events-none select-none'
|
||||||
renderTextLayer={false}
|
renderTextLayer={false}
|
||||||
renderAnnotationLayer={false}
|
renderAnnotationLayer={false}
|
||||||
pageNumber={pageNumber}
|
pageNumber={pageNumber}
|
||||||
width={pageWidth}
|
width={pageWidth}
|
||||||
canvasBackground={graphLightT.canvas.background}
|
canvasBackground={graphLightT.canvas.background}
|
||||||
/>
|
/>
|
||||||
<Overlay position='bottom-6 left-1/2 -translate-x-1/2' className='flex select-none'>
|
<Overlay position='bottom-3 left-1/2 -translate-x-1/2' className='flex select-none'>
|
||||||
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
||||||
</Overlay>
|
</Overlay>
|
||||||
</Document>
|
</Document>
|
||||||
|
|
|
@ -8,7 +8,7 @@ interface PageControlsProps {
|
||||||
|
|
||||||
function PageControls({ pageNumber, pageCount, setPageNumber }: PageControlsProps) {
|
function PageControls({ pageNumber, pageCount, setPageNumber }: PageControlsProps) {
|
||||||
return (
|
return (
|
||||||
<>
|
<div className='flex items-center'>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='clr-hover clr-text-controls'
|
className='clr-hover clr-text-controls'
|
||||||
|
@ -25,9 +25,9 @@ function PageControls({ pageNumber, pageCount, setPageNumber }: PageControlsProp
|
||||||
>
|
>
|
||||||
<IconPageLeft size='1.5rem' />
|
<IconPageLeft size='1.5rem' />
|
||||||
</button>
|
</button>
|
||||||
<p className='px-3 text-black text-nowrap'>
|
<div className='px-3 text-nowrap'>
|
||||||
Страница {pageNumber} из {pageCount}
|
Страница {pageNumber} из {pageCount}
|
||||||
</p>
|
</div>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='clr-hover clr-text-controls'
|
className='clr-hover clr-text-controls'
|
||||||
|
@ -44,7 +44,7 @@ function PageControls({ pageNumber, pageCount, setPageNumber }: PageControlsProp
|
||||||
>
|
>
|
||||||
<IconPageLast size='1.5rem' />
|
<IconPageLast size='1.5rem' />
|
||||||
</button>
|
</button>
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import useWindowSize from '@/hooks/useWindowSize';
|
||||||
import { HelpTopic } from '@/models/miscellaneous';
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
|
|
||||||
import HelpAccess from './items/HelpAccess';
|
import HelpAccess from './items/HelpAccess';
|
||||||
|
@ -33,11 +34,20 @@ import HelpTermGraph from './items/HelpTermGraph';
|
||||||
import HelpTerminologyControl from './items/HelpTerminologyControl';
|
import HelpTerminologyControl from './items/HelpTerminologyControl';
|
||||||
import HelpVersions from './items/HelpVersions';
|
import HelpVersions from './items/HelpVersions';
|
||||||
|
|
||||||
|
// PDF Viewer setup
|
||||||
|
const OFFSET_X_SMALL = 32;
|
||||||
|
const OFFSET_X_LARGE = 280;
|
||||||
|
|
||||||
|
const MIN_SIZE_SMALL = 300;
|
||||||
|
const MIN_SIZE_LARGE = 600;
|
||||||
|
|
||||||
interface TopicPageProps {
|
interface TopicPageProps {
|
||||||
topic: HelpTopic;
|
topic: HelpTopic;
|
||||||
}
|
}
|
||||||
|
|
||||||
function TopicPage({ topic }: TopicPageProps) {
|
function TopicPage({ topic }: TopicPageProps) {
|
||||||
|
const size = useWindowSize();
|
||||||
|
|
||||||
if (topic === HelpTopic.MAIN) return <HelpPortal />;
|
if (topic === HelpTopic.MAIN) return <HelpPortal />;
|
||||||
|
|
||||||
if (topic === HelpTopic.INTERFACE) return <HelpInterface />;
|
if (topic === HelpTopic.INTERFACE) return <HelpInterface />;
|
||||||
|
@ -72,7 +82,13 @@ function TopicPage({ topic }: TopicPageProps) {
|
||||||
if (topic === HelpTopic.INFO) return <HelpInfo />;
|
if (topic === HelpTopic.INFO) return <HelpInfo />;
|
||||||
if (topic === HelpTopic.INFO_RULES) return <HelpRules />;
|
if (topic === HelpTopic.INFO_RULES) return <HelpRules />;
|
||||||
if (topic === HelpTopic.INFO_CONTRIB) return <HelpContributors />;
|
if (topic === HelpTopic.INFO_CONTRIB) return <HelpContributors />;
|
||||||
if (topic === HelpTopic.INFO_PRIVACY) return <HelpPrivacy />;
|
if (topic === HelpTopic.INFO_PRIVACY)
|
||||||
|
return (
|
||||||
|
<HelpPrivacy
|
||||||
|
offsetXpx={size.isSmall ? OFFSET_X_SMALL : OFFSET_X_LARGE}
|
||||||
|
minWidth={size.isSmall ? MIN_SIZE_SMALL : MIN_SIZE_LARGE}
|
||||||
|
/>
|
||||||
|
);
|
||||||
if (topic === HelpTopic.INFO_API) return <HelpAPI />;
|
if (topic === HelpTopic.INFO_API) return <HelpAPI />;
|
||||||
|
|
||||||
if (topic === HelpTopic.EXTEOR) return <HelpExteor />;
|
if (topic === HelpTopic.EXTEOR) return <HelpExteor />;
|
||||||
|
|
|
@ -8,7 +8,7 @@ interface ViewTopicProps {
|
||||||
|
|
||||||
function ViewTopic({ topic }: ViewTopicProps) {
|
function ViewTopic({ topic }: ViewTopicProps) {
|
||||||
return (
|
return (
|
||||||
<AnimateFade key={topic} className='py-2 pl-6 pr-3 mx-auto'>
|
<AnimateFade key={topic} className='px-3 py-2 mx-auto'>
|
||||||
<TopicPage topic={topic} />
|
<TopicPage topic={topic} />
|
||||||
</AnimateFade>
|
</AnimateFade>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
import PDFViewer from '@/components/ui/PDFViewer';
|
import PDFViewer from '@/components/ui/PDFViewer';
|
||||||
import { resources } from '@/utils/constants';
|
import { resources } from '@/utils/constants';
|
||||||
|
|
||||||
function HelpPrivacy() {
|
interface HelpPrivacyProps {
|
||||||
|
offsetXpx: number;
|
||||||
|
minWidth: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
function HelpPrivacy({ offsetXpx, minWidth }: HelpPrivacyProps) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<PDFViewer file={resources.privacy_policy} />
|
<PDFViewer file={resources.privacy_policy} offsetXpx={offsetXpx} minWidth={minWidth} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user