@burdenoff/microfe-theculturepost 2026.721.1 → 2026.721.3

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.
@@ -30,7 +30,20 @@ export interface TopicFilters {
30
30
  pagination?: PaginationInput;
31
31
  }
32
32
  export declare const useTcpTopics: (filters?: TopicFilters) => import('@tanstack/react-query').UseQueryResult<TcpConnection<TcpTopic>, Error>;
33
- export declare const useTcpTopic: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<TcpTopic | null, Error>;
33
+ export declare const useTcpTopic: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<{
34
+ stories: TcpStory[];
35
+ workspaceId: string;
36
+ id: string;
37
+ name: string;
38
+ description?: string | null | undefined;
39
+ slug: string;
40
+ isFeatured: boolean;
41
+ createdAt: string;
42
+ updatedAt: string;
43
+ category: TcpTopicCategory;
44
+ tradition?: string | null | undefined;
45
+ storyCount: number;
46
+ } | null, Error>;
34
47
  export declare const useTcpCreateTopic: () => import('@tanstack/react-query').UseMutationResult<TcpTopic, Error, TcpCreateTopicInput, unknown>;
35
48
  export declare const useTcpUpdateTopic: () => import('@tanstack/react-query').UseMutationResult<TcpTopic, Error, {
36
49
  id: string;
@@ -43,7 +56,22 @@ export interface DiscussionFilters {
43
56
  pagination?: PaginationInput;
44
57
  }
45
58
  export declare const useTcpDiscussions: (filters?: DiscussionFilters) => import('@tanstack/react-query').UseQueryResult<TcpConnection<TcpDiscussion>, Error>;
46
- export declare const useTcpDiscussion: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<TcpDiscussion | null, Error>;
59
+ export declare const useTcpDiscussion: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<{
60
+ replies: TcpReply[];
61
+ status: TcpModerationStatus;
62
+ workspaceId: string;
63
+ id: string;
64
+ title: string;
65
+ tags: string[];
66
+ createdAt: string;
67
+ updatedAt: string;
68
+ storyId?: string | null | undefined;
69
+ prompt?: string | null | undefined;
70
+ openedById?: string | null | undefined;
71
+ isInterfaith: boolean;
72
+ isLocked: boolean;
73
+ replyCount: number;
74
+ } | null, Error>;
47
75
  export declare const useTcpReplies: (discussionId: string | undefined, status?: TcpModerationStatus) => import('@tanstack/react-query').UseQueryResult<TcpReply[], Error>;
48
76
  export declare const useTcpOpenDiscussion: () => import('@tanstack/react-query').UseMutationResult<TcpDiscussion, Error, TcpCreateDiscussionInput, unknown>;
49
77
  export declare const useTcpPostReply: () => import('@tanstack/react-query').UseMutationResult<TcpReply, Error, TcpCreateReplyInput, unknown>;
@@ -53,7 +81,20 @@ export declare const useTcpModerateReply: () => import('@tanstack/react-query').
53
81
  }, unknown>;
54
82
  export declare const useTcpLockDiscussion: () => import('@tanstack/react-query').UseMutationResult<TcpDiscussion, Error, string, unknown>;
55
83
  export declare const useTcpCollections: (pagination?: PaginationInput) => import('@tanstack/react-query').UseQueryResult<TcpCollection[], Error>;
56
- export declare const useTcpCollection: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<TcpCollection | null, Error>;
84
+ export declare const useTcpCollection: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<{
85
+ items: TcpArchiveItem[];
86
+ oralHistories: TcpOralHistory[];
87
+ workspaceId: string;
88
+ id: string;
89
+ name: string;
90
+ description?: string | null | undefined;
91
+ slug: string;
92
+ cover?: (import('../types').TcpFileRef | null) | undefined;
93
+ createdAt: string;
94
+ updatedAt: string;
95
+ tradition?: string | null | undefined;
96
+ itemCount: number;
97
+ } | null, Error>;
57
98
  export declare const useTcpCreateCollection: () => import('@tanstack/react-query').UseMutationResult<TcpCollection, Error, TcpCreateCollectionInput, unknown>;
58
99
  export interface ArchiveItemFilters {
59
100
  accessLevel?: TcpAccessLevel;
@@ -1 +1 @@
1
- {"version":3,"file":"useTcpApi.d.ts","sourceRoot":"","sources":["../../../src/theculturepost/hooks/useTcpApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTcpApi.d.ts","sourceRoot":"","sources":["../../../src/theculturepost/hooks/useTcpApi.ts"],"names":[],"mappings":"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"}
@@ -65,8 +65,15 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
65
65
  }, d = "\n id workspaceId name slug description tradition category isFeatured storyCount createdAt updatedAt\n", f = "\n id workspaceId title slug summary format status topicId authorId editorId\n cover { id } languages tags readingMins publishedAt isFeatured isBookmarked createdAt updatedAt\n topic { id name slug category }\n", p = "\n id workspaceId storyId title author publisher publishedOn url excerpt provenance\n sourceType sourceFile { id } verification createdAt updatedAt\n", m = `
66
66
  ${f}
67
67
  body
68
- citations { ${p} }
69
- `, h = "\n id workspaceId title prompt storyId openedById isInterfaith isLocked status tags\n replyCount createdAt updatedAt\n", g = "\n id workspaceId discussionId authorId body perspective status createdAt updatedAt\n", _ = "\n id workspaceId title description kind accessLevel collectionId file { id }\n provenance origin languages tags datedAt createdAt updatedAt\n", v = "\n id workspaceId title summary transcript narratorName language accessLevel collectionId\n recording { id } durationSecs recordedAt createdAt updatedAt\n", y = "\n id workspaceId name slug description tradition cover { id } itemCount createdAt updatedAt\n", b = (t = {}) => {
68
+ citations { items { ${p} } pageInfo { cursor hasMore } }
69
+ `;
70
+ function h(e) {
71
+ return e ? {
72
+ ...e,
73
+ citations: e.citations.items
74
+ } : null;
75
+ }
76
+ var g = "\n id workspaceId title prompt storyId openedById isInterfaith isLocked status tags\n replyCount createdAt updatedAt\n", _ = "\n id workspaceId discussionId authorId body perspective status createdAt updatedAt\n", v = "\n id workspaceId title description kind accessLevel collectionId file { id }\n provenance origin languages tags datedAt createdAt updatedAt\n", y = "\n id workspaceId title summary transcript narratorName language accessLevel collectionId\n recording { id } durationSecs recordedAt createdAt updatedAt\n", b = "\n id workspaceId name slug description tradition cover { id } itemCount createdAt updatedAt\n", x = (t = {}) => {
70
77
  let { apiGatewayUrl: n } = e();
71
78
  return r({
72
79
  queryKey: [...c.stories, t],
@@ -82,44 +89,44 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
82
89
  pagination: u(t.pagination)
83
90
  }, n)).tcpListStories
84
91
  });
85
- }, x = (t) => {
92
+ }, S = (t) => {
86
93
  let { apiGatewayUrl: n } = e();
87
94
  return r({
88
95
  queryKey: c.story(t ?? ""),
89
96
  enabled: !!t,
90
- queryFn: async () => (await s(`query TcpStory($id: ID!) {
97
+ queryFn: async () => h((await s(`query TcpStory($id: ID!) {
91
98
  tcpStory(id: $id) { ${m} }
92
- }`, { id: t }, n)).tcpStory
99
+ }`, { id: t }, n)).tcpStory)
93
100
  });
94
- }, S = () => {
101
+ }, C = () => {
95
102
  let { apiGatewayUrl: t } = e(), r = i();
96
103
  return n({
97
- mutationFn: async (e) => (await s(`mutation TcpCreateStory($input: TcpCreateStoryInput!) {
104
+ mutationFn: async (e) => h((await s(`mutation TcpCreateStory($input: TcpCreateStoryInput!) {
98
105
  tcpCreateStory(input: $input) { ${m} }
99
- }`, { input: e }, t)).tcpCreateStory,
106
+ }`, { input: e }, t)).tcpCreateStory),
100
107
  onSuccess: () => r.invalidateQueries({ queryKey: c.stories })
101
108
  });
102
- }, C = () => {
109
+ }, w = () => {
103
110
  let { apiGatewayUrl: t } = e(), r = i();
104
111
  return n({
105
- mutationFn: async (e) => (await s(`mutation TcpUpdateStory($id: ID!, $input: TcpUpdateStoryInput!) {
112
+ mutationFn: async (e) => h((await s(`mutation TcpUpdateStory($id: ID!, $input: TcpUpdateStoryInput!) {
106
113
  tcpUpdateStory(id: $id, input: $input) { ${m} }
107
- }`, e, t)).tcpUpdateStory,
114
+ }`, e, t)).tcpUpdateStory),
108
115
  onSuccess: (e) => {
109
116
  r.invalidateQueries({ queryKey: c.stories }), r.invalidateQueries({ queryKey: c.story(e.id) });
110
117
  }
111
118
  });
112
- }, w = () => {
119
+ }, T = () => {
113
120
  let { apiGatewayUrl: t } = e(), r = i();
114
121
  return n({
115
- mutationFn: async (e) => (await s(`mutation TcpTransitionStory($id: ID!, $status: TcpStoryStatus!) {
122
+ mutationFn: async (e) => h((await s(`mutation TcpTransitionStory($id: ID!, $status: TcpStoryStatus!) {
116
123
  tcpTransitionStory(id: $id, status: $status) { ${m} }
117
- }`, e, t)).tcpTransitionStory,
124
+ }`, e, t)).tcpTransitionStory),
118
125
  onSuccess: (e) => {
119
126
  r.invalidateQueries({ queryKey: c.stories }), r.invalidateQueries({ queryKey: c.story(e.id) });
120
127
  }
121
128
  });
122
- }, T = (t) => {
129
+ }, E = (t) => {
123
130
  let { apiGatewayUrl: n } = e();
124
131
  return r({
125
132
  queryKey: [
@@ -134,7 +141,7 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
134
141
  }
135
142
  }`, { pagination: u(t) }, n)).tcpMySavedStories
136
143
  });
137
- }, E = () => {
144
+ }, D = () => {
138
145
  let { apiGatewayUrl: t } = e(), r = i();
139
146
  return n({
140
147
  mutationFn: async (e) => (await s("mutation TcpToggleStoryBookmark($storyId: ID!) { tcpToggleStoryBookmark(storyId: $storyId) }", { storyId: e }, t)).tcpToggleStoryBookmark,
@@ -142,16 +149,16 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
142
149
  r.invalidateQueries({ queryKey: c.stories }), r.invalidateQueries({ queryKey: c.story(t) });
143
150
  }
144
151
  });
145
- }, D = (t) => {
152
+ }, O = (t) => {
146
153
  let { apiGatewayUrl: n } = e();
147
154
  return r({
148
155
  queryKey: c.citations(t ?? ""),
149
156
  enabled: !!t,
150
157
  queryFn: async () => (await s(`query TcpListCitations($storyId: ID!) {
151
- tcpListCitations(storyId: $storyId) { ${p} }
152
- }`, { storyId: t }, n)).tcpListCitations
158
+ tcpListCitations(storyId: $storyId) { items { ${p} } pageInfo { cursor hasMore } }
159
+ }`, { storyId: t }, n)).tcpListCitations.items
153
160
  });
154
- }, O = () => {
161
+ }, k = () => {
155
162
  let { apiGatewayUrl: t } = e(), r = i();
156
163
  return n({
157
164
  mutationFn: async (e) => (await s(`mutation TcpAddCitation($input: TcpCreateCitationInput!) {
@@ -161,7 +168,7 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
161
168
  r.invalidateQueries({ queryKey: c.citations(e.storyId) }), r.invalidateQueries({ queryKey: c.story(e.storyId) });
162
169
  }
163
170
  });
164
- }, k = () => {
171
+ }, A = () => {
165
172
  let { apiGatewayUrl: t } = e(), r = i();
166
173
  return n({
167
174
  mutationFn: async (e) => (await s(`mutation TcpVerifyCitation($id: ID!, $verification: TcpVerificationStatus!) {
@@ -171,7 +178,7 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
171
178
  r.invalidateQueries({ queryKey: c.citations(e.storyId) }), r.invalidateQueries({ queryKey: c.story(e.storyId) });
172
179
  }
173
180
  });
174
- }, A = (t = {}) => {
181
+ }, j = (t = {}) => {
175
182
  let { apiGatewayUrl: n } = e();
176
183
  return r({
177
184
  queryKey: [...c.topics, t],
@@ -185,19 +192,25 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
185
192
  pagination: u(t.pagination)
186
193
  }, n)).tcpListTopics
187
194
  });
188
- }, j = (t) => {
195
+ }, M = (t) => {
189
196
  let { apiGatewayUrl: n } = e();
190
197
  return r({
191
198
  queryKey: c.topic(t ?? ""),
192
199
  enabled: !!t,
193
- queryFn: async () => (await s(`query TcpTopic($id: ID!) {
200
+ queryFn: async () => {
201
+ let e = await s(`query TcpTopic($id: ID!) {
194
202
  tcpTopic(id: $id) {
195
203
  ${d}
196
- stories { ${f} }
204
+ stories { items { ${f} } pageInfo { cursor hasMore } }
197
205
  }
198
- }`, { id: t }, n)).tcpTopic
206
+ }`, { id: t }, n);
207
+ return e.tcpTopic ? {
208
+ ...e.tcpTopic,
209
+ stories: e.tcpTopic.stories.items
210
+ } : null;
211
+ }
199
212
  });
200
- }, M = () => {
213
+ }, N = () => {
201
214
  let { apiGatewayUrl: t } = e(), r = i();
202
215
  return n({
203
216
  mutationFn: async (e) => (await s(`mutation TcpCreateTopic($input: TcpCreateTopicInput!) {
@@ -205,7 +218,7 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
205
218
  }`, { input: e }, t)).tcpCreateTopic,
206
219
  onSuccess: () => r.invalidateQueries({ queryKey: c.topics })
207
220
  });
208
- }, N = () => {
221
+ }, P = () => {
209
222
  let { apiGatewayUrl: t } = e(), r = i();
210
223
  return n({
211
224
  mutationFn: async (e) => (await s(`mutation TcpUpdateTopic($id: ID!, $input: TcpUpdateTopicInput!) {
@@ -215,7 +228,7 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
215
228
  r.invalidateQueries({ queryKey: c.topics }), r.invalidateQueries({ queryKey: c.topic(e.id) });
216
229
  }
217
230
  });
218
- }, P = () => {
231
+ }, F = () => {
219
232
  let { apiGatewayUrl: t } = e(), r = i();
220
233
  return n({
221
234
  mutationFn: async (e) => (await s("mutation TcpArchiveTopic($id: ID!) { tcpArchiveTopic(id: $id) }", { id: e }, t)).tcpArchiveTopic,
@@ -223,13 +236,13 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
223
236
  r.invalidateQueries({ queryKey: c.topics }), r.invalidateQueries({ queryKey: c.topic(t) });
224
237
  }
225
238
  });
226
- }, F = (t = {}) => {
239
+ }, I = (t = {}) => {
227
240
  let { apiGatewayUrl: n } = e();
228
241
  return r({
229
242
  queryKey: [...c.discussions, t],
230
243
  queryFn: async () => (await s(`query TcpListDiscussions($status: TcpModerationStatus, $storyId: ID, $pagination: PaginationInput) {
231
244
  tcpListDiscussions(status: $status, storyId: $storyId, pagination: $pagination) {
232
- items { ${h} }
245
+ items { ${g} }
233
246
  pageInfo { cursor hasMore }
234
247
  }
235
248
  }`, {
@@ -238,104 +251,117 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
238
251
  pagination: u(t.pagination)
239
252
  }, n)).tcpListDiscussions
240
253
  });
241
- }, I = (t) => {
254
+ }, L = (t) => {
242
255
  let { apiGatewayUrl: n } = e();
243
256
  return r({
244
257
  queryKey: c.discussion(t ?? ""),
245
258
  enabled: !!t,
246
- queryFn: async () => (await s(`query TcpDiscussion($id: ID!) {
259
+ queryFn: async () => {
260
+ let e = await s(`query TcpDiscussion($id: ID!) {
247
261
  tcpDiscussion(id: $id) {
248
- ${h}
249
- replies { ${g} }
262
+ ${g}
263
+ replies { items { ${_} } pageInfo { cursor hasMore } }
250
264
  }
251
- }`, { id: t }, n)).tcpDiscussion
265
+ }`, { id: t }, n);
266
+ return e.tcpDiscussion ? {
267
+ ...e.tcpDiscussion,
268
+ replies: e.tcpDiscussion.replies.items
269
+ } : null;
270
+ }
252
271
  });
253
- }, L = (t, n) => {
272
+ }, R = (t, n) => {
254
273
  let { apiGatewayUrl: i } = e();
255
274
  return r({
256
275
  queryKey: [...c.replies(t ?? ""), n ?? "all"],
257
276
  enabled: !!t,
258
277
  queryFn: async () => (await s(`query TcpListReplies($discussionId: ID!, $status: TcpModerationStatus) {
259
- tcpListReplies(discussionId: $discussionId, status: $status) { ${g} }
278
+ tcpListReplies(discussionId: $discussionId, status: $status) { items { ${_} } pageInfo { cursor hasMore } }
260
279
  }`, {
261
280
  discussionId: t,
262
281
  status: n
263
- }, i)).tcpListReplies
282
+ }, i)).tcpListReplies.items
264
283
  });
265
- }, R = () => {
284
+ }, z = () => {
266
285
  let { apiGatewayUrl: t } = e(), r = i();
267
286
  return n({
268
287
  mutationFn: async (e) => (await s(`mutation TcpOpenDiscussion($input: TcpCreateDiscussionInput!) {
269
- tcpOpenDiscussion(input: $input) { ${h} }
288
+ tcpOpenDiscussion(input: $input) { ${g} }
270
289
  }`, { input: e }, t)).tcpOpenDiscussion,
271
290
  onSuccess: () => r.invalidateQueries({ queryKey: c.discussions })
272
291
  });
273
- }, z = () => {
292
+ }, B = () => {
274
293
  let { apiGatewayUrl: t } = e(), r = i();
275
294
  return n({
276
295
  mutationFn: async (e) => (await s(`mutation TcpPostReply($input: TcpCreateReplyInput!) {
277
- tcpPostReply(input: $input) { ${g} }
296
+ tcpPostReply(input: $input) { ${_} }
278
297
  }`, { input: e }, t)).tcpPostReply,
279
298
  onSuccess: (e) => {
280
299
  r.invalidateQueries({ queryKey: c.replies(e.discussionId) }), r.invalidateQueries({ queryKey: c.discussion(e.discussionId) }), r.invalidateQueries({ queryKey: c.discussions });
281
300
  }
282
301
  });
283
- }, B = () => {
302
+ }, V = () => {
284
303
  let { apiGatewayUrl: t } = e(), r = i();
285
304
  return n({
286
305
  mutationFn: async (e) => (await s(`mutation TcpModerateReply($id: ID!, $status: TcpModerationStatus!) {
287
- tcpModerateReply(id: $id, status: $status) { ${g} }
306
+ tcpModerateReply(id: $id, status: $status) { ${_} }
288
307
  }`, e, t)).tcpModerateReply,
289
308
  onSuccess: (e) => {
290
309
  r.invalidateQueries({ queryKey: c.replies(e.discussionId) }), r.invalidateQueries({ queryKey: c.discussion(e.discussionId) });
291
310
  }
292
311
  });
293
- }, V = () => {
312
+ }, H = () => {
294
313
  let { apiGatewayUrl: t } = e(), r = i();
295
314
  return n({
296
315
  mutationFn: async (e) => (await s(`mutation TcpLockDiscussion($id: ID!) {
297
- tcpLockDiscussion(id: $id) { ${h} }
316
+ tcpLockDiscussion(id: $id) { ${g} }
298
317
  }`, { id: e }, t)).tcpLockDiscussion,
299
318
  onSuccess: (e) => {
300
319
  r.invalidateQueries({ queryKey: c.discussions }), r.invalidateQueries({ queryKey: c.discussion(e.id) });
301
320
  }
302
321
  });
303
- }, H = (t) => {
322
+ }, U = (t) => {
304
323
  let { apiGatewayUrl: n } = e();
305
324
  return r({
306
325
  queryKey: [...c.collections, t],
307
326
  queryFn: async () => (await s(`query TcpListCollections($pagination: PaginationInput) {
308
- tcpListCollections(pagination: $pagination) { ${y} }
309
- }`, { pagination: u(t) }, n)).tcpListCollections
327
+ tcpListCollections(pagination: $pagination) { items { ${b} } pageInfo { cursor hasMore } }
328
+ }`, { pagination: u(t) }, n)).tcpListCollections.items
310
329
  });
311
- }, U = (t) => {
330
+ }, W = (t) => {
312
331
  let { apiGatewayUrl: n } = e();
313
332
  return r({
314
333
  queryKey: c.collection(t ?? ""),
315
334
  enabled: !!t,
316
- queryFn: async () => (await s(`query TcpCollection($id: ID!) {
335
+ queryFn: async () => {
336
+ let e = await s(`query TcpCollection($id: ID!) {
317
337
  tcpCollection(id: $id) {
318
- ${y}
319
- items { ${_} }
320
- oralHistories { ${v} }
338
+ ${b}
339
+ items { items { ${v} } pageInfo { cursor hasMore } }
340
+ oralHistories { items { ${y} } pageInfo { cursor hasMore } }
321
341
  }
322
- }`, { id: t }, n)).tcpCollection
342
+ }`, { id: t }, n);
343
+ return e.tcpCollection ? {
344
+ ...e.tcpCollection,
345
+ items: e.tcpCollection.items.items,
346
+ oralHistories: e.tcpCollection.oralHistories.items
347
+ } : null;
348
+ }
323
349
  });
324
- }, W = () => {
350
+ }, G = () => {
325
351
  let { apiGatewayUrl: t } = e(), r = i();
326
352
  return n({
327
353
  mutationFn: async (e) => (await s(`mutation TcpCreateCollection($input: TcpCreateCollectionInput!) {
328
- tcpCreateCollection(input: $input) { ${y} }
354
+ tcpCreateCollection(input: $input) { ${b} }
329
355
  }`, { input: e }, t)).tcpCreateCollection,
330
356
  onSuccess: () => r.invalidateQueries({ queryKey: c.collections })
331
357
  });
332
- }, G = (t = {}) => {
358
+ }, K = (t = {}) => {
333
359
  let { apiGatewayUrl: n } = e();
334
360
  return r({
335
361
  queryKey: [...c.archiveItems, t],
336
362
  queryFn: async () => (await s(`query TcpListArchiveItems($accessLevel: TcpAccessLevel, $collectionId: ID, $kind: TcpArchiveItemKind, $pagination: PaginationInput) {
337
363
  tcpListArchiveItems(accessLevel: $accessLevel, collectionId: $collectionId, kind: $kind, pagination: $pagination) {
338
- items { ${_} }
364
+ items { ${v} }
339
365
  pageInfo { cursor hasMore }
340
366
  }
341
367
  }`, {
@@ -345,41 +371,41 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
345
371
  pagination: u(t.pagination)
346
372
  }, n)).tcpListArchiveItems
347
373
  });
348
- }, K = (t) => {
374
+ }, q = (t) => {
349
375
  let { apiGatewayUrl: n } = e();
350
376
  return r({
351
377
  queryKey: c.archiveItem(t ?? ""),
352
378
  enabled: !!t,
353
379
  queryFn: async () => (await s(`query TcpArchiveItem($id: ID!) {
354
380
  tcpArchiveItem(id: $id) {
355
- ${_}
356
- collection { ${y} }
381
+ ${v}
382
+ collection { ${b} }
357
383
  }
358
384
  }`, { id: t }, n)).tcpArchiveItem
359
385
  });
360
- }, q = () => {
386
+ }, J = () => {
361
387
  let { apiGatewayUrl: t } = e(), r = i();
362
388
  return n({
363
389
  mutationFn: async (e) => (await s(`mutation TcpCreateArchiveItem($input: TcpCreateArchiveItemInput!) {
364
- tcpCreateArchiveItem(input: $input) { ${_} }
390
+ tcpCreateArchiveItem(input: $input) { ${v} }
365
391
  }`, { input: e }, t)).tcpCreateArchiveItem,
366
392
  onSuccess: (e) => {
367
393
  r.invalidateQueries({ queryKey: c.archiveItems }), e.collectionId && r.invalidateQueries({ queryKey: c.collection(e.collectionId) });
368
394
  }
369
395
  });
370
- }, J = (t) => {
396
+ }, Y = (t) => {
371
397
  let { apiGatewayUrl: n } = e();
372
398
  return r({
373
399
  queryKey: [...c.oralHistories, t ?? "all"],
374
400
  queryFn: async () => (await s(`query TcpListOralHistories($collectionId: ID) {
375
- tcpListOralHistories(collectionId: $collectionId) { ${v} }
376
- }`, { collectionId: t }, n)).tcpListOralHistories
401
+ tcpListOralHistories(collectionId: $collectionId) { items { ${y} } pageInfo { cursor hasMore } }
402
+ }`, { collectionId: t }, n)).tcpListOralHistories.items
377
403
  });
378
- }, Y = () => {
404
+ }, X = () => {
379
405
  let { apiGatewayUrl: t } = e(), r = i();
380
406
  return n({
381
407
  mutationFn: async (e) => (await s(`mutation TcpRecordOralHistory($input: TcpCreateOralHistoryInput!) {
382
- tcpRecordOralHistory(input: $input) { ${v} }
408
+ tcpRecordOralHistory(input: $input) { ${y} }
383
409
  }`, { input: e }, t)).tcpRecordOralHistory,
384
410
  onSuccess: (e) => {
385
411
  r.invalidateQueries({ queryKey: c.oralHistories }), e.collectionId && r.invalidateQueries({ queryKey: c.collection(e.collectionId) });
@@ -387,6 +413,6 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
387
413
  });
388
414
  };
389
415
  //#endregion
390
- export { O as useTcpAddCitation, K as useTcpArchiveItem, G as useTcpArchiveItems, P as useTcpArchiveTopic, D as useTcpCitations, U as useTcpCollection, H as useTcpCollections, q as useTcpCreateArchiveItem, W as useTcpCreateCollection, S as useTcpCreateStory, M as useTcpCreateTopic, I as useTcpDiscussion, F as useTcpDiscussions, V as useTcpLockDiscussion, B as useTcpModerateReply, T as useTcpMySavedStories, R as useTcpOpenDiscussion, J as useTcpOralHistories, z as useTcpPostReply, Y as useTcpRecordOralHistory, L as useTcpReplies, b as useTcpStories, x as useTcpStory, E as useTcpToggleStoryBookmark, j as useTcpTopic, A as useTcpTopics, w as useTcpTransitionStory, C as useTcpUpdateStory, N as useTcpUpdateTopic, k as useTcpVerifyCitation };
416
+ export { k as useTcpAddCitation, q as useTcpArchiveItem, K as useTcpArchiveItems, F as useTcpArchiveTopic, O as useTcpCitations, W as useTcpCollection, U as useTcpCollections, J as useTcpCreateArchiveItem, G as useTcpCreateCollection, C as useTcpCreateStory, N as useTcpCreateTopic, L as useTcpDiscussion, I as useTcpDiscussions, H as useTcpLockDiscussion, V as useTcpModerateReply, E as useTcpMySavedStories, z as useTcpOpenDiscussion, Y as useTcpOralHistories, B as useTcpPostReply, X as useTcpRecordOralHistory, R as useTcpReplies, x as useTcpStories, S as useTcpStory, D as useTcpToggleStoryBookmark, M as useTcpTopic, j as useTcpTopics, T as useTcpTransitionStory, w as useTcpUpdateStory, P as useTcpUpdateTopic, A as useTcpVerifyCitation };
391
417
 
392
418
  //# sourceMappingURL=useTcpApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTcpApi.js","names":[],"sources":["../../../src/theculturepost/hooks/useTcpApi.ts"],"sourcesContent":["/**\n * TheCulturePost API hooks\n * @module theculturepost/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-theculturepost-svc`\n * federated GraphQL contract (the `tcp*` operations). Every query/mutation below\n * uses an inline gql string whose fields match the svc `.hive-schema.graphql`\n * exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n *\n * IMPORTANT: `User`/`File` are id-only federation stubs in this subgraph. We\n * never select `cover { url }` or `author { firstName }`. Covers/artifacts/\n * recordings select `{ id }` and resolve to a URL via wspace-files-svc; author\n * display uses the raw `authorId`/`editorId`/`openedById`.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useTheCulturePost } from '../context';\nimport { clearGraphqlResponseCache } from '../lib/graphql-cache';\nimport type {\n TcpConnection,\n TcpStory,\n TcpStoryStatus,\n TcpTopic,\n TcpTopicCategory,\n TcpCitation,\n TcpVerificationStatus,\n TcpDiscussion,\n TcpReply,\n TcpModerationStatus,\n TcpCollection,\n TcpArchiveItem,\n TcpArchiveItemKind,\n TcpAccessLevel,\n TcpOralHistory,\n TcpCreateStoryInput,\n TcpUpdateStoryInput,\n TcpCreateTopicInput,\n TcpUpdateTopicInput,\n TcpCreateCitationInput,\n TcpCreateDiscussionInput,\n TcpCreateReplyInput,\n TcpCreateCollectionInput,\n TcpCreateArchiveItemInput,\n TcpUpdateArchiveItemInput,\n TcpCreateOralHistoryInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\nconst isMutation = (query: string): boolean => /^\\s*mutation\\b/.test(query);\n\nconst tcpQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n // A mutation's own request must never be served from (or coalesced onto) the\n // read cache, and the resolved read cache must be dropped once it commits so\n // the React-Query refetch that follows sees the new state — not a stale\n // pre-write response held for up to 15s. Clear before AND after the write.\n const mutating = isMutation(query);\n if (mutating) clearGraphqlResponseCache();\n\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (mutating) clearGraphqlResponseCache();\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n stories: ['theculturepost', 'stories'] as const,\n story: (id: string) => ['theculturepost', 'story', id] as const,\n citations: (storyId: string) => ['theculturepost', 'citations', storyId] as const,\n topics: ['theculturepost', 'topics'] as const,\n topic: (id: string) => ['theculturepost', 'topic', id] as const,\n discussions: ['theculturepost', 'discussions'] as const,\n discussion: (id: string) => ['theculturepost', 'discussion', id] as const,\n replies: (discussionId: string) => ['theculturepost', 'replies', discussionId] as const,\n collections: ['theculturepost', 'collections'] as const,\n collection: (id: string) => ['theculturepost', 'collection', id] as const,\n archiveItems: ['theculturepost', 'archive-items'] as const,\n archiveItem: (id: string) => ['theculturepost', 'archive-item', id] as const,\n oralHistories: ['theculturepost', 'oral-histories'] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n/** Drop `cursor` when it is nullish so the svc never sees an explicit null. */\nconst page = (p?: PaginationInput): PaginationInput => {\n const base = p ?? DEFAULT_PAGE;\n const result: PaginationInput = { limit: base.limit ?? DEFAULT_PAGE.limit };\n if (base.offset != null) result.offset = base.offset;\n if (base.cursor != null) result.cursor = base.cursor;\n return result;\n};\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst TOPIC_CORE_FIELDS = `\n id workspaceId name slug description tradition category isFeatured storyCount createdAt updatedAt\n`;\n\nconst STORY_CARD_FIELDS = `\n id workspaceId title slug summary format status topicId authorId editorId\n cover { id } languages tags readingMins publishedAt isFeatured isBookmarked createdAt updatedAt\n topic { id name slug category }\n`;\n\nconst CITATION_FIELDS = `\n id workspaceId storyId title author publisher publishedOn url excerpt provenance\n sourceType sourceFile { id } verification createdAt updatedAt\n`;\n\nconst STORY_DETAIL_FIELDS = `\n ${STORY_CARD_FIELDS}\n body\n citations { ${CITATION_FIELDS} }\n`;\n\nconst DISCUSSION_FIELDS = `\n id workspaceId title prompt storyId openedById isInterfaith isLocked status tags\n replyCount createdAt updatedAt\n`;\n\nconst REPLY_FIELDS = `\n id workspaceId discussionId authorId body perspective status createdAt updatedAt\n`;\n\nconst ARCHIVE_ITEM_FIELDS = `\n id workspaceId title description kind accessLevel collectionId file { id }\n provenance origin languages tags datedAt createdAt updatedAt\n`;\n\nconst ORAL_HISTORY_FIELDS = `\n id workspaceId title summary transcript narratorName language accessLevel collectionId\n recording { id } durationSecs recordedAt createdAt updatedAt\n`;\n\nconst COLLECTION_CORE_FIELDS = `\n id workspaceId name slug description tradition cover { id } itemCount createdAt updatedAt\n`;\n\n// ============================================================================\n// Stories\n// ============================================================================\n\nexport interface StoryFilters {\n status?: TcpStoryStatus;\n topicId?: string;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useTcpStories = (filters: StoryFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.stories, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListStories: TcpConnection<TcpStory> }>(\n `query TcpListStories($status: TcpStoryStatus, $topicId: ID, $featured: Boolean, $pagination: PaginationInput) {\n tcpListStories(status: $status, topicId: $topicId, featured: $featured, pagination: $pagination) {\n items { ${STORY_CARD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: filters.status,\n topicId: filters.topicId,\n featured: filters.featured,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.tcpListStories;\n },\n });\n};\n\nexport const useTcpStory = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.story(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpStory: TcpStory | null }>(\n `query TcpStory($id: ID!) {\n tcpStory(id: $id) { ${STORY_DETAIL_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpStory;\n },\n });\n};\n\nexport const useTcpCreateStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateStoryInput) => {\n const result = await tcpQuery<{ tcpCreateStory: TcpStory }>(\n `mutation TcpCreateStory($input: TcpCreateStoryInput!) {\n tcpCreateStory(input: $input) { ${STORY_DETAIL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateStory;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.stories }),\n });\n};\n\nexport const useTcpUpdateStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateStoryInput }) => {\n const result = await tcpQuery<{ tcpUpdateStory: TcpStory }>(\n `mutation TcpUpdateStory($id: ID!, $input: TcpUpdateStoryInput!) {\n tcpUpdateStory(id: $id, input: $input) { ${STORY_DETAIL_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpUpdateStory;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(data.id) });\n },\n });\n};\n\nexport const useTcpTransitionStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: TcpStoryStatus }) => {\n const result = await tcpQuery<{ tcpTransitionStory: TcpStory }>(\n `mutation TcpTransitionStory($id: ID!, $status: TcpStoryStatus!) {\n tcpTransitionStory(id: $id, status: $status) { ${STORY_DETAIL_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpTransitionStory;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(data.id) });\n },\n });\n};\n\n// ============================================================================\n// Reading list (personal bookmarks)\n// ============================================================================\n\nexport const useTcpMySavedStories = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.stories, 'saved', pagination],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpMySavedStories: TcpConnection<TcpStory> }>(\n `query TcpMySavedStories($pagination: PaginationInput) {\n tcpMySavedStories(pagination: $pagination) {\n items { ${STORY_CARD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return result.tcpMySavedStories;\n },\n });\n};\n\nexport const useTcpToggleStoryBookmark = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (storyId: string) => {\n const result = await tcpQuery<{ tcpToggleStoryBookmark: boolean }>(\n `mutation TcpToggleStoryBookmark($storyId: ID!) { tcpToggleStoryBookmark(storyId: $storyId) }`,\n { storyId },\n apiGatewayUrl\n );\n return result.tcpToggleStoryBookmark;\n },\n onSuccess: (_bookmarked, storyId) => {\n // The bookmarked state is embedded in every story payload (isBookmarked)\n // and the saved-stories list membership itself changes — invalidate both.\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(storyId) });\n },\n });\n};\n\n// ============================================================================\n// Citations\n// ============================================================================\n\nexport const useTcpCitations = (storyId: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.citations(storyId ?? ''),\n enabled: Boolean(storyId),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListCitations: TcpCitation[] }>(\n `query TcpListCitations($storyId: ID!) {\n tcpListCitations(storyId: $storyId) { ${CITATION_FIELDS} }\n }`,\n { storyId },\n apiGatewayUrl\n );\n return result.tcpListCitations;\n },\n });\n};\n\nexport const useTcpAddCitation = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateCitationInput) => {\n const result = await tcpQuery<{ tcpAddCitation: TcpCitation }>(\n `mutation TcpAddCitation($input: TcpCreateCitationInput!) {\n tcpAddCitation(input: $input) { ${CITATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpAddCitation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.citations(data.storyId) });\n qc.invalidateQueries({ queryKey: KEY.story(data.storyId) });\n },\n });\n};\n\nexport const useTcpVerifyCitation = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; verification: TcpVerificationStatus }) => {\n const result = await tcpQuery<{ tcpVerifyCitation: TcpCitation }>(\n `mutation TcpVerifyCitation($id: ID!, $verification: TcpVerificationStatus!) {\n tcpVerifyCitation(id: $id, verification: $verification) { ${CITATION_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpVerifyCitation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.citations(data.storyId) });\n qc.invalidateQueries({ queryKey: KEY.story(data.storyId) });\n },\n });\n};\n\n// ============================================================================\n// Topics\n// ============================================================================\n\nexport interface TopicFilters {\n category?: TcpTopicCategory;\n pagination?: PaginationInput;\n}\n\nexport const useTcpTopics = (filters: TopicFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.topics, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListTopics: TcpConnection<TcpTopic> }>(\n `query TcpListTopics($category: TcpTopicCategory, $pagination: PaginationInput) {\n tcpListTopics(category: $category, pagination: $pagination) {\n items { ${TOPIC_CORE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { category: filters.category, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.tcpListTopics;\n },\n });\n};\n\nexport const useTcpTopic = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.topic(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpTopic: TcpTopic | null }>(\n `query TcpTopic($id: ID!) {\n tcpTopic(id: $id) {\n ${TOPIC_CORE_FIELDS}\n stories { ${STORY_CARD_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpTopic;\n },\n });\n};\n\nexport const useTcpCreateTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateTopicInput) => {\n const result = await tcpQuery<{ tcpCreateTopic: TcpTopic }>(\n `mutation TcpCreateTopic($input: TcpCreateTopicInput!) {\n tcpCreateTopic(input: $input) { ${TOPIC_CORE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateTopic;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.topics }),\n });\n};\n\nexport const useTcpUpdateTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateTopicInput }) => {\n const result = await tcpQuery<{ tcpUpdateTopic: TcpTopic }>(\n `mutation TcpUpdateTopic($id: ID!, $input: TcpUpdateTopicInput!) {\n tcpUpdateTopic(id: $id, input: $input) { ${TOPIC_CORE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpUpdateTopic;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.topics });\n qc.invalidateQueries({ queryKey: KEY.topic(data.id) });\n },\n });\n};\n\nexport const useTcpArchiveTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await tcpQuery<{ tcpArchiveTopic: boolean }>(\n `mutation TcpArchiveTopic($id: ID!) { tcpArchiveTopic(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpArchiveTopic;\n },\n onSuccess: (_data, id) => {\n qc.invalidateQueries({ queryKey: KEY.topics });\n qc.invalidateQueries({ queryKey: KEY.topic(id) });\n },\n });\n};\n\n// ============================================================================\n// Discussions / Replies\n// ============================================================================\n\nexport interface DiscussionFilters {\n status?: TcpModerationStatus;\n storyId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useTcpDiscussions = (filters: DiscussionFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.discussions, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListDiscussions: TcpConnection<TcpDiscussion> }>(\n `query TcpListDiscussions($status: TcpModerationStatus, $storyId: ID, $pagination: PaginationInput) {\n tcpListDiscussions(status: $status, storyId: $storyId, pagination: $pagination) {\n items { ${DISCUSSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status: filters.status, storyId: filters.storyId, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.tcpListDiscussions;\n },\n });\n};\n\nexport const useTcpDiscussion = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.discussion(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpDiscussion: TcpDiscussion | null }>(\n `query TcpDiscussion($id: ID!) {\n tcpDiscussion(id: $id) {\n ${DISCUSSION_FIELDS}\n replies { ${REPLY_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpDiscussion;\n },\n });\n};\n\nexport const useTcpReplies = (discussionId: string | undefined, status?: TcpModerationStatus) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.replies(discussionId ?? ''), status ?? 'all'],\n enabled: Boolean(discussionId),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListReplies: TcpReply[] }>(\n `query TcpListReplies($discussionId: ID!, $status: TcpModerationStatus) {\n tcpListReplies(discussionId: $discussionId, status: $status) { ${REPLY_FIELDS} }\n }`,\n { discussionId, status },\n apiGatewayUrl\n );\n return result.tcpListReplies;\n },\n });\n};\n\nexport const useTcpOpenDiscussion = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateDiscussionInput) => {\n const result = await tcpQuery<{ tcpOpenDiscussion: TcpDiscussion }>(\n `mutation TcpOpenDiscussion($input: TcpCreateDiscussionInput!) {\n tcpOpenDiscussion(input: $input) { ${DISCUSSION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpOpenDiscussion;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.discussions }),\n });\n};\n\nexport const useTcpPostReply = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateReplyInput) => {\n const result = await tcpQuery<{ tcpPostReply: TcpReply }>(\n `mutation TcpPostReply($input: TcpCreateReplyInput!) {\n tcpPostReply(input: $input) { ${REPLY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpPostReply;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.replies(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussions });\n },\n });\n};\n\nexport const useTcpModerateReply = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: TcpModerationStatus }) => {\n const result = await tcpQuery<{ tcpModerateReply: TcpReply }>(\n `mutation TcpModerateReply($id: ID!, $status: TcpModerationStatus!) {\n tcpModerateReply(id: $id, status: $status) { ${REPLY_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpModerateReply;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.replies(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.discussionId) });\n },\n });\n};\n\nexport const useTcpLockDiscussion = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await tcpQuery<{ tcpLockDiscussion: TcpDiscussion }>(\n `mutation TcpLockDiscussion($id: ID!) {\n tcpLockDiscussion(id: $id) { ${DISCUSSION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpLockDiscussion;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.discussions });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.id) });\n },\n });\n};\n\n// ============================================================================\n// Collections\n// ============================================================================\n\nexport const useTcpCollections = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.collections, pagination],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListCollections: TcpCollection[] }>(\n `query TcpListCollections($pagination: PaginationInput) {\n tcpListCollections(pagination: $pagination) { ${COLLECTION_CORE_FIELDS} }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return result.tcpListCollections;\n },\n });\n};\n\nexport const useTcpCollection = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.collection(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpCollection: TcpCollection | null }>(\n `query TcpCollection($id: ID!) {\n tcpCollection(id: $id) {\n ${COLLECTION_CORE_FIELDS}\n items { ${ARCHIVE_ITEM_FIELDS} }\n oralHistories { ${ORAL_HISTORY_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpCollection;\n },\n });\n};\n\nexport const useTcpCreateCollection = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateCollectionInput) => {\n const result = await tcpQuery<{ tcpCreateCollection: TcpCollection }>(\n `mutation TcpCreateCollection($input: TcpCreateCollectionInput!) {\n tcpCreateCollection(input: $input) { ${COLLECTION_CORE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateCollection;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.collections }),\n });\n};\n\n// ============================================================================\n// Archive items\n// ============================================================================\n\nexport interface ArchiveItemFilters {\n accessLevel?: TcpAccessLevel;\n collectionId?: string;\n kind?: TcpArchiveItemKind;\n pagination?: PaginationInput;\n}\n\nexport const useTcpArchiveItems = (filters: ArchiveItemFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.archiveItems, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListArchiveItems: TcpConnection<TcpArchiveItem> }>(\n `query TcpListArchiveItems($accessLevel: TcpAccessLevel, $collectionId: ID, $kind: TcpArchiveItemKind, $pagination: PaginationInput) {\n tcpListArchiveItems(accessLevel: $accessLevel, collectionId: $collectionId, kind: $kind, pagination: $pagination) {\n items { ${ARCHIVE_ITEM_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n accessLevel: filters.accessLevel,\n collectionId: filters.collectionId,\n kind: filters.kind,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.tcpListArchiveItems;\n },\n });\n};\n\nexport const useTcpArchiveItem = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.archiveItem(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpArchiveItem: TcpArchiveItem | null }>(\n `query TcpArchiveItem($id: ID!) {\n tcpArchiveItem(id: $id) {\n ${ARCHIVE_ITEM_FIELDS}\n collection { ${COLLECTION_CORE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpArchiveItem;\n },\n });\n};\n\nexport const useTcpCreateArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateArchiveItemInput) => {\n const result = await tcpQuery<{ tcpCreateArchiveItem: TcpArchiveItem }>(\n `mutation TcpCreateArchiveItem($input: TcpCreateArchiveItemInput!) {\n tcpCreateArchiveItem(input: $input) { ${ARCHIVE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateArchiveItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n\nexport const useTcpUpdateArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateArchiveItemInput }) => {\n const result = await tcpQuery<{ tcpUpdateArchiveItem: TcpArchiveItem }>(\n `mutation TcpUpdateArchiveItem($id: ID!, $input: TcpUpdateArchiveItemInput!) {\n tcpUpdateArchiveItem(id: $id, input: $input) { ${ARCHIVE_ITEM_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpUpdateArchiveItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n qc.invalidateQueries({ queryKey: KEY.archiveItem(data.id) });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n\nexport const useTcpArchiveArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; collectionId?: string | null }) => {\n const result = await tcpQuery<{ tcpArchiveArchiveItem: boolean }>(\n `mutation TcpArchiveArchiveItem($id: ID!) { tcpArchiveArchiveItem(id: $id) }`,\n { id: vars.id },\n apiGatewayUrl\n );\n return result.tcpArchiveArchiveItem;\n },\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n qc.invalidateQueries({ queryKey: KEY.archiveItem(vars.id) });\n if (vars.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(vars.collectionId) });\n },\n });\n};\n\n// ============================================================================\n// Oral histories\n// ============================================================================\n\nexport const useTcpOralHistories = (collectionId?: string) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.oralHistories, collectionId ?? 'all'],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListOralHistories: TcpOralHistory[] }>(\n `query TcpListOralHistories($collectionId: ID) {\n tcpListOralHistories(collectionId: $collectionId) { ${ORAL_HISTORY_FIELDS} }\n }`,\n { collectionId },\n apiGatewayUrl\n );\n return result.tcpListOralHistories;\n },\n });\n};\n\nexport const useTcpRecordOralHistory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateOralHistoryInput) => {\n const result = await tcpQuery<{ tcpRecordOralHistory: TcpOralHistory }>(\n `mutation TcpRecordOralHistory($input: TcpCreateOralHistoryInput!) {\n tcpRecordOralHistory(input: $input) { ${ORAL_HISTORY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpRecordOralHistory;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.oralHistories });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useTcpApi.js","names":[],"sources":["../../../src/theculturepost/hooks/useTcpApi.ts"],"sourcesContent":["/**\n * TheCulturePost API hooks\n * @module theculturepost/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-theculturepost-svc`\n * federated GraphQL contract (the `tcp*` operations). Every query/mutation below\n * uses an inline gql string whose fields match the svc `.hive-schema.graphql`\n * exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n *\n * IMPORTANT: `User`/`File` are id-only federation stubs in this subgraph. We\n * never select `cover { url }` or `author { firstName }`. Covers/artifacts/\n * recordings select `{ id }` and resolve to a URL via wspace-files-svc; author\n * display uses the raw `authorId`/`editorId`/`openedById`.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useTheCulturePost } from '../context';\nimport { clearGraphqlResponseCache } from '../lib/graphql-cache';\nimport type {\n TcpConnection,\n TcpStory,\n TcpStoryStatus,\n TcpTopic,\n TcpTopicCategory,\n TcpCitation,\n TcpVerificationStatus,\n TcpDiscussion,\n TcpReply,\n TcpModerationStatus,\n TcpCollection,\n TcpArchiveItem,\n TcpArchiveItemKind,\n TcpAccessLevel,\n TcpOralHistory,\n TcpCreateStoryInput,\n TcpUpdateStoryInput,\n TcpCreateTopicInput,\n TcpUpdateTopicInput,\n TcpCreateCitationInput,\n TcpCreateDiscussionInput,\n TcpCreateReplyInput,\n TcpCreateCollectionInput,\n TcpCreateArchiveItemInput,\n TcpUpdateArchiveItemInput,\n TcpCreateOralHistoryInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\nconst isMutation = (query: string): boolean => /^\\s*mutation\\b/.test(query);\n\nconst tcpQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n // A mutation's own request must never be served from (or coalesced onto) the\n // read cache, and the resolved read cache must be dropped once it commits so\n // the React-Query refetch that follows sees the new state — not a stale\n // pre-write response held for up to 15s. Clear before AND after the write.\n const mutating = isMutation(query);\n if (mutating) clearGraphqlResponseCache();\n\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (mutating) clearGraphqlResponseCache();\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n stories: ['theculturepost', 'stories'] as const,\n story: (id: string) => ['theculturepost', 'story', id] as const,\n citations: (storyId: string) => ['theculturepost', 'citations', storyId] as const,\n topics: ['theculturepost', 'topics'] as const,\n topic: (id: string) => ['theculturepost', 'topic', id] as const,\n discussions: ['theculturepost', 'discussions'] as const,\n discussion: (id: string) => ['theculturepost', 'discussion', id] as const,\n replies: (discussionId: string) => ['theculturepost', 'replies', discussionId] as const,\n collections: ['theculturepost', 'collections'] as const,\n collection: (id: string) => ['theculturepost', 'collection', id] as const,\n archiveItems: ['theculturepost', 'archive-items'] as const,\n archiveItem: (id: string) => ['theculturepost', 'archive-item', id] as const,\n oralHistories: ['theculturepost', 'oral-histories'] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n/** Drop `cursor` when it is nullish so the svc never sees an explicit null. */\nconst page = (p?: PaginationInput): PaginationInput => {\n const base = p ?? DEFAULT_PAGE;\n const result: PaginationInput = { limit: base.limit ?? DEFAULT_PAGE.limit };\n if (base.offset != null) result.offset = base.offset;\n if (base.cursor != null) result.cursor = base.cursor;\n return result;\n};\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst TOPIC_CORE_FIELDS = `\n id workspaceId name slug description tradition category isFeatured storyCount createdAt updatedAt\n`;\n\nconst STORY_CARD_FIELDS = `\n id workspaceId title slug summary format status topicId authorId editorId\n cover { id } languages tags readingMins publishedAt isFeatured isBookmarked createdAt updatedAt\n topic { id name slug category }\n`;\n\nconst CITATION_FIELDS = `\n id workspaceId storyId title author publisher publishedOn url excerpt provenance\n sourceType sourceFile { id } verification createdAt updatedAt\n`;\n\n// `TcpStory.citations` returns TcpCitationConnection (items + pageInfo), not\n// a bare list — see normalizeStoryDetail below, which flattens it back to\n// TcpCitation[] so every TcpStory-typed caller keeps working unchanged.\nconst STORY_DETAIL_FIELDS = `\n ${STORY_CARD_FIELDS}\n body\n citations { items { ${CITATION_FIELDS} } pageInfo { cursor hasMore } }\n`;\n\ntype RawStoryDetail = Omit<TcpStory, 'citations'> & { citations: TcpConnection<TcpCitation> };\n\nfunction normalizeStoryDetail(raw: RawStoryDetail): TcpStory;\nfunction normalizeStoryDetail(raw: RawStoryDetail | null): TcpStory | null;\nfunction normalizeStoryDetail(raw: RawStoryDetail | null): TcpStory | null {\n if (!raw) return null;\n return { ...raw, citations: raw.citations.items };\n}\n\nconst DISCUSSION_FIELDS = `\n id workspaceId title prompt storyId openedById isInterfaith isLocked status tags\n replyCount createdAt updatedAt\n`;\n\nconst REPLY_FIELDS = `\n id workspaceId discussionId authorId body perspective status createdAt updatedAt\n`;\n\nconst ARCHIVE_ITEM_FIELDS = `\n id workspaceId title description kind accessLevel collectionId file { id }\n provenance origin languages tags datedAt createdAt updatedAt\n`;\n\nconst ORAL_HISTORY_FIELDS = `\n id workspaceId title summary transcript narratorName language accessLevel collectionId\n recording { id } durationSecs recordedAt createdAt updatedAt\n`;\n\nconst COLLECTION_CORE_FIELDS = `\n id workspaceId name slug description tradition cover { id } itemCount createdAt updatedAt\n`;\n\n// ============================================================================\n// Stories\n// ============================================================================\n\nexport interface StoryFilters {\n status?: TcpStoryStatus;\n topicId?: string;\n featured?: boolean;\n pagination?: PaginationInput;\n}\n\nexport const useTcpStories = (filters: StoryFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.stories, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListStories: TcpConnection<TcpStory> }>(\n `query TcpListStories($status: TcpStoryStatus, $topicId: ID, $featured: Boolean, $pagination: PaginationInput) {\n tcpListStories(status: $status, topicId: $topicId, featured: $featured, pagination: $pagination) {\n items { ${STORY_CARD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n status: filters.status,\n topicId: filters.topicId,\n featured: filters.featured,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.tcpListStories;\n },\n });\n};\n\nexport const useTcpStory = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.story(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpStory: RawStoryDetail | null }>(\n `query TcpStory($id: ID!) {\n tcpStory(id: $id) { ${STORY_DETAIL_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return normalizeStoryDetail(result.tcpStory);\n },\n });\n};\n\nexport const useTcpCreateStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateStoryInput) => {\n const result = await tcpQuery<{ tcpCreateStory: RawStoryDetail }>(\n `mutation TcpCreateStory($input: TcpCreateStoryInput!) {\n tcpCreateStory(input: $input) { ${STORY_DETAIL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return normalizeStoryDetail(result.tcpCreateStory);\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.stories }),\n });\n};\n\nexport const useTcpUpdateStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateStoryInput }) => {\n const result = await tcpQuery<{ tcpUpdateStory: RawStoryDetail }>(\n `mutation TcpUpdateStory($id: ID!, $input: TcpUpdateStoryInput!) {\n tcpUpdateStory(id: $id, input: $input) { ${STORY_DETAIL_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return normalizeStoryDetail(result.tcpUpdateStory);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(data.id) });\n },\n });\n};\n\nexport const useTcpTransitionStory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: TcpStoryStatus }) => {\n const result = await tcpQuery<{ tcpTransitionStory: RawStoryDetail }>(\n `mutation TcpTransitionStory($id: ID!, $status: TcpStoryStatus!) {\n tcpTransitionStory(id: $id, status: $status) { ${STORY_DETAIL_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return normalizeStoryDetail(result.tcpTransitionStory);\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(data.id) });\n },\n });\n};\n\n// ============================================================================\n// Reading list (personal bookmarks)\n// ============================================================================\n\nexport const useTcpMySavedStories = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.stories, 'saved', pagination],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpMySavedStories: TcpConnection<TcpStory> }>(\n `query TcpMySavedStories($pagination: PaginationInput) {\n tcpMySavedStories(pagination: $pagination) {\n items { ${STORY_CARD_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return result.tcpMySavedStories;\n },\n });\n};\n\nexport const useTcpToggleStoryBookmark = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (storyId: string) => {\n const result = await tcpQuery<{ tcpToggleStoryBookmark: boolean }>(\n `mutation TcpToggleStoryBookmark($storyId: ID!) { tcpToggleStoryBookmark(storyId: $storyId) }`,\n { storyId },\n apiGatewayUrl\n );\n return result.tcpToggleStoryBookmark;\n },\n onSuccess: (_bookmarked, storyId) => {\n // The bookmarked state is embedded in every story payload (isBookmarked)\n // and the saved-stories list membership itself changes — invalidate both.\n qc.invalidateQueries({ queryKey: KEY.stories });\n qc.invalidateQueries({ queryKey: KEY.story(storyId) });\n },\n });\n};\n\n// ============================================================================\n// Citations\n// ============================================================================\n\nexport const useTcpCitations = (storyId: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.citations(storyId ?? ''),\n enabled: Boolean(storyId),\n queryFn: async () => {\n // tcpListCitations returns TcpCitationConnection (items + pageInfo), not\n // a bare list — selecting CITATION_FIELDS directly on it fails schema\n // validation (`Cannot query field \"id\" on type \"TcpCitationConnection\"`).\n const result = await tcpQuery<{ tcpListCitations: TcpConnection<TcpCitation> }>(\n `query TcpListCitations($storyId: ID!) {\n tcpListCitations(storyId: $storyId) { items { ${CITATION_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n { storyId },\n apiGatewayUrl\n );\n return result.tcpListCitations.items;\n },\n });\n};\n\nexport const useTcpAddCitation = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateCitationInput) => {\n const result = await tcpQuery<{ tcpAddCitation: TcpCitation }>(\n `mutation TcpAddCitation($input: TcpCreateCitationInput!) {\n tcpAddCitation(input: $input) { ${CITATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpAddCitation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.citations(data.storyId) });\n qc.invalidateQueries({ queryKey: KEY.story(data.storyId) });\n },\n });\n};\n\nexport const useTcpVerifyCitation = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; verification: TcpVerificationStatus }) => {\n const result = await tcpQuery<{ tcpVerifyCitation: TcpCitation }>(\n `mutation TcpVerifyCitation($id: ID!, $verification: TcpVerificationStatus!) {\n tcpVerifyCitation(id: $id, verification: $verification) { ${CITATION_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpVerifyCitation;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.citations(data.storyId) });\n qc.invalidateQueries({ queryKey: KEY.story(data.storyId) });\n },\n });\n};\n\n// ============================================================================\n// Topics\n// ============================================================================\n\nexport interface TopicFilters {\n category?: TcpTopicCategory;\n pagination?: PaginationInput;\n}\n\nexport const useTcpTopics = (filters: TopicFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.topics, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListTopics: TcpConnection<TcpTopic> }>(\n `query TcpListTopics($category: TcpTopicCategory, $pagination: PaginationInput) {\n tcpListTopics(category: $category, pagination: $pagination) {\n items { ${TOPIC_CORE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { category: filters.category, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.tcpListTopics;\n },\n });\n};\n\nexport const useTcpTopic = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.topic(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n // TcpTopic.stories returns TcpStoryConnection (items + pageInfo), not a bare list.\n const result = await tcpQuery<{\n tcpTopic: (Omit<TcpTopic, 'stories'> & { stories: TcpConnection<TcpStory> }) | null;\n }>(\n `query TcpTopic($id: ID!) {\n tcpTopic(id: $id) {\n ${TOPIC_CORE_FIELDS}\n stories { items { ${STORY_CARD_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpTopic\n ? { ...result.tcpTopic, stories: result.tcpTopic.stories.items }\n : null;\n },\n });\n};\n\nexport const useTcpCreateTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateTopicInput) => {\n const result = await tcpQuery<{ tcpCreateTopic: TcpTopic }>(\n `mutation TcpCreateTopic($input: TcpCreateTopicInput!) {\n tcpCreateTopic(input: $input) { ${TOPIC_CORE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateTopic;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.topics }),\n });\n};\n\nexport const useTcpUpdateTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateTopicInput }) => {\n const result = await tcpQuery<{ tcpUpdateTopic: TcpTopic }>(\n `mutation TcpUpdateTopic($id: ID!, $input: TcpUpdateTopicInput!) {\n tcpUpdateTopic(id: $id, input: $input) { ${TOPIC_CORE_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpUpdateTopic;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.topics });\n qc.invalidateQueries({ queryKey: KEY.topic(data.id) });\n },\n });\n};\n\nexport const useTcpArchiveTopic = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await tcpQuery<{ tcpArchiveTopic: boolean }>(\n `mutation TcpArchiveTopic($id: ID!) { tcpArchiveTopic(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpArchiveTopic;\n },\n onSuccess: (_data, id) => {\n qc.invalidateQueries({ queryKey: KEY.topics });\n qc.invalidateQueries({ queryKey: KEY.topic(id) });\n },\n });\n};\n\n// ============================================================================\n// Discussions / Replies\n// ============================================================================\n\nexport interface DiscussionFilters {\n status?: TcpModerationStatus;\n storyId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useTcpDiscussions = (filters: DiscussionFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.discussions, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListDiscussions: TcpConnection<TcpDiscussion> }>(\n `query TcpListDiscussions($status: TcpModerationStatus, $storyId: ID, $pagination: PaginationInput) {\n tcpListDiscussions(status: $status, storyId: $storyId, pagination: $pagination) {\n items { ${DISCUSSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { status: filters.status, storyId: filters.storyId, pagination: page(filters.pagination) },\n apiGatewayUrl\n );\n return result.tcpListDiscussions;\n },\n });\n};\n\nexport const useTcpDiscussion = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.discussion(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n // TcpDiscussion.replies returns TcpReplyConnection (items + pageInfo), not a bare list.\n const result = await tcpQuery<{\n tcpDiscussion:\n (Omit<TcpDiscussion, 'replies'> & { replies: TcpConnection<TcpReply> }) | null;\n }>(\n `query TcpDiscussion($id: ID!) {\n tcpDiscussion(id: $id) {\n ${DISCUSSION_FIELDS}\n replies { items { ${REPLY_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpDiscussion\n ? { ...result.tcpDiscussion, replies: result.tcpDiscussion.replies.items }\n : null;\n },\n });\n};\n\nexport const useTcpReplies = (discussionId: string | undefined, status?: TcpModerationStatus) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.replies(discussionId ?? ''), status ?? 'all'],\n enabled: Boolean(discussionId),\n queryFn: async () => {\n // tcpListReplies returns TcpReplyConnection (items + pageInfo).\n const result = await tcpQuery<{ tcpListReplies: TcpConnection<TcpReply> }>(\n `query TcpListReplies($discussionId: ID!, $status: TcpModerationStatus) {\n tcpListReplies(discussionId: $discussionId, status: $status) { items { ${REPLY_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n { discussionId, status },\n apiGatewayUrl\n );\n return result.tcpListReplies.items;\n },\n });\n};\n\nexport const useTcpOpenDiscussion = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateDiscussionInput) => {\n const result = await tcpQuery<{ tcpOpenDiscussion: TcpDiscussion }>(\n `mutation TcpOpenDiscussion($input: TcpCreateDiscussionInput!) {\n tcpOpenDiscussion(input: $input) { ${DISCUSSION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpOpenDiscussion;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.discussions }),\n });\n};\n\nexport const useTcpPostReply = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateReplyInput) => {\n const result = await tcpQuery<{ tcpPostReply: TcpReply }>(\n `mutation TcpPostReply($input: TcpCreateReplyInput!) {\n tcpPostReply(input: $input) { ${REPLY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpPostReply;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.replies(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussions });\n },\n });\n};\n\nexport const useTcpModerateReply = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; status: TcpModerationStatus }) => {\n const result = await tcpQuery<{ tcpModerateReply: TcpReply }>(\n `mutation TcpModerateReply($id: ID!, $status: TcpModerationStatus!) {\n tcpModerateReply(id: $id, status: $status) { ${REPLY_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpModerateReply;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.replies(data.discussionId) });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.discussionId) });\n },\n });\n};\n\nexport const useTcpLockDiscussion = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await tcpQuery<{ tcpLockDiscussion: TcpDiscussion }>(\n `mutation TcpLockDiscussion($id: ID!) {\n tcpLockDiscussion(id: $id) { ${DISCUSSION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpLockDiscussion;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.discussions });\n qc.invalidateQueries({ queryKey: KEY.discussion(data.id) });\n },\n });\n};\n\n// ============================================================================\n// Collections\n// ============================================================================\n\nexport const useTcpCollections = (pagination?: PaginationInput) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.collections, pagination],\n queryFn: async () => {\n // tcpListCollections returns TcpCollectionConnection (items + pageInfo).\n const result = await tcpQuery<{ tcpListCollections: TcpConnection<TcpCollection> }>(\n `query TcpListCollections($pagination: PaginationInput) {\n tcpListCollections(pagination: $pagination) { items { ${COLLECTION_CORE_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n { pagination: page(pagination) },\n apiGatewayUrl\n );\n return result.tcpListCollections.items;\n },\n });\n};\n\nexport const useTcpCollection = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.collection(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n // TcpCollection.items / .oralHistories return TcpArchiveItemConnection /\n // TcpOralHistoryConnection (items + pageInfo), not bare lists.\n const result = await tcpQuery<{\n tcpCollection:\n | (Omit<TcpCollection, 'items' | 'oralHistories'> & {\n items: TcpConnection<TcpArchiveItem>;\n oralHistories: TcpConnection<TcpOralHistory>;\n })\n | null;\n }>(\n `query TcpCollection($id: ID!) {\n tcpCollection(id: $id) {\n ${COLLECTION_CORE_FIELDS}\n items { items { ${ARCHIVE_ITEM_FIELDS} } pageInfo { cursor hasMore } }\n oralHistories { items { ${ORAL_HISTORY_FIELDS} } pageInfo { cursor hasMore } }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpCollection\n ? {\n ...result.tcpCollection,\n items: result.tcpCollection.items.items,\n oralHistories: result.tcpCollection.oralHistories.items,\n }\n : null;\n },\n });\n};\n\nexport const useTcpCreateCollection = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateCollectionInput) => {\n const result = await tcpQuery<{ tcpCreateCollection: TcpCollection }>(\n `mutation TcpCreateCollection($input: TcpCreateCollectionInput!) {\n tcpCreateCollection(input: $input) { ${COLLECTION_CORE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateCollection;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.collections }),\n });\n};\n\n// ============================================================================\n// Archive items\n// ============================================================================\n\nexport interface ArchiveItemFilters {\n accessLevel?: TcpAccessLevel;\n collectionId?: string;\n kind?: TcpArchiveItemKind;\n pagination?: PaginationInput;\n}\n\nexport const useTcpArchiveItems = (filters: ArchiveItemFilters = {}) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.archiveItems, filters],\n queryFn: async () => {\n const result = await tcpQuery<{ tcpListArchiveItems: TcpConnection<TcpArchiveItem> }>(\n `query TcpListArchiveItems($accessLevel: TcpAccessLevel, $collectionId: ID, $kind: TcpArchiveItemKind, $pagination: PaginationInput) {\n tcpListArchiveItems(accessLevel: $accessLevel, collectionId: $collectionId, kind: $kind, pagination: $pagination) {\n items { ${ARCHIVE_ITEM_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n accessLevel: filters.accessLevel,\n collectionId: filters.collectionId,\n kind: filters.kind,\n pagination: page(filters.pagination),\n },\n apiGatewayUrl\n );\n return result.tcpListArchiveItems;\n },\n });\n};\n\nexport const useTcpArchiveItem = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: KEY.archiveItem(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const result = await tcpQuery<{ tcpArchiveItem: TcpArchiveItem | null }>(\n `query TcpArchiveItem($id: ID!) {\n tcpArchiveItem(id: $id) {\n ${ARCHIVE_ITEM_FIELDS}\n collection { ${COLLECTION_CORE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.tcpArchiveItem;\n },\n });\n};\n\nexport const useTcpCreateArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateArchiveItemInput) => {\n const result = await tcpQuery<{ tcpCreateArchiveItem: TcpArchiveItem }>(\n `mutation TcpCreateArchiveItem($input: TcpCreateArchiveItemInput!) {\n tcpCreateArchiveItem(input: $input) { ${ARCHIVE_ITEM_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpCreateArchiveItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n\nexport const useTcpUpdateArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; input: TcpUpdateArchiveItemInput }) => {\n const result = await tcpQuery<{ tcpUpdateArchiveItem: TcpArchiveItem }>(\n `mutation TcpUpdateArchiveItem($id: ID!, $input: TcpUpdateArchiveItemInput!) {\n tcpUpdateArchiveItem(id: $id, input: $input) { ${ARCHIVE_ITEM_FIELDS} }\n }`,\n vars,\n apiGatewayUrl\n );\n return result.tcpUpdateArchiveItem;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n qc.invalidateQueries({ queryKey: KEY.archiveItem(data.id) });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n\nexport const useTcpArchiveArchiveItem = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (vars: { id: string; collectionId?: string | null }) => {\n const result = await tcpQuery<{ tcpArchiveArchiveItem: boolean }>(\n `mutation TcpArchiveArchiveItem($id: ID!) { tcpArchiveArchiveItem(id: $id) }`,\n { id: vars.id },\n apiGatewayUrl\n );\n return result.tcpArchiveArchiveItem;\n },\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: KEY.archiveItems });\n qc.invalidateQueries({ queryKey: KEY.archiveItem(vars.id) });\n if (vars.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(vars.collectionId) });\n },\n });\n};\n\n// ============================================================================\n// Oral histories\n// ============================================================================\n\nexport const useTcpOralHistories = (collectionId?: string) => {\n const { apiGatewayUrl } = useTheCulturePost();\n return useQuery({\n queryKey: [...KEY.oralHistories, collectionId ?? 'all'],\n queryFn: async () => {\n // tcpListOralHistories returns TcpOralHistoryConnection (items + pageInfo).\n const result = await tcpQuery<{ tcpListOralHistories: TcpConnection<TcpOralHistory> }>(\n `query TcpListOralHistories($collectionId: ID) {\n tcpListOralHistories(collectionId: $collectionId) { items { ${ORAL_HISTORY_FIELDS} } pageInfo { cursor hasMore } }\n }`,\n { collectionId },\n apiGatewayUrl\n );\n return result.tcpListOralHistories.items;\n },\n });\n};\n\nexport const useTcpRecordOralHistory = () => {\n const { apiGatewayUrl } = useTheCulturePost();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TcpCreateOralHistoryInput) => {\n const result = await tcpQuery<{ tcpRecordOralHistory: TcpOralHistory }>(\n `mutation TcpRecordOralHistory($input: TcpCreateOralHistoryInput!) {\n tcpRecordOralHistory(input: $input) { ${ORAL_HISTORY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.tcpRecordOralHistory;\n },\n onSuccess: (data) => {\n qc.invalidateQueries({ queryKey: KEY.oralHistories });\n if (data.collectionId) qc.invalidateQueries({ queryKey: KEY.collection(data.collectionId) });\n },\n });\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-theculturepost",
3
- "version": "2026.721.1",
3
+ "version": "2026.721.3",
4
4
  "description": "Burdenoff TheCulturePost Microfrontend",
5
5
  "type": "module",
6
6
  "files": [