1"use client";
2
3
20import { useMemo } from "react";
21import { useQuery } from "@tanstack/react-query";
22import { workspaceApi } from "@/lib/api";
23import { useWorkspaceMembers } from "@/hooks/use-workspace";
24import { usePageTree } from "@/hooks/use-pages";
25import type { MentionSource } from "@/components/mentions/mention-model";
26import type { PageTreeEntry } from "@/lib/types";
27
28
29function flattenPages(entries: PageTreeEntry[] | undefined): { id: string; title: string }[] {
30 const out: { id: string; title: string }[] = [];
31 const walk = (list: PageTreeEntry[] | undefined) => {
32 for (const e of list ?? []) {
33 out.push({ id: e.id, title: e.title });
34 if (e.children) walk(e.children);
35 }
36 };
37 walk(entries);
38 return out;
39}
40
41export function useMentionSources(workspaceId: string) {
42 const enabled = workspaceId.length > 0;
43
44 const { data: members, isLoading: loadingMembers } = useWorkspaceMembers(workspaceId);
45 const { data: tree, isLoading: loadingTree } = usePageTree(workspaceId);
46 const { data: teams, isLoading: loadingTeams } = useQuery({
47 queryKey: ["workspaces", workspaceId, "teams"],
48 queryFn: () => workspaceApi.teams(workspaceId),
49 enabled
50 });
51 const { data: databases, isLoading: loadingDatabases } = useQuery({
52 queryKey: ["workspaces", workspaceId, "databases"],
53 queryFn: () => workspaceApi.databases(workspaceId, { limit: 50 }),
54 enabled
55 });
56
57 const source = useMemo<MentionSource>(
58 () => ({
59 people: (members ?? []).map((m) => m.user),
60 teams: (teams ?? []).map((t) => ({ id: t.id, name: t.name, memberCount: t.memberCount })),
61 pages: flattenPages(tree),
62 databases: (databases ?? []).map((d) => ({ id: d.id, title: d.title, icon: d.icon }))
63 }),
64 [members, teams, tree, databases]
65 );
66
67 return {
68 source,
69 isLoading: loadingMembers || loadingTree || loadingTeams || loadingDatabases
70 };
71}
72