import * as React from 'react' import { runInAction } from 'mobx' import { eventManager as EventManager } from '@packages/runner-shared' import State from '../lib/state' /** * SplitPane hierarchy looks like this: * ```jsx *
*
..
* ... *
*``` * we need to set these to display: none during cy.screenshot. */ export function useScreenshotHandler ({ eventManager, state, splitPaneRef }: { eventManager: typeof EventManager state: State splitPaneRef: React.MutableRefObject<{ splitPane: HTMLDivElement }> }) { const showPane = () => { if (!splitPaneRef.current) { return } splitPaneRef.current.splitPane.firstElementChild.classList.remove('d-none') splitPaneRef.current.splitPane.querySelector('[role="presentation"]').classList.remove('d-none') const iframe = document.querySelector('.aut-iframe') iframe.classList.remove('aut-iframe-screenshotting') } const hidePane = () => { if (!splitPaneRef.current) { return } splitPaneRef.current.splitPane.firstElementChild.classList.add('d-none') splitPaneRef.current.splitPane.querySelector('[role="presentation"]').classList.add('d-none') const iframe = document.querySelector('.aut-iframe') iframe.classList.add('aut-iframe-screenshotting') } React.useEffect(() => { const onBeforeScreenshot = () => { runInAction(() => { state.setScreenshotting(true) hidePane() }) } eventManager.on('before:screenshot', onBeforeScreenshot) const revertFromScreenshotting = () => { runInAction(() => { state.setScreenshotting(false) showPane() }) } eventManager.on('after:screenshot', revertFromScreenshotting) eventManager.on('run:start', revertFromScreenshotting) return () => { eventManager.off('before:screenshot', onBeforeScreenshot) eventManager.off('after:screenshot', revertFromScreenshotting) eventManager.off('run:start', revertFromScreenshotting) } // eslint-disable-next-line react-hooks/exhaustive-deps }, []) }