Files
mnote/wolai-frontend/src/lib/file-tree/delete.ts
T

51 lines
1.4 KiB
TypeScript
Raw Normal View History

2026-01-07 18:38:56 +08:00
"use client";
import type { FileTreeRow } from "@/lib/file-tree/types";
import { filterTopLevelDocIds } from "./dnd";
export type FileTreeDeleteTargets = {
docIds: string[];
assetIds: string[];
};
export function computeFileTreeDeleteTargets(args: {
visibleRows: FileTreeRow[];
selectedRowIds: Set<string>;
parentById: Map<string, string | null>;
}): FileTreeDeleteTargets {
const { visibleRows, selectedRowIds, parentById } = args;
const docCandidates: string[] = [];
const assetCandidates: string[] = [];
const assetDocIdByAssetId = new Map<string, string>();
for (const row of visibleRows) {
if (!selectedRowIds.has(row.rowId)) continue;
if (row.kind === "doc" || row.kind === "index") {
docCandidates.push(row.docId);
continue;
}
2026-01-11 12:35:53 +08:00
if (row.kind === "asset" || row.kind === "asset-folder") {
2026-01-07 18:38:56 +08:00
assetCandidates.push(row.asset.id);
assetDocIdByAssetId.set(row.asset.id, row.docId);
}
}
const docIds = filterTopLevelDocIds(docCandidates, parentById);
const docIdSet = new Set(docIds);
const seenAssets = new Set<string>();
const assetIds: string[] = [];
for (const assetId of assetCandidates) {
if (seenAssets.has(assetId)) continue;
seenAssets.add(assetId);
const docId = assetDocIdByAssetId.get(assetId);
if (docId && docIdSet.has(docId)) continue;
assetIds.push(assetId);
}
return { docIds, assetIds };
}