@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.
@@ -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, useGetWorkspaceDirectoryQuery as a, useLeaveConversationMutation as o, useMarkConversationAsReadMutation as s, useMuteConversationMutation as c, usePinConversationMutation as l, useSearchConversationsQuery as u, useUnarchiveConversationMutation as d, useUnmuteConversationMutation as f, useUnpinConversationMutation as p, useUpdateConversationByHookMutation as m } from "../../generated/wspace-operations.js";
3
- import { mapConversation as h } from "../utils/mappers.js";
4
- import { applyMarkConversationAsReadToCache as g } from "../utils/readReceiptCache.js";
5
- import { useCallback as _, useEffect as v, useMemo as y, useState as b } from "react";
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 x(t) {
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 = y(() => r.data?.conversations.edges.map((e) => h(e.node)) ?? [], [r.data]), o = r.data?.conversations.pageInfo.hasNextPage ?? !1;
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 S(t) {
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 ? h(i.data.conversation) : null,
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 C(t) {
61
- let { workspaceId: n } = e(), r = t.trim(), i = u({
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) => h(e.node)) ?? [],
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 w = 25, T = 250;
75
- function E(t) {
76
- let { workspaceId: n } = e(), [r, i] = b(t.trim());
77
- v(() => {
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
- }, T);
80
+ }, E);
81
81
  return () => clearTimeout(n);
82
82
  }, [t]);
83
- let o = a({
83
+ let a = o({
84
84
  variables: {
85
85
  filter: r ? { search: r } : void 0,
86
86
  pagination: {
87
- limit: w,
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: y(() => o.data?.workspaceDirectory.edges ?? [], [o.data]),
96
- totalCount: o.data?.workspaceDirectory.totalCount ?? 0,
97
- loading: o.loading,
98
- error: o.error ?? null
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 D() {
101
+ function O() {
102
102
  let { workspaceId: t } = e(), [r, i] = n();
103
103
  return {
104
- createConversation: _(async (e) => {
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 ? h(a) : null;
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 O() {
126
- let [e, t] = s();
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: _(async (t) => {
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 && g(e, 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 k() {
151
- let [e, n] = t(), [r, i] = d(), [a, s] = l(), [u, m] = p(), [h, g] = c(), [v, y] = f(), [b, x] = o();
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: _(async (t) => {
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: _(async (e) => {
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: _(async (e) => {
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: _(async (e) => {
174
- let { data: t } = await u({ variables: { conversationId: e } });
190
+ unpinConversation: v(async (e) => {
191
+ let { data: t } = await c({ variables: { conversationId: e } });
175
192
  return !!t?.unpinConversation?.id;
176
- }, [u]),
177
- muteConversation: _(async (e) => {
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: _(async (e) => {
182
- let { data: t } = await v({ variables: { conversationId: e } });
198
+ unmuteConversation: v(async (e) => {
199
+ let { data: t } = await _({ variables: { conversationId: e } });
183
200
  return !!t?.unmuteConversation?.id;
184
- }, [v]),
185
- leaveConversation: _(async (e) => {
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 || s.loading || m.loading || g.loading || y.loading || x.loading,
194
- error: n.error ?? i.error ?? s.error ?? m.error ?? g.error ?? y.error ?? x.error ?? null
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 A() {
198
- let [e, t] = m();
214
+ function M() {
215
+ let [e, t] = h();
199
216
  return {
200
- updateConversation: _(async (t) => {
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 ? h(r) : null;
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 { k as useConversationActions, D as useCreateConversation, S as useGetConversation, x as useGetConversations, O as useMarkConversationAsRead, C as useSearchConversations, A as useUpdateConversation, E as useWorkspaceDirectory };
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 j = e`
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 M(e) {
378
+ function j(e) {
379
379
  let r = {
380
380
  ...n,
381
381
  ...e
382
382
  };
383
- return t.useMutation(j, r);
383
+ return t.useMutation(ee, r);
384
384
  }
385
- var N = e`
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 P(e) {
392
+ function N(e) {
393
393
  let r = {
394
394
  ...n,
395
395
  ...e
396
396
  };
397
- return t.useMutation(N, r);
397
+ return t.useMutation(M, r);
398
398
  }
399
- var F = e`
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 I(e) {
432
+ function F(e) {
433
433
  let r = {
434
434
  ...n,
435
435
  ...e
436
436
  };
437
- return t.useMutation(F, r);
437
+ return t.useMutation(P, r);
438
438
  }
439
- var L = e`
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 R(e) {
506
+ function L(e) {
507
507
  let r = {
508
508
  ...n,
509
509
  ...e
510
510
  };
511
- return t.useQuery(L, r);
511
+ return t.useQuery(I, r);
512
512
  }
513
- var z = e`
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 B(e) {
574
+ function z(e) {
575
575
  let r = {
576
576
  ...n,
577
577
  ...e
578
578
  };
579
- return t.useQuery(z, r);
579
+ return t.useQuery(R, r);
580
580
  }
581
- var V = e`
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 H(e) {
664
+ function V(e) {
665
665
  let r = {
666
666
  ...n,
667
667
  ...e
668
668
  };
669
- return t.useQuery(V, r);
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 U = e`
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 W(e) {
814
+ function G(e) {
760
815
  let r = {
761
816
  ...n,
762
817
  ...e
763
818
  };
764
- return t.useQuery(U, r);
819
+ return t.useQuery(W, r);
765
820
  }
766
- var G = e`
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 K(e) {
878
+ function q(e) {
824
879
  let r = {
825
880
  ...n,
826
881
  ...e
827
882
  };
828
- return t.useQuery(G, r);
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 q = e`
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
- `, J = e`
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
- `, Y = e`
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
- `, X = e`
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
- `, Z = e`
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
- `, Q = e`
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
- `, $ = e`
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 { q as ConversationAddedDocument, Y as ConversationDeletedDocument, J as ConversationUpdatedDocument, V as GetMessagesDocument, Z as MessageAddedDocument, $ as MessageDeletedDocument, Q as MessageUpdatedDocument, X as ParticipantChangedDocument, b as useAddReactionMutation, o as useArchiveConversationMutation, i as useCreateConversationMutation, v as useDeleteMessageMutation, g as useEditMessageMutation, R as useGetConversationQuery, B as useGetConversationsQuery, H as useGetMessagesQuery, W as useGetWorkspaceDirectoryQuery, f as useLeaveConversationMutation, u as useMarkConversationAsReadMutation, w as useMuteConversationMutation, E as usePinConversationMutation, O as usePinMessageByHookMutation, S as useRemoveReactionMutation, K as useSearchConversationsQuery, m as useSendMessageMutation, c as useUnarchiveConversationMutation, A as useUnmuteConversationMutation, M as useUnpinConversationMutation, P as useUnpinMessageByHookMutation, I as useUpdateConversationByHookMutation };
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