diff --git a/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx b/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx index cc2512692c540..6d0390fbf902b 100644 --- a/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx +++ b/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx @@ -19,6 +19,7 @@ interface WorkspaceErrorDialogProps { workspaceOwner: string; workspaceName: string; templateVersionId: string; + isDeleting: boolean; } export const WorkspaceErrorDialog: FC = ({ @@ -29,6 +30,7 @@ export const WorkspaceErrorDialog: FC = ({ workspaceOwner, workspaceName, templateVersionId, + isDeleting, }) => { const navigate = useNavigate(); @@ -52,7 +54,9 @@ export const WorkspaceErrorDialog: FC = ({ !isOpen && onClose()}> - Error building workspace + + Error {isDeleting ? "deleting" : "building"} workspace + Message{" "} {getErrorMessage(error, "Failed to build workspace.")} diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx index d2d916f71e9e8..3853af67d394f 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx @@ -1,4 +1,6 @@ import { MissingBuildParameters } from "api/api"; +import { isApiError } from "api/errors"; +import { type ApiError, getErrorMessage } from "api/errors"; import { changeVersion, deleteWorkspace, @@ -13,6 +15,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "components/DropdownMenu/DropdownMenu"; +import { displayError } from "components/GlobalSnackbar/utils"; import { CopyIcon, DownloadIcon, @@ -24,6 +27,7 @@ import { import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { Link as RouterLink } from "react-router-dom"; +import { WorkspaceErrorDialog } from "../ErrorDialog/WorkspaceErrorDialog"; import { ChangeWorkspaceVersionDialog } from "./ChangeWorkspaceVersionDialog"; import { DownloadLogsDialog } from "./DownloadLogsDialog"; import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; @@ -42,6 +46,11 @@ export const WorkspaceMoreActions: FC = ({ }) => { const queryClient = useQueryClient(); + const [workspaceErrorDialog, setWorkspaceErrorDialog] = useState<{ + open: boolean; + error?: ApiError; + }>({ open: false }); + // Permissions const { data: permissions } = useQuery(workspacePermissions(workspace)); @@ -58,11 +67,25 @@ export const WorkspaceMoreActions: FC = ({ ), ); + const handleError = (error: unknown) => { + if (isApiError(error) && error.code === "ERR_BAD_REQUEST") { + setWorkspaceErrorDialog({ + open: true, + error: error, + }); + } else { + displayError(getErrorMessage(error, "Failed to delete workspace.")); + } + }; + // Delete const [isConfirmingDelete, setIsConfirmingDelete] = useState(false); - const deleteWorkspaceMutation = useMutation( - deleteWorkspace(workspace, queryClient), - ); + const deleteWorkspaceMutation = useMutation({ + ...deleteWorkspace(workspace, queryClient), + onError: (error: unknown) => { + handleError(error); + }, + }); // Duplicate const { duplicateWorkspace, isDuplicationReady } = @@ -212,6 +235,17 @@ export const WorkspaceMoreActions: FC = ({ setIsConfirmingDelete(false); }} /> + + setWorkspaceErrorDialog({ open: false })} + showDetail={workspace.template_use_classic_parameter_flow} + workspaceOwner={workspace.owner_name} + workspaceName={workspace.name} + templateVersionId={workspace.latest_build.template_version_id} + isDeleting={true} + /> ); }; diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index 1e727faf46cd4..79ec5ad11a2b5 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -392,6 +392,7 @@ export const WorkspaceReadyPage: FC = ({ workspaceOwner={workspace.owner_name} workspaceName={workspace.name} templateVersionId={workspace.latest_build.template_version_id} + isDeleting={false} /> ); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy