mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 06:23:06 +08:00
feat(base): reconcile bulk delete over socket + prune selection
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue, getDefaultStore } from "jotai";
|
||||||
import { useQueryClient, InfiniteData } from "@tanstack/react-query";
|
import { useQueryClient, InfiniteData } from "@tanstack/react-query";
|
||||||
import { socketAtom } from "@/features/websocket/atoms/socket-atom";
|
import { socketAtom } from "@/features/websocket/atoms/socket-atom";
|
||||||
import {
|
import {
|
||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
IBaseRow,
|
IBaseRow,
|
||||||
IBaseView,
|
IBaseView,
|
||||||
} from "@/features/base/types/base.types";
|
} from "@/features/base/types/base.types";
|
||||||
|
import { selectedRowIdsAtom } from "@/features/base/atoms/base-atoms";
|
||||||
import { IPagination } from "@/lib/types";
|
import { IPagination } from "@/lib/types";
|
||||||
|
|
||||||
type BaseRowCreated = {
|
type BaseRowCreated = {
|
||||||
@@ -31,6 +32,13 @@ type BaseRowDeleted = {
|
|||||||
requestId?: string | null;
|
requestId?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type BaseRowsDeleted = {
|
||||||
|
operation: "base:rows:deleted";
|
||||||
|
baseId: string;
|
||||||
|
rowIds: string[];
|
||||||
|
requestId?: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
type BaseRowReordered = {
|
type BaseRowReordered = {
|
||||||
operation: "base:row:reordered";
|
operation: "base:row:reordered";
|
||||||
baseId: string;
|
baseId: string;
|
||||||
@@ -65,6 +73,7 @@ type BaseInboundEvent =
|
|||||||
| BaseRowCreated
|
| BaseRowCreated
|
||||||
| BaseRowUpdated
|
| BaseRowUpdated
|
||||||
| BaseRowDeleted
|
| BaseRowDeleted
|
||||||
|
| BaseRowsDeleted
|
||||||
| BaseRowReordered
|
| BaseRowReordered
|
||||||
| BasePropertyEvent
|
| BasePropertyEvent
|
||||||
| BaseViewEvent
|
| BaseViewEvent
|
||||||
@@ -173,6 +182,41 @@ export function useBaseSocket(baseId: string | undefined): void {
|
|||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
const store = getDefaultStore();
|
||||||
|
const current = store.get(selectedRowIdsAtom);
|
||||||
|
if (current.has(e.rowId)) {
|
||||||
|
const next = new Set(current);
|
||||||
|
next.delete(e.rowId);
|
||||||
|
store.set(selectedRowIdsAtom, next);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "base:rows:deleted": {
|
||||||
|
const e = event as BaseRowsDeleted;
|
||||||
|
const removeSet = new Set(e.rowIds);
|
||||||
|
queryClient.setQueriesData<InfiniteData<IPagination<IBaseRow>>>(
|
||||||
|
{ queryKey: ["base-rows", baseId] },
|
||||||
|
(old) => {
|
||||||
|
if (!old) return old;
|
||||||
|
return {
|
||||||
|
...old,
|
||||||
|
pages: old.pages.map((page) => ({
|
||||||
|
...page,
|
||||||
|
items: page.items.filter((row) => !removeSet.has(row.id)),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const store = getDefaultStore();
|
||||||
|
const current = store.get(selectedRowIdsAtom);
|
||||||
|
if (current.size > 0) {
|
||||||
|
let changed = false;
|
||||||
|
const next = new Set(current);
|
||||||
|
for (const id of e.rowIds) {
|
||||||
|
if (next.delete(id)) changed = true;
|
||||||
|
}
|
||||||
|
if (changed) store.set(selectedRowIdsAtom, next);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "base:row:reordered": {
|
case "base:row:reordered": {
|
||||||
|
|||||||
Reference in New Issue
Block a user