@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<
|
|
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<
|
|
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<
|
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EAChB,MAAM,UAAU,CAAC;
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 () =>
|
|
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)
|
|
206
|
+
}`, { id: t }, n);
|
|
207
|
+
return e.tcpTopic ? {
|
|
208
|
+
...e.tcpTopic,
|
|
209
|
+
stories: e.tcpTopic.stories.items
|
|
210
|
+
} : null;
|
|
211
|
+
}
|
|
199
212
|
});
|
|
200
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 { ${
|
|
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
|
-
},
|
|
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 () =>
|
|
259
|
+
queryFn: async () => {
|
|
260
|
+
let e = await s(`query TcpDiscussion($id: ID!) {
|
|
247
261
|
tcpDiscussion(id: $id) {
|
|
248
|
-
${
|
|
249
|
-
replies { ${
|
|
262
|
+
${g}
|
|
263
|
+
replies { items { ${_} } pageInfo { cursor hasMore } }
|
|
250
264
|
}
|
|
251
|
-
}`, { id: t }, n)
|
|
265
|
+
}`, { id: t }, n);
|
|
266
|
+
return e.tcpDiscussion ? {
|
|
267
|
+
...e.tcpDiscussion,
|
|
268
|
+
replies: e.tcpDiscussion.replies.items
|
|
269
|
+
} : null;
|
|
270
|
+
}
|
|
252
271
|
});
|
|
253
|
-
},
|
|
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) { ${
|
|
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
|
-
},
|
|
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) { ${
|
|
288
|
+
tcpOpenDiscussion(input: $input) { ${g} }
|
|
270
289
|
}`, { input: e }, t)).tcpOpenDiscussion,
|
|
271
290
|
onSuccess: () => r.invalidateQueries({ queryKey: c.discussions })
|
|
272
291
|
});
|
|
273
|
-
},
|
|
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) { ${
|
|
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
|
-
},
|
|
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) { ${
|
|
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
|
-
},
|
|
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) { ${
|
|
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
|
-
},
|
|
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) { ${
|
|
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
|
-
},
|
|
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 () =>
|
|
335
|
+
queryFn: async () => {
|
|
336
|
+
let e = await s(`query TcpCollection($id: ID!) {
|
|
317
337
|
tcpCollection(id: $id) {
|
|
318
|
-
${
|
|
319
|
-
items { ${
|
|
320
|
-
oralHistories { ${
|
|
338
|
+
${b}
|
|
339
|
+
items { items { ${v} } pageInfo { cursor hasMore } }
|
|
340
|
+
oralHistories { items { ${y} } pageInfo { cursor hasMore } }
|
|
321
341
|
}
|
|
322
|
-
}`, { id: t }, n)
|
|
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
|
-
},
|
|
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) { ${
|
|
354
|
+
tcpCreateCollection(input: $input) { ${b} }
|
|
329
355
|
}`, { input: e }, t)).tcpCreateCollection,
|
|
330
356
|
onSuccess: () => r.invalidateQueries({ queryKey: c.collections })
|
|
331
357
|
});
|
|
332
|
-
},
|
|
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
|
-
},
|
|
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 { ${
|
|
381
|
+
${v}
|
|
382
|
+
collection { ${b} }
|
|
357
383
|
}
|
|
358
384
|
}`, { id: t }, n)).tcpArchiveItem
|
|
359
385
|
});
|
|
360
|
-
},
|
|
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
|
-
},
|
|
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) { ${
|
|
376
|
-
}`, { collectionId: t }, n)).tcpListOralHistories
|
|
401
|
+
tcpListOralHistories(collectionId: $collectionId) { items { ${y} } pageInfo { cursor hasMore } }
|
|
402
|
+
}`, { collectionId: t }, n)).tcpListOralHistories.items
|
|
377
403
|
});
|
|
378
|
-
},
|
|
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) { ${
|
|
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 {
|
|
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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"}
|