Skip to content

Commit 18965e0

Browse files
committed
Improve delete
1 parent 32d9025 commit 18965e0

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

site/src/pages/WorkspacesPage/WorkspacesPage.tsx

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import { useTemplateFilterMenu, useStatusFilterMenu } from "./filter/menus"
1111
import { useSearchParams } from "react-router-dom"
1212
import { useFilter } from "components/Filter/filter"
1313
import { useUserFilterMenu } from "components/Filter/UserFilter"
14-
import { getWorkspaces } from "api/api"
14+
import { deleteWorkspace, getWorkspaces } from "api/api"
1515
import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"
1616
import Box from "@mui/material/Box"
1717
import { MONOSPACE_FONT_FAMILY } from "theme/constants"
1818
import TextField from "@mui/material/TextField"
19+
import { displayError } from "components/GlobalSnackbar/utils"
20+
import { getErrorMessage } from "api/errors"
1921

2022
const WorkspacesPage: FC = () => {
2123
const [lockedWorkspaces, setLockedWorkspaces] = useState<Workspace[]>([])
@@ -25,7 +27,7 @@ const WorkspacesPage: FC = () => {
2527
const searchParamsResult = useSearchParams()
2628
const pagination = usePagination({ searchParamsResult })
2729
const filterProps = useWorkspacesFilter({ searchParamsResult, pagination })
28-
const { data, error, queryKey } = useWorkspacesData({
30+
const { data, error, queryKey, refetch } = useWorkspacesData({
2931
...pagination,
3032
query: filterProps.filter.query,
3133
})
@@ -101,6 +103,10 @@ const WorkspacesPage: FC = () => {
101103
onClose={() => {
102104
setIsDeletingAll(false)
103105
}}
106+
onDelete={async () => {
107+
await refetch()
108+
setCheckedWorkspaces([])
109+
}}
104110
/>
105111
</>
106112
)
@@ -159,38 +165,69 @@ const BatchDeleteConfirmation = ({
159165
checkedWorkspaces,
160166
open,
161167
onClose,
168+
onDelete,
162169
}: {
163170
checkedWorkspaces: Workspace[]
164171
open: boolean
165172
onClose: () => void
173+
onDelete: () => void
166174
}) => {
167175
const [confirmValue, setConfirmValue] = useState("")
168176
const [confirmError, setConfirmError] = useState(false)
177+
const [isDeleting, setIsDeleting] = useState(false)
178+
179+
const close = () => {
180+
if (isDeleting) {
181+
return
182+
}
183+
184+
onClose()
185+
setConfirmValue("")
186+
setConfirmError(false)
187+
setIsDeleting(false)
188+
}
189+
190+
const confirmDeletion = async () => {
191+
setConfirmError(false)
169192

170-
const confirmDeletion = () => {
171193
if (confirmValue.toLowerCase() !== "delete") {
172194
setConfirmError(true)
173195
return
174196
}
197+
198+
try {
199+
setIsDeleting(true)
200+
await Promise.all(checkedWorkspaces.map((w) => deleteWorkspace(w.id)))
201+
} catch (e) {
202+
displayError(
203+
"Error on deleting workspaces",
204+
getErrorMessage(e, "An error occurred while deleting the workspaces"),
205+
)
206+
} finally {
207+
close()
208+
onDelete()
209+
}
175210
}
176211

177212
return (
178213
<ConfirmDialog
214+
type="delete"
179215
open={open}
216+
confirmLoading={isDeleting}
217+
onConfirm={confirmDeletion}
180218
onClose={() => {
181219
onClose()
182220
setConfirmValue("")
183221
setConfirmError(false)
184222
}}
185-
type="delete"
186223
title={`Delete ${checkedWorkspaces?.length} ${
187224
checkedWorkspaces.length === 1 ? "workspace" : "workspaces"
188225
}`}
189226
description={
190227
<form
191-
onSubmit={(e) => {
228+
onSubmit={async (e) => {
192229
e.preventDefault()
193-
confirmDeletion()
230+
await confirmDeletion()
194231
}}
195232
>
196233
<Box>
@@ -223,8 +260,6 @@ const BatchDeleteConfirmation = ({
223260
/>
224261
</form>
225262
}
226-
confirmLoading={false}
227-
onConfirm={confirmDeletion}
228263
/>
229264
)
230265
}

0 commit comments

Comments
 (0)