diff --git a/packages/api/src/queue-processor.ts b/packages/api/src/queue-processor.ts index 8f4231685..cfa587243 100644 --- a/packages/api/src/queue-processor.ts +++ b/packages/api/src/queue-processor.ts @@ -176,9 +176,9 @@ export const createWorker = (connection: ConnectionOptions) => case 'save-page': { return savePageJob(job.data, job.attemptsMade) } - // case 'update-pdf-content': { - // return updatePDFContentJob(job.data) - // } + case 'update-pdf-content': { + return updatePDFContentJob(job.data) + } case THUMBNAIL_JOB: return findThumbnail(job.data) case TRIGGER_RULE_JOB_NAME: diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index a2f6fb75f..f557873ad 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -510,12 +510,12 @@ export const saveArticleReadingProgressResolver = authorized< } } - if (env.redis.cache && env.redis.mq) { - if (force) { - // clear any cached values. - await clearCachedReadingPosition(uid, id) - } + if (env.redis.cache && force) { + // clear any cached values. + await clearCachedReadingPosition(uid, id) + } + if (env.redis.cache && env.redis.mq && !force) { // If redis caching and queueing are available we delay this write const updatedProgress = await dataSources.readingProgress.updateReadingProgress(uid, id, { diff --git a/packages/web/components/templates/article/PDFDisplaySettingsModal.tsx b/packages/web/components/templates/article/PDFDisplaySettingsModal.tsx index 41a5ac510..f6f7ab5de 100644 --- a/packages/web/components/templates/article/PDFDisplaySettingsModal.tsx +++ b/packages/web/components/templates/article/PDFDisplaySettingsModal.tsx @@ -59,6 +59,17 @@ function PDFSettings(props: SettingsProps): JSX.Element { initialValue: true, isSessionStorage: false, }) + const [rememberLatestPage, setLatestPage] = usePersistedState({ + key: 'reader-remember-latest-page', + initialValue: true, + isSessionStorage: false, + }) + + const [useNativeReader, setUseNativeReader] = usePersistedState({ + key: 'reader-use-native-reader', + initialValue: false, + isSessionStorage: false, + }) return ( + + + + + { + setLatestPage(checked) + document.dispatchEvent(new Event('pdfReaderUpdateSettings')) + }} + > + + + + + + + + { + setUseNativeReader(checked) + document.dispatchEvent(new Event('pdfReaderUpdateSettings')) + }} + > + + + + {/* (0) const [showSearch, setShowSearch] = useState(false) const [showToolbar, setShowToolbar] = useState(true) + const [saveLatestPage, setSaveLatestPage] = useState(true); + const [sidebarActive, setSidebarActive] = useState(false) const createHighlight = useCreateHighlight() @@ -69,8 +71,7 @@ export default function PdfArticleContainer(props: PdfArticleContainerProps) { const pdfScriptingManager = new pdfjsViewer.PDFScriptingManager({ eventBus, - sandboxBundleSrc: - window.location.origin + '/pdfjs-dist/pdf.sandbox.mjs', + sandboxBundleSrc: window.location.origin + '/pdfjs-dist/pdf.sandbox.mjs', }) const pdfViewer = new pdfjsViewer.PDFViewer({ @@ -100,11 +101,19 @@ export default function PdfArticleContainer(props: PdfArticleContainerProps) { useEffect(() => { // Uses the existing mechanism to hide the reader toolbar from pspdfkit - document.addEventListener('pdfReaderUpdateSettings', () => { + const updateReaderSettings = () => { const show = localStorage.getItem('reader-show-pdf-tool-bar') const showBar = show ? JSON.parse(show) == true : false setShowToolbar(showBar) - }) + + const latestPage = localStorage.getItem('reader-remember-latest-page') + const latestPageSave = latestPage ? JSON.parse(latestPage) == true : false + setSaveLatestPage(latestPageSave) + } + + document.addEventListener('pdfReaderUpdateSettings', updateReaderSettings) + updateReaderSettings(); + ;(async () => { const pdfViewer = await createPdfViewer() const pdfDocument = await loadPdfDocument() @@ -174,6 +183,7 @@ export default function PdfArticleContainer(props: PdfArticleContainerProps) { containerRef={containerRef} eventBus={eventBus} sidebarActive={sidebarActive} + saveLatestPage={saveLatestPage} pdfViewer={pdfViewer} articleMutations={{ createHighlightMutation: async (input: CreateHighlightInput) => { diff --git a/packages/web/components/templates/article/pdf.js/PdfViewer.tsx b/packages/web/components/templates/article/pdf.js/PdfViewer.tsx index 42e2ec991..887aa54eb 100644 --- a/packages/web/components/templates/article/pdf.js/PdfViewer.tsx +++ b/packages/web/components/templates/article/pdf.js/PdfViewer.tsx @@ -32,6 +32,8 @@ export type PdfArticleContainerProps = { sidebarActive: boolean articleMutations: ArticleMutations + + saveLatestPage: boolean } export default function PdfViewer(props: PdfArticleContainerProps) { @@ -372,11 +374,13 @@ export default function PdfViewer(props: PdfArticleContainerProps) { props.containerRef.current.clientHeight) / props.containerRef.current.scrollHeight + console.log(currentPageNum, props.saveLatestPage) await props.articleMutations.articleReadingProgressMutation({ id: props.article.id, readingProgressTopPercent: bottomProgress * 100, readingProgressPercent: bottomProgress * 100, readingProgressAnchorIndex: currentPageNum + 1, + force: !props.saveLatestPage // Force will overwrite, even if it's a previous page num. }) } }, 2500) diff --git a/packages/web/pages/[username]/[slug]/index.tsx b/packages/web/pages/[username]/[slug]/index.tsx index 4e24b2f0b..7b1f4dd12 100644 --- a/packages/web/pages/[username]/[slug]/index.tsx +++ b/packages/web/pages/[username]/[slug]/index.tsx @@ -39,7 +39,16 @@ import { import { useGetViewer } from '../../../lib/networking/viewer/useGetViewer' const PdfArticleContainerNoSSR = dynamic( - () => import(`./../../../components/templates/article/pdf.js/PdfArticleContainer`), + () => + import( + `./../../../components/templates/article/pdf.js/PdfArticleContainer` + ), + { ssr: false } +) + +const NativePdfArticleContainer = dynamic( + () => + import(`./../../../components/templates/article/NativePdfArticleContainer`), { ssr: false } ) @@ -52,6 +61,7 @@ export default function Reader(): JSX.Element { const router = useRouter() const [showEditModal, setShowEditModal] = useState(false) const [showHighlightsModal, setShowHighlightsModal] = useState(false) + const [useNativePdfReader, setUseNativePdfReader] = useState(false) const { data: viewerData } = useGetViewer() const readerSettings = useReaderSettings() const archiveItem = useArchiveItem() @@ -223,6 +233,28 @@ export default function Reader(): JSX.Element { ] ) + useEffect(() => { + const updateReaderSettings = () => { + const native = localStorage.getItem('reader-use-native-reader') + const nativeReader = native ? JSON.parse(native) == true : false + setUseNativePdfReader(nativeReader) + } + + if (window) { + updateReaderSettings() + document.addEventListener('pdfReaderUpdateSettings', updateReaderSettings) + } + + return () => { + if (window) { + document.removeEventListener( + 'pdfReaderUpdateSettings', + updateReaderSettings + ) + } + } + }, []) + useEffect(() => { const archive = () => { actionHandler('archive') @@ -529,14 +561,24 @@ export default function Reader(): JSX.Element { /> ) : null} - {libraryItem && viewerData && libraryItem.contentReader == 'PDF' && ( - - )} + {libraryItem && + viewerData && + libraryItem.contentReader == 'PDF' && + (useNativePdfReader ? ( + + ) : ( + + ))} {libraryItem && viewerData && libraryItem.contentReader == 'WEB' && ( .page > .canvasWrapper { +.pdfViewer .canvasWrapper { box-shadow: 3px 3px 8px #0000001a; }