From d8769b2d9dd1f6b13ebbdd60886f882a751f293f Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Wed, 4 Feb 2026 08:27:07 -0800 Subject: [PATCH] fix app tabs --- src/client/components/AppDetail.tsx | 3 ++- src/client/components/Nav.tsx | 8 +++++--- src/client/index.tsx | 4 ++-- src/client/state.ts | 12 ++++++++---- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/client/components/AppDetail.tsx b/src/client/components/AppDetail.tsx index d8d7a84..7611833 100644 --- a/src/client/components/AppDetail.tsx +++ b/src/client/components/AppDetail.tsx @@ -2,7 +2,7 @@ import { define } from '@because/forge' import type { App } from '../../shared/types' import { restartApp, startApp, stopApp } from '../api' import { openDeleteAppModal, openRenameAppModal } from '../modals' -import { apps, selectedTab } from '../state' +import { apps, getSelectedTab } from '../state' import { ActionBar, Button, @@ -44,6 +44,7 @@ const OpenEmojiPicker = define('OpenEmojiPicker', { export function AppDetail({ app, render }: { app: App, render: () => void }) { // Find all tools const tools = apps.filter(a => a.tool) + const selectedTab = getSelectedTab(app.name) return (
diff --git a/src/client/components/Nav.tsx b/src/client/components/Nav.tsx index 61f0429..0a2813d 100644 --- a/src/client/components/Nav.tsx +++ b/src/client/components/Nav.tsx @@ -1,16 +1,18 @@ import type { App } from '../../shared/types' -import { apps, selectedApp, selectedTab, setSelectedTab } from '../state' +import { apps, getSelectedTab, setSelectedTab } from '../state' import { Tab, TabBar } from '../styles' import { resetToolIframe } from '../tool-iframes' export function Nav({ app, render }: { app: App; render: () => void }) { + const selectedTab = getSelectedTab(app.name) + const handleTabClick = (tab: string) => { // If clicking already-selected tool tab, reset to home if (tab === selectedTab && tab !== 'overview') { - resetToolIframe(tab, selectedApp) + resetToolIframe(tab, app.name) return } - setSelectedTab(tab) + setSelectedTab(app.name, tab) render() } diff --git a/src/client/index.tsx b/src/client/index.tsx index 7a1782c..cdc8fc0 100644 --- a/src/client/index.tsx +++ b/src/client/index.tsx @@ -1,6 +1,6 @@ import { render as renderApp } from 'hono/jsx/dom' import { Dashboard } from './components' -import { apps, selectedApp, selectedTab, setApps, setSelectedApp } from './state' +import { apps, getSelectedTab, selectedApp, setApps, setSelectedApp } from './state' import { initModal } from './components/modal' import { initToolIframes, updateToolIframes } from './tool-iframes' import { initUpdate } from './update' @@ -10,7 +10,7 @@ const render = () => { // Update tool iframes after DOM settles requestAnimationFrame(() => { const tools = apps.filter(a => a.tool) - updateToolIframes(selectedTab, tools, selectedApp) + updateToolIframes(getSelectedTab(selectedApp), tools, selectedApp) }) } diff --git a/src/client/state.ts b/src/client/state.ts index 2b62ce8..a62dd31 100644 --- a/src/client/state.ts +++ b/src/client/state.ts @@ -9,7 +9,7 @@ export let sidebarSection: 'apps' | 'tools' = (localStorage.getItem('sidebarSect export let apps: App[] = [] // Tab state -export let selectedTab: string = localStorage.getItem('selectedTab') || 'overview' +export let appTabs: Record = JSON.parse(localStorage.getItem('appTabs') || '{}') // State setters export function setSelectedApp(name: string | null) { @@ -35,7 +35,11 @@ export function setApps(newApps: App[]) { apps = newApps } -export function setSelectedTab(tab: string) { - selectedTab = tab - localStorage.setItem('selectedTab', tab) +export const getSelectedTab = (appName: string | null) => + appName ? appTabs[appName] || 'overview' : 'overview' + +export function setSelectedTab(appName: string | null, tab: string) { + if (!appName) return + appTabs[appName] = tab + localStorage.setItem('appTabs', JSON.stringify(appTabs)) }