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:
Alf Eaton 2022-07-21 09:31:31 +01:00 committed by Copybot
parent 106411085f
commit c6b0d988f9
4 changed files with 64 additions and 1 deletions

View file

@ -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,

View file

@ -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)

View file

@ -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

View file

@ -10,4 +10,8 @@ export const mockScope = () => ({
}, },
}, },
hasLintingError: false, hasLintingError: false,
ui: {
view: 'editor',
pdfLayout: 'sideBySide',
},
}) })