mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 14:43:46 +01:00
Store the scroll position of the PDF per root doc (#20376)
GitOrigin-RevId: 561c38b7258df40f0e738fdc2575e23d9d15102a
This commit is contained in:
@@ -7,6 +7,8 @@ import {
|
|||||||
useMemo,
|
useMemo,
|
||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
|
Dispatch,
|
||||||
|
SetStateAction,
|
||||||
} from 'react'
|
} from 'react'
|
||||||
import useScopeValue from '../hooks/use-scope-value'
|
import useScopeValue from '../hooks/use-scope-value'
|
||||||
import useScopeValueSetterOnly from '../hooks/use-scope-value-setter-only'
|
import useScopeValueSetterOnly from '../hooks/use-scope-value-setter-only'
|
||||||
@@ -37,6 +39,10 @@ import { useFileTreePathContext } from '@/features/file-tree/contexts/file-tree-
|
|||||||
import { useUserSettingsContext } from '@/shared/context/user-settings-context'
|
import { useUserSettingsContext } from '@/shared/context/user-settings-context'
|
||||||
import { useFeatureFlag } from '@/shared/context/split-test-context'
|
import { useFeatureFlag } from '@/shared/context/split-test-context'
|
||||||
import { useEditorManagerContext } from '@/features/ide-react/context/editor-manager-context'
|
import { useEditorManagerContext } from '@/features/ide-react/context/editor-manager-context'
|
||||||
|
import {
|
||||||
|
PdfScrollPosition,
|
||||||
|
usePdfScrollPosition,
|
||||||
|
} from '@/shared/hooks/use-pdf-scroll-position'
|
||||||
|
|
||||||
type PdfFile = Record<string, any>
|
type PdfFile = Record<string, any>
|
||||||
|
|
||||||
@@ -61,14 +67,14 @@ export type CompileContext = {
|
|||||||
pdfFile?: PdfFile
|
pdfFile?: PdfFile
|
||||||
pdfUrl?: string
|
pdfUrl?: string
|
||||||
pdfViewer?: string
|
pdfViewer?: string
|
||||||
position?: Record<string, any>
|
position?: PdfScrollPosition
|
||||||
rawLog?: string
|
rawLog?: string
|
||||||
setAutoCompile: (value: boolean) => void
|
setAutoCompile: (value: boolean) => void
|
||||||
setDraft: (value: any) => void
|
setDraft: (value: any) => void
|
||||||
setError: (value: any) => void
|
setError: (value: any) => void
|
||||||
setHasLintingError: (value: any) => void // only for storybook
|
setHasLintingError: (value: any) => void // only for storybook
|
||||||
setHighlights: (value: any) => void
|
setHighlights: (value: any) => void
|
||||||
setPosition: (value: any) => void
|
setPosition: Dispatch<SetStateAction<PdfScrollPosition>>
|
||||||
setShowCompileTimeWarning: (value: any) => void
|
setShowCompileTimeWarning: (value: any) => void
|
||||||
setShowLogs: (value: boolean) => void
|
setShowLogs: (value: boolean) => void
|
||||||
toggleLogs: () => void
|
toggleLogs: () => void
|
||||||
@@ -171,7 +177,7 @@ export const LocalCompileProvider: FC = ({ children }) => {
|
|||||||
// the rootDocId used in the most recent compile request, which may not be the
|
// the rootDocId used in the most recent compile request, which may not be the
|
||||||
// same as the project rootDocId. This is used to calculate correct paths when
|
// same as the project rootDocId. This is used to calculate correct paths when
|
||||||
// parsing the compile logs
|
// parsing the compile logs
|
||||||
const lastCompileRootDocId = data?.rootDocId
|
const lastCompileRootDocId = data ? (data.rootDocId ?? rootDocId) : null
|
||||||
|
|
||||||
// callback to be invoked for PdfJsMetrics
|
// callback to be invoked for PdfJsMetrics
|
||||||
const [firstRenderDone, setFirstRenderDone] = useState(() => () => {})
|
const [firstRenderDone, setFirstRenderDone] = useState(() => () => {})
|
||||||
@@ -216,8 +222,7 @@ export const LocalCompileProvider: FC = ({ children }) => {
|
|||||||
// areas to highlight on the PDF, from synctex
|
// areas to highlight on the PDF, from synctex
|
||||||
const [highlights, setHighlights] = useState()
|
const [highlights, setHighlights] = useState()
|
||||||
|
|
||||||
// scroll position of the PDF
|
const [position, setPosition] = usePdfScrollPosition(lastCompileRootDocId)
|
||||||
const [position, setPosition] = usePersistedState(`pdf.position.${projectId}`)
|
|
||||||
|
|
||||||
// whether autocompile is switched on
|
// whether autocompile is switched on
|
||||||
const [autoCompile, setAutoCompile] = usePersistedState(
|
const [autoCompile, setAutoCompile] = usePersistedState(
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { Dispatch, SetStateAction, useEffect, useRef, useState } from 'react'
|
||||||
|
import customLocalStorage from '@/infrastructure/local-storage'
|
||||||
|
import { debugConsole } from '@/utils/debugging'
|
||||||
|
|
||||||
|
export type PdfScrollPosition = Record<string, any> | undefined
|
||||||
|
|
||||||
|
export const usePdfScrollPosition = (
|
||||||
|
lastCompileRootDocId: string | null | undefined
|
||||||
|
): [PdfScrollPosition, Dispatch<SetStateAction<PdfScrollPosition>>] => {
|
||||||
|
// scroll position of the PDF
|
||||||
|
const [position, setPosition] = useState<PdfScrollPosition>()
|
||||||
|
|
||||||
|
const lastCompileRootDocIdRef = useRef<string | null | undefined>(
|
||||||
|
lastCompileRootDocId
|
||||||
|
)
|
||||||
|
useEffect(() => {
|
||||||
|
lastCompileRootDocIdRef.current = lastCompileRootDocId
|
||||||
|
}, [lastCompileRootDocId])
|
||||||
|
|
||||||
|
const initialScrollPositionRef = useRef<PdfScrollPosition | null>(null)
|
||||||
|
|
||||||
|
// load the stored PDF scroll position when the compiled root doc changes
|
||||||
|
useEffect(() => {
|
||||||
|
if (lastCompileRootDocId) {
|
||||||
|
const position = customLocalStorage.getItem(
|
||||||
|
`pdf.position.${lastCompileRootDocId}`
|
||||||
|
)
|
||||||
|
if (position) {
|
||||||
|
debugConsole.log('loaded position for', lastCompileRootDocId, position)
|
||||||
|
initialScrollPositionRef.current = position
|
||||||
|
setPosition(position)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [lastCompileRootDocId])
|
||||||
|
|
||||||
|
// store the current root doc's PDF scroll position when it changes
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
lastCompileRootDocIdRef.current &&
|
||||||
|
position &&
|
||||||
|
position !== initialScrollPositionRef.current
|
||||||
|
) {
|
||||||
|
debugConsole.log(
|
||||||
|
'storing position for',
|
||||||
|
lastCompileRootDocIdRef.current,
|
||||||
|
position
|
||||||
|
)
|
||||||
|
customLocalStorage.setItem(
|
||||||
|
`pdf.position.${lastCompileRootDocIdRef.current}`,
|
||||||
|
position
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}, [position])
|
||||||
|
|
||||||
|
return [position, setPosition]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user