mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 06:23:06 +08:00
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { useCallback } from "react";
|
|
import { notifications } from "@mantine/notifications";
|
|
import { useTranslation } from "react-i18next";
|
|
import { useRowSelection } from "@/features/base/hooks/use-row-selection";
|
|
import { useDeleteRowsMutation } from "@/features/base/queries/base-row-query";
|
|
|
|
const BATCH_SIZE = 500;
|
|
|
|
export function useDeleteSelectedRows(baseId: string) {
|
|
const { t } = useTranslation();
|
|
const { selectedIds, clear } = useRowSelection();
|
|
const mutation = useDeleteRowsMutation();
|
|
|
|
const deleteSelected = useCallback(async () => {
|
|
const ids = Array.from(selectedIds);
|
|
if (ids.length === 0) return;
|
|
const chunks: string[][] = [];
|
|
for (let i = 0; i < ids.length; i += BATCH_SIZE) {
|
|
chunks.push(ids.slice(i, i + BATCH_SIZE));
|
|
}
|
|
try {
|
|
for (const chunk of chunks) {
|
|
await mutation.mutateAsync({ baseId, rowIds: chunk });
|
|
}
|
|
notifications.show({
|
|
message: t("{{count}} rows deleted", { count: ids.length }),
|
|
});
|
|
clear();
|
|
} catch {
|
|
// mutation onError already shows notification
|
|
}
|
|
}, [baseId, selectedIds, mutation, clear, t]);
|
|
|
|
return { deleteSelected, isPending: mutation.isPending };
|
|
}
|