mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-29 04:33:48 -05:00
Merge pull request #8909 from overleaf/ae-7734-auto-compile
Only autocompile when the PDF preview is open GitOrigin-RevId: f1b2fa934da227c046c990fc86dbf78d6501a408
This commit is contained in:
parent
106411085f
commit
c6b0d988f9
4 changed files with 64 additions and 1 deletions
|
@ -32,6 +32,7 @@ LayoutContext.Provider.propTypes = {
|
||||||
leftMenuShown: PropTypes.bool,
|
leftMenuShown: PropTypes.bool,
|
||||||
setLeftMenuShown: PropTypes.func.isRequired,
|
setLeftMenuShown: PropTypes.func.isRequired,
|
||||||
pdfLayout: PropTypes.oneOf(['sideBySide', 'flat']).isRequired,
|
pdfLayout: PropTypes.oneOf(['sideBySide', 'flat']).isRequired,
|
||||||
|
pdfPreviewOpen: PropTypes.bool,
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,6 +112,9 @@ export function LayoutProvider({ children }) {
|
||||||
isRedundant: detachIsRedundant,
|
isRedundant: detachIsRedundant,
|
||||||
} = useDetachLayout()
|
} = useDetachLayout()
|
||||||
|
|
||||||
|
const pdfPreviewOpen =
|
||||||
|
pdfLayout === 'sideBySide' || view === 'pdf' || detachRole === 'detacher'
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (debugPdfDetach) {
|
if (debugPdfDetach) {
|
||||||
console.log('Layout Effect', {
|
console.log('Layout Effect', {
|
||||||
|
@ -151,6 +155,7 @@ export function LayoutProvider({ children }) {
|
||||||
chatIsOpen,
|
chatIsOpen,
|
||||||
leftMenuShown,
|
leftMenuShown,
|
||||||
pdfLayout,
|
pdfLayout,
|
||||||
|
pdfPreviewOpen,
|
||||||
reviewPanelOpen,
|
reviewPanelOpen,
|
||||||
setChatIsOpen,
|
setChatIsOpen,
|
||||||
setLeftMenuShown,
|
setLeftMenuShown,
|
||||||
|
@ -169,6 +174,7 @@ export function LayoutProvider({ children }) {
|
||||||
chatIsOpen,
|
chatIsOpen,
|
||||||
leftMenuShown,
|
leftMenuShown,
|
||||||
pdfLayout,
|
pdfLayout,
|
||||||
|
pdfPreviewOpen,
|
||||||
reviewPanelOpen,
|
reviewPanelOpen,
|
||||||
setChatIsOpen,
|
setChatIsOpen,
|
||||||
setLeftMenuShown,
|
setLeftMenuShown,
|
||||||
|
|
|
@ -28,6 +28,7 @@ import { useProjectContext } from './project-context'
|
||||||
import { useEditorContext } from './editor-context'
|
import { useEditorContext } from './editor-context'
|
||||||
import { buildFileList } from '../../features/pdf-preview/util/file-list'
|
import { buildFileList } from '../../features/pdf-preview/util/file-list'
|
||||||
import { useSplitTestContext } from './split-test-context'
|
import { useSplitTestContext } from './split-test-context'
|
||||||
|
import { useLayoutContext } from './layout-context'
|
||||||
|
|
||||||
export const LocalCompileContext = createContext()
|
export const LocalCompileContext = createContext()
|
||||||
|
|
||||||
|
@ -87,6 +88,8 @@ export function LocalCompileProvider({ children }) {
|
||||||
|
|
||||||
const { splitTestVariants } = useSplitTestContext()
|
const { splitTestVariants } = useSplitTestContext()
|
||||||
|
|
||||||
|
const { pdfPreviewOpen } = useLayoutContext()
|
||||||
|
|
||||||
// whether a compile is in progress
|
// whether a compile is in progress
|
||||||
const [compiling, setCompiling] = useState(false)
|
const [compiling, setCompiling] = useState(false)
|
||||||
|
|
||||||
|
@ -447,7 +450,10 @@ export function LocalCompileProvider({ children }) {
|
||||||
const codeCheckFailed = stopOnValidationError && autoCompileLintingError
|
const codeCheckFailed = stopOnValidationError && autoCompileLintingError
|
||||||
|
|
||||||
// the project is available for auto-compiling
|
// the project is available for auto-compiling
|
||||||
const canAutoCompile = Boolean(autoCompile && !codeCheckFailed)
|
// (autocompile is enabled, the PDF preview is open, and the code check (if enabled) hasn't failed)
|
||||||
|
const canAutoCompile = Boolean(
|
||||||
|
autoCompile && pdfPreviewOpen && !codeCheckFailed
|
||||||
|
)
|
||||||
|
|
||||||
// show that the project has pending changes
|
// show that the project has pending changes
|
||||||
const hasChanges = Boolean(canAutoCompile && uncompiled && compiledOnce)
|
const hasChanges = Boolean(canAutoCompile && uncompiled && compiledOnce)
|
||||||
|
|
|
@ -2,12 +2,24 @@ import localStorage from '../../../../frontend/js/infrastructure/local-storage'
|
||||||
import PdfPreview from '../../../../frontend/js/features/pdf-preview/components/pdf-preview'
|
import PdfPreview from '../../../../frontend/js/features/pdf-preview/components/pdf-preview'
|
||||||
import { EditorProviders } from '../../helpers/editor-providers'
|
import { EditorProviders } from '../../helpers/editor-providers'
|
||||||
import { mockScope } from './scope'
|
import { mockScope } from './scope'
|
||||||
|
import { useLayoutContext } from '../../../../frontend/js/shared/context/layout-context'
|
||||||
|
import { FC, useEffect } from 'react'
|
||||||
|
|
||||||
const storeAndFireEvent = (win: typeof window, key: string, value: unknown) => {
|
const storeAndFireEvent = (win: typeof window, key: string, value: unknown) => {
|
||||||
localStorage.setItem(key, value)
|
localStorage.setItem(key, value)
|
||||||
win.dispatchEvent(new StorageEvent('storage', { key }))
|
win.dispatchEvent(new StorageEvent('storage', { key }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Layout: FC<{ layout: string; view?: string }> = ({ layout, view }) => {
|
||||||
|
const { changeLayout } = useLayoutContext()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
changeLayout(layout, view)
|
||||||
|
}, [changeLayout, layout, view])
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
describe('<PdfPreview/>', function () {
|
describe('<PdfPreview/>', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
cy.interceptCompile()
|
cy.interceptCompile()
|
||||||
|
@ -285,6 +297,40 @@ describe('<PdfPreview/>', function () {
|
||||||
cy.findByText('Code check failed')
|
cy.findByText('Code check failed')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('does not run a compile on doc change if the PDF preview is not open', function () {
|
||||||
|
const scope = mockScope()
|
||||||
|
|
||||||
|
cy.mount(
|
||||||
|
<EditorProviders scope={scope}>
|
||||||
|
<Layout layout="flat" view="editor" />
|
||||||
|
<div className="pdf-viewer">
|
||||||
|
<PdfPreview />
|
||||||
|
</div>
|
||||||
|
</EditorProviders>
|
||||||
|
)
|
||||||
|
|
||||||
|
// wait for "compile on load" to finish
|
||||||
|
cy.findByRole('button', { name: 'Compiling…' })
|
||||||
|
cy.wait('@compile')
|
||||||
|
cy.findByRole('button', { name: 'Recompile' })
|
||||||
|
|
||||||
|
cy.window().then(win => {
|
||||||
|
cy.clock()
|
||||||
|
|
||||||
|
// switch on auto compile
|
||||||
|
storeAndFireEvent(win, 'autocompile_enabled:project123', true)
|
||||||
|
|
||||||
|
// fire a doc:changed event => compile
|
||||||
|
win.dispatchEvent(new CustomEvent('doc:changed'))
|
||||||
|
|
||||||
|
cy.tick(6000) // > AUTO_COMPILE_DEBOUNCE
|
||||||
|
|
||||||
|
cy.clock().invoke('restore')
|
||||||
|
})
|
||||||
|
|
||||||
|
cy.findByRole('button', { name: 'Recompile' })
|
||||||
|
})
|
||||||
|
|
||||||
describe('displays error messages', function () {
|
describe('displays error messages', function () {
|
||||||
const compileErrorStatuses = {
|
const compileErrorStatuses = {
|
||||||
'clear-cache':
|
'clear-cache':
|
||||||
|
@ -455,6 +501,7 @@ describe('<PdfPreview/>', function () {
|
||||||
|
|
||||||
// wait for "compile on load" to finish
|
// wait for "compile on load" to finish
|
||||||
cy.findByRole('button', { name: 'Compiling…' })
|
cy.findByRole('button', { name: 'Compiling…' })
|
||||||
|
cy.wait('@compile')
|
||||||
cy.findByRole('button', { name: 'Recompile' })
|
cy.findByRole('button', { name: 'Recompile' })
|
||||||
|
|
||||||
// show the logs UI
|
// show the logs UI
|
||||||
|
|
|
@ -10,4 +10,8 @@ export const mockScope = () => ({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
hasLintingError: false,
|
hasLintingError: false,
|
||||||
|
ui: {
|
||||||
|
view: 'editor',
|
||||||
|
pdfLayout: 'sideBySide',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue