From 8c0a82d3a83fd7c64dcaf9d8447a45bd451dafe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Andr=C3=A9?= Date: Thu, 19 Mar 2026 21:21:00 +0100 Subject: [PATCH] refactor(ui): keep locale bootstrap branch focused --- packages/ui/src/App.tsx | 67 +++---- .../components/instance/instance-shell2.tsx | 174 +++++++----------- .../instance/shell/useSessionCache.ts | 22 +-- .../src/components/session/session-view.tsx | 10 +- 4 files changed, 98 insertions(+), 175 deletions(-) diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 04e3394b..4420af92 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -1,12 +1,15 @@ -import { Component, For, Show, Suspense, createMemo, createEffect, createSignal, lazy, onMount, onCleanup } from "solid-js" +import { Component, For, Show, createMemo, createEffect, createSignal, onMount, onCleanup } from "solid-js" import { Dialog } from "@kobalte/core/dialog" import { Toaster } from "solid-toast" import useMediaQuery from "@suid/material/useMediaQuery" import { Minimize2 } from "lucide-solid" import AlertDialog from "./components/alert-dialog" +import FolderSelectionView from "./components/folder-selection-view" import { showConfirmDialog } from "./stores/alerts" import InstanceTabs from "./components/instance-tabs" +import InstanceDisconnectedModal from "./components/instance-disconnected-modal" import InstanceShell from "./components/instance/instance-shell2" +import { SettingsScreen } from "./components/settings-screen" import { InstanceMetadataProvider } from "./lib/contexts/instance-metadata-context" import { initMarkdown } from "./lib/markdown" import { initGithubStars } from "./stores/github-stars" @@ -51,16 +54,10 @@ import { } from "./stores/sessions" import { getInstanceSessionIndicatorStatus } from "./stores/session-status" -import { openSettings, settingsOpen } from "./stores/settings-screen" +import { openSettings } from "./stores/settings-screen" const log = getLogger("actions") -const LazyFolderSelectionView = lazy(() => import("./components/folder-selection-view")) -const LazyInstanceDisconnectedModal = lazy(() => import("./components/instance-disconnected-modal")) -const LazySettingsScreen = lazy(() => - import("./components/settings-screen").then((module) => ({ default: module.SettingsScreen })), -) - const App: Component = () => { const { isDark } = useTheme() const { t } = useI18n() @@ -412,16 +409,12 @@ const App: Component = () => { return ( <> - - - - - + @@ -534,37 +527,29 @@ const App: Component = () => { } > - }> - - +
- }> - { - setShowFolderSelection(false) - clearLaunchError() - }} - /> - + { + setShowFolderSelection(false) + clearLaunchError() + }} + />
- - - - - - - + + + import("../instance-welcome-view")) -const LazyInfoView = lazy(() => import("../info-view")) -const LazyCommandPalette = lazy(() => import("../command-palette")) -const LazyBackgroundProcessOutputDialog = lazy(() => - import("../background-process-output-dialog").then((module) => ({ default: module.BackgroundProcessOutputDialog })), -) -const LazyPermissionApprovalModal = lazy(() => import("../permission-approval-modal")) -const LazyRightPanel = lazy(() => import("./shell/right-panel/RightPanel")) - -function RightPanelFallback() { - return
-} - interface InstanceShellProps { instance: Instance // Provided by App-level instance tabs; lets us pause heavy rendering @@ -503,30 +494,28 @@ const InstanceShell2: Component = (props) => { role="presentation" aria-hidden="true" /> - }> - - + ) } @@ -566,32 +555,28 @@ const InstanceShell2: Component = (props) => { aria-hidden="true" /> - }> - }> - - - + ) @@ -849,9 +834,7 @@ const InstanceShell2: Component = (props) => { } >
- }> - - +
@@ -867,49 +850,30 @@ const InstanceShell2: Component = (props) => { class="instance-shell2 flex flex-col flex-1 min-h-0" data-instance-id={props.instance.id} > - }> - - - } - > + }> {sessionLayout}
- - - hideCommandPalette(props.instance.id)} - commands={instancePaletteCommands()} - onExecute={props.onExecuteCommand} - /> - - + hideCommandPalette(props.instance.id)} + commands={instancePaletteCommands()} + onExecute={props.onExecuteCommand} + /> - - - - - + - - - setPermissionModalOpen(false)} - /> - - + setPermissionModalOpen(false)} + /> ) } diff --git a/packages/ui/src/components/instance/shell/useSessionCache.ts b/packages/ui/src/components/instance/shell/useSessionCache.ts index 8839d569..0e3a3476 100644 --- a/packages/ui/src/components/instance/shell/useSessionCache.ts +++ b/packages/ui/src/components/instance/shell/useSessionCache.ts @@ -2,30 +2,10 @@ import { createEffect, createSignal, type Accessor } from "solid-js" import { messageStoreBus } from "../../../stores/message-v2/bus" import { clearSessionRenderCache } from "../../message-block" import { getLogger } from "../../../lib/logger" -import { runtimeEnv } from "../../../lib/runtime-env" const log = getLogger("session") -function getSessionCacheLimit() { - if (runtimeEnv.platform === "mobile") { - return 2 - } - - if (runtimeEnv.host === "tauri") { - return 3 - } - - if (typeof navigator !== "undefined") { - const deviceMemory = (navigator as Navigator & { deviceMemory?: number }).deviceMemory - if (typeof deviceMemory === "number" && deviceMemory <= 4) { - return 3 - } - } - - return 5 -} - -const SESSION_CACHE_LIMIT = getSessionCacheLimit() +const SESSION_CACHE_LIMIT = 5 type SessionCacheOptions = { instanceId: Accessor diff --git a/packages/ui/src/components/session/session-view.tsx b/packages/ui/src/components/session/session-view.tsx index b234b09b..ba78382c 100644 --- a/packages/ui/src/components/session/session-view.tsx +++ b/packages/ui/src/components/session/session-view.tsx @@ -131,15 +131,9 @@ export const SessionView: Component = (props) => { createEffect(() => { const currentSession = session() - if (!currentSession) { - return + if (currentSession) { + loadMessages(props.instanceId, currentSession.id).catch((error) => log.error("Failed to load messages", error)) } - - if (props.isActive === false) { - return - } - - loadMessages(props.instanceId, currentSession.id).catch((error) => log.error("Failed to load messages", error)) }) function registerPromptInputApi(api: PromptInputApi) {