diff --git a/apps/desktop/src/renderer/commandPalette/modules/workspace/commands.tsx b/apps/desktop/src/renderer/commandPalette/modules/workspace/commands.tsx index f5174a4d604..8871c05fe3e 100644 --- a/apps/desktop/src/renderer/commandPalette/modules/workspace/commands.tsx +++ b/apps/desktop/src/renderer/commandPalette/modules/workspace/commands.tsx @@ -61,6 +61,7 @@ export const workspaceProvider: CommandProvider = { run: () => useRemoveFromSidebarIntent.getState().request({ workspaceId: workspace.id, + workspaceName: workspace.name, projectId: workspace.projectId ?? "", isMain, }), diff --git a/apps/desktop/src/renderer/commandPalette/ui/RemoveFromSidebarMount/RemoveFromSidebarMount.tsx b/apps/desktop/src/renderer/commandPalette/ui/RemoveFromSidebarMount/RemoveFromSidebarMount.tsx index 1fc2de353d4..7d6aa148fe5 100644 --- a/apps/desktop/src/renderer/commandPalette/ui/RemoveFromSidebarMount/RemoveFromSidebarMount.tsx +++ b/apps/desktop/src/renderer/commandPalette/ui/RemoveFromSidebarMount/RemoveFromSidebarMount.tsx @@ -1,4 +1,13 @@ -import { useEffect, useRef } from "react"; +import { + AlertDialog, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@superset/ui/alert-dialog"; +import { Button } from "@superset/ui/button"; +import { useCallback } from "react"; import { useNavigateAwayFromWorkspace } from "renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/hooks/useNavigateAwayFromWorkspace"; import { useDashboardSidebarState } from "renderer/routes/_authenticated/hooks/useDashboardSidebarState"; import { useRemoveFromSidebarIntent } from "renderer/stores/remove-workspace-from-sidebar-intent"; @@ -9,11 +18,16 @@ export function RemoveFromSidebarMount() { const { hideWorkspaceInSidebar, removeWorkspaceFromSidebar } = useDashboardSidebarState(); const { navigateAwayFromWorkspace } = useNavigateAwayFromWorkspace(); - const lastTickRef = useRef(0); - useEffect(() => { - if (!target || target.tick === lastTickRef.current) return; - lastTickRef.current = target.tick; + const handleOpenChange = useCallback( + (open: boolean) => { + if (!open) clear(); + }, + [clear], + ); + + const handleConfirm = useCallback(() => { + if (!target) return; navigateAwayFromWorkspace(target.workspaceId); if (target.isMain) { hideWorkspaceInSidebar(target.workspaceId, target.projectId); @@ -29,5 +43,37 @@ export function RemoveFromSidebarMount() { clear, ]); - return null; + return ( + + + + + Remove "{target?.workspaceName ?? "workspace"}" from sidebar? + + + The workspace itself isn't deleted — you can always add it back from + the Workspaces page. + + + + + + + + + ); } diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarWorkspaceItem/hooks/useDashboardSidebarWorkspaceItemActions/useDashboardSidebarWorkspaceItemActions.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarWorkspaceItem/hooks/useDashboardSidebarWorkspaceItemActions/useDashboardSidebarWorkspaceItemActions.ts index fbcf9ade824..2e7313d0984 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarWorkspaceItem/hooks/useDashboardSidebarWorkspaceItemActions/useDashboardSidebarWorkspaceItemActions.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarWorkspaceItem/hooks/useDashboardSidebarWorkspaceItemActions/useDashboardSidebarWorkspaceItemActions.ts @@ -5,10 +5,10 @@ import { useCopyToClipboard } from "renderer/hooks/useCopyToClipboard"; import { getHostServiceClientByUrl } from "renderer/lib/host-service-client"; import { electronTrpcClient } from "renderer/lib/trpc-client"; import { useDashboardSidebarSectionRename } from "renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarSectionRenameContext"; -import { useNavigateAwayFromWorkspace } from "renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/hooks/useNavigateAwayFromWorkspace"; import { useDashboardSidebarState } from "renderer/routes/_authenticated/hooks/useDashboardSidebarState"; import { useOptimisticCollectionActions } from "renderer/routes/_authenticated/hooks/useOptimisticCollectionActions"; import { useLocalHostService } from "renderer/routes/_authenticated/providers/LocalHostServiceProvider"; +import { useRemoveFromSidebarIntent } from "renderer/stores/remove-workspace-from-sidebar-intent"; import { useV2NotificationStore, useV2WorkspaceIsUnread, @@ -31,7 +31,6 @@ export function useDashboardSidebarWorkspaceItemActions({ }: UseDashboardSidebarWorkspaceItemActionsOptions) { const navigate = useNavigate(); const matchRoute = useMatchRoute(); - const { navigateAwayFromWorkspace } = useNavigateAwayFromWorkspace(); const { activeHostUrl } = useLocalHostService(); const { copyToClipboard } = useCopyToClipboard(); const { v2Workspaces: workspaceActions } = useOptimisticCollectionActions(); @@ -41,12 +40,8 @@ export function useDashboardSidebarWorkspaceItemActions({ ); const setManualUnread = useV2NotificationStore((s) => s.setManualUnread); const isUnread = useV2WorkspaceIsUnread(workspaceId); - const { - createSection, - hideWorkspaceInSidebar, - moveWorkspaceToSection, - removeWorkspaceFromSidebar, - } = useDashboardSidebarState(); + const { createSection, moveWorkspaceToSection, removeWorkspaceFromSidebar } = + useDashboardSidebarState(); const [isRenaming, setIsRenaming] = useState(false); const [renameValue, setRenameValue] = useState(workspaceName); @@ -89,12 +84,12 @@ export function useDashboardSidebarWorkspaceItemActions({ }; const handleRemoveFromSidebar = () => { - navigateAwayFromWorkspace(workspaceId); - if (isMainWorkspace) { - hideWorkspaceInSidebar(workspaceId, projectId); - return; - } - removeWorkspaceFromSidebar(workspaceId); + useRemoveFromSidebarIntent.getState().request({ + workspaceId, + workspaceName, + projectId, + isMain: isMainWorkspace, + }); }; const handleCreateSection = () => { diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspacesList/components/V2WorkspaceRow/V2WorkspaceRow.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspacesList/components/V2WorkspaceRow/V2WorkspaceRow.tsx index 6e468e5a00d..75b7b933f2d 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspacesList/components/V2WorkspaceRow/V2WorkspaceRow.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspaces/components/V2WorkspacesList/components/V2WorkspaceRow/V2WorkspaceRow.tsx @@ -30,6 +30,7 @@ import type { import { useDashboardSidebarState } from "renderer/routes/_authenticated/hooks/useDashboardSidebarState"; import { PRIcon } from "renderer/screens/main/components/PRIcon/PRIcon"; import { getRelativeTime } from "renderer/screens/main/components/WorkspacesListView/utils"; +import { useRemoveFromSidebarIntent } from "renderer/stores/remove-workspace-from-sidebar-intent"; import { V2_WORKSPACES_ROW_GRID } from "../../constants"; interface V2WorkspaceRowProps { @@ -47,11 +48,7 @@ export function V2WorkspaceRow({ }: V2WorkspaceRowProps) { const navigate = useNavigate(); const { gateFeature } = usePaywall(); - const { - ensureWorkspaceInSidebar, - hideWorkspaceInSidebar, - removeWorkspaceFromSidebar, - } = useDashboardSidebarState(); + const { ensureWorkspaceInSidebar } = useDashboardSidebarState(); const isMainWorkspace = workspace.type === "main"; const HostIcon = hostIconFor(workspace.hostType); @@ -95,18 +92,18 @@ export function V2WorkspaceRow({ event.preventDefault(); return; } - if (isMainWorkspace) { - hideWorkspaceInSidebar(workspace.id, workspace.projectId); - return; - } - removeWorkspaceFromSidebar(workspace.id); + useRemoveFromSidebarIntent.getState().request({ + workspaceId: workspace.id, + workspaceName: workspace.name, + projectId: workspace.projectId, + isMain: isMainWorkspace, + }); }, [ - hideWorkspaceInSidebar, isCurrentRoute, isMainWorkspace, - removeWorkspaceFromSidebar, workspace.id, + workspace.name, workspace.projectId, ], ); diff --git a/apps/desktop/src/renderer/stores/remove-workspace-from-sidebar-intent.ts b/apps/desktop/src/renderer/stores/remove-workspace-from-sidebar-intent.ts index 6ccb61634e8..deaab88cbe0 100644 --- a/apps/desktop/src/renderer/stores/remove-workspace-from-sidebar-intent.ts +++ b/apps/desktop/src/renderer/stores/remove-workspace-from-sidebar-intent.ts @@ -2,6 +2,7 @@ import { create } from "zustand"; export interface RemoveFromSidebarTarget { workspaceId: string; + workspaceName: string; projectId: string; isMain: boolean; tick: number;