'use client'; import { useMemo } from 'react'; import type { BeadIssue } from '../../lib/types'; import type { ProjectScopeOption } from '../../lib/project-scope'; import { TopBar } from './top-bar'; import { LeftPanel } from './left-panel'; import { RightPanel } from './right-panel'; import { MobileNav } from './mobile-nav'; import { ThreadDrawer } from './thread-drawer'; import { useUrlState } from '../../hooks/use-url-state'; import { GraphView } from '../graph/graph-view'; import { SocialPage } from '../social/social-page'; import { SwarmPage } from '../swarm/swarm-page'; import { buildSocialCards } from '../../lib/social-cards'; import { buildSwarmCards } from '../../lib/swarm-cards'; export interface UnifiedShellProps { issues: BeadIssue[]; projectRoot: string; projectScopeKey: string; projectScopeOptions: ProjectScopeOption[]; projectScopeMode: 'single' | 'aggregate'; } export function UnifiedShell({ issues, }: UnifiedShellProps) { const { view, taskId, setTaskId, swarmId, setSwarmId, graphTab, setGraphTab, panel, drawer, setDrawer } = useUrlState(); const socialCards = useMemo(() => buildSocialCards(issues), [issues]); const swarmCards = useMemo(() => buildSwarmCards(issues), [issues]); const selectedSocialCard = taskId ? socialCards.find(c => c.id === taskId) : null; const selectedSwarmCard = swarmId ? swarmCards.find(c => c.swarmId === swarmId) : null; const handleGraphSelect = (id: string) => { setTaskId(id); }; const handleCardSelect = (id: string) => { if (view === 'social') { setTaskId(id); } else if (view === 'swarm') { setSwarmId(id); } setDrawer('open'); }; const handleCloseDrawer = () => { setDrawer('closed'); }; // Thread drawer - shows when card selected const isDrawerOpen = drawer === 'open' && (!!taskId || !!swarmId); const drawerTitle = selectedSocialCard?.title || selectedSwarmCard?.title || ''; const drawerId = taskId || swarmId || ''; const renderRightPanel = () => { // TODO: Wire up ActivityPanel (bb-ui2.29) - for now show placeholder return (
Activity Panel coming
(bb-ui2.29)
); }; const renderMiddleContent = () => { if (view === 'graph') { return ( ); } if (view === 'social') { return ( ); } if (view === 'swarm') { return ( ); } return null; }; return (
{/* TOP BAR: 3rem fixed */} {/* MAIN AREA: CSS Grid [13rem | 1fr | 17rem] */}
{/* LEFT PANEL: 13rem channel tree */} {/* MIDDLE CONTENT: flex-1 */}
{renderMiddleContent()}
{/* RIGHT PANEL: 17rem - Always shows Activity (bb-ui2.29) */} {renderRightPanel()}
{/* THREAD DRAWER: 24rem - Slides from right edge of middle when card selected */} {/* MOBILE NAV: Bottom tab bar */}
); }