1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-27 10:32:58 +02:00
joplin/packages/pdf-viewer/FullViewer.tsx
2022-10-26 16:04:08 +01:00

128 lines
3.5 KiB
TypeScript

import { useRef, useState, useCallback } from 'react';
import * as React from 'react';
import usePdfDocument from './hooks/usePdfDocument';
import VerticalPages from './VerticalPages';
import MessageService from './messageService';
import { DownloadButton, PrintButton, OpenLinkButton, CloseButton } from './ui/IconButtons';
import ZoomControls from './ui/ZoomControls';
import styled from 'styled-components';
import GotoInput from './ui/GotoPage';
require('./fullScreen.css');
const TitleWrapper = styled.div`
font-size: 0.7rem;
font-weight: 400;
display: flex;
align-items: start;
flex-direction: column;
min-width: 10rem;
max-width: 18rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--secondary);
padding: 0.2rem 0.6rem;
height: 100%;
width: 100%;
justify-content: center;
`;
const Title = styled.div`
font-size: 0.9rem;
font-weight: bold;
margin-bottom: 0.2rem;
color: var(--primary);
overflow: hidden;
`;
export interface FullViewerProps {
pdfPath: string;
isDarkTheme: boolean;
messageService: MessageService;
startPage: number;
title: string;
}
export default function FullViewer(props: FullViewerProps) {
const pdfDocument = usePdfDocument(props.pdfPath);
const [zoom, setZoom] = useState<number>(1);
const [startPage, setStartPage] = useState<number>(props.startPage || 1);
const [selectedPage, setSelectedPage] = useState<number>(startPage);
const mainViewerRef = useRef<HTMLDivElement>(null);
const thubmnailRef = useRef<HTMLDivElement>(null);
const onActivePageChange = useCallback((pageNo: number) => {
setSelectedPage(pageNo);
}, []);
const goToPage = useCallback((pageNo: number) => {
if (pageNo < 1 || pageNo > pdfDocument.pageCount || pageNo === selectedPage) return;
setSelectedPage(pageNo);
setStartPage(pageNo);
}, [pdfDocument, selectedPage]);
if (!pdfDocument) {
return (
<div className="full-app loading">
<div></div>
</div>);
}
return (
<div className="full-app">
<div className="top-bar">
<div>
<TitleWrapper>
<Title title={props.title}>{props.title}</Title>
<div>{selectedPage} of {pdfDocument.pageCount} pages</div>
</TitleWrapper>
</div>
<div>
<ZoomControls onChange={setZoom} zoom={zoom} size={1} />
<OpenLinkButton onClick={props.messageService.openExternalViewer} size={1.3} />
<PrintButton onClick={pdfDocument?.printPdf} size={1.3}/>
<DownloadButton onClick={pdfDocument?.downloadPdf} size={1.3}/>
<GotoInput onChange={goToPage} size={1.3} pageCount={pdfDocument.pageCount} currentPage={selectedPage} />
</div>
<div>
<CloseButton onClick={props.messageService.close} size={1.3} />
</div>
</div>
<div className="viewers dark-bg">
<div className="pane thumbnail-pane" ref={thubmnailRef}>
<VerticalPages
pdfDocument={pdfDocument}
isDarkTheme={true}
rememberScroll={false}
container={thubmnailRef}
pageGap={16}
widthPercent={86}
showPageNumbers={true}
selectedPage={selectedPage}
onPageClick={goToPage}
textSelectable={false}
zoom={1}
/>
</div>
<div className="pane main-pane" ref={mainViewerRef}>
<VerticalPages
pdfDocument={pdfDocument}
isDarkTheme={true}
rememberScroll={false}
container={mainViewerRef}
zoom={zoom}
pageGap={5}
anchorPage={startPage}
onActivePageChange={onActivePageChange}
textSelectable={true}
onTextSelect={props.messageService.textSelected}
showPageNumbers={false}
/>
</div>
</div>
</div>
);
}