diff --git a/src/hooks/project-hooks.tsx b/src/hooks/project-hooks.tsx index bc0a8f6fe..efd63ab19 100644 --- a/src/hooks/project-hooks.tsx +++ b/src/hooks/project-hooks.tsx @@ -60,6 +60,7 @@ export type LoadAction = "replaceProject" | "replaceActions"; interface ProjectContext { browserNavigationToEditor(): Promise; openEditor(focusVisible?: boolean): Promise; + hideSimulator(): Promise; project: MakeCodeProject; projectEdited: boolean; resetProject: () => void; @@ -306,12 +307,24 @@ export const ProjectProvider = ({ setProjectEdited, ] ); + + const hideSimulatorPromiseRef = useRef | null>(null); + + const hideSimulator = useCallback(async () => { + await doAfterEditorUpdate(() => Promise.resolve()); + hideSimulatorPromiseRef.current = + driverRef.current?.hideSimulator() ?? null; + await hideSimulatorPromiseRef.current; + }, [doAfterEditorUpdate, driverRef]); + const browserNavigationToEditor = useCallback(async () => { try { setProjectEdited(); - await doAfterEditorUpdate(() => { - return Promise.resolve(); - }); + await doAfterEditorUpdate(() => Promise.resolve()); + + // Wait for simulator to finish hiding before showing simulator. + await hideSimulatorPromiseRef.current; + await driverRef.current?.showSimulator(); return true; } catch (e) { if (e instanceof CodeEditorError) { @@ -323,7 +336,7 @@ export const ProjectProvider = ({ logging.error(e); return false; } - }, [doAfterEditorUpdate, logging, setProjectEdited]); + }, [doAfterEditorUpdate, driverRef, logging, setProjectEdited]); const resetProject = useStore((s) => s.resetProject); const loadDataset = useStore((s) => s.loadDataset); const loadFile = useCallback( @@ -493,6 +506,7 @@ export const ProjectProvider = ({ loadFile, openEditor, browserNavigationToEditor, + hideSimulator, project, projectEdited, resetProject, @@ -511,6 +525,7 @@ export const ProjectProvider = ({ loadFile, openEditor, browserNavigationToEditor, + hideSimulator, project, projectEdited, resetProject, diff --git a/src/pages/DataSamplesPage.tsx b/src/pages/DataSamplesPage.tsx index 2f09504dc..0cd8747b8 100644 --- a/src/pages/DataSamplesPage.tsx +++ b/src/pages/DataSamplesPage.tsx @@ -47,6 +47,7 @@ import { } from "../store"; import { tourElClassname } from "../tours"; import { createHomePageUrl, createTestingModelPageUrl } from "../urls"; +import { useProject } from "../hooks/project-hooks"; const DataSamplesPage = () => { const actions = useStore((s) => s.actions); @@ -55,12 +56,20 @@ const DataSamplesPage = () => { const projectId = useStore((s) => s.id); const [selectedActionIdx, setSelectedActionIdx] = useState(0); const navigate = useNavigate(); - + const { hideSimulator } = useProject(); + const initAsyncCalled = useRef(false); useEffect(() => { if (!projectSessionStorage.getProjectId() || !projectId) { return navigate(createHomePageUrl()); } - }, [navigate, projectId]); + // Hide simulator to avoid it from making noise. Editing data samples can + // cause the model to get invalidated and for the simulator to restart. + // Hiding it prevents it from loading and restarting. + if (!initAsyncCalled.current) { + initAsyncCalled.current = true; + void hideSimulator(); + } + }, [navigate, projectId, hideSimulator]); const trainModelFlowStart = useStore((s) => s.trainModelFlowStart); diff --git a/src/pages/TestingModelPage.tsx b/src/pages/TestingModelPage.tsx index 66fc500d7..9511a1f14 100644 --- a/src/pages/TestingModelPage.tsx +++ b/src/pages/TestingModelPage.tsx @@ -55,6 +55,8 @@ const TestingModelPage = () => { navigate(createDataSamplesPageUrl()); }, [navigate]); + const { hideSimulator } = useProject(); + const initAsyncCalled = useRef(false); useEffect(() => { if (!projectSessionStorage.getProjectId()) { return navigate(createHomePageUrl()); @@ -62,6 +64,11 @@ const TestingModelPage = () => { if (!model) { return navigateToDataSamples(); } + if (!initAsyncCalled.current) { + initAsyncCalled.current = true; + // Hide simulator to avoid it from making noise. + void hideSimulator(); + } startPredicting(bufferedData); return () => { @@ -69,6 +76,7 @@ const TestingModelPage = () => { }; }, [ bufferedData, + hideSimulator, model, navigate, navigateToDataSamples,