diff --git a/apps/desktop/src/renderer/components/NewWorkspaceModal/NewWorkspaceModal.tsx b/apps/desktop/src/renderer/components/NewWorkspaceModal/NewWorkspaceModal.tsx index 37d4fe55b91..3c73d852375 100644 --- a/apps/desktop/src/renderer/components/NewWorkspaceModal/NewWorkspaceModal.tsx +++ b/apps/desktop/src/renderer/components/NewWorkspaceModal/NewWorkspaceModal.tsx @@ -49,10 +49,7 @@ import { useNewWorkspaceModalOpen, usePreSelectedProjectId, } from "renderer/stores/new-workspace-modal"; -import { - resolveBranchPrefix, - sanitizeBranchName, -} from "shared/utils/branch"; +import { resolveBranchPrefix, sanitizeBranchName } from "shared/utils/branch"; import { ExistingWorktreesList } from "./components/ExistingWorktreesList"; function generateSlugFromTitle(title: string): string { diff --git a/apps/desktop/src/renderer/hooks/useFileOpenMode/index.ts b/apps/desktop/src/renderer/hooks/useFileOpenMode/index.ts index 9c7ae61741c..50c2fbadba0 100644 --- a/apps/desktop/src/renderer/hooks/useFileOpenMode/index.ts +++ b/apps/desktop/src/renderer/hooks/useFileOpenMode/index.ts @@ -1 +1 @@ -export { useFileOpenMode } from "./useFileOpenMode"; +export { getFileOpenMode, useFileOpenMode } from "./useFileOpenMode"; diff --git a/apps/desktop/src/renderer/hooks/useFileOpenMode/useFileOpenMode.ts b/apps/desktop/src/renderer/hooks/useFileOpenMode/useFileOpenMode.ts index e0c31713af7..0e760a66852 100644 --- a/apps/desktop/src/renderer/hooks/useFileOpenMode/useFileOpenMode.ts +++ b/apps/desktop/src/renderer/hooks/useFileOpenMode/useFileOpenMode.ts @@ -1,6 +1,17 @@ +import type { FileOpenMode } from "@superset/local-db"; import { electronTrpc } from "renderer/lib/electron-trpc"; +import { DEFAULT_FILE_OPEN_MODE } from "shared/constants"; -export function useFileOpenMode() { +let cachedFileOpenMode: FileOpenMode = DEFAULT_FILE_OPEN_MODE; + +/** Non-React getter, kept in sync by useFileOpenMode(). */ +export function getFileOpenMode(): FileOpenMode { + return cachedFileOpenMode; +} + +export function useFileOpenMode(): FileOpenMode { const { data } = electronTrpc.settings.getFileOpenMode.useQuery(); - return data ?? "split-pane"; + const mode = data ?? DEFAULT_FILE_OPEN_MODE; + cachedFileOpenMode = mode; + return mode; } diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx index 076293e52b1..35fb5077897 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx @@ -1,6 +1,7 @@ import { toast } from "@superset/ui/sonner"; import { createFileRoute, notFound, useNavigate } from "@tanstack/react-router"; import { useCallback, useEffect, useMemo } from "react"; +import { useFileOpenMode } from "renderer/hooks/useFileOpenMode"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { electronTrpcClient as trpcClient } from "renderer/lib/trpc-client"; import { usePresets } from "renderer/react-query/presets"; @@ -74,6 +75,9 @@ function WorkspacePage() { const routeNavigate = Route.useNavigate(); const { tabId: searchTabId, paneId: searchPaneId } = Route.useSearch(); + // Keep the file open mode cache warm for addFileViewerPane + useFileOpenMode(); + // Handle search-param-driven tab/pane activation (e.g. from notification clicks) useEffect(() => { if (!searchTabId) return; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/hooks/useFileLinkClick.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/hooks/useFileLinkClick.ts index 04c1beaa04b..9ef2948743f 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/hooks/useFileLinkClick.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/hooks/useFileLinkClick.ts @@ -1,6 +1,5 @@ import { toast } from "@superset/ui/sonner"; import { useCallback } from "react"; -import { useFileOpenMode } from "renderer/hooks/useFileOpenMode"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { electronTrpcClient as trpcClient } from "renderer/lib/trpc-client"; import { useTabsStore } from "renderer/stores/tabs/store"; @@ -26,7 +25,6 @@ export function useFileLinkClick({ workspaceCwd, }: UseFileLinkClickOptions): UseFileLinkClickReturn { const addFileViewerPane = useTabsStore((s) => s.addFileViewerPane); - const fileOpenMode = useFileOpenMode(); // Query terminal link behavior setting const { data: terminalLinkBehavior } = @@ -91,19 +89,12 @@ export function useFileLinkClick({ filePath, line, column, - openInNewTab: fileOpenMode === "new-tab", }); } else { openInExternalEditor(); } }, - [ - terminalLinkBehavior, - workspaceId, - workspaceCwd, - addFileViewerPane, - fileOpenMode, - ], + [terminalLinkBehavior, workspaceId, workspaceCwd, addFileViewerPane], ); return { diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/FilesView.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/FilesView.tsx index 49ddbf20d16..a7f288e1075 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/FilesView.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/FilesView.tsx @@ -14,7 +14,6 @@ import { import { useParams } from "@tanstack/react-router"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { LuFile, LuFolder } from "react-icons/lu"; -import { useFileOpenMode } from "renderer/hooks/useFileOpenMode"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useFileExplorerStore } from "renderer/stores/file-explorer"; import { useTabsStore } from "renderer/stores/tabs/store"; @@ -149,7 +148,6 @@ export function FilesView() { }); const addFileViewerPane = useTabsStore((s) => s.addFileViewerPane); - const fileOpenMode = useFileOpenMode(); const openFileInEditorMutation = electronTrpc.external.openFileInEditor.useMutation(); @@ -164,10 +162,9 @@ export function FilesView() { if (!workspaceId || !worktreePath || entry.isDirectory) return; addFileViewerPane(workspaceId, { filePath: entry.relativePath, - openInNewTab: fileOpenMode === "new-tab", }); }, - [workspaceId, worktreePath, addFileViewerPane, fileOpenMode], + [workspaceId, worktreePath, addFileViewerPane], ); const handleOpenInEditor = useCallback( diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/index.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/index.tsx index 9bad05da004..624a9b93bbc 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/index.tsx @@ -11,7 +11,6 @@ import { LuX, } from "react-icons/lu"; import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent"; -import { useFileOpenMode } from "renderer/hooks/useFileOpenMode"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { RightSidebarTab, @@ -102,7 +101,6 @@ export function RightSidebar() { }; const addFileViewerPane = useTabsStore((s) => s.addFileViewerPane); - const fileOpenMode = useFileOpenMode(); const trpcUtils = electronTrpc.useUtils(); const { scrollToFile } = useScrollContext(); @@ -137,17 +135,10 @@ export function RightSidebar() { diffCategory: category, commitHash, oldPath: file.oldPath, - openInNewTab: fileOpenMode === "new-tab", }); invalidateFileContent(file.path); }, - [ - workspaceId, - worktreePath, - addFileViewerPane, - invalidateFileContent, - fileOpenMode, - ], + [workspaceId, worktreePath, addFileViewerPane, invalidateFileContent], ); const handleFileScrollTo = useCallback( diff --git a/apps/desktop/src/renderer/stores/tabs/store.ts b/apps/desktop/src/renderer/stores/tabs/store.ts index b726b8b808a..7c5375fac17 100644 --- a/apps/desktop/src/renderer/stores/tabs/store.ts +++ b/apps/desktop/src/renderer/stores/tabs/store.ts @@ -1,5 +1,6 @@ import type { MosaicNode } from "react-mosaic-component"; import { updateTree } from "react-mosaic-component"; +import { getFileOpenMode } from "renderer/hooks/useFileOpenMode"; import { trpcTabsStorage } from "renderer/lib/trpc-storage"; import { acknowledgedStatus } from "shared/tabs-types"; import { create } from "zustand"; @@ -530,6 +531,13 @@ export const useTabsStore = create()( workspaceId: string, options: AddFileViewerPaneOptions, ) => { + if (options.openInNewTab === undefined) { + options = { + ...options, + openInNewTab: getFileOpenMode() === "new-tab", + }; + } + const state = get(); const resolvedActiveTabId = resolveActiveTabIdForWorkspace({ workspaceId, diff --git a/bun.lock b/bun.lock index 14625b17fbf..62029c7a4fe 100644 --- a/bun.lock +++ b/bun.lock @@ -104,7 +104,7 @@ }, "apps/desktop": { "name": "@superset/desktop", - "version": "0.0.78", + "version": "0.0.80", "dependencies": { "@better-auth/stripe": "1.4.18", "@dnd-kit/core": "^6.3.1",