/* Copyright 2026 Marimo. All rights reserved. */ import { useAtomValue } from "jotai"; import { ArrowLeftIcon } from "lucide-react"; import { useEffect } from "react"; import { AppContainer } from "@/components/editor/app-container"; import { AppHeader } from "@/components/editor/header/app-header"; import { Spinner } from "@/components/icons/spinner"; import { buttonVariants } from "@/components/ui/button"; import { DelayMount } from "@/components/utils/delay-mount"; import { cn } from "@/utils/cn"; import { CellsRenderer } from "../components/editor/renderers/cells-renderer"; import { notebookIsRunningAtom, useCellActions } from "./cells/cells"; import type { AppConfig } from "./config/config-schema"; import { RuntimeState } from "./kernel/RuntimeState"; import { getSessionId } from "./kernel/session"; import { useRequestClient } from "./network/requests"; import { isAppConnecting } from "./websocket/connection-utils"; import { useMarimoKernelConnection } from "./websocket/useMarimoKernelConnection"; interface AppProps { appConfig: AppConfig; } export const RunApp: React.FC = ({ appConfig }) => { const { setCells } = useCellActions(); const { sendComponentValues } = useRequestClient(); // Initialize RuntimeState event-listeners useEffect(() => { RuntimeState.INSTANCE.start(sendComponentValues); return () => { RuntimeState.INSTANCE.stop(); }; }, []); const { connection } = useMarimoKernelConnection({ autoInstantiate: true, setCells: setCells, sessionId: getSessionId(), }); const isRunning = useAtomValue(notebookIsRunningAtom); const isConnecting = isAppConnecting(connection.state); const renderCells = () => { // If we are connecting for more than 2 seconds, show a spinner if (isConnecting) { return (

Connecting...

); } return ; }; const galleryHref = (() => { if (typeof window === "undefined") { return null; } const url = new URL(window.location.href); if (!url.searchParams.has("file")) { return null; } url.searchParams.delete("file"); const search = url.searchParams.toString(); return search ? `${url.pathname}?${search}` : url.pathname; })(); return ( {galleryHref && (
Back
)}
{renderCells()}
); };