summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages/layout.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-24 09:10:24 -0500
committerGitHub <[email protected]>2026-03-24 09:10:24 -0500
commit546748a461539ca63e188ee07ab2b143c5ac2c83 (patch)
tree1eb96ef20f37aaa533efe0f467d7c15628524dd7 /packages/app/src/pages/layout.tsx
parentc9c93eac00bda356f4cf2b03e011d0b19e535952 (diff)
downloadopencode-546748a461539ca63e188ee07ab2b143c5ac2c83.tar.gz
opencode-546748a461539ca63e188ee07ab2b143c5ac2c83.zip
fix(app): startup efficiency (#18854)
Diffstat (limited to 'packages/app/src/pages/layout.tsx')
-rw-r--r--packages/app/src/pages/layout.tsx62
1 files changed, 41 insertions, 21 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index d8b073258..d01c7d3ce 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -49,21 +49,16 @@ import { useNotification } from "@/context/notification"
import { usePermission } from "@/context/permission"
import { Binary } from "@opencode-ai/util/binary"
import { retry } from "@opencode-ai/util/retry"
-import { playSound, soundSrc } from "@/utils/sound"
+import { playSoundById } from "@/utils/sound"
import { createAim } from "@/utils/aim"
import { setNavigate } from "@/utils/notification-click"
import { Worktree as WorktreeState } from "@/utils/worktree"
import { setSessionHandoff } from "@/pages/session/handoff"
import { useDialog } from "@opencode-ai/ui/context/dialog"
-import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme"
-import { DialogSelectProvider } from "@/components/dialog-select-provider"
-import { DialogSelectServer } from "@/components/dialog-select-server"
-import { DialogSettings } from "@/components/dialog-settings"
+import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme/context"
import { useCommand, type CommandOption } from "@/context/command"
import { ConstrainDragXAxis, getDraggableId } from "@/utils/solid-dnd"
-import { DialogSelectDirectory } from "@/components/dialog-select-directory"
-import { DialogEditProject } from "@/components/dialog-edit-project"
import { DebugBar } from "@/components/debug-bar"
import { Titlebar } from "@/components/titlebar"
import { useServer } from "@/context/server"
@@ -110,6 +105,8 @@ export default function Layout(props: ParentProps) {
const pageReady = createMemo(() => ready())
let scrollContainerRef: HTMLDivElement | undefined
+ let dialogRun = 0
+ let dialogDead = false
const params = useParams()
const globalSDK = useGlobalSDK()
@@ -139,7 +136,7 @@ export default function Layout(props: ParentProps) {
dir: globalSync.peek(dir, { bootstrap: false })[0].path.directory || dir,
}
})
- const availableThemeEntries = createMemo(() => Object.entries(theme.themes()))
+ const availableThemeEntries = createMemo(() => theme.ids().map((id) => [id, theme.themes()[id]] as const))
const colorSchemeOrder: ColorScheme[] = ["system", "light", "dark"]
const colorSchemeKey: Record<ColorScheme, "theme.scheme.system" | "theme.scheme.light" | "theme.scheme.dark"> = {
system: "theme.scheme.system",
@@ -201,6 +198,8 @@ export default function Layout(props: ParentProps) {
})
onCleanup(() => {
+ dialogDead = true
+ dialogRun += 1
if (navLeave.current !== undefined) clearTimeout(navLeave.current)
clearTimeout(sortNowTimeout)
if (sortNowInterval) clearInterval(sortNowInterval)
@@ -336,10 +335,9 @@ export default function Layout(props: ParentProps) {
const nextIndex = currentIndex === -1 ? 0 : (currentIndex + direction + ids.length) % ids.length
const nextThemeId = ids[nextIndex]
theme.setTheme(nextThemeId)
- const nextTheme = theme.themes()[nextThemeId]
showToast({
title: language.t("toast.theme.title"),
- description: nextTheme?.name ?? nextThemeId,
+ description: theme.name(nextThemeId),
})
}
@@ -494,7 +492,7 @@ export default function Layout(props: ParentProps) {
if (e.details.type === "permission.asked") {
if (settings.sounds.permissionsEnabled()) {
- playSound(soundSrc(settings.sounds.permissions()))
+ void playSoundById(settings.sounds.permissions())
}
if (settings.notifications.permissions()) {
void platform.notify(title, description, href)
@@ -1152,10 +1150,10 @@ export default function Layout(props: ParentProps) {
},
]
- for (const [id, definition] of availableThemeEntries()) {
+ for (const [id] of availableThemeEntries()) {
commands.push({
id: `theme.set.${id}`,
- title: language.t("command.theme.set", { theme: definition.name ?? id }),
+ title: language.t("command.theme.set", { theme: theme.name(id) }),
category: language.t("command.category.theme"),
onSelect: () => theme.commitPreview(),
onHighlight: () => {
@@ -1206,15 +1204,27 @@ export default function Layout(props: ParentProps) {
})
function connectProvider() {
- dialog.show(() => <DialogSelectProvider />)
+ const run = ++dialogRun
+ void import("@/components/dialog-select-provider").then((x) => {
+ if (dialogDead || dialogRun !== run) return
+ dialog.show(() => <x.DialogSelectProvider />)
+ })
}
function openServer() {
- dialog.show(() => <DialogSelectServer />)
+ const run = ++dialogRun
+ void import("@/components/dialog-select-server").then((x) => {
+ if (dialogDead || dialogRun !== run) return
+ dialog.show(() => <x.DialogSelectServer />)
+ })
}
function openSettings() {
- dialog.show(() => <DialogSettings />)
+ const run = ++dialogRun
+ void import("@/components/dialog-settings").then((x) => {
+ if (dialogDead || dialogRun !== run) return
+ dialog.show(() => <x.DialogSettings />)
+ })
}
function projectRoot(directory: string) {
@@ -1441,7 +1451,13 @@ export default function Layout(props: ParentProps) {
layout.sidebar.toggleWorkspaces(project.worktree)
}
- const showEditProjectDialog = (project: LocalProject) => dialog.show(() => <DialogEditProject project={project} />)
+ const showEditProjectDialog = (project: LocalProject) => {
+ const run = ++dialogRun
+ void import("@/components/dialog-edit-project").then((x) => {
+ if (dialogDead || dialogRun !== run) return
+ dialog.show(() => <x.DialogEditProject project={project} />)
+ })
+ }
async function chooseProject() {
function resolve(result: string | string[] | null) {
@@ -1462,10 +1478,14 @@ export default function Layout(props: ParentProps) {
})
resolve(result)
} else {
- dialog.show(
- () => <DialogSelectDirectory multiple={true} onSelect={resolve} />,
- () => resolve(null),
- )
+ const run = ++dialogRun
+ void import("@/components/dialog-select-directory").then((x) => {
+ if (dialogDead || dialogRun !== run) return
+ dialog.show(
+ () => <x.DialogSelectDirectory multiple={true} onSelect={resolve} />,
+ () => resolve(null),
+ )
+ })
}
}