@burdenoff/microfe-theculturepost 2026.721.1 → 2026.721.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +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;AAuHlB,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,GAAI,UAAS,YAAiB,mFAuBvD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,GAAG,SAAS,2EAgBjD,CAAC;AAEF,eAAO,MAAM,iBAAiB,wGAgB7B,CAAC;AAEF,eAAO,MAAM,iBAAiB;QAIK,MAAM;WAAS,mBAAmB;WAepE,CAAC;AAEF,eAAO,MAAM,qBAAqB;QAIC,MAAM;YAAU,cAAc;WAehE,CAAC;AAMF,eAAO,MAAM,oBAAoB,GAAI,aAAa,eAAe,mFAkBhE,CAAC;AAEF,eAAO,MAAM,yBAAyB,0FAmBrC,CAAC;AAMF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"useTcpApi.d.ts","sourceRoot":"","sources":["../../../src/theculturepost/hooks/useTcpApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,8 +148,8 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
|
|
|
148
148
|
queryKey: c.citations(t ?? ""),
|
|
149
149
|
enabled: !!t,
|
|
150
150
|
queryFn: async () => (await s(`query TcpListCitations($storyId: ID!) {
|
|
151
|
-
tcpListCitations(storyId: $storyId) { ${p} }
|
|
152
|
-
}`, { storyId: t }, n)).tcpListCitations
|
|
151
|
+
tcpListCitations(storyId: $storyId) { items { ${p} } pageInfo { cursor hasMore } }
|
|
152
|
+
}`, { storyId: t }, n)).tcpListCitations.items
|
|
153
153
|
});
|
|
154
154
|
}, O = () => {
|
|
155
155
|
let { apiGatewayUrl: t } = e(), r = i();
|
|
@@ -256,11 +256,11 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
|
|
|
256
256
|
queryKey: [...c.replies(t ?? ""), n ?? "all"],
|
|
257
257
|
enabled: !!t,
|
|
258
258
|
queryFn: async () => (await s(`query TcpListReplies($discussionId: ID!, $status: TcpModerationStatus) {
|
|
259
|
-
tcpListReplies(discussionId: $discussionId, status: $status) { ${g} }
|
|
259
|
+
tcpListReplies(discussionId: $discussionId, status: $status) { items { ${g} } pageInfo { cursor hasMore } }
|
|
260
260
|
}`, {
|
|
261
261
|
discussionId: t,
|
|
262
262
|
status: n
|
|
263
|
-
}, i)).tcpListReplies
|
|
263
|
+
}, i)).tcpListReplies.items
|
|
264
264
|
});
|
|
265
265
|
}, R = () => {
|
|
266
266
|
let { apiGatewayUrl: t } = e(), r = i();
|
|
@@ -305,8 +305,8 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
|
|
|
305
305
|
return r({
|
|
306
306
|
queryKey: [...c.collections, t],
|
|
307
307
|
queryFn: async () => (await s(`query TcpListCollections($pagination: PaginationInput) {
|
|
308
|
-
tcpListCollections(pagination: $pagination) { ${y} }
|
|
309
|
-
}`, { pagination: u(t) }, n)).tcpListCollections
|
|
308
|
+
tcpListCollections(pagination: $pagination) { items { ${y} } pageInfo { cursor hasMore } }
|
|
309
|
+
}`, { pagination: u(t) }, n)).tcpListCollections.items
|
|
310
310
|
});
|
|
311
311
|
}, U = (t) => {
|
|
312
312
|
let { apiGatewayUrl: n } = e();
|
|
@@ -372,8 +372,8 @@ var o = (e) => /^\s*mutation\b/.test(e), s = async (e, n, r) => {
|
|
|
372
372
|
return r({
|
|
373
373
|
queryKey: [...c.oralHistories, t ?? "all"],
|
|
374
374
|
queryFn: async () => (await s(`query TcpListOralHistories($collectionId: ID) {
|
|
375
|
-
tcpListOralHistories(collectionId: $collectionId) { ${v} }
|
|
376
|
-
}`, { collectionId: t }, n)).tcpListOralHistories
|
|
375
|
+
tcpListOralHistories(collectionId: $collectionId) { items { ${v} } pageInfo { cursor hasMore } }
|
|
376
|
+
}`, { collectionId: t }, n)).tcpListOralHistories.items
|
|
377
377
|
});
|
|
378
378
|
}, Y = () => {
|
|
379
379
|
let { apiGatewayUrl: t } = e(), r = i();
|
|
@@ -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\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 // 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 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 // 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 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 // 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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"}
|