diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e6fbd6cbc5b..72c3b46032c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -72,7 +72,7 @@ "@hookform/resolvers": "^5.2.2", "@lezer/highlight": "^1.2.3", "@parcel/watcher": "^2.5.6", - "@pierre/diffs": "1.1.7", + "@pierre/diffs": "1.1.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-label": "^2.1.8", "@sentry/electron": "^7.7.0", @@ -84,7 +84,7 @@ "@superset/host-service": "workspace:*", "@superset/local-db": "workspace:*", "@superset/macos-process-metrics": "workspace:*", - "@superset/pane-layout": "workspace:*", + "@superset/panes": "workspace:*", "@superset/shared": "workspace:*", "@superset/trpc": "workspace:*", "@superset/ui": "workspace:*", diff --git a/apps/desktop/src/main/host-service/index.ts b/apps/desktop/src/main/host-service/index.ts index 56da823a9d2..484f661fb54 100644 --- a/apps/desktop/src/main/host-service/index.ts +++ b/apps/desktop/src/main/host-service/index.ts @@ -21,6 +21,7 @@ const dbPath = process.env.HOST_DB_PATH; const deviceClientId = process.env.DEVICE_CLIENT_ID; const deviceName = process.env.DEVICE_NAME; const hostServiceSecret = process.env.HOST_SERVICE_SECRET; +const desktopVitePort = process.env.DESKTOP_VITE_PORT ?? "5173"; const auth = authToken && cloudApiUrl ? new JwtApiAuthProvider(authToken) : undefined; @@ -36,7 +37,10 @@ const { app, injectWebSocket } = createApp({ dbPath, deviceClientId, deviceName, - allowedOrigins: ["http://127.0.0.1"], + allowedOrigins: [ + `http://localhost:${desktopVitePort}`, + `http://127.0.0.1:${desktopVitePort}`, + ], }); const server = serve( diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/AddTabMenu.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/AddTabMenu.tsx new file mode 100644 index 00000000000..7ae3dd2e50b --- /dev/null +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/AddTabMenu.tsx @@ -0,0 +1,52 @@ +import { + DropdownMenuCheckboxItem, + DropdownMenuItem, + DropdownMenuSeparator, +} from "@superset/ui/dropdown-menu"; +import { BsTerminalPlus } from "react-icons/bs"; +import { TbMessageCirclePlus, TbWorld } from "react-icons/tb"; +import { HotkeyMenuShortcut } from "renderer/components/HotkeyMenuShortcut"; + +interface AddTabMenuProps { + onAddTerminal: () => void; + onAddChat: () => void; + onAddBrowser: () => void; + showPresetsBar: boolean; + onTogglePresetsBar: (enabled: boolean) => void; +} + +export function AddTabMenu({ + onAddTerminal, + onAddChat, + onAddBrowser, + showPresetsBar, + onTogglePresetsBar, +}: AddTabMenuProps) { + return ( + <> + + + Terminal + + + + + Chat + + + + + Browser + + + + onTogglePresetsBar(checked === true)} + onSelect={(event) => event.preventDefault()} + > + Show Preset Bar + + + ); +} diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/index.ts new file mode 100644 index 00000000000..212f4c1e26b --- /dev/null +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/AddTabMenu/index.ts @@ -0,0 +1 @@ +export { AddTabMenu } from "./AddTabMenu"; diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/PaneViewer/PaneViewer.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/PaneViewer/PaneViewer.tsx deleted file mode 100644 index ba1d4d82cca..00000000000 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/PaneViewer/PaneViewer.tsx +++ /dev/null @@ -1,329 +0,0 @@ -import { - createPaneRoot, - type PaneRegistry, - PaneWorkspace, -} from "@superset/pane-layout"; -import { - DropdownMenuCheckboxItem, - DropdownMenuItem, - DropdownMenuSeparator, -} from "@superset/ui/dropdown-menu"; -import { useNavigate } from "@tanstack/react-router"; -import { FileCode2, Globe, MessageSquare, TerminalSquare } from "lucide-react"; -import { useCallback, useMemo } from "react"; -import { BsTerminalPlus } from "react-icons/bs"; -import { TbMessageCirclePlus, TbWorld } from "react-icons/tb"; -import { HotkeyMenuShortcut } from "renderer/components/HotkeyMenuShortcut"; -import { electronTrpc } from "renderer/lib/electron-trpc"; -import { WorkspaceChat } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat"; -import { WorkspaceFilePreview } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceFiles/components/WorkspaceFilePreview/WorkspaceFilePreview"; -import { WorkspaceTerminal } from "renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceTerminal"; -import { - CommandPalette, - useCommandPalette, -} from "renderer/screens/main/components/CommandPalette"; -import { PresetsBar } from "renderer/screens/main/components/WorkspaceView/ContentView/components/PresetsBar"; -import { useAppHotkey } from "renderer/stores/hotkeys"; -import { DEFAULT_SHOW_PRESETS_BAR } from "shared/constants"; -import { PaneViewerEmptyState } from "./components/PaneViewerEmptyState"; -import { useV2WorkspacePaneLayout } from "./hooks/useV2WorkspacePaneLayout"; -import { - type BrowserPaneData, - type ChatPaneData, - createBrowserPane, - createChatPane, - createFilePane, - createTerminalPane, - type DevtoolsPaneData, - type FilePaneData, - type PaneViewerData, - type TerminalPaneData, -} from "./pane-viewer.model"; - -interface PaneViewerProps { - projectId: string; - workspaceId: string; - workspaceName: string; -} - -function getFileTitle(filePath: string): string { - return filePath.split("/").pop() ?? filePath; -} - -export function PaneViewer({ - projectId, - workspaceId, - workspaceName, -}: PaneViewerProps) { - const navigate = useNavigate(); - const { store } = useV2WorkspacePaneLayout({ - projectId, - workspaceId, - }); - const utils = electronTrpc.useUtils(); - const { data: showPresetsBar } = - electronTrpc.settings.getShowPresetsBar.useQuery(); - const setShowPresetsBar = electronTrpc.settings.setShowPresetsBar.useMutation( - { - onMutate: async ({ enabled }) => { - await utils.settings.getShowPresetsBar.cancel(); - const previous = utils.settings.getShowPresetsBar.getData(); - utils.settings.getShowPresetsBar.setData(undefined, enabled); - return { previous }; - }, - onError: (_error, _variables, context) => { - if (context?.previous !== undefined) { - utils.settings.getShowPresetsBar.setData(undefined, context.previous); - } - }, - onSettled: () => { - utils.settings.getShowPresetsBar.invalidate(); - }, - }, - ); - - const openFilePane = useCallback( - (filePath: string) => { - const pane = createFilePane({ - title: getFileTitle(filePath), - filePath, - mode: "editor", - hasChanges: false, - }); - const activePane = store.getState().getActivePane(); - - if (activePane) { - store.getState().addPaneToGroup({ - rootId: activePane.rootId, - groupId: activePane.groupId, - pane, - replaceUnpinned: true, - select: true, - }); - return; - } - - store.getState().addRoot( - createPaneRoot({ - titleOverride: "Files", - panes: [pane], - }), - ); - }, - [store], - ); - - const addTerminalRoot = useCallback(() => { - store.getState().addRoot( - createPaneRoot({ - titleOverride: "Terminal", - panes: [ - createTerminalPane({ - title: "Terminal", - sessionKey: `${workspaceId}:${crypto.randomUUID()}`, - cwd: `/workspace/${workspaceName}`, - launchMode: "workspace-shell", - }), - ], - }), - ); - }, [store, workspaceId, workspaceName]); - - const addChatRoot = useCallback(() => { - store.getState().addRoot( - createPaneRoot({ - titleOverride: "Chat", - panes: [ - createChatPane({ - title: "Chat", - sessionId: null, - }), - ], - }), - ); - }, [store]); - - const addBrowserRoot = useCallback(() => { - store.getState().addRoot( - createPaneRoot({ - titleOverride: "Browser", - panes: [ - createBrowserPane({ - title: "Browser", - url: "http://localhost:3000", - mode: "preview", - }), - ], - }), - ); - }, [store]); - - const commandPalette = useCommandPalette({ - workspaceId, - navigate, - onSelectFile: ({ close, filePath, targetWorkspaceId }) => { - close(); - - if (targetWorkspaceId !== workspaceId) { - void navigate({ - to: "/v2-workspace/$workspaceId", - params: { workspaceId: targetWorkspaceId }, - }); - return; - } - - openFilePane(filePath); - }, - }); - - const handleQuickOpen = useCallback(() => { - commandPalette.toggle(); - }, [commandPalette]); - const setPaneData = store.getState().setPaneData; - - const paneRegistry = useMemo>( - () => ({ - file: { - getIcon: () => , - renderPane: ({ pane }) => { - const data = pane.data as FilePaneData; - - return ( - - ); - }, - }, - terminal: { - getIcon: () => , - renderPane: ({ pane }) => { - const _data = pane.data as TerminalPaneData; - return ; - }, - }, - browser: { - getIcon: () => , - renderPane: ({ pane }) => { - const data = pane.data as BrowserPaneData; - - return ( -