@burdenoff/microfe-conversations 2026.930.1 → 2026.1006.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conversations/components/NewConversationDialog.js +135 -133
- package/dist/conversations/components/NewConversationDialog.js.map +1 -1
- package/dist/conversations/hooks/useConversationQueries.js +66 -49
- package/dist/conversations/hooks/useConversationQueries.js.map +1 -1
- package/dist/generated/wspace-operations.js +87 -32
- package/dist/generated/wspace-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useConversations as e } from "../providers/ConversationsProvider.js";
|
|
2
|
-
import { useArchiveConversationMutation as t, useCreateConversationMutation as n, useGetConversationQuery as r, useGetConversationsQuery as i,
|
|
3
|
-
import { mapConversation as
|
|
4
|
-
import { applyMarkConversationAsReadToCache as
|
|
5
|
-
import { useCallback as
|
|
2
|
+
import { useArchiveConversationMutation as t, useCreateConversationMutation as n, useGetConversationQuery as r, useGetConversationsQuery as i, useGetOrCreateDirectConversationLazyQuery as a, useGetWorkspaceDirectoryQuery as o, useLeaveConversationMutation as s, useMarkConversationAsReadMutation as c, useMuteConversationMutation as l, usePinConversationMutation as u, useSearchConversationsQuery as d, useUnarchiveConversationMutation as f, useUnmuteConversationMutation as p, useUnpinConversationMutation as m, useUpdateConversationByHookMutation as h } from "../../generated/wspace-operations.js";
|
|
3
|
+
import { mapConversation as g } from "../utils/mappers.js";
|
|
4
|
+
import { applyMarkConversationAsReadToCache as _ } from "../utils/readReceiptCache.js";
|
|
5
|
+
import { useCallback as v, useEffect as y, useMemo as b, useState as x } from "react";
|
|
6
6
|
//#region src/conversations/hooks/useConversationQueries.ts
|
|
7
|
-
function
|
|
7
|
+
function S(t) {
|
|
8
8
|
let { workspaceId: n } = e(), r = i({
|
|
9
9
|
variables: {
|
|
10
10
|
first: t?.first ?? 25,
|
|
@@ -17,7 +17,7 @@ function x(t) {
|
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
skip: !n
|
|
20
|
-
}), a =
|
|
20
|
+
}), a = b(() => r.data?.conversations.edges.map((e) => g(e.node)) ?? [], [r.data]), o = r.data?.conversations.pageInfo.hasNextPage ?? !1;
|
|
21
21
|
return {
|
|
22
22
|
conversations: a,
|
|
23
23
|
loading: r.loading,
|
|
@@ -41,13 +41,13 @@ function x(t) {
|
|
|
41
41
|
}
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
function
|
|
44
|
+
function C(t) {
|
|
45
45
|
let { workspaceId: n } = e(), i = r({
|
|
46
46
|
variables: { id: t },
|
|
47
47
|
skip: !n || !t
|
|
48
48
|
});
|
|
49
49
|
return {
|
|
50
|
-
conversation: i.data?.conversation ?
|
|
50
|
+
conversation: i.data?.conversation ? g(i.data.conversation) : null,
|
|
51
51
|
members: i.data?.conversation?.members.edges.map((e) => e.node).filter((e) => !!e) ?? [],
|
|
52
52
|
membersTotalCount: i.data?.conversation?.members.totalCount ?? 0,
|
|
53
53
|
loading: i.loading,
|
|
@@ -57,8 +57,8 @@ function S(t) {
|
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
function
|
|
61
|
-
let { workspaceId: n } = e(), r = t.trim(), i =
|
|
60
|
+
function w(t) {
|
|
61
|
+
let { workspaceId: n } = e(), r = t.trim(), i = d({
|
|
62
62
|
variables: {
|
|
63
63
|
query: r,
|
|
64
64
|
first: 25
|
|
@@ -66,25 +66,25 @@ function C(t) {
|
|
|
66
66
|
skip: !n || r.length < 2
|
|
67
67
|
});
|
|
68
68
|
return {
|
|
69
|
-
conversations: i.data?.searchConversations.edges.map((e) =>
|
|
69
|
+
conversations: i.data?.searchConversations.edges.map((e) => g(e.node)) ?? [],
|
|
70
70
|
loading: i.loading,
|
|
71
71
|
error: i.error ?? null
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
-
var
|
|
75
|
-
function
|
|
76
|
-
let { workspaceId: n } = e(), [r, i] =
|
|
77
|
-
|
|
74
|
+
var T = 25, E = 250;
|
|
75
|
+
function D(t) {
|
|
76
|
+
let { workspaceId: n } = e(), [r, i] = x(t.trim());
|
|
77
|
+
y(() => {
|
|
78
78
|
let e = t.trim(), n = setTimeout(() => {
|
|
79
79
|
i(e);
|
|
80
|
-
},
|
|
80
|
+
}, E);
|
|
81
81
|
return () => clearTimeout(n);
|
|
82
82
|
}, [t]);
|
|
83
|
-
let
|
|
83
|
+
let a = o({
|
|
84
84
|
variables: {
|
|
85
85
|
filter: r ? { search: r } : void 0,
|
|
86
86
|
pagination: {
|
|
87
|
-
limit:
|
|
87
|
+
limit: T,
|
|
88
88
|
offset: 0
|
|
89
89
|
}
|
|
90
90
|
},
|
|
@@ -92,16 +92,16 @@ function E(t) {
|
|
|
92
92
|
fetchPolicy: "cache-and-network"
|
|
93
93
|
});
|
|
94
94
|
return {
|
|
95
|
-
members:
|
|
96
|
-
totalCount:
|
|
97
|
-
loading:
|
|
98
|
-
error:
|
|
95
|
+
members: b(() => a.data?.workspaceDirectory.edges ?? [], [a.data]),
|
|
96
|
+
totalCount: a.data?.workspaceDirectory.totalCount ?? 0,
|
|
97
|
+
loading: a.loading,
|
|
98
|
+
error: a.error ?? null
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
|
-
function
|
|
101
|
+
function O() {
|
|
102
102
|
let { workspaceId: t } = e(), [r, i] = n();
|
|
103
103
|
return {
|
|
104
|
-
createConversation:
|
|
104
|
+
createConversation: v(async (e) => {
|
|
105
105
|
if (!t) throw Error("Workspace context is required to create a conversation");
|
|
106
106
|
try {
|
|
107
107
|
let { data: n, error: i } = await r({ variables: { input: {
|
|
@@ -113,7 +113,7 @@ function D() {
|
|
|
113
113
|
} } });
|
|
114
114
|
if (i) throw i;
|
|
115
115
|
let a = n?.createConversation.conversation;
|
|
116
|
-
return a ?
|
|
116
|
+
return a ? g(a) : null;
|
|
117
117
|
} catch (e) {
|
|
118
118
|
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to create conversation");
|
|
119
119
|
}
|
|
@@ -122,10 +122,27 @@ function D() {
|
|
|
122
122
|
error: i.error ?? null
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
let [e, t] =
|
|
125
|
+
function k() {
|
|
126
|
+
let [e, t] = a();
|
|
127
|
+
return {
|
|
128
|
+
startDirectConversation: v(async (t) => {
|
|
129
|
+
try {
|
|
130
|
+
let { data: n, error: r } = await e({ variables: { userId: t } });
|
|
131
|
+
if (r) throw r;
|
|
132
|
+
let i = n?.getOrCreateDirectConversation;
|
|
133
|
+
return i ? g(i) : null;
|
|
134
|
+
} catch (e) {
|
|
135
|
+
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to open direct conversation");
|
|
136
|
+
}
|
|
137
|
+
}, [e]),
|
|
138
|
+
loading: t.loading,
|
|
139
|
+
error: t.error ?? null
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function A() {
|
|
143
|
+
let [e, t] = c();
|
|
127
144
|
return {
|
|
128
|
-
markConversationAsRead:
|
|
145
|
+
markConversationAsRead: v(async (t) => {
|
|
129
146
|
try {
|
|
130
147
|
let { data: n, error: r } = await e({
|
|
131
148
|
variables: {
|
|
@@ -134,7 +151,7 @@ function O() {
|
|
|
134
151
|
},
|
|
135
152
|
update: (e, t) => {
|
|
136
153
|
let n = t.data?.markConversationAsRead;
|
|
137
|
-
n &&
|
|
154
|
+
n && _(e, n);
|
|
138
155
|
}
|
|
139
156
|
});
|
|
140
157
|
if (r) throw r;
|
|
@@ -147,10 +164,10 @@ function O() {
|
|
|
147
164
|
error: t.error ?? null
|
|
148
165
|
};
|
|
149
166
|
}
|
|
150
|
-
function
|
|
151
|
-
let [e, n] = t(), [r, i] =
|
|
167
|
+
function j() {
|
|
168
|
+
let [e, n] = t(), [r, i] = f(), [a, o] = u(), [c, d] = m(), [h, g] = l(), [_, y] = p(), [b, x] = s();
|
|
152
169
|
return {
|
|
153
|
-
archiveConversation:
|
|
170
|
+
archiveConversation: v(async (t) => {
|
|
154
171
|
let { data: n } = await e({
|
|
155
172
|
variables: { id: t },
|
|
156
173
|
refetchQueries: ["GetConversations"],
|
|
@@ -158,7 +175,7 @@ function k() {
|
|
|
158
175
|
});
|
|
159
176
|
return n?.archiveConversation.id === t;
|
|
160
177
|
}, [e]),
|
|
161
|
-
unarchiveConversation:
|
|
178
|
+
unarchiveConversation: v(async (e) => {
|
|
162
179
|
let { data: t } = await r({
|
|
163
180
|
variables: { id: e },
|
|
164
181
|
refetchQueries: ["GetConversations"],
|
|
@@ -166,23 +183,23 @@ function k() {
|
|
|
166
183
|
});
|
|
167
184
|
return t?.unarchiveConversation.id === e;
|
|
168
185
|
}, [r]),
|
|
169
|
-
pinConversation:
|
|
186
|
+
pinConversation: v(async (e) => {
|
|
170
187
|
let { data: t } = await a({ variables: { conversationId: e } });
|
|
171
188
|
return !!t?.pinConversation?.id;
|
|
172
189
|
}, [a]),
|
|
173
|
-
unpinConversation:
|
|
174
|
-
let { data: t } = await
|
|
190
|
+
unpinConversation: v(async (e) => {
|
|
191
|
+
let { data: t } = await c({ variables: { conversationId: e } });
|
|
175
192
|
return !!t?.unpinConversation?.id;
|
|
176
|
-
}, [
|
|
177
|
-
muteConversation:
|
|
193
|
+
}, [c]),
|
|
194
|
+
muteConversation: v(async (e) => {
|
|
178
195
|
let { data: t } = await h({ variables: { conversationId: e } });
|
|
179
196
|
return !!t?.muteConversation?.id;
|
|
180
197
|
}, [h]),
|
|
181
|
-
unmuteConversation:
|
|
182
|
-
let { data: t } = await
|
|
198
|
+
unmuteConversation: v(async (e) => {
|
|
199
|
+
let { data: t } = await _({ variables: { conversationId: e } });
|
|
183
200
|
return !!t?.unmuteConversation?.id;
|
|
184
|
-
}, [
|
|
185
|
-
leaveConversation:
|
|
201
|
+
}, [_]),
|
|
202
|
+
leaveConversation: v(async (e) => {
|
|
186
203
|
let { data: t } = await b({
|
|
187
204
|
variables: { conversationId: e },
|
|
188
205
|
refetchQueries: ["GetConversations"],
|
|
@@ -190,17 +207,17 @@ function k() {
|
|
|
190
207
|
});
|
|
191
208
|
return t?.leaveConversation.success ?? !1;
|
|
192
209
|
}, [b]),
|
|
193
|
-
loading: n.loading || i.loading ||
|
|
194
|
-
error: n.error ?? i.error ??
|
|
210
|
+
loading: n.loading || i.loading || o.loading || d.loading || g.loading || y.loading || x.loading,
|
|
211
|
+
error: n.error ?? i.error ?? o.error ?? d.error ?? g.error ?? y.error ?? x.error ?? null
|
|
195
212
|
};
|
|
196
213
|
}
|
|
197
|
-
function
|
|
198
|
-
let [e, t] =
|
|
214
|
+
function M() {
|
|
215
|
+
let [e, t] = h();
|
|
199
216
|
return {
|
|
200
|
-
updateConversation:
|
|
217
|
+
updateConversation: v(async (t) => {
|
|
201
218
|
try {
|
|
202
219
|
let { data: n } = await e({ variables: { input: t } }), r = n?.updateConversation?.conversation;
|
|
203
|
-
return r ?
|
|
220
|
+
return r ? g(r) : null;
|
|
204
221
|
} catch (e) {
|
|
205
222
|
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to update conversation");
|
|
206
223
|
}
|
|
@@ -210,6 +227,6 @@ function A() {
|
|
|
210
227
|
};
|
|
211
228
|
}
|
|
212
229
|
//#endregion
|
|
213
|
-
export {
|
|
230
|
+
export { j as useConversationActions, O as useCreateConversation, C as useGetConversation, S as useGetConversations, A as useMarkConversationAsRead, w as useSearchConversations, k as useStartDirectConversation, M as useUpdateConversation, D as useWorkspaceDirectory };
|
|
214
231
|
|
|
215
232
|
//# sourceMappingURL=useConversationQueries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversationQueries.js","names":[],"sources":["../../../src/conversations/hooks/useConversationQueries.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { type ApolloCache, type FetchResult } from \"@apollo/client\";\nimport {\n type GetConversationQuery,\n type GetWorkspaceDirectoryQuery,\n type MarkConversationAsReadMutation,\n useArchiveConversationMutation,\n useCreateConversationMutation,\n useGetConversationQuery,\n useGetConversationsQuery,\n useGetWorkspaceDirectoryQuery,\n useMarkConversationAsReadMutation,\n useMuteConversationMutation,\n useLeaveConversationMutation,\n usePinConversationMutation,\n useSearchConversationsQuery,\n useUnarchiveConversationMutation,\n useUnmuteConversationMutation,\n useUnpinConversationMutation,\n useUpdateConversationByHookMutation,\n} from \"../../generated/wspace-operations\";\nimport type * as WspaceTypes from \"../../generated/wspace-types\";\nimport type {\n Conversation,\n ConversationState,\n ConversationType,\n ConversationVisibility,\n} from \"../types\";\nimport { useConversations } from \"../providers/ConversationsProvider\";\nimport { mapConversation } from \"../utils/mappers\";\nimport { applyMarkConversationAsReadToCache } from \"../utils/readReceiptCache\";\n\ninterface UseGetConversationsOptions {\n first?: number;\n after?: string;\n types?: ConversationType[];\n /**\n * Conversation lifecycle states to include. When omitted the backend\n * returns ACTIVE conversations by default (filtering is union, not\n * exclusion, so `[\"ACTIVE\"]` and `undefined` are interchangeable for the\n * default inbox). Pass `[\"ARCHIVED\"]` to drive the archived tab.\n */\n states?: ConversationState[];\n hasUnread?: boolean;\n isPinned?: boolean;\n}\n\ninterface UseGetConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n hasNextPage: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n/**\n * Hook: Fetch a paginated list of conversations.\n */\nexport function useGetConversations(\n options?: UseGetConversationsOptions,\n): UseGetConversationsResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationsQuery({\n variables: {\n first: options?.first ?? 25,\n after: options?.after,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n states: options?.states as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationState[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n skip: !workspaceId,\n });\n\n const conversations = useMemo(\n () =>\n queryResult.data?.conversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n [queryResult.data],\n );\n\n const hasNextPage =\n queryResult.data?.conversations.pageInfo.hasNextPage ?? false;\n\n return {\n conversations,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n hasNextPage,\n fetchMore: () => {\n const endCursor = queryResult.data?.conversations.pageInfo.endCursor;\n if (!endCursor || !hasNextPage) return;\n void queryResult.fetchMore({\n variables: {\n first: options?.first ?? 25,\n after: endCursor,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n states: options?.states as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationState[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n });\n },\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseGetConversationResult {\n conversation: Conversation | null;\n members: ConversationMember[];\n membersTotalCount: number;\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport type ConversationMember = NonNullable<\n GetConversationQuery[\"conversation\"]\n>[\"members\"][\"edges\"][number][\"node\"];\ntype ConversationMemberEdge = NonNullable<\n GetConversationQuery[\"conversation\"]\n>[\"members\"][\"edges\"][number];\n\n/**\n * Hook: Fetch a single conversation by ID.\n */\nexport function useGetConversation(\n conversationId: string,\n): UseGetConversationResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationQuery({\n variables: { id: conversationId },\n skip: !workspaceId || !conversationId,\n });\n\n return {\n conversation: queryResult.data?.conversation\n ? mapConversation(queryResult.data.conversation)\n : null,\n members:\n queryResult.data?.conversation?.members.edges\n .map((edge: ConversationMemberEdge) => edge.node)\n .filter(\n (member: ConversationMember | null): member is ConversationMember =>\n Boolean(member),\n ) ?? [],\n membersTotalCount: queryResult.data?.conversation?.members.totalCount ?? 0,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseSearchConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Search conversations by query string.\n */\nexport function useSearchConversations(\n query: string,\n): UseSearchConversationsResult {\n const { workspaceId } = useConversations();\n const trimmedQuery = query.trim();\n const queryResult = useSearchConversationsQuery({\n variables: { query: trimmedQuery, first: 25 },\n skip: !workspaceId || trimmedQuery.length < 2,\n });\n\n return {\n conversations:\n queryResult.data?.searchConversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n\n/**\n * A workspace member surfaced by the directory, resolved to a friendly\n * identity. `id` is the member's user id (used for `participantIds`).\n */\nexport type WorkspaceDirectoryMember =\n GetWorkspaceDirectoryQuery[\"workspaceDirectory\"][\"edges\"][number];\n\ninterface UseWorkspaceDirectoryResult {\n members: WorkspaceDirectoryMember[];\n totalCount: number;\n loading: boolean;\n error: Error | null;\n}\n\nconst DIRECTORY_PAGE_SIZE = 25;\nconst DIRECTORY_SEARCH_DEBOUNCE_MS = 250;\n\n/**\n * Hook: Search the current workspace's member directory (server-side,\n * debounced). Backed by the conversations `workspaceDirectory` query, which is\n * a thin, identity-resolved wrapper over wspace-workspace-svc. An empty search\n * lists the first page of members so the picker shows suggestions before the\n * user types.\n */\nexport function useWorkspaceDirectory(\n search: string,\n): UseWorkspaceDirectoryResult {\n const { workspaceId } = useConversations();\n const [debouncedSearch, setDebouncedSearch] = useState(search.trim());\n\n useEffect(() => {\n const trimmed = search.trim();\n const handle = setTimeout(() => {\n setDebouncedSearch(trimmed);\n }, DIRECTORY_SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(handle);\n }, [search]);\n\n const queryResult = useGetWorkspaceDirectoryQuery({\n variables: {\n filter: debouncedSearch ? { search: debouncedSearch } : undefined,\n pagination: { limit: DIRECTORY_PAGE_SIZE, offset: 0 },\n },\n skip: !workspaceId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const members = useMemo(\n () => queryResult.data?.workspaceDirectory.edges ?? [],\n [queryResult.data],\n );\n\n return {\n members,\n totalCount: queryResult.data?.workspaceDirectory.totalCount ?? 0,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n\ninterface CreateConversationInput {\n type: ConversationType;\n title?: string;\n description?: string;\n participantIds: string[];\n visibility?: ConversationVisibility;\n}\n\ninterface UseCreateConversationResult {\n createConversation: (\n input: CreateConversationInput,\n ) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Create a new conversation.\n */\nexport function useCreateConversation(): UseCreateConversationResult {\n const { workspaceId } = useConversations();\n const [createConversationMutation, mutationState] =\n useCreateConversationMutation();\n\n const createConversation = useCallback(\n async (input: CreateConversationInput): Promise<Conversation | null> => {\n if (!workspaceId) {\n throw new Error(\n \"Workspace context is required to create a conversation\",\n );\n }\n\n try {\n const { data, error } = await createConversationMutation({\n variables: {\n input: {\n workspaceId,\n type: input.type as WspaceTypes.ConversationType,\n title: input.title,\n description: input.description,\n participantIds: input.participantIds,\n },\n },\n });\n if (error) throw error;\n\n const conversation = data?.createConversation.conversation;\n return conversation ? mapConversation(conversation) : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to create conversation\");\n }\n },\n [createConversationMutation, workspaceId],\n );\n\n return {\n createConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseMarkConversationAsReadResult {\n markConversationAsRead: (input: {\n conversationId: string;\n messageId?: string;\n }) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Mark a conversation as read for the current viewer.\n *\n * Pass the newest message the viewer has seen as `messageId`; when omitted\n * the backend marks the whole conversation read. On success the cache update\n * zeroes the viewer-scoped `unreadCount`/`mentionCount` fields on the cached\n * Conversation entity — the list badge reads those top-level fields, which\n * membership normalization alone would leave stale — and drops the\n * conversation from any cached `hasUnread: true` list (see\n * `applyMarkConversationAsReadToCache`).\n */\nexport function useMarkConversationAsRead(): UseMarkConversationAsReadResult {\n const [markConversationAsReadMutation, mutationState] =\n useMarkConversationAsReadMutation();\n\n const markConversationAsRead = useCallback(\n async (input: {\n conversationId: string;\n messageId?: string;\n }): Promise<boolean> => {\n try {\n const { data, error } = await markConversationAsReadMutation({\n variables: {\n conversationId: input.conversationId,\n messageId: input.messageId,\n },\n update: (\n cache: ApolloCache,\n result: FetchResult<MarkConversationAsReadMutation>,\n ) => {\n const membership = result.data?.markConversationAsRead;\n if (!membership) return;\n applyMarkConversationAsReadToCache(cache, membership);\n },\n });\n if (error) throw error;\n return Boolean(data?.markConversationAsRead);\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to mark conversation as read\");\n }\n },\n [markConversationAsReadMutation],\n );\n\n return {\n markConversationAsRead,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseUpdateConversationResult {\n archiveConversation: (id: string) => Promise<boolean>;\n unarchiveConversation: (id: string) => Promise<boolean>;\n pinConversation: (id: string) => Promise<boolean>;\n unpinConversation: (id: string) => Promise<boolean>;\n muteConversation: (id: string) => Promise<boolean>;\n unmuteConversation: (id: string) => Promise<boolean>;\n leaveConversation: (id: string) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Conversation mutation operations.\n */\nexport function useConversationActions(): UseUpdateConversationResult {\n const [archiveConversationMutation, archiveState] =\n useArchiveConversationMutation();\n const [unarchiveConversationMutation, unarchiveState] =\n useUnarchiveConversationMutation();\n const [pinConversationMutation, pinState] = usePinConversationMutation();\n const [unpinConversationMutation, unpinState] =\n useUnpinConversationMutation();\n const [muteConversationMutation, muteState] = useMuteConversationMutation();\n const [unmuteConversationMutation, unmuteState] =\n useUnmuteConversationMutation();\n const [leaveConversationMutation, leaveState] =\n useLeaveConversationMutation();\n\n const archiveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n // refetch GetConversations so the row drops out of the inbox (and the\n // Archived tab gains it) without waiting for a manual refresh.\n const { data } = await archiveConversationMutation({\n variables: { id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.archiveConversation.id === id;\n },\n [archiveConversationMutation],\n );\n\n const unarchiveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unarchiveConversationMutation({\n variables: { id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.unarchiveConversation.id === id;\n },\n [unarchiveConversationMutation],\n );\n\n const pinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await pinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.pinConversation?.id);\n },\n [pinConversationMutation],\n );\n\n const unpinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unpinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unpinConversation?.id);\n },\n [unpinConversationMutation],\n );\n\n const muteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await muteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.muteConversation?.id);\n },\n [muteConversationMutation],\n );\n\n const unmuteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unmuteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unmuteConversation?.id);\n },\n [unmuteConversationMutation],\n );\n\n const leaveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await leaveConversationMutation({\n variables: { conversationId: id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.leaveConversation.success ?? false;\n },\n [leaveConversationMutation],\n );\n\n return {\n archiveConversation,\n unarchiveConversation,\n pinConversation,\n unpinConversation,\n muteConversation,\n unmuteConversation,\n leaveConversation,\n loading:\n archiveState.loading ||\n unarchiveState.loading ||\n pinState.loading ||\n unpinState.loading ||\n muteState.loading ||\n unmuteState.loading ||\n leaveState.loading,\n error:\n (archiveState.error as Error | undefined) ??\n (unarchiveState.error as Error | undefined) ??\n (pinState.error as Error | undefined) ??\n (unpinState.error as Error | undefined) ??\n (muteState.error as Error | undefined) ??\n (unmuteState.error as Error | undefined) ??\n (leaveState.error as Error | undefined) ??\n null,\n };\n}\n\ninterface UseUpdateConversationOptions {\n updateConversation: (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useUpdateConversation(): UseUpdateConversationOptions {\n const [updateConversationMutation, mutationState] =\n useUpdateConversationByHookMutation();\n\n const updateConversation = useCallback(\n async (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }): Promise<Conversation | null> => {\n try {\n const { data } = await updateConversationMutation({\n variables: { input },\n });\n const typedData = data as\n | {\n updateConversation?: {\n conversation?: Record<string, unknown> | null;\n };\n }\n | undefined;\n const conversation = typedData?.updateConversation?.conversation;\n return conversation\n ? mapConversation(conversation as Record<string, unknown>)\n : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to update conversation\");\n }\n },\n [updateConversationMutation],\n );\n\n return {\n updateConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useConversationQueries.js","names":[],"sources":["../../../src/conversations/hooks/useConversationQueries.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { type ApolloCache, type FetchResult } from \"@apollo/client\";\nimport {\n type GetConversationQuery,\n type GetOrCreateDirectConversationQuery,\n type GetWorkspaceDirectoryQuery,\n type MarkConversationAsReadMutation,\n useArchiveConversationMutation,\n useCreateConversationMutation,\n useGetConversationQuery,\n useGetConversationsQuery,\n useGetOrCreateDirectConversationLazyQuery,\n useGetWorkspaceDirectoryQuery,\n useMarkConversationAsReadMutation,\n useMuteConversationMutation,\n useLeaveConversationMutation,\n usePinConversationMutation,\n useSearchConversationsQuery,\n useUnarchiveConversationMutation,\n useUnmuteConversationMutation,\n useUnpinConversationMutation,\n useUpdateConversationByHookMutation,\n} from \"../../generated/wspace-operations\";\nimport type * as WspaceTypes from \"../../generated/wspace-types\";\nimport type {\n Conversation,\n ConversationState,\n ConversationType,\n ConversationVisibility,\n} from \"../types\";\nimport { useConversations } from \"../providers/ConversationsProvider\";\nimport { mapConversation } from \"../utils/mappers\";\nimport { applyMarkConversationAsReadToCache } from \"../utils/readReceiptCache\";\n\ninterface UseGetConversationsOptions {\n first?: number;\n after?: string;\n types?: ConversationType[];\n /**\n * Conversation lifecycle states to include. When omitted the backend\n * returns ACTIVE conversations by default (filtering is union, not\n * exclusion, so `[\"ACTIVE\"]` and `undefined` are interchangeable for the\n * default inbox). Pass `[\"ARCHIVED\"]` to drive the archived tab.\n */\n states?: ConversationState[];\n hasUnread?: boolean;\n isPinned?: boolean;\n}\n\ninterface UseGetConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n hasNextPage: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n/**\n * Hook: Fetch a paginated list of conversations.\n */\nexport function useGetConversations(\n options?: UseGetConversationsOptions,\n): UseGetConversationsResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationsQuery({\n variables: {\n first: options?.first ?? 25,\n after: options?.after,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n states: options?.states as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationState[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n skip: !workspaceId,\n });\n\n const conversations = useMemo(\n () =>\n queryResult.data?.conversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n [queryResult.data],\n );\n\n const hasNextPage =\n queryResult.data?.conversations.pageInfo.hasNextPage ?? false;\n\n return {\n conversations,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n hasNextPage,\n fetchMore: () => {\n const endCursor = queryResult.data?.conversations.pageInfo.endCursor;\n if (!endCursor || !hasNextPage) return;\n void queryResult.fetchMore({\n variables: {\n first: options?.first ?? 25,\n after: endCursor,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n states: options?.states as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationState[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n });\n },\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseGetConversationResult {\n conversation: Conversation | null;\n members: ConversationMember[];\n membersTotalCount: number;\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport type ConversationMember = NonNullable<\n GetConversationQuery[\"conversation\"]\n>[\"members\"][\"edges\"][number][\"node\"];\ntype ConversationMemberEdge = NonNullable<\n GetConversationQuery[\"conversation\"]\n>[\"members\"][\"edges\"][number];\n\n/**\n * Hook: Fetch a single conversation by ID.\n */\nexport function useGetConversation(\n conversationId: string,\n): UseGetConversationResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationQuery({\n variables: { id: conversationId },\n skip: !workspaceId || !conversationId,\n });\n\n return {\n conversation: queryResult.data?.conversation\n ? mapConversation(queryResult.data.conversation)\n : null,\n members:\n queryResult.data?.conversation?.members.edges\n .map((edge: ConversationMemberEdge) => edge.node)\n .filter(\n (member: ConversationMember | null): member is ConversationMember =>\n Boolean(member),\n ) ?? [],\n membersTotalCount: queryResult.data?.conversation?.members.totalCount ?? 0,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseSearchConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Search conversations by query string.\n */\nexport function useSearchConversations(\n query: string,\n): UseSearchConversationsResult {\n const { workspaceId } = useConversations();\n const trimmedQuery = query.trim();\n const queryResult = useSearchConversationsQuery({\n variables: { query: trimmedQuery, first: 25 },\n skip: !workspaceId || trimmedQuery.length < 2,\n });\n\n return {\n conversations:\n queryResult.data?.searchConversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n\n/**\n * A workspace member surfaced by the directory, resolved to a friendly\n * identity. `id` is the member's user id (used for `participantIds`).\n */\nexport type WorkspaceDirectoryMember =\n GetWorkspaceDirectoryQuery[\"workspaceDirectory\"][\"edges\"][number];\n\ninterface UseWorkspaceDirectoryResult {\n members: WorkspaceDirectoryMember[];\n totalCount: number;\n loading: boolean;\n error: Error | null;\n}\n\nconst DIRECTORY_PAGE_SIZE = 25;\nconst DIRECTORY_SEARCH_DEBOUNCE_MS = 250;\n\n/**\n * Hook: Search the current workspace's member directory (server-side,\n * debounced). Backed by the conversations `workspaceDirectory` query, which is\n * a thin, identity-resolved wrapper over wspace-workspace-svc. An empty search\n * lists the first page of members so the picker shows suggestions before the\n * user types.\n */\nexport function useWorkspaceDirectory(\n search: string,\n): UseWorkspaceDirectoryResult {\n const { workspaceId } = useConversations();\n const [debouncedSearch, setDebouncedSearch] = useState(search.trim());\n\n useEffect(() => {\n const trimmed = search.trim();\n const handle = setTimeout(() => {\n setDebouncedSearch(trimmed);\n }, DIRECTORY_SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(handle);\n }, [search]);\n\n const queryResult = useGetWorkspaceDirectoryQuery({\n variables: {\n filter: debouncedSearch ? { search: debouncedSearch } : undefined,\n pagination: { limit: DIRECTORY_PAGE_SIZE, offset: 0 },\n },\n skip: !workspaceId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const members = useMemo(\n () => queryResult.data?.workspaceDirectory.edges ?? [],\n [queryResult.data],\n );\n\n return {\n members,\n totalCount: queryResult.data?.workspaceDirectory.totalCount ?? 0,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n\ninterface CreateConversationInput {\n type: ConversationType;\n title?: string;\n description?: string;\n participantIds: string[];\n visibility?: ConversationVisibility;\n}\n\ninterface UseCreateConversationResult {\n createConversation: (\n input: CreateConversationInput,\n ) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Create a new conversation.\n */\nexport function useCreateConversation(): UseCreateConversationResult {\n const { workspaceId } = useConversations();\n const [createConversationMutation, mutationState] =\n useCreateConversationMutation();\n\n const createConversation = useCallback(\n async (input: CreateConversationInput): Promise<Conversation | null> => {\n if (!workspaceId) {\n throw new Error(\n \"Workspace context is required to create a conversation\",\n );\n }\n\n try {\n const { data, error } = await createConversationMutation({\n variables: {\n input: {\n workspaceId,\n type: input.type as WspaceTypes.ConversationType,\n title: input.title,\n description: input.description,\n participantIds: input.participantIds,\n },\n },\n });\n if (error) throw error;\n\n const conversation = data?.createConversation.conversation;\n return conversation ? mapConversation(conversation) : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to create conversation\");\n }\n },\n [createConversationMutation, workspaceId],\n );\n\n return {\n createConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseStartDirectConversationResult {\n /**\n * Open (or create) the 1-to-1 conversation with `userId`. Reuses the\n * existing thread if one is already bound to the (viewer, recipient) pair;\n * mints a new one otherwise. See BOFF-8227.\n */\n startDirectConversation: (userId: string) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: open or create the 1-to-1 conversation with another workspace member.\n *\n * Wraps the `getOrCreateDirectConversation` GraphQL query so the *only* place\n * a DM is ever created for a given pair is the backend's exact-pair lookup.\n * The frontend must NOT call `useCreateConversation` for DMs — that path\n * always mints a new row, which is what produced duplicate DM threads in the\n * inbox (BOFF-8227).\n *\n * The returned conversation id is the id of either the freshly-created row OR\n * the pre-existing thread that was reused — callers can treat it as the\n * authoritative detail-page id regardless of which branch ran.\n */\nexport function useStartDirectConversation(): UseStartDirectConversationResult {\n const [getOrCreateDirectConversation, queryState] =\n useGetOrCreateDirectConversationLazyQuery();\n\n const startDirectConversation = useCallback(\n async (userId: string): Promise<Conversation | null> => {\n try {\n const { data, error } = await getOrCreateDirectConversation({\n variables: { userId },\n });\n if (error) throw error;\n\n const rawConversation = (\n data as GetOrCreateDirectConversationQuery | undefined | null\n )?.getOrCreateDirectConversation;\n return rawConversation\n ? mapConversation(\n rawConversation as unknown as Record<string, unknown>,\n )\n : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to open direct conversation\");\n }\n },\n [getOrCreateDirectConversation],\n );\n\n return {\n startDirectConversation,\n loading: queryState.loading,\n error: queryState.error ?? null,\n };\n}\n\ninterface UseMarkConversationAsReadResult {\n markConversationAsRead: (input: {\n conversationId: string;\n messageId?: string;\n }) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Mark a conversation as read for the current viewer.\n *\n * Pass the newest message the viewer has seen as `messageId`; when omitted\n * the backend marks the whole conversation read. On success the cache update\n * zeroes the viewer-scoped `unreadCount`/`mentionCount` fields on the cached\n * Conversation entity — the list badge reads those top-level fields, which\n * membership normalization alone would leave stale — and drops the\n * conversation from any cached `hasUnread: true` list (see\n * `applyMarkConversationAsReadToCache`).\n */\nexport function useMarkConversationAsRead(): UseMarkConversationAsReadResult {\n const [markConversationAsReadMutation, mutationState] =\n useMarkConversationAsReadMutation();\n\n const markConversationAsRead = useCallback(\n async (input: {\n conversationId: string;\n messageId?: string;\n }): Promise<boolean> => {\n try {\n const { data, error } = await markConversationAsReadMutation({\n variables: {\n conversationId: input.conversationId,\n messageId: input.messageId,\n },\n update: (\n cache: ApolloCache,\n result: FetchResult<MarkConversationAsReadMutation>,\n ) => {\n const membership = result.data?.markConversationAsRead;\n if (!membership) return;\n applyMarkConversationAsReadToCache(cache, membership);\n },\n });\n if (error) throw error;\n return Boolean(data?.markConversationAsRead);\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to mark conversation as read\");\n }\n },\n [markConversationAsReadMutation],\n );\n\n return {\n markConversationAsRead,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseUpdateConversationResult {\n archiveConversation: (id: string) => Promise<boolean>;\n unarchiveConversation: (id: string) => Promise<boolean>;\n pinConversation: (id: string) => Promise<boolean>;\n unpinConversation: (id: string) => Promise<boolean>;\n muteConversation: (id: string) => Promise<boolean>;\n unmuteConversation: (id: string) => Promise<boolean>;\n leaveConversation: (id: string) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Conversation mutation operations.\n */\nexport function useConversationActions(): UseUpdateConversationResult {\n const [archiveConversationMutation, archiveState] =\n useArchiveConversationMutation();\n const [unarchiveConversationMutation, unarchiveState] =\n useUnarchiveConversationMutation();\n const [pinConversationMutation, pinState] = usePinConversationMutation();\n const [unpinConversationMutation, unpinState] =\n useUnpinConversationMutation();\n const [muteConversationMutation, muteState] = useMuteConversationMutation();\n const [unmuteConversationMutation, unmuteState] =\n useUnmuteConversationMutation();\n const [leaveConversationMutation, leaveState] =\n useLeaveConversationMutation();\n\n const archiveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n // refetch GetConversations so the row drops out of the inbox (and the\n // Archived tab gains it) without waiting for a manual refresh.\n const { data } = await archiveConversationMutation({\n variables: { id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.archiveConversation.id === id;\n },\n [archiveConversationMutation],\n );\n\n const unarchiveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unarchiveConversationMutation({\n variables: { id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.unarchiveConversation.id === id;\n },\n [unarchiveConversationMutation],\n );\n\n const pinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await pinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.pinConversation?.id);\n },\n [pinConversationMutation],\n );\n\n const unpinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unpinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unpinConversation?.id);\n },\n [unpinConversationMutation],\n );\n\n const muteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await muteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.muteConversation?.id);\n },\n [muteConversationMutation],\n );\n\n const unmuteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unmuteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unmuteConversation?.id);\n },\n [unmuteConversationMutation],\n );\n\n const leaveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await leaveConversationMutation({\n variables: { conversationId: id },\n refetchQueries: [\"GetConversations\"],\n awaitRefetchQueries: true,\n });\n return data?.leaveConversation.success ?? false;\n },\n [leaveConversationMutation],\n );\n\n return {\n archiveConversation,\n unarchiveConversation,\n pinConversation,\n unpinConversation,\n muteConversation,\n unmuteConversation,\n leaveConversation,\n loading:\n archiveState.loading ||\n unarchiveState.loading ||\n pinState.loading ||\n unpinState.loading ||\n muteState.loading ||\n unmuteState.loading ||\n leaveState.loading,\n error:\n (archiveState.error as Error | undefined) ??\n (unarchiveState.error as Error | undefined) ??\n (pinState.error as Error | undefined) ??\n (unpinState.error as Error | undefined) ??\n (muteState.error as Error | undefined) ??\n (unmuteState.error as Error | undefined) ??\n (leaveState.error as Error | undefined) ??\n null,\n };\n}\n\ninterface UseUpdateConversationOptions {\n updateConversation: (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useUpdateConversation(): UseUpdateConversationOptions {\n const [updateConversationMutation, mutationState] =\n useUpdateConversationByHookMutation();\n\n const updateConversation = useCallback(\n async (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }): Promise<Conversation | null> => {\n try {\n const { data } = await updateConversationMutation({\n variables: { input },\n });\n const typedData = data as\n | {\n updateConversation?: {\n conversation?: Record<string, unknown> | null;\n };\n }\n | undefined;\n const conversation = typedData?.updateConversation?.conversation;\n return conversation\n ? mapConversation(conversation as Record<string, unknown>)\n : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to update conversation\");\n }\n },\n [updateConversationMutation],\n );\n\n return {\n updateConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n"],"mappings":"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"}
|
|
@@ -368,35 +368,35 @@ function A(e) {
|
|
|
368
368
|
};
|
|
369
369
|
return t.useMutation(k, r);
|
|
370
370
|
}
|
|
371
|
-
var
|
|
371
|
+
var ee = e`
|
|
372
372
|
mutation UnpinConversation($conversationId: ID!) {
|
|
373
373
|
unpinConversation(conversationId: $conversationId) {
|
|
374
374
|
id
|
|
375
375
|
}
|
|
376
376
|
}
|
|
377
377
|
`;
|
|
378
|
-
function
|
|
378
|
+
function j(e) {
|
|
379
379
|
let r = {
|
|
380
380
|
...n,
|
|
381
381
|
...e
|
|
382
382
|
};
|
|
383
|
-
return t.useMutation(
|
|
383
|
+
return t.useMutation(ee, r);
|
|
384
384
|
}
|
|
385
|
-
var
|
|
385
|
+
var M = e`
|
|
386
386
|
mutation UnpinMessageByHook($messageId: ID!) {
|
|
387
387
|
unpinMessage(messageId: $messageId) {
|
|
388
388
|
id
|
|
389
389
|
}
|
|
390
390
|
}
|
|
391
391
|
`;
|
|
392
|
-
function
|
|
392
|
+
function N(e) {
|
|
393
393
|
let r = {
|
|
394
394
|
...n,
|
|
395
395
|
...e
|
|
396
396
|
};
|
|
397
|
-
return t.useMutation(
|
|
397
|
+
return t.useMutation(M, r);
|
|
398
398
|
}
|
|
399
|
-
var
|
|
399
|
+
var P = e`
|
|
400
400
|
mutation UpdateConversationByHook($input: UpdateConversationInput!) {
|
|
401
401
|
updateConversation(input: $input) {
|
|
402
402
|
success
|
|
@@ -429,14 +429,14 @@ var F = e`
|
|
|
429
429
|
}
|
|
430
430
|
}
|
|
431
431
|
`;
|
|
432
|
-
function
|
|
432
|
+
function F(e) {
|
|
433
433
|
let r = {
|
|
434
434
|
...n,
|
|
435
435
|
...e
|
|
436
436
|
};
|
|
437
|
-
return t.useMutation(
|
|
437
|
+
return t.useMutation(P, r);
|
|
438
438
|
}
|
|
439
|
-
var
|
|
439
|
+
var I = e`
|
|
440
440
|
query GetConversation($id: ID!) {
|
|
441
441
|
conversation(id: $id) {
|
|
442
442
|
id
|
|
@@ -503,14 +503,14 @@ var L = e`
|
|
|
503
503
|
}
|
|
504
504
|
}
|
|
505
505
|
`;
|
|
506
|
-
function
|
|
506
|
+
function L(e) {
|
|
507
507
|
let r = {
|
|
508
508
|
...n,
|
|
509
509
|
...e
|
|
510
510
|
};
|
|
511
|
-
return t.useQuery(
|
|
511
|
+
return t.useQuery(I, r);
|
|
512
512
|
}
|
|
513
|
-
var
|
|
513
|
+
var R = e`
|
|
514
514
|
query GetConversations($first: Int, $after: String, $filter: ConversationFilter, $sort: ConversationSort) {
|
|
515
515
|
conversations(first: $first, after: $after, filter: $filter, sort: $sort) {
|
|
516
516
|
edges {
|
|
@@ -571,14 +571,14 @@ var z = e`
|
|
|
571
571
|
}
|
|
572
572
|
}
|
|
573
573
|
`;
|
|
574
|
-
function
|
|
574
|
+
function z(e) {
|
|
575
575
|
let r = {
|
|
576
576
|
...n,
|
|
577
577
|
...e
|
|
578
578
|
};
|
|
579
|
-
return t.useQuery(
|
|
579
|
+
return t.useQuery(R, r);
|
|
580
580
|
}
|
|
581
|
-
var
|
|
581
|
+
var B = e`
|
|
582
582
|
query GetMessages($conversationId: ID!, $first: Int, $after: String, $before: String, $filter: MessageFilter) {
|
|
583
583
|
messages(
|
|
584
584
|
conversationId: $conversationId
|
|
@@ -661,12 +661,67 @@ var V = e`
|
|
|
661
661
|
}
|
|
662
662
|
}
|
|
663
663
|
`;
|
|
664
|
-
function
|
|
664
|
+
function V(e) {
|
|
665
665
|
let r = {
|
|
666
666
|
...n,
|
|
667
667
|
...e
|
|
668
668
|
};
|
|
669
|
-
return t.useQuery(
|
|
669
|
+
return t.useQuery(B, r);
|
|
670
|
+
}
|
|
671
|
+
var H = e`
|
|
672
|
+
query GetOrCreateDirectConversation($userId: ID!) {
|
|
673
|
+
getOrCreateDirectConversation(userId: $userId) {
|
|
674
|
+
id
|
|
675
|
+
workspaceId
|
|
676
|
+
type
|
|
677
|
+
title
|
|
678
|
+
description
|
|
679
|
+
avatar
|
|
680
|
+
state
|
|
681
|
+
visibility
|
|
682
|
+
isGroup
|
|
683
|
+
createdBy
|
|
684
|
+
createdAt
|
|
685
|
+
updatedAt
|
|
686
|
+
currentUserMembership {
|
|
687
|
+
id
|
|
688
|
+
role
|
|
689
|
+
status
|
|
690
|
+
lastReadMessageId
|
|
691
|
+
lastReadAt
|
|
692
|
+
unreadCount
|
|
693
|
+
mentionCount
|
|
694
|
+
notificationLevel
|
|
695
|
+
isMuted
|
|
696
|
+
isPinned
|
|
697
|
+
pinnedOrder
|
|
698
|
+
canSendMessages
|
|
699
|
+
canAddMembers
|
|
700
|
+
canRemoveMembers
|
|
701
|
+
joinedAt
|
|
702
|
+
customTitle
|
|
703
|
+
customAvatar
|
|
704
|
+
}
|
|
705
|
+
memberCount
|
|
706
|
+
unreadCount
|
|
707
|
+
mentionCount
|
|
708
|
+
features {
|
|
709
|
+
threads
|
|
710
|
+
reactions
|
|
711
|
+
mentions
|
|
712
|
+
calls
|
|
713
|
+
apps
|
|
714
|
+
polls
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
`;
|
|
719
|
+
function U(e) {
|
|
720
|
+
let r = {
|
|
721
|
+
...n,
|
|
722
|
+
...e
|
|
723
|
+
};
|
|
724
|
+
return t.useLazyQuery(H, r);
|
|
670
725
|
}
|
|
671
726
|
e`
|
|
672
727
|
query GetPresence($userIds: [ID!]!) {
|
|
@@ -743,7 +798,7 @@ e`
|
|
|
743
798
|
}
|
|
744
799
|
}
|
|
745
800
|
`;
|
|
746
|
-
var
|
|
801
|
+
var W = e`
|
|
747
802
|
query GetWorkspaceDirectory($filter: WorkspaceDirectoryFilter, $pagination: PaginationInput) {
|
|
748
803
|
workspaceDirectory(filter: $filter, pagination: $pagination) {
|
|
749
804
|
totalCount
|
|
@@ -756,14 +811,14 @@ var U = e`
|
|
|
756
811
|
}
|
|
757
812
|
}
|
|
758
813
|
`;
|
|
759
|
-
function
|
|
814
|
+
function G(e) {
|
|
760
815
|
let r = {
|
|
761
816
|
...n,
|
|
762
817
|
...e
|
|
763
818
|
};
|
|
764
|
-
return t.useQuery(
|
|
819
|
+
return t.useQuery(W, r);
|
|
765
820
|
}
|
|
766
|
-
var
|
|
821
|
+
var K = e`
|
|
767
822
|
query SearchConversations($query: String!, $first: Int, $after: String, $filter: ConversationFilter) {
|
|
768
823
|
searchConversations(
|
|
769
824
|
query: $query
|
|
@@ -820,12 +875,12 @@ var G = e`
|
|
|
820
875
|
}
|
|
821
876
|
}
|
|
822
877
|
`;
|
|
823
|
-
function
|
|
878
|
+
function q(e) {
|
|
824
879
|
let r = {
|
|
825
880
|
...n,
|
|
826
881
|
...e
|
|
827
882
|
};
|
|
828
|
-
return t.useQuery(
|
|
883
|
+
return t.useQuery(K, r);
|
|
829
884
|
}
|
|
830
885
|
e`
|
|
831
886
|
query SearchMessagesByHook($query: String!, $conversationId: ID, $first: Int) {
|
|
@@ -888,7 +943,7 @@ e`
|
|
|
888
943
|
}
|
|
889
944
|
}
|
|
890
945
|
`;
|
|
891
|
-
var
|
|
946
|
+
var J = e`
|
|
892
947
|
subscription ConversationAdded {
|
|
893
948
|
conversationAdded {
|
|
894
949
|
id
|
|
@@ -903,7 +958,7 @@ var q = e`
|
|
|
903
958
|
updatedAt
|
|
904
959
|
}
|
|
905
960
|
}
|
|
906
|
-
`,
|
|
961
|
+
`, Y = e`
|
|
907
962
|
subscription ConversationUpdated($conversationId: ID!) {
|
|
908
963
|
conversationUpdated(conversationId: $conversationId) {
|
|
909
964
|
changes
|
|
@@ -919,14 +974,14 @@ var q = e`
|
|
|
919
974
|
}
|
|
920
975
|
}
|
|
921
976
|
}
|
|
922
|
-
`,
|
|
977
|
+
`, X = e`
|
|
923
978
|
subscription ConversationDeleted($conversationId: ID!) {
|
|
924
979
|
conversationDeleted(conversationId: $conversationId) {
|
|
925
980
|
conversationId
|
|
926
981
|
deletedBy
|
|
927
982
|
}
|
|
928
983
|
}
|
|
929
|
-
`,
|
|
984
|
+
`, Z = e`
|
|
930
985
|
subscription ParticipantChanged($conversationId: ID!) {
|
|
931
986
|
participantChanged(conversationId: $conversationId) {
|
|
932
987
|
changeType
|
|
@@ -946,7 +1001,7 @@ var q = e`
|
|
|
946
1001
|
}
|
|
947
1002
|
}
|
|
948
1003
|
}
|
|
949
|
-
`,
|
|
1004
|
+
`, Q = e`
|
|
950
1005
|
subscription MessageAdded($conversationId: ID!) {
|
|
951
1006
|
messageAdded(conversationId: $conversationId) {
|
|
952
1007
|
id
|
|
@@ -1008,7 +1063,7 @@ var q = e`
|
|
|
1008
1063
|
}
|
|
1009
1064
|
}
|
|
1010
1065
|
}
|
|
1011
|
-
`,
|
|
1066
|
+
`, $ = e`
|
|
1012
1067
|
subscription MessageUpdated($conversationId: ID!) {
|
|
1013
1068
|
messageUpdated(conversationId: $conversationId) {
|
|
1014
1069
|
id
|
|
@@ -1023,7 +1078,7 @@ var q = e`
|
|
|
1023
1078
|
updatedAt
|
|
1024
1079
|
}
|
|
1025
1080
|
}
|
|
1026
|
-
`,
|
|
1081
|
+
`, te = e`
|
|
1027
1082
|
subscription MessageDeleted($conversationId: ID!) {
|
|
1028
1083
|
messageDeleted(conversationId: $conversationId) {
|
|
1029
1084
|
conversationId
|
|
@@ -1079,6 +1134,6 @@ e`
|
|
|
1079
1134
|
}
|
|
1080
1135
|
`;
|
|
1081
1136
|
//#endregion
|
|
1082
|
-
export {
|
|
1137
|
+
export { J as ConversationAddedDocument, X as ConversationDeletedDocument, Y as ConversationUpdatedDocument, B as GetMessagesDocument, Q as MessageAddedDocument, te as MessageDeletedDocument, $ as MessageUpdatedDocument, Z as ParticipantChangedDocument, b as useAddReactionMutation, o as useArchiveConversationMutation, i as useCreateConversationMutation, v as useDeleteMessageMutation, g as useEditMessageMutation, L as useGetConversationQuery, z as useGetConversationsQuery, V as useGetMessagesQuery, U as useGetOrCreateDirectConversationLazyQuery, G as useGetWorkspaceDirectoryQuery, f as useLeaveConversationMutation, u as useMarkConversationAsReadMutation, w as useMuteConversationMutation, E as usePinConversationMutation, O as usePinMessageByHookMutation, S as useRemoveReactionMutation, q as useSearchConversationsQuery, m as useSendMessageMutation, c as useUnarchiveConversationMutation, A as useUnmuteConversationMutation, j as useUnpinConversationMutation, N as useUnpinMessageByHookMutation, F as useUpdateConversationByHookMutation };
|
|
1083
1138
|
|
|
1084
1139
|
//# sourceMappingURL=wspace-operations.js.map
|