From b17505adf7571d6f8edf54669a2823d9913b90c3 Mon Sep 17 00:00:00 2001 From: cxymds Date: Wed, 8 Apr 2026 21:49:08 +0800 Subject: [PATCH] fix: disabled version bucket object delete do not display check delete all version --- components/object/list.tsx | 31 +++++++++++++++++++++++++------ lib/object-delete.ts | 17 +++++++++++++++++ tests/lib/object-delete.test.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 lib/object-delete.ts create mode 100644 tests/lib/object-delete.test.ts diff --git a/components/object/list.tsx b/components/object/list.tsx index 2246db2..841bdb0 100644 --- a/components/object/list.tsx +++ b/components/object/list.tsx @@ -39,6 +39,12 @@ import { exportFile } from "@/lib/export-file" import { getContentType } from "@/lib/mime-types" import { formatBytes } from "@/lib/functions" import { buildBucketPath } from "@/lib/bucket-path" +import { + resolveBucketVersioningState, + shouldForceDeleteObjects, + shouldShowDeleteAllVersions, + type BucketVersioningState, +} from "@/lib/object-delete" import { TaskStatsButton } from "@/components/tasks/stats-button" import { useAddDeleteKeys, useAddDeleteFolder, useTasks } from "@/contexts/task-context" import type { ColumnDef } from "@tanstack/react-table" @@ -92,7 +98,7 @@ export function ObjectList({ const [continuationToken, setContinuationToken] = React.useState() const [tokenHistory, setTokenHistory] = React.useState([]) const [nextToken, setNextToken] = React.useState() - const [bucketVersioningEnabled, setBucketVersioningEnabled] = React.useState(false) + const [bucketVersioningState, setBucketVersioningState] = React.useState("unknown") const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false) const [deleteDialogKeys, setDeleteDialogKeys] = React.useState([]) const [deleteAllVersions, setDeleteAllVersions] = React.useState(false) @@ -177,15 +183,28 @@ export function ObjectList({ }, [tasks, fetchObjects]) React.useEffect(() => { + let cancelled = false + const loadBucketVersioningStatus = async () => { + setBucketVersioningState("unknown") + try { const resp = await getBucketVersioning(bucket) - setBucketVersioningEnabled((resp as { Status?: string })?.Status === "Enabled") + if (!cancelled) { + setBucketVersioningState(resolveBucketVersioningState((resp as { Status?: string })?.Status)) + } } catch { - setBucketVersioningEnabled(false) + if (!cancelled) { + setBucketVersioningState("disabled") + } } } - loadBucketVersioningStatus() + + void loadBucketVersioningStatus() + + return () => { + cancelled = true + } }, [bucket, getBucketVersioning]) React.useEffect(() => { @@ -436,7 +455,7 @@ export function ObjectList({ setDeleteDialogOpen(false) if (!keys.length) return - if ((bucketVersioningEnabled && deleteAllVersions) || !bucketVersioningEnabled) { + if (shouldForceDeleteObjects(bucketVersioningState, deleteAllVersions)) { await handleDeleteAllVersions(keys) } else { await handleDelete(keys) @@ -603,7 +622,7 @@ export function ObjectList({ {t("Warning")} {t("Are you sure you want to delete the selected objects?")} - {bucketVersioningEnabled && ( + {shouldShowDeleteAllVersions(bucketVersioningState) && (