mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-11 16:52:38 +02:00
refactor(mentions): update document mention handling to use document keys for consistency across components
This commit is contained in:
parent
76c91adebc
commit
8be7f2e05c
3 changed files with 25 additions and 13 deletions
|
|
@ -628,9 +628,14 @@ const Composer: FC = () => {
|
||||||
|
|
||||||
const handleDocumentRemove = useCallback(
|
const handleDocumentRemove = useCallback(
|
||||||
(docId: number, docType?: string) => {
|
(docId: number, docType?: string) => {
|
||||||
setMentionedDocuments((prev) =>
|
setMentionedDocuments((prev) => {
|
||||||
prev.filter((doc) => !(doc.id === docId && doc.document_type === docType))
|
if (!docType) {
|
||||||
);
|
// Defensive fallback: keep UI in sync even when chip type is unavailable.
|
||||||
|
return prev.filter((doc) => doc.id !== docId);
|
||||||
|
}
|
||||||
|
const removedKey = getMentionDocKey({ id: docId, document_type: docType });
|
||||||
|
return prev.filter((doc) => getMentionDocKey(doc) !== removedKey);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
[setMentionedDocuments]
|
[setMentionedDocuments]
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import { DndProvider } from "react-dnd";
|
||||||
import { HTML5Backend } from "react-dnd-html5-backend";
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
||||||
import { renamingFolderIdAtom } from "@/atoms/documents/folder.atoms";
|
import { renamingFolderIdAtom } from "@/atoms/documents/folder.atoms";
|
||||||
import type { DocumentTypeEnum } from "@/contracts/types/document.types";
|
import type { DocumentTypeEnum } from "@/contracts/types/document.types";
|
||||||
|
import { getMentionDocKey } from "@/lib/chat/mention-doc-key";
|
||||||
import { DocumentNode, type DocumentNodeDoc } from "./DocumentNode";
|
import { DocumentNode, type DocumentNodeDoc } from "./DocumentNode";
|
||||||
import { type FolderDisplay, FolderNode } from "./FolderNode";
|
import { type FolderDisplay, FolderNode } from "./FolderNode";
|
||||||
|
|
||||||
|
|
@ -17,7 +18,7 @@ interface FolderTreeViewProps {
|
||||||
documents: DocumentNodeDoc[];
|
documents: DocumentNodeDoc[];
|
||||||
expandedIds: Set<number>;
|
expandedIds: Set<number>;
|
||||||
onToggleExpand: (folderId: number) => void;
|
onToggleExpand: (folderId: number) => void;
|
||||||
mentionedDocIds: Set<number>;
|
mentionedDocKeys: Set<string>;
|
||||||
onToggleChatMention: (
|
onToggleChatMention: (
|
||||||
doc: { id: number; title: string; document_type: string },
|
doc: { id: number; title: string; document_type: string },
|
||||||
isMentioned: boolean
|
isMentioned: boolean
|
||||||
|
|
@ -62,7 +63,7 @@ export function FolderTreeView({
|
||||||
documents,
|
documents,
|
||||||
expandedIds,
|
expandedIds,
|
||||||
onToggleExpand,
|
onToggleExpand,
|
||||||
mentionedDocIds,
|
mentionedDocKeys,
|
||||||
onToggleChatMention,
|
onToggleChatMention,
|
||||||
onToggleFolderSelect,
|
onToggleFolderSelect,
|
||||||
onRenameFolder,
|
onRenameFolder,
|
||||||
|
|
@ -181,7 +182,7 @@ export function FolderTreeView({
|
||||||
|
|
||||||
function compute(folderId: number): { selected: number; total: number } {
|
function compute(folderId: number): { selected: number; total: number } {
|
||||||
const directDocs = (docsByFolder[folderId] ?? []).filter(isSelectable);
|
const directDocs = (docsByFolder[folderId] ?? []).filter(isSelectable);
|
||||||
let selected = directDocs.filter((d) => mentionedDocIds.has(d.id)).length;
|
let selected = directDocs.filter((d) => mentionedDocKeys.has(getMentionDocKey(d))).length;
|
||||||
let total = directDocs.length;
|
let total = directDocs.length;
|
||||||
|
|
||||||
for (const child of foldersByParent[folderId] ?? []) {
|
for (const child of foldersByParent[folderId] ?? []) {
|
||||||
|
|
@ -202,7 +203,7 @@ export function FolderTreeView({
|
||||||
if (states[f.id] === undefined) compute(f.id);
|
if (states[f.id] === undefined) compute(f.id);
|
||||||
}
|
}
|
||||||
return states;
|
return states;
|
||||||
}, [folders, docsByFolder, foldersByParent, mentionedDocIds]);
|
}, [folders, docsByFolder, foldersByParent, mentionedDocKeys]);
|
||||||
|
|
||||||
const folderMap = useMemo(() => {
|
const folderMap = useMemo(() => {
|
||||||
const map: Record<number, FolderDisplay> = {};
|
const map: Record<number, FolderDisplay> = {};
|
||||||
|
|
@ -276,7 +277,7 @@ export function FolderTreeView({
|
||||||
key={`doc-${d.id}`}
|
key={`doc-${d.id}`}
|
||||||
doc={d}
|
doc={d}
|
||||||
depth={depth}
|
depth={depth}
|
||||||
isMentioned={mentionedDocIds.has(d.id)}
|
isMentioned={mentionedDocKeys.has(getMentionDocKey(d))}
|
||||||
onToggleChatMention={onToggleChatMention}
|
onToggleChatMention={onToggleChatMention}
|
||||||
onPreview={onPreviewDocument}
|
onPreview={onPreviewDocument}
|
||||||
onEdit={onEditDocument}
|
onEdit={onEditDocument}
|
||||||
|
|
@ -356,7 +357,7 @@ export function FolderTreeView({
|
||||||
key={`doc-${d.id}`}
|
key={`doc-${d.id}`}
|
||||||
doc={d}
|
doc={d}
|
||||||
depth={depth}
|
depth={depth}
|
||||||
isMentioned={mentionedDocIds.has(d.id)}
|
isMentioned={mentionedDocKeys.has(getMentionDocKey(d))}
|
||||||
onToggleChatMention={onToggleChatMention}
|
onToggleChatMention={onToggleChatMention}
|
||||||
onPreview={onPreviewDocument}
|
onPreview={onPreviewDocument}
|
||||||
onEdit={onEditDocument}
|
onEdit={onEditDocument}
|
||||||
|
|
|
||||||
|
|
@ -416,7 +416,10 @@ function AuthenticatedDocumentsSidebarBase({
|
||||||
const { mutateAsync: deleteDocumentMutation } = useAtomValue(deleteDocumentMutationAtom);
|
const { mutateAsync: deleteDocumentMutation } = useAtomValue(deleteDocumentMutationAtom);
|
||||||
|
|
||||||
const [sidebarDocs, setSidebarDocs] = useAtom(mentionedDocumentsAtom);
|
const [sidebarDocs, setSidebarDocs] = useAtom(mentionedDocumentsAtom);
|
||||||
const mentionedDocIds = useMemo(() => new Set(sidebarDocs.map((d) => d.id)), [sidebarDocs]);
|
const mentionedDocKeys = useMemo(
|
||||||
|
() => new Set(sidebarDocs.map((d) => getMentionDocKey(d))),
|
||||||
|
[sidebarDocs]
|
||||||
|
);
|
||||||
|
|
||||||
// Folder state
|
// Folder state
|
||||||
const [expandedFolderMap, setExpandedFolderMap] = useAtom(expandedFolderIdsAtom);
|
const [expandedFolderMap, setExpandedFolderMap] = useAtom(expandedFolderIdsAtom);
|
||||||
|
|
@ -1143,7 +1146,7 @@ function AuthenticatedDocumentsSidebarBase({
|
||||||
documents={searchFilteredDocuments}
|
documents={searchFilteredDocuments}
|
||||||
expandedIds={expandedIds}
|
expandedIds={expandedIds}
|
||||||
onToggleExpand={toggleFolderExpand}
|
onToggleExpand={toggleFolderExpand}
|
||||||
mentionedDocIds={mentionedDocIds}
|
mentionedDocKeys={mentionedDocKeys}
|
||||||
onToggleChatMention={handleToggleChatMention}
|
onToggleChatMention={handleToggleChatMention}
|
||||||
onToggleFolderSelect={handleToggleFolderSelect}
|
onToggleFolderSelect={handleToggleFolderSelect}
|
||||||
onRenameFolder={handleRenameFolder}
|
onRenameFolder={handleRenameFolder}
|
||||||
|
|
@ -1572,7 +1575,10 @@ function AnonymousDocumentsSidebar({
|
||||||
const [search, setSearch] = useState("");
|
const [search, setSearch] = useState("");
|
||||||
|
|
||||||
const [sidebarDocs, setSidebarDocs] = useAtom(mentionedDocumentsAtom);
|
const [sidebarDocs, setSidebarDocs] = useAtom(mentionedDocumentsAtom);
|
||||||
const mentionedDocIds = useMemo(() => new Set(sidebarDocs.map((d) => d.id)), [sidebarDocs]);
|
const mentionedDocKeys = useMemo(
|
||||||
|
() => new Set(sidebarDocs.map((d) => getMentionDocKey(d))),
|
||||||
|
[sidebarDocs]
|
||||||
|
);
|
||||||
|
|
||||||
const handleToggleChatMention = useCallback(
|
const handleToggleChatMention = useCallback(
|
||||||
(doc: { id: number; title: string; document_type: string }, isMentioned: boolean) => {
|
(doc: { id: number; title: string; document_type: string }, isMentioned: boolean) => {
|
||||||
|
|
@ -1801,7 +1807,7 @@ function AnonymousDocumentsSidebar({
|
||||||
documents={searchFilteredDocs}
|
documents={searchFilteredDocs}
|
||||||
expandedIds={new Set()}
|
expandedIds={new Set()}
|
||||||
onToggleExpand={() => {}}
|
onToggleExpand={() => {}}
|
||||||
mentionedDocIds={mentionedDocIds}
|
mentionedDocKeys={mentionedDocKeys}
|
||||||
onToggleChatMention={handleToggleChatMention}
|
onToggleChatMention={handleToggleChatMention}
|
||||||
onToggleFolderSelect={() => {}}
|
onToggleFolderSelect={() => {}}
|
||||||
onRenameFolder={() => gate("rename folders")}
|
onRenameFolder={() => gate("rename folders")}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue