/* Copyright 2026 Marimo. All rights reserved. */ import { useAtom, useAtomValue } from "jotai"; import { atomWithStorage } from "jotai/utils"; import { DatabaseIcon, VariableIcon } from "lucide-react"; import React, { useCallback } from "react"; import { connectionsAtom, DataSources, } from "@/components/datasources/datasources"; import { Accordion } from "@/components/ui/accordion"; import { VariableTable } from "@/components/variables/variables-table"; import { useCellIds } from "@/core/cells/cells"; import { datasetTablesAtom } from "@/core/datasets/state"; import { useVariables } from "@/core/variables/state"; import { jotaiJsonStorage } from "@/utils/storage/jotai"; import { PanelAccordionContent, PanelAccordionItem, PanelAccordionTrigger, PanelBadge, } from "./components"; type OpenSections = "variables" | "datasources"; interface SessionPanelState { openSections: OpenSections[]; hasUserInteracted: boolean; } const sessionPanelAtom = atomWithStorage( "marimo:session-panel:state", { openSections: ["variables"], hasUserInteracted: false }, jotaiJsonStorage, ); const SessionPanel: React.FC = () => { const variables = useVariables(); const cellIds = useCellIds(); const tables = useAtomValue(datasetTablesAtom); const dataConnections = useAtomValue(connectionsAtom); const [state, setState] = useAtom(sessionPanelAtom); const datasourcesCount = tables.length + dataConnections.length; // If the user hasn't interacted with the accordion and there are connections, show datasources open const openSections = !state.hasUserInteracted && datasourcesCount > 0 ? [...new Set([...state.openSections, "datasources"])] : state.openSections; const handleValueChange = useCallback( (value: OpenSections[]) => { setState({ openSections: value, hasUserInteracted: true, }); }, [setState], ); const isDatasourcesOpen = openSections.includes("datasources"); const showDatasourcesBadge = !isDatasourcesOpen && datasourcesCount > 0; return ( Data sources {showDatasourcesBadge && {datasourcesCount}} Variables {Object.keys(variables).length === 0 ? (
No variables defined
) : ( )}
); }; export default SessionPanel;