@burdenoff/microfe-hookmovies 2026.713.1 → 2026.719.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"useHookMoviesApi.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/hooks/useHookMoviesApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useHookMoviesApi.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/hooks/useHookMoviesApi.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useHookMoviesApi.js","names":[],"sources":["../../../src/hookmovies/hooks/useHookMoviesApi.ts"],"sourcesContent":["/**\n * HookMovies API hooks\n * @module hookmovies/hooks\n *\n * Real data layer for the HookMovies workspace subgraph (`hookmovies` Hive\n * service / `wspace-hookmovies-svc`). Every hook talks to the live workspace\n * GraphQL gateway via {@link graphqlFetch} with inline operations whose fields\n * mirror `.hive-schema.graphql` exactly. No mocks.\n *\n * Conventions (mirrors microfe-kadaikodi):\n * - `hookmoviesQuery` wraps graphqlFetch({ gateway: 'workspace', workspaceToken: true })\n * and throws on GraphQL errors / missing data.\n * - One react-query `useQuery` per read op and `useMutation` per write op.\n * - Strict hand-written result interfaces — no `any`.\n * - Pagination uses the subgraph's `PaginationInput` (limit/offset/cursor) and\n * `Hok*Connection { items, pageInfo { cursor hasMore } }` shapes verbatim.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useHookMovies } from '../context';\n\n// ============================================================================\n// Low-level query runner\n// ============================================================================\n\nconst hookmoviesQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // This MFE bypasses Apollo, so fe-libs' short-lived graphqlFetch read cache\n // (~15s) would otherwise serve pre-write data to the very next refetch issued\n // by a mutation's onSuccess invalidation. Clear it after any successful\n // mutation so every downstream read is fresh (fleet-wide stale-read-after-\n // write fix).\n if (query.trimStart().startsWith('mutation')) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\n/**\n * Low-level runner for the GLOBAL gateway. HookMovies reuses several platform\n * services that live in the global layer — global-billing (checkout / earnings /\n * payouts), global-auth (developer API keys) and global-i18n (languages / user\n * language preference). Those ops are global-scoped, so we do NOT attach the\n * workspace token and we let fe-libs resolve the runtime global gateway URL\n * (never the workspace `apiGatewayUrl`). Auth + locale headers are added\n * automatically by {@link graphqlFetch}.\n */\nconst globalQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'global',\n query,\n variables,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // Same stale-read-after-write guard as hookmoviesQuery (see there).\n if (query.trimStart().startsWith('mutation')) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst QK = 'hookmovies' as const;\n\n// ============================================================================\n// Shared scalar / enum types (mirror .hive-schema.graphql)\n// ============================================================================\n\nexport interface HokPaginationInput {\n cursor?: string | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface HokPageInfo {\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport type HokTitleType =\n | 'MOVIE'\n | 'SERIES'\n | 'SHORT_FILM'\n | 'DOCUMENTARY'\n | 'ANIME'\n | 'SHORT_FORM'\n | 'LONG_FORM'\n | 'LIVE_EVENT'\n | 'TRAILER'\n | 'COLLECTION'\n | 'FAST_CHANNEL';\n\nexport type HokTitleStatus =\n | 'DRAFT'\n | 'IN_REVIEW'\n | 'SCHEDULED'\n | 'PUBLISHED'\n | 'UNPUBLISHED'\n | 'ARCHIVED';\n\nexport type HokProductionStatus =\n | 'DEVELOPMENT'\n | 'GREENLIT'\n | 'IN_PRODUCTION'\n | 'POST_PRODUCTION'\n | 'RELEASED'\n | 'SHELVED';\n\nexport type HokAuditionStatus = 'OPEN' | 'REVIEWING' | 'CALLBACKS' | 'CLOSED' | 'CANCELLED';\n\nexport type HokApplicationStatus =\n | 'SUBMITTED'\n | 'SHORTLISTED'\n | 'CALLBACK'\n | 'OFFERED'\n | 'REJECTED'\n | 'WITHDRAWN';\n\nexport type HokCreditRole =\n | 'ACTOR'\n | 'DIRECTOR'\n | 'WRITER'\n | 'PRODUCER'\n | 'CINEMATOGRAPHER'\n | 'EDITOR'\n | 'COMPOSER'\n | 'VOICE_ACTOR'\n | 'CREW';\n\nexport type HokReviewStatus = 'PENDING' | 'PUBLISHED' | 'HIDDEN' | 'REMOVED';\n\nexport type HokRightsWindowStatus = 'DRAFT' | 'PENDING' | 'ACTIVE' | 'EXPIRED' | 'REVOKED';\n\nexport type HokMonetizationMode = 'FREE_AVOD' | 'SVOD' | 'TVOD_RENT' | 'TVOD_BUY' | 'PPV' | 'FAST';\n\nexport type HokEntitlementSource = 'SUBSCRIPTION' | 'PURCHASE' | 'RENTAL' | 'PROMO' | 'FREE';\n\nexport type HokEntitlementStatus = 'ACTIVE' | 'EXPIRED' | 'REVOKED';\n\nexport type HokListKind = 'WATCHLIST' | 'PLAYLIST';\n\nexport type HokListVisibility = 'PRIVATE' | 'UNLISTED' | 'PUBLIC';\n\n// ============================================================================\n// Domain object types\n// ============================================================================\n\nexport interface HokStudio {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n country: string | null;\n websiteUrl: string | null;\n isVerified: boolean;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokPerson {\n id: string;\n name: string;\n biography: string | null;\n knownFor: string | null;\n primaryLanguage: string | null;\n portfolioRef: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokCredit {\n id: string;\n personId: string;\n titleId: string;\n role: HokCreditRole;\n characterName: string | null;\n billingOrder: number;\n person: Pick<HokPerson, 'id' | 'name' | 'knownFor'> | null;\n}\n\nexport interface HokEpisodeSummary {\n id: string;\n name: string;\n number: number;\n seasonId: string | null;\n synopsis: string | null;\n runtimeMinutes: number | null;\n airDate: string | null;\n}\n\nexport interface HokSeasonSummary {\n id: string;\n name: string | null;\n number: number;\n synopsis: string | null;\n}\n\nexport interface HokTitle {\n id: string;\n title: string;\n slug: string | null;\n type: HokTitleType;\n status: HokTitleStatus;\n synopsis: string | null;\n genres: string[];\n tags: string[];\n originalLanguage: string | null;\n originCountry: string | null;\n releaseYear: number | null;\n releaseDate: string | null;\n runtimeMinutes: number | null;\n certification: string | null;\n aiDisclosure: boolean;\n studioId: string | null;\n posterFileId: string | null;\n backdropFileId: string | null;\n trailerFileId: string | null;\n videoFileId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokTitleDetail extends HokTitle {\n studio: Pick<HokStudio, 'id' | 'name'> | null;\n credits: HokCredit[];\n seasons: HokSeasonSummary[];\n episodes: HokEpisodeSummary[];\n}\n\nexport interface HokProduction {\n id: string;\n title: string;\n logline: string | null;\n synopsis: string | null;\n status: HokProductionStatus;\n currency: string;\n budgetMinorUnits: string;\n studioId: string | null;\n producerId: string | null;\n resultingTitleId: string | null;\n artistrybaseProjectRef: string | null;\n tags: string[];\n startDate: string | null;\n endDate: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokAuditionSummary {\n id: string;\n roleName: string;\n status: HokAuditionStatus;\n isMinorRole: boolean;\n payMinorUnits: string;\n currency: string;\n location: string | null;\n language: string | null;\n submissionDeadline: string | null;\n}\n\nexport interface HokProductionDetail extends HokProduction {\n auditions: HokAuditionSummary[];\n}\n\nexport interface HokAudition {\n id: string;\n productionId: string;\n roleName: string;\n description: string | null;\n status: HokAuditionStatus;\n isMinorRole: boolean;\n payMinorUnits: string;\n currency: string;\n location: string | null;\n language: string | null;\n submissionDeadline: string | null;\n createdAt: string;\n updatedAt: string;\n production: Pick<HokProduction, 'id' | 'title'> | null;\n}\n\nexport interface HokApplication {\n id: string;\n auditionId: string;\n applicantId: string;\n coverNote: string | null;\n score: number | null;\n status: HokApplicationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokReview {\n id: string;\n titleId: string;\n authorId: string;\n score: number;\n body: string | null;\n hasSpoilers: boolean;\n helpfulCount: number;\n verifiedWatch: boolean;\n status: HokReviewStatus;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokRightsWindow {\n id: string;\n titleId: string;\n status: HokRightsWindowStatus;\n modes: HokMonetizationMode[];\n territories: string[];\n exclusive: boolean;\n currency: string;\n licenseeId: string | null;\n startsAt: string | null;\n endsAt: string | null;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokEntitlement {\n id: string;\n titleId: string;\n userId: string;\n mode: HokMonetizationMode;\n source: HokEntitlementSource;\n status: HokEntitlementStatus;\n territory: string | null;\n expiresAt: string | null;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokList {\n id: string;\n name: string;\n description: string | null;\n kind: HokListKind;\n visibility: HokListVisibility;\n ownerId: string;\n itemCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokWatchProgress {\n id: string;\n titleId: string;\n episodeId: string | null;\n positionSeconds: number;\n completed: boolean;\n lastDevice: string | null;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n}\n\n// ============================================================================\n// Connection wrappers\n// ============================================================================\n\ninterface HokConnection<TItem> {\n items: TItem[];\n pageInfo: HokPageInfo;\n /** Total rows matching the current filters, across all pages. */\n totalCount: number;\n}\n\n// ============================================================================\n// Inline field selections (reused across ops)\n// ============================================================================\n\nconst TITLE_FIELDS = `\n id title slug type status synopsis genres tags originalLanguage originCountry\n releaseYear releaseDate runtimeMinutes certification aiDisclosure studioId\n posterFileId backdropFileId trailerFileId videoFileId\n createdAt updatedAt\n`;\n\nconst STUDIO_FIELDS = `\n id name slug description country websiteUrl isVerified tags createdAt updatedAt\n`;\n\nconst PERSON_FIELDS = `\n id name biography knownFor primaryLanguage portfolioRef tags createdAt updatedAt\n`;\n\nconst PRODUCTION_FIELDS = `\n id title logline synopsis status currency budgetMinorUnits studioId producerId\n resultingTitleId artistrybaseProjectRef tags startDate endDate createdAt updatedAt\n`;\n\nconst AUDITION_FIELDS = `\n id productionId roleName description status isMinorRole payMinorUnits currency\n location language submissionDeadline createdAt updatedAt\n`;\n\nconst REVIEW_FIELDS = `\n id titleId authorId score body hasSpoilers helpfulCount verifiedWatch status\n createdAt updatedAt\n`;\n\nconst RIGHTS_FIELDS = `\n id titleId status modes territories exclusive currency licenseeId startsAt endsAt\n createdAt updatedAt\n`;\n\nconst LIST_FIELDS = `\n id name description kind visibility ownerId itemCount createdAt updatedAt\n`;\n\nconst PAGE_INFO = `pageInfo { cursor hasMore }\n totalCount`;\n\n// ============================================================================\n// Titles\n// ============================================================================\n\nexport interface HokTitleFilters {\n status?: HokTitleStatus;\n type?: HokTitleType;\n studioId?: string;\n}\n\nexport const useTitles = (\n filters: HokTitleFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'titles', filters, pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListTitles: HokConnection<HokTitle> }>(\n `query HokTitles($pagination: PaginationInput, $search: String, $status: HokTitleStatus, $type: HokTitleType, $studioId: ID) {\n hokListTitles(pagination: $pagination, search: $search, status: $status, type: $type, studioId: $studioId) {\n items { ${TITLE_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n {\n pagination,\n search: search?.trim() ? search.trim() : undefined,\n status: filters.status,\n type: filters.type,\n studioId: filters.studioId,\n },\n apiGatewayUrl\n );\n return result.hokListTitles;\n },\n });\n};\n\nexport const useTitle = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'title', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokTitle: HokTitleDetail | null }>(\n `query HokTitle($id: ID!) {\n hokTitle(id: $id) {\n ${TITLE_FIELDS}\n studio { id name }\n credits {\n id personId titleId role characterName billingOrder\n person { id name knownFor }\n }\n seasons { id name number synopsis }\n episodes { id name number seasonId synopsis runtimeMinutes airDate }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokTitle;\n },\n enabled: Boolean(id),\n });\n};\n\nexport interface CreateTitleInput {\n title: string;\n type?: HokTitleType;\n synopsis?: string;\n genres?: string[];\n tags?: string[];\n originalLanguage?: string;\n originCountry?: string;\n releaseYear?: number;\n runtimeMinutes?: number;\n certification?: string;\n slug?: string;\n studioId?: string;\n aiDisclosure?: boolean;\n}\n\nexport const useCreateTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateTitleInput) => {\n const result = await hookmoviesQuery<{ hokCreateTitle: HokTitle }>(\n `mutation HokCreateTitle($input: HokCreateTitleInput!) {\n hokCreateTitle(input: $input) { ${TITLE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateTitle;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n },\n });\n};\n\nexport interface UpdateTitleInput {\n title?: string;\n type?: HokTitleType;\n synopsis?: string;\n genres?: string[];\n tags?: string[];\n originalLanguage?: string;\n originCountry?: string;\n releaseYear?: number;\n runtimeMinutes?: number;\n certification?: string;\n slug?: string;\n studioId?: string;\n aiDisclosure?: boolean;\n posterFileId?: string;\n backdropFileId?: string;\n trailerFileId?: string;\n videoFileId?: string;\n}\n\nexport const useUpdateTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: UpdateTitleInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateTitle: HokTitle }>(\n `mutation HokUpdateTitle($id: ID!, $input: HokUpdateTitleInput!) {\n hokUpdateTitle(id: $id, input: $input) { ${TITLE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateTitle;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.id] });\n },\n });\n};\n\nexport const useTransitionTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokTitleStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionTitle: HokTitle }>(\n `mutation HokTransitionTitle($id: ID!, $status: HokTitleStatus!) {\n hokTransitionTitle(id: $id, status: $status) { ${TITLE_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionTitle;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.id] });\n },\n });\n};\n\nexport const useArchiveTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokArchiveTitle: boolean }>(\n `mutation HokArchiveTitle($id: ID!) { hokArchiveTitle(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokArchiveTitle;\n },\n onSuccess: (_data, id) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', id] });\n },\n });\n};\n\n// ============================================================================\n// Studios\n// ============================================================================\n\nexport const useStudios = (\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'studios', pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListStudios: HokConnection<HokStudio> }>(\n `query HokStudios($pagination: PaginationInput, $search: String) {\n hokListStudios(pagination: $pagination, search: $search) {\n items { ${STUDIO_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, search: search?.trim() ? search.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListStudios;\n },\n });\n};\n\nexport interface CreateStudioInput {\n name: string;\n slug?: string;\n description?: string;\n country?: string;\n websiteUrl?: string;\n tags?: string[];\n}\n\nexport const useCreateStudio = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateStudioInput) => {\n const result = await hookmoviesQuery<{ hokCreateStudio: HokStudio }>(\n `mutation HokCreateStudio($input: HokCreateStudioInput!) {\n hokCreateStudio(input: $input) { ${STUDIO_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateStudio;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'studios'] });\n },\n });\n};\n\n// ============================================================================\n// People\n// ============================================================================\n\nexport const usePeople = (\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'people', pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListPeople: HokConnection<HokPerson> }>(\n `query HokPeople($pagination: PaginationInput, $search: String) {\n hokListPeople(pagination: $pagination, search: $search) {\n items { ${PERSON_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, search: search?.trim() ? search.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListPeople;\n },\n });\n};\n\nexport interface CreatePersonInput {\n name: string;\n biography?: string;\n knownFor?: string;\n primaryLanguage?: string;\n portfolioRef?: string;\n tags?: string[];\n}\n\nexport const useCreatePerson = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreatePersonInput) => {\n const result = await hookmoviesQuery<{ hokCreatePerson: HokPerson }>(\n `mutation HokCreatePerson($input: HokCreatePersonInput!) {\n hokCreatePerson(input: $input) { ${PERSON_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreatePerson;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'people'] });\n },\n });\n};\n\n// ============================================================================\n// Productions\n// ============================================================================\n\nexport interface HokProductionFilters {\n status?: HokProductionStatus;\n studioId?: string;\n}\n\nexport const useProductions = (\n filters: HokProductionFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'productions', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListProductions: HokConnection<HokProduction> }>(\n `query HokProductions($pagination: PaginationInput, $status: HokProductionStatus, $studioId: ID) {\n hokListProductions(pagination: $pagination, status: $status, studioId: $studioId) {\n items { ${PRODUCTION_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, studioId: filters.studioId },\n apiGatewayUrl\n );\n return result.hokListProductions;\n },\n });\n};\n\nexport const useProduction = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'production', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokProduction: HokProductionDetail | null }>(\n `query HokProduction($id: ID!) {\n hokProduction(id: $id) {\n ${PRODUCTION_FIELDS}\n auditions {\n id roleName status isMinorRole payMinorUnits currency location language submissionDeadline\n }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokProduction;\n },\n enabled: Boolean(id),\n });\n};\n\nexport interface CreateProductionInput {\n title: string;\n logline?: string;\n synopsis?: string;\n currency?: string;\n budgetMinorUnits?: string;\n studioId?: string;\n producerId?: string;\n artistrybaseProjectRef?: string;\n tags?: string[];\n startDate?: string;\n endDate?: string;\n}\n\nexport const useCreateProduction = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateProductionInput) => {\n const result = await hookmoviesQuery<{ hokCreateProduction: HokProduction }>(\n `mutation HokCreateProduction($input: HokCreateProductionInput!) {\n hokCreateProduction(input: $input) { ${PRODUCTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateProduction;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'productions'] });\n },\n });\n};\n\nexport const useTransitionProduction = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokProductionStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionProduction: HokProduction }>(\n `mutation HokTransitionProduction($id: ID!, $status: HokProductionStatus!) {\n hokTransitionProduction(id: $id, status: $status) { ${PRODUCTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionProduction;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'productions'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'production', data.id] });\n },\n });\n};\n\n// ============================================================================\n// Auditions & Applications\n// ============================================================================\n\nexport interface HokAuditionFilters {\n status?: HokAuditionStatus;\n productionId?: string;\n}\n\nexport const useAuditions = (\n filters: HokAuditionFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'auditions', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListAuditions: HokConnection<HokAudition> }>(\n `query HokAuditions($pagination: PaginationInput, $status: HokAuditionStatus, $productionId: ID) {\n hokListAuditions(pagination: $pagination, status: $status, productionId: $productionId) {\n items {\n ${AUDITION_FIELDS}\n production { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, productionId: filters.productionId },\n apiGatewayUrl\n );\n return result.hokListAuditions;\n },\n });\n};\n\n/**\n * Resolve a single audition by id. The subgraph exposes no `hokAudition(id)`\n * root field, so we read the (workspace-scoped) audition list and pick the row.\n * Fetched with a generous page size since auditions are workspace-bounded.\n */\nexport const useAuditionById = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'audition-by-id', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListAuditions: HokConnection<HokAudition> }>(\n `query HokAuditionLookup($pagination: PaginationInput) {\n hokListAuditions(pagination: $pagination) {\n items {\n ${AUDITION_FIELDS}\n production { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination: { limit: 200, offset: 0 } },\n apiGatewayUrl\n );\n return result.hokListAuditions.items.find((a) => a.id === id) ?? null;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useAuditionApplications = (auditionId: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'applications', auditionId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListApplications: HokApplication[] }>(\n `query HokApplications($auditionId: ID!) {\n hokListApplications(auditionId: $auditionId) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { auditionId },\n apiGatewayUrl\n );\n return result.hokListApplications;\n },\n enabled: Boolean(auditionId),\n });\n};\n\nexport interface CreateAuditionInput {\n productionId: string;\n roleName: string;\n description?: string;\n payMinorUnits?: string;\n currency?: string;\n location?: string;\n language?: string;\n isMinorRole?: boolean;\n submissionDeadline?: string;\n}\n\nexport const useCreateAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateAuditionInput) => {\n const result = await hookmoviesQuery<{ hokCreateAudition: HokAudition }>(\n `mutation HokCreateAudition($input: HokCreateAuditionInput!) {\n hokCreateAudition(input: $input) { ${AUDITION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateAudition;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'auditions'] });\n },\n });\n};\n\nexport const useCloseAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokCloseAudition: HokAudition }>(\n `mutation HokCloseAudition($id: ID!) {\n hokCloseAudition(id: $id) { ${AUDITION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokCloseAudition;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'auditions'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'audition-by-id', data.id] });\n },\n });\n};\n\nexport interface ApplyToAuditionInput {\n auditionId: string;\n coverNote?: string;\n selfTapeFileId?: string;\n}\n\nexport const useApplyToAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: ApplyToAuditionInput) => {\n const result = await hookmoviesQuery<{ hokApplyToAudition: HokApplication }>(\n `mutation HokApplyToAudition($input: HokApplyToAuditionInput!) {\n hokApplyToAudition(input: $input) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokApplyToAudition;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'applications', data.auditionId] });\n },\n });\n};\n\nexport const useScoreApplication = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, score }: { id: string; score: number }) => {\n const result = await hookmoviesQuery<{ hokScoreApplication: HokApplication }>(\n `mutation HokScoreApplication($id: ID!, $score: Int!) {\n hokScoreApplication(id: $id, score: $score) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { id, score },\n apiGatewayUrl\n );\n return result.hokScoreApplication;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'applications', data.auditionId] });\n },\n });\n};\n\n// ============================================================================\n// Reviews\n// ============================================================================\n\nexport interface HokReviewFilters {\n status?: HokReviewStatus;\n titleId?: string;\n}\n\nexport const useReviews = (\n filters: HokReviewFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'reviews', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListReviews: HokConnection<HokReview> }>(\n `query HokReviews($pagination: PaginationInput, $status: HokReviewStatus, $titleId: ID) {\n hokListReviews(pagination: $pagination, status: $status, titleId: $titleId) {\n items {\n ${REVIEW_FIELDS}\n title { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, titleId: filters.titleId },\n apiGatewayUrl\n );\n return result.hokListReviews;\n },\n });\n};\n\nexport interface CreateReviewInput {\n titleId: string;\n score: number;\n body?: string;\n hasSpoilers?: boolean;\n aspectScores?: Record<string, unknown>;\n}\n\nexport const useCreateReview = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateReviewInput) => {\n const result = await hookmoviesQuery<{ hokCreateReview: HokReview }>(\n `mutation HokCreateReview($input: HokCreateReviewInput!) {\n hokCreateReview(input: $input) { ${REVIEW_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateReview;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\nexport const useDeleteReview = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteReview: boolean }>(\n `mutation HokDeleteReview($id: ID!) { hokDeleteReview(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteReview;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\n// ============================================================================\n// Rights Windows\n// ============================================================================\n\nexport interface HokRightsFilters {\n status?: HokRightsWindowStatus;\n titleId?: string;\n}\n\nexport const useRightsWindows = (\n filters: HokRightsFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'rights', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{\n hokListRightsWindows: HokConnection<HokRightsWindow>;\n }>(\n `query HokRightsWindows($pagination: PaginationInput, $status: HokRightsWindowStatus, $titleId: ID) {\n hokListRightsWindows(pagination: $pagination, status: $status, titleId: $titleId) {\n items {\n ${RIGHTS_FIELDS}\n title { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, titleId: filters.titleId },\n apiGatewayUrl\n );\n return result.hokListRightsWindows;\n },\n });\n};\n\nexport interface CreateRightsWindowInput {\n titleId: string;\n modes: HokMonetizationMode[];\n territories?: string[];\n exclusive?: boolean;\n currency?: string;\n licenseeId?: string;\n startsAt?: string;\n endsAt?: string;\n contractFileId?: string;\n priceMinorUnits?: Record<string, unknown>;\n}\n\nexport const useCreateRightsWindow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateRightsWindowInput) => {\n const result = await hookmoviesQuery<{ hokCreateRightsWindow: HokRightsWindow }>(\n `mutation HokCreateRightsWindow($input: HokCreateRightsWindowInput!) {\n hokCreateRightsWindow(input: $input) { ${RIGHTS_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateRightsWindow;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'rights'] });\n },\n });\n};\n\nexport const useTransitionRightsWindow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokRightsWindowStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionRightsWindow: HokRightsWindow }>(\n `mutation HokTransitionRightsWindow($id: ID!, $status: HokRightsWindowStatus!) {\n hokTransitionRightsWindow(id: $id, status: $status) { ${RIGHTS_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionRightsWindow;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'rights'] });\n },\n });\n};\n\nexport const useRevokeEntitlement = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokRevokeEntitlement: boolean }>(\n `mutation HokRevokeEntitlement($id: ID!) { hokRevokeEntitlement(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokRevokeEntitlement;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-entitlements'] });\n },\n });\n};\n\n// ============================================================================\n// Entitlements (self-scoped)\n// ============================================================================\n\nexport const useMyEntitlements = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-entitlements', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyEntitlements: HokEntitlement[] }>(\n `query HokMyEntitlements($titleId: ID) {\n hokMyEntitlements(titleId: $titleId) {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyEntitlements;\n },\n });\n};\n\n// ============================================================================\n// Lists / Watchlists (self-scoped)\n// ============================================================================\n\nexport const useMyLists = (\n kind?: HokListKind,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-lists', kind, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyLists: HokConnection<HokList> }>(\n `query HokMyLists($kind: HokListKind, $pagination: PaginationInput) {\n hokMyLists(kind: $kind, pagination: $pagination) {\n items { ${LIST_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { kind, pagination },\n apiGatewayUrl\n );\n return result.hokMyLists;\n },\n });\n};\n\nexport interface CreateListInput {\n name: string;\n description?: string;\n kind?: HokListKind;\n visibility?: HokListVisibility;\n items?: Record<string, unknown>;\n}\n\nexport const useCreateList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateListInput) => {\n const result = await hookmoviesQuery<{ hokCreateList: HokList }>(\n `mutation HokCreateList($input: HokCreateListInput!) {\n hokCreateList(input: $input) { ${LIST_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\nexport const useDeleteList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteList: boolean }>(\n `mutation HokDeleteList($id: ID!) { hokDeleteList(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\n// ============================================================================\n// Watch progress / Continue Watching (self-scoped)\n// ============================================================================\n\nexport const useMyWatchProgress = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-watch-progress', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyWatchProgress: HokWatchProgress[] }>(\n `query HokMyWatchProgress($titleId: ID) {\n hokMyWatchProgress(titleId: $titleId) {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyWatchProgress;\n },\n });\n};\n\n// ============================================================================\n// Credits (cast & crew on a title)\n// ============================================================================\n\nexport interface HokCreateCreditInput {\n personId: string;\n titleId: string;\n role?: HokCreditRole;\n characterName?: string;\n billingOrder?: number;\n}\n\n/**\n * Attach a person to a title as cast/crew. Invalidates the affected title's\n * detail query (`[QK,'title',titleId]`) — credits are read as part of that\n * detail selection, so refetching it surfaces the new credit.\n */\nexport const useAddCredit = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateCreditInput) => {\n const result = await hookmoviesQuery<{ hokAddCredit: HokCredit }>(\n `mutation HokAddCredit($input: HokCreateCreditInput!) {\n hokAddCredit(input: $input) {\n id personId titleId role characterName billingOrder\n person { id name knownFor }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokAddCredit;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\n// ============================================================================\n// Seasons & Episodes (series structure under a title)\n// ============================================================================\n\nexport interface HokSeason {\n id: string;\n titleId: string;\n number: number;\n name: string | null;\n synopsis: string | null;\n airDate: string | null;\n}\n\nexport interface HokEpisode {\n id: string;\n titleId: string;\n seasonId: string | null;\n number: number;\n name: string;\n synopsis: string | null;\n runtimeMinutes: number | null;\n airDate: string | null;\n}\n\nexport interface HokCreateSeasonInput {\n titleId: string;\n number: number;\n name?: string;\n synopsis?: string;\n airDate?: string;\n}\n\n/** Add a season to a series title; refetches the title detail (seasons live there). */\nexport const useCreateSeason = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateSeasonInput) => {\n const result = await hookmoviesQuery<{ hokCreateSeason: HokSeason }>(\n `mutation HokCreateSeason($input: HokCreateSeasonInput!) {\n hokCreateSeason(input: $input) {\n id titleId number name synopsis airDate\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateSeason;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\nexport interface HokCreateEpisodeInput {\n titleId: string;\n number: number;\n name: string;\n seasonId?: string;\n synopsis?: string;\n runtimeMinutes?: number;\n airDate?: string;\n fileId?: string;\n}\n\n/** Add an episode to a title; refetches the title detail (episodes live there). */\nexport const useCreateEpisode = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateEpisodeInput) => {\n const result = await hookmoviesQuery<{ hokCreateEpisode: HokEpisode }>(\n `mutation HokCreateEpisode($input: HokCreateEpisodeInput!) {\n hokCreateEpisode(input: $input) {\n id titleId seasonId number name synopsis runtimeMinutes airDate\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateEpisode;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\n// ============================================================================\n// Watch progress mutation (self-scoped)\n// ============================================================================\n\nexport interface HokRecordProgressInput {\n titleId: string;\n positionSeconds: number;\n completed?: boolean;\n episodeId?: string;\n lastDevice?: string;\n}\n\n/** Record playback position for the calling user; invalidates continue-watching. */\nexport const useRecordProgress = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokRecordProgressInput) => {\n const result = await hookmoviesQuery<{ hokRecordProgress: HokWatchProgress }>(\n `mutation HokRecordProgress($input: HokRecordProgressInput!) {\n hokRecordProgress(input: $input) {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokRecordProgress;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-watch-progress'] });\n },\n });\n};\n\n// ============================================================================\n// Entitlements — check (self) & grant (wspace)\n// ============================================================================\n\nexport interface HokEntitlementCheck {\n entitled: boolean;\n modes: HokMonetizationMode[];\n}\n\n/** Whether the calling user may watch a title, and under which monetization modes. */\nexport const useCheckEntitlement = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'check-entitlement', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokCheckEntitlement: HokEntitlementCheck }>(\n `query HokCheckEntitlement($titleId: ID!) {\n hokCheckEntitlement(titleId: $titleId) { entitled modes }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokCheckEntitlement;\n },\n enabled: Boolean(titleId),\n });\n};\n\nexport interface HokGrantEntitlementInput {\n titleId: string;\n userId: string;\n mode: HokMonetizationMode;\n source?: HokEntitlementSource;\n territory?: string;\n expiresAt?: string;\n}\n\n/** Grant a user access to a title; invalidates the caller's entitlements list. */\nexport const useGrantEntitlement = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokGrantEntitlementInput) => {\n const result = await hookmoviesQuery<{ hokGrantEntitlement: HokEntitlement }>(\n `mutation HokGrantEntitlement($input: HokGrantEntitlementInput!) {\n hokGrantEntitlement(input: $input) {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokGrantEntitlement;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-entitlements'] });\n },\n });\n};\n\n// ============================================================================\n// List updates (self-scoped)\n// ============================================================================\n\nexport interface HokUpdateListInput {\n name?: string;\n description?: string;\n visibility?: HokListVisibility;\n items?: Record<string, unknown>;\n}\n\n/** Rename / re-scope / re-order a list's items; invalidates the caller's lists. */\nexport const useUpdateList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: HokUpdateListInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateList: HokList }>(\n `mutation HokUpdateList($id: ID!, $input: HokUpdateListInput!) {\n hokUpdateList(id: $id, input: $input) { ${LIST_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\n// ============================================================================\n// Clips (short-form promos / bonus content attached to a title)\n// ============================================================================\n\nexport type HokClipStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';\n\nexport interface HokClip {\n id: string;\n titleId: string;\n videoFileId: string;\n posterFileId: string | null;\n caption: string | null;\n durationSeconds: number | null;\n language: string | null;\n}\n\nconst CLIP_FIELDS = `\n id titleId videoFileId posterFileId caption durationSeconds language\n`;\n\n/** Clips for a title (optionally filtered by language). */\nexport const useClips = (\n titleId?: string,\n language?: string,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'clips', titleId ?? '', language ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListClips: HokConnection<HokClip> }>(\n `query HokClips($pagination: PaginationInput, $titleId: ID, $language: String) {\n hokListClips(pagination: $pagination, titleId: $titleId, language: $language) {\n items { ${CLIP_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n {\n pagination,\n titleId,\n language: language?.trim() ? language.trim() : undefined,\n },\n apiGatewayUrl\n );\n return result.hokListClips;\n },\n enabled: Boolean(titleId),\n });\n};\n\nexport interface HokCreateClipInput {\n titleId: string;\n videoFileId: string;\n posterFileId?: string;\n caption?: string;\n durationSeconds?: number;\n language?: string;\n order?: number;\n}\n\n/** Attach a clip (video file ref) to a title; invalidates that title's clip list. */\nexport const useCreateClip = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateClipInput) => {\n const result = await hookmoviesQuery<{ hokCreateClip: HokClip }>(\n `mutation HokCreateClip($input: HokCreateClipInput!) {\n hokCreateClip(input: $input) { ${CLIP_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateClip;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'clips', data.titleId] });\n },\n });\n};\n\n/**\n * Delete a clip. `hokDeleteClip` takes only the clip id, so the caller passes\n * the owning `titleId` too — used purely to invalidate the right clip list.\n */\nexport const useDeleteClip = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id }: { id: string; titleId: string }) => {\n const result = await hookmoviesQuery<{ hokDeleteClip: boolean }>(\n `mutation HokDeleteClip($id: ID!) { hokDeleteClip(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteClip;\n },\n onSuccess: (_data, { titleId }) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'clips', titleId] });\n },\n });\n};\n\n// ============================================================================\n// Localizations (subtitle / caption / dub tracks — for player track menus)\n// ============================================================================\n\nexport type HokLocalizationKind = 'SUBTITLE' | 'CAPTION' | 'DUB';\n\nexport type HokLocalizationStatus = 'DRAFT' | 'READY' | 'ARCHIVED';\n\nexport interface HokLocalization {\n id: string;\n language: string;\n kind: HokLocalizationKind;\n fileId: string;\n isDefault: boolean;\n titleId: string | null;\n episodeId: string | null;\n status: HokLocalizationStatus;\n localizedTitle: string | null;\n localizedSynopsis: string | null;\n}\n\nconst LOCALIZATION_FIELDS = `\n id language kind fileId isDefault titleId episodeId status\n localizedTitle localizedSynopsis\n`;\n\n/**\n * Localization tracks for a title (and optionally a specific episode). Used by\n * the player to build its subtitle / caption / dub track menu.\n */\nexport const useLocalizations = (titleId?: string, episodeId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'localizations', titleId ?? '', episodeId ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListLocalizations: HokLocalization[] }>(\n `query HokLocalizations($titleId: ID, $episodeId: ID) {\n hokListLocalizations(titleId: $titleId, episodeId: $episodeId) {\n ${LOCALIZATION_FIELDS}\n }\n }`,\n { titleId, episodeId },\n apiGatewayUrl\n );\n return result.hokListLocalizations;\n },\n enabled: Boolean(titleId) || Boolean(episodeId),\n });\n};\n\n// ============================================================================\n// Health probe (used by the dashboard service-status card)\n// ============================================================================\n\nexport const useHealth = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'health'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokHealth: string }>(\n `query HokHealth { hokHealth }`,\n {},\n apiGatewayUrl\n );\n return result.hokHealth;\n },\n staleTime: 60 * 1000,\n });\n};\n\n// ============================================================================\n// Profiles (Netflix-style per-account viewing profiles, self-scoped)\n// ============================================================================\n\nexport interface HokProfile {\n id: string;\n accountUserId: string;\n name: string;\n avatarFileId: string | null;\n isKids: boolean;\n hasPin: boolean;\n languages: string[];\n maturityLimit: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nconst PROFILE_FIELDS = `\n id accountUserId name avatarFileId isKids hasPin languages maturityLimit\n createdAt updatedAt\n`;\n\n/** The calling account's viewing profiles (self-scoped to ctx.actorId). */\nexport const useMyProfiles = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'profiles'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyProfiles: HokProfile[] }>(\n `query HokMyProfiles { hokMyProfiles { ${PROFILE_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyProfiles;\n },\n });\n};\n\nexport interface CreateProfileInput {\n name: string;\n avatarFileId?: string;\n isKids?: boolean;\n languages?: string[];\n maturityLimit?: string;\n pin?: string;\n}\n\nexport const useCreateProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateProfileInput) => {\n const result = await hookmoviesQuery<{ hokCreateProfile: HokProfile }>(\n `mutation HokCreateProfile($input: HokCreateProfileInput!) {\n hokCreateProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\nexport interface UpdateProfileInput {\n name?: string;\n avatarFileId?: string;\n isKids?: boolean;\n languages?: string[];\n maturityLimit?: string;\n pin?: string;\n}\n\nexport const useUpdateProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: UpdateProfileInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateProfile: HokProfile }>(\n `mutation HokUpdateProfile($id: ID!, $input: HokUpdateProfileInput!) {\n hokUpdateProfile(id: $id, input: $input) { ${PROFILE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\nexport const useDeleteProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteProfile: boolean }>(\n `mutation HokDeleteProfile($id: ID!) { hokDeleteProfile(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\n// ============================================================================\n// Watch parties (synchronized co-viewing rooms, self-scoped host/join)\n// ============================================================================\n\nexport type HokWatchPartyStatus = 'LIVE' | 'PAUSED' | 'ENDED';\n\nexport interface HokWatchPartyMember {\n id: string;\n partyId: string;\n userId: string;\n role: string;\n joinedAt: string;\n}\n\nexport interface HokWatchParty {\n id: string;\n titleId: string;\n episodeId: string | null;\n hostUserId: string;\n isPlaying: boolean;\n positionSeconds: number;\n status: HokWatchPartyStatus;\n createdAt: string;\n updatedAt: string;\n members: HokWatchPartyMember[];\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n}\n\nconst WATCH_PARTY_FIELDS = `\n id titleId episodeId hostUserId isPlaying positionSeconds status createdAt updatedAt\n members { id partyId userId role joinedAt }\n title { id title type }\n`;\n\nexport interface CreateWatchPartyInput {\n titleId: string;\n episodeId?: string;\n isPlaying?: boolean;\n positionSeconds?: number;\n}\n\nexport const useCreateWatchParty = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateWatchPartyInput) => {\n const result = await hookmoviesQuery<{ hokCreateWatchParty: HokWatchParty }>(\n `mutation HokCreateWatchParty($input: HokCreateWatchPartyInput!) {\n hokCreateWatchParty(input: $input) { ${WATCH_PARTY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateWatchParty;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\n/** Fetch a single watch party by id (workspace-scoped read). */\nexport const useWatchParty = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'watch-party', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokWatchParty: HokWatchParty | null }>(\n `query HokWatchParty($id: ID!) {\n hokWatchParty(id: $id) { ${WATCH_PARTY_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokWatchParty;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useJoinWatchParty = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokJoinWatchParty: HokWatchParty }>(\n `mutation HokJoinWatchParty($id: ID!) {\n hokJoinWatchParty(id: $id) { ${WATCH_PARTY_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokJoinWatchParty;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\nexport const useUpdatePartyPlayback = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({\n id,\n isPlaying,\n positionSeconds,\n }: {\n id: string;\n isPlaying: boolean;\n positionSeconds: number;\n }) => {\n const result = await hookmoviesQuery<{ hokUpdatePartyPlayback: HokWatchParty }>(\n `mutation HokUpdatePartyPlayback($id: ID!, $isPlaying: Boolean!, $positionSeconds: Int!) {\n hokUpdatePartyPlayback(id: $id, isPlaying: $isPlaying, positionSeconds: $positionSeconds) {\n ${WATCH_PARTY_FIELDS}\n }\n }`,\n { id, isPlaying, positionSeconds },\n apiGatewayUrl\n );\n return result.hokUpdatePartyPlayback;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\n// ============================================================================\n// Review helpfulness votes (self-scoped; invalidate reviews)\n// ============================================================================\n\nexport const useVoteReviewHelpful = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (reviewId: string) => {\n const result = await hookmoviesQuery<{ hokVoteReviewHelpful: HokReview }>(\n `mutation HokVoteReviewHelpful($reviewId: ID!) {\n hokVoteReviewHelpful(reviewId: $reviewId) {\n ${REVIEW_FIELDS}\n title { id title }\n }\n }`,\n { reviewId },\n apiGatewayUrl\n );\n return result.hokVoteReviewHelpful;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\nexport const useUnvoteReviewHelpful = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (reviewId: string) => {\n const result = await hookmoviesQuery<{ hokUnvoteReviewHelpful: HokReview }>(\n `mutation HokUnvoteReviewHelpful($reviewId: ID!) {\n hokUnvoteReviewHelpful(reviewId: $reviewId) {\n ${REVIEW_FIELDS}\n title { id title }\n }\n }`,\n { reviewId },\n apiGatewayUrl\n );\n return result.hokUnvoteReviewHelpful;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\n// ============================================================================\n// Moderation (report content self-scoped; review queue wspace-scoped)\n// ============================================================================\n\nexport type HokModerationSeverity = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\n\nexport type HokModerationStatus = 'OPEN' | 'REVIEWING' | 'RESOLVED' | 'DISMISSED';\n\nexport interface HokModerationFlag {\n id: string;\n entityId: string;\n entityType: string;\n reason: string;\n reportedByUserId: string;\n resolution: string | null;\n severity: HokModerationSeverity;\n status: HokModerationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst MODERATION_FIELDS = `\n id entityId entityType reason reportedByUserId resolution severity status\n createdAt updatedAt\n`;\n\nexport interface ReportContentInput {\n entityType: string;\n entityId: string;\n reason: string;\n}\n\nexport const useReportContent = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ entityType, entityId, reason }: ReportContentInput) => {\n const result = await hookmoviesQuery<{ hokReportContent: HokModerationFlag }>(\n `mutation HokReportContent($entityType: String!, $entityId: ID!, $reason: String!) {\n hokReportContent(entityType: $entityType, entityId: $entityId, reason: $reason) {\n ${MODERATION_FIELDS}\n }\n }`,\n { entityType, entityId, reason },\n apiGatewayUrl\n );\n return result.hokReportContent;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'moderation-flags'] });\n },\n });\n};\n\nexport const useModerationFlags = (\n status?: HokModerationStatus,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'moderation-flags', status ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{\n hokListModerationFlags: HokConnection<HokModerationFlag>;\n }>(\n `query HokModerationFlags($pagination: PaginationInput, $status: HokModerationStatus) {\n hokListModerationFlags(pagination: $pagination, status: $status) {\n items { ${MODERATION_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status },\n apiGatewayUrl\n );\n return result.hokListModerationFlags;\n },\n });\n};\n\nexport const useResolveModerationFlag = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n resolution,\n }: {\n id: string;\n status: HokModerationStatus;\n resolution?: string;\n }) => {\n const result = await hookmoviesQuery<{ hokResolveModerationFlag: HokModerationFlag }>(\n `mutation HokResolveModerationFlag($id: ID!, $status: HokModerationStatus!, $resolution: String) {\n hokResolveModerationFlag(id: $id, status: $status, resolution: $resolution) {\n ${MODERATION_FIELDS}\n }\n }`,\n { id, status, resolution },\n apiGatewayUrl\n );\n return result.hokResolveModerationFlag;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'moderation-flags'] });\n },\n });\n};\n\n// ============================================================================\n// Preferences (onboarding — languages / content types / maturity, self-scoped)\n// ============================================================================\n\nexport interface HokPreferences {\n id: string;\n userId: string;\n languages: string[];\n contentTypes: string[];\n maturityLimit: string | null;\n onboardedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nconst PREFERENCES_FIELDS = `\n id userId languages contentTypes maturityLimit onboardedAt createdAt updatedAt\n`;\n\nexport const useMyPreferences = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'preferences'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyPreferences: HokPreferences | null }>(\n `query HokMyPreferences { hokMyPreferences { ${PREFERENCES_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyPreferences;\n },\n });\n};\n\nexport interface SetPreferencesInput {\n languages?: string[];\n contentTypes?: string[];\n maturityLimit?: string;\n onboarded?: boolean;\n}\n\nexport const useSetPreferences = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: SetPreferencesInput) => {\n const result = await hookmoviesQuery<{ hokSetPreferences: HokPreferences }>(\n `mutation HokSetPreferences($input: HokSetPreferencesInput!) {\n hokSetPreferences(input: $input) { ${PREFERENCES_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokSetPreferences;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'preferences'] });\n },\n });\n};\n\n// ============================================================================\n// FAST channels & linear schedule (wspace-scoped)\n// ============================================================================\n\nexport type HokChannelStatus = 'DRAFT' | 'LIVE' | 'OFFLINE';\n\nexport interface HokChannel {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n language: string;\n timezone: string;\n genres: string[];\n status: HokChannelStatus;\n logoFileId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokScheduleBlock {\n id: string;\n channelId: string;\n titleId: string | null;\n episodeId: string | null;\n startAt: string;\n endAt: string;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n channel: Pick<HokChannel, 'id' | 'name'> | null;\n}\n\nconst CHANNEL_FIELDS = `\n id name slug description language timezone genres status logoFileId\n createdAt updatedAt\n`;\n\nconst SCHEDULE_BLOCK_FIELDS = `\n id channelId titleId episodeId startAt endAt createdAt updatedAt\n title { id title type }\n channel { id name }\n`;\n\nexport const useChannels = (\n language?: string,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'channels', language ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListChannels: HokConnection<HokChannel> }>(\n `query HokChannels($pagination: PaginationInput, $language: String) {\n hokListChannels(pagination: $pagination, language: $language) {\n items { ${CHANNEL_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, language: language?.trim() ? language.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListChannels;\n },\n });\n};\n\nexport const useChannelSchedule = (channelId: string | undefined, from?: string, to?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'channel-schedule', channelId ?? '', from ?? '', to ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokChannelSchedule: HokScheduleBlock[] }>(\n `query HokChannelSchedule($channelId: ID!, $from: DateTime, $to: DateTime) {\n hokChannelSchedule(channelId: $channelId, from: $from, to: $to) {\n ${SCHEDULE_BLOCK_FIELDS}\n }\n }`,\n { channelId, from, to },\n apiGatewayUrl\n );\n return result.hokChannelSchedule;\n },\n enabled: Boolean(channelId),\n });\n};\n\nexport const useNowPlaying = (channelId: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'now-playing', channelId ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokNowPlaying: HokScheduleBlock | null }>(\n `query HokNowPlaying($channelId: ID!) {\n hokNowPlaying(channelId: $channelId) { ${SCHEDULE_BLOCK_FIELDS} }\n }`,\n { channelId },\n apiGatewayUrl\n );\n return result.hokNowPlaying;\n },\n enabled: Boolean(channelId),\n });\n};\n\nexport interface CreateChannelInput {\n name: string;\n slug?: string;\n description?: string;\n language?: string;\n timezone?: string;\n genres?: string[];\n logoFileId?: string;\n}\n\nexport const useCreateChannel = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateChannelInput) => {\n const result = await hookmoviesQuery<{ hokCreateChannel: HokChannel }>(\n `mutation HokCreateChannel($input: HokCreateChannelInput!) {\n hokCreateChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateChannel;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channels'] });\n },\n });\n};\n\nexport interface ScheduleBlockInput {\n channelId: string;\n startAt: string;\n endAt: string;\n titleId?: string;\n episodeId?: string;\n}\n\nexport const useScheduleBlock = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: ScheduleBlockInput) => {\n const result = await hookmoviesQuery<{ hokScheduleBlock: HokScheduleBlock }>(\n `mutation HokScheduleBlock($input: HokScheduleBlockInput!) {\n hokScheduleBlock(input: $input) { ${SCHEDULE_BLOCK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokScheduleBlock;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channel-schedule', data.channelId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'now-playing', data.channelId] });\n },\n });\n};\n\nexport const useRemoveScheduleBlock = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id }: { id: string; channelId: string }) => {\n const result = await hookmoviesQuery<{ hokRemoveScheduleBlock: boolean }>(\n `mutation HokRemoveScheduleBlock($id: ID!) { hokRemoveScheduleBlock(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokRemoveScheduleBlock;\n },\n onSuccess: (_data, { channelId }) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channel-schedule', channelId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'now-playing', channelId] });\n },\n });\n};\n\n// ============================================================================\n// Localization mutations (wspace-scoped; reads via useLocalizations above)\n// ============================================================================\n\nexport interface CreateLocalizationInput {\n language: string;\n fileId: string;\n kind?: HokLocalizationKind;\n titleId?: string;\n episodeId?: string;\n isDefault?: boolean;\n localizedTitle?: string;\n localizedSynopsis?: string;\n}\n\nexport const useCreateLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateLocalizationInput) => {\n const result = await hookmoviesQuery<{ hokCreateLocalization: HokLocalization }>(\n `mutation HokCreateLocalization($input: HokCreateLocalizationInput!) {\n hokCreateLocalization(input: $input) { ${LOCALIZATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\nexport const useDeleteLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteLocalization: boolean }>(\n `mutation HokDeleteLocalization($id: ID!) { hokDeleteLocalization(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\nexport const useSetDefaultLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokSetDefaultLocalization: HokLocalization }>(\n `mutation HokSetDefaultLocalization($id: ID!) {\n hokSetDefaultLocalization(id: $id) { ${LOCALIZATION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokSetDefaultLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\n// ============================================================================\n// Global-billing reuse (checkout / earnings / payouts) — GLOBAL gateway\n// ============================================================================\n\nexport interface BillingAccount {\n id: string;\n name: string | null;\n orgId: string | null;\n currency: string | null;\n creditAmount: number | null;\n isDefault: boolean | null;\n}\n\n/**\n * Billing accounts owned by the calling actor. HookMovies uses one to anchor\n * checkout orders (title purchases / rentals) and creator earnings & payouts.\n */\nexport const useMyBillingAccounts = () => {\n return useQuery({\n queryKey: [QK, 'billing-accounts'],\n queryFn: async () => {\n const result = await globalQuery<{ myBillingAccounts: BillingAccount[] }>(\n `query HokMyBillingAccounts {\n myBillingAccounts { id name orgId currency creditAmount isDefault }\n }`,\n {}\n );\n return result.myBillingAccounts;\n },\n });\n};\n\nexport type BillingOrderStatus =\n | 'CREATED'\n | 'PAYMENT_PENDING'\n | 'COMPLETED'\n | 'FAILED'\n | 'CANCELED'\n | 'EXPIRED';\n\nexport interface BillingOrder {\n id: string;\n status: BillingOrderStatus;\n currency: string;\n subtotal: number;\n externalService: string;\n description: string | null;\n createdAt: string;\n}\n\nexport interface CreateBillingOrderResponse {\n success: boolean;\n error: string | null;\n order: BillingOrder | null;\n}\n\nexport interface BillingOrderItemInput {\n name: string;\n quantity: number;\n unitPrice: number;\n description?: string;\n}\n\nexport interface CreateBillingOrderInput {\n billingAccountId: string;\n currency: string;\n externalOrderId: string;\n externalService: string;\n subtotal: number;\n items: BillingOrderItemInput[];\n description?: string;\n expiryMinutes?: number;\n}\n\n/** Open a checkout order (e.g. a TVOD title purchase / rental) via global-billing. */\nexport const useCreateBillingOrder = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: CreateBillingOrderInput) => {\n const result = await globalQuery<{ createBillingOrder: CreateBillingOrderResponse }>(\n `mutation HokCreateBillingOrder($input: CreateBillingOrderInput!) {\n createBillingOrder(input: $input) {\n success\n error\n order { id status currency subtotal externalService description createdAt }\n }\n }`,\n { input }\n );\n return result.createBillingOrder;\n },\n onSuccess: (_data, variables) => {\n void queryClient.invalidateQueries({\n queryKey: [QK, 'billing-accounts'],\n });\n void queryClient.invalidateQueries({\n queryKey: [QK, 'earnings-summary', variables.billingAccountId],\n });\n },\n });\n};\n\nexport interface EarningsCategoryBreakdown {\n category: string;\n amount: number;\n count: number;\n}\n\nexport interface EarningsSummary {\n availableAmount: number;\n reservedAmount: number;\n paidAmount: number;\n pendingAmount: number;\n moneyAmount: number;\n creditsAmount: number;\n totalLifetimeAmount: number;\n categoryBreakdown: EarningsCategoryBreakdown[];\n}\n\nexport const useMyEarningsSummary = (billingAccountId: string | undefined) => {\n return useQuery({\n queryKey: [QK, 'earnings-summary', billingAccountId],\n queryFn: async () => {\n const result = await globalQuery<{ myEarningsSummary: EarningsSummary }>(\n `query HokMyEarningsSummary($billingAccountId: ID!) {\n myEarningsSummary(billingAccountId: $billingAccountId) {\n availableAmount reservedAmount paidAmount pendingAmount\n moneyAmount creditsAmount totalLifetimeAmount\n categoryBreakdown { category amount count }\n }\n }`,\n { billingAccountId }\n );\n return result.myEarningsSummary;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type EarningsEntryStatus = 'AVAILABLE' | 'RESERVED' | 'PAID' | 'REVERSED';\n\nexport interface EarningsEntry {\n id: string;\n billingAccountId: string;\n amount: number;\n currency: string;\n description: string | null;\n sourceCategory: string;\n status: EarningsEntryStatus;\n availableAt: string;\n createdAt: string;\n}\n\nexport interface EarningsEntryConnection {\n items: EarningsEntry[];\n totalCount: number;\n hasMore: boolean;\n}\n\nexport interface EarningsEntryFilter {\n status?: EarningsEntryStatus;\n sourceCategory?: string;\n startDate?: string;\n endDate?: string;\n}\n\nexport const useMyEarningsEntries = (\n billingAccountId: string | undefined,\n filter?: EarningsEntryFilter,\n limit = 20,\n offset = 0\n) => {\n return useQuery({\n queryKey: [QK, 'earnings-entries', billingAccountId, filter ?? {}, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ myEarningsEntries: EarningsEntryConnection }>(\n `query HokMyEarningsEntries($billingAccountId: ID!, $filter: EarningsEntryFilterInput, $limit: Int, $offset: Int) {\n myEarningsEntries(billingAccountId: $billingAccountId, filter: $filter, limit: $limit, offset: $offset) {\n items {\n id billingAccountId amount currency description sourceCategory status\n availableAt createdAt\n }\n totalCount\n hasMore\n }\n }`,\n { billingAccountId, filter, limit, offset }\n );\n return result.myEarningsEntries;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type PayoutAccountType = 'BANK_ACCOUNT' | 'UPI' | 'WALLET';\n\nexport type PayoutAccountStatus =\n | 'PENDING_VERIFICATION'\n | 'ACTIVE'\n | 'FAILED_VERIFICATION'\n | 'ARCHIVED';\n\nexport interface PayoutAccount {\n id: string;\n billingAccountId: string;\n label: string;\n displayName: string | null;\n type: PayoutAccountType;\n currency: string;\n accountLast4: string | null;\n isDefault: boolean;\n isActive: boolean;\n status: PayoutAccountStatus;\n createdAt: string;\n}\n\nexport const useMyPayoutAccounts = (billingAccountId: string | undefined) => {\n return useQuery({\n queryKey: [QK, 'payout-accounts', billingAccountId],\n queryFn: async () => {\n const result = await globalQuery<{ myPayoutAccounts: PayoutAccount[] }>(\n `query HokMyPayoutAccounts($billingAccountId: ID!) {\n myPayoutAccounts(billingAccountId: $billingAccountId) {\n id billingAccountId label displayName type currency accountLast4\n isDefault isActive status createdAt\n }\n }`,\n { billingAccountId }\n );\n return result.myPayoutAccounts;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type PayoutRequestStatus =\n | 'APPROVED'\n | 'PENDING'\n | 'PROCESSING'\n | 'PAID'\n | 'REJECTED'\n | 'FAILED';\n\nexport interface PayoutRequest {\n id: string;\n billingAccountId: string;\n requestedAmount: number;\n approvedAmount: number | null;\n currency: string;\n status: PayoutRequestStatus;\n provider: string;\n userNotes: string | null;\n createdAt: string;\n paidAt: string | null;\n}\n\nexport interface PayoutRequestConnection {\n items: PayoutRequest[];\n totalCount: number;\n hasMore: boolean;\n}\n\nconst PAYOUT_REQUEST_FIELDS = `\n id billingAccountId requestedAmount approvedAmount currency status provider\n userNotes createdAt paidAt\n`;\n\nexport const useMyPayoutRequests = (\n billingAccountId: string | undefined,\n limit = 20,\n offset = 0\n) => {\n return useQuery({\n queryKey: [QK, 'payout-requests', billingAccountId, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ myPayoutRequests: PayoutRequestConnection }>(\n `query HokMyPayoutRequests($billingAccountId: ID!, $limit: Int, $offset: Int) {\n myPayoutRequests(billingAccountId: $billingAccountId, limit: $limit, offset: $offset) {\n items { ${PAYOUT_REQUEST_FIELDS} }\n totalCount\n hasMore\n }\n }`,\n { billingAccountId, limit, offset }\n );\n return result.myPayoutRequests;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport interface RequestPayoutInput {\n billingAccountId: string;\n payoutAccountId: string;\n amount: number;\n currency: string;\n notes?: string;\n}\n\nexport const useRequestPayout = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: RequestPayoutInput) => {\n const result = await globalQuery<{ requestBillingPayout: PayoutRequest }>(\n `mutation HokRequestPayout($input: RequestPayoutInput!) {\n requestBillingPayout(input: $input) { ${PAYOUT_REQUEST_FIELDS} }\n }`,\n { input }\n );\n return result.requestBillingPayout;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({\n queryKey: [QK, 'payout-requests', data.billingAccountId],\n });\n void queryClient.invalidateQueries({\n queryKey: [QK, 'earnings-summary', data.billingAccountId],\n });\n },\n });\n};\n\n// ============================================================================\n// Global-auth reuse (developer API keys) — GLOBAL gateway\n// ============================================================================\n\nexport interface ApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName: string | null;\n createdAt: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n}\n\nexport interface ApiKeyConnection {\n apiKeys: ApiKey[];\n totalCount: number;\n hasMore: boolean;\n}\n\nconst API_KEY_FIELDS = `\n id name prefix scopes appId appName createdAt expiresAt lastUsedAt\n`;\n\nexport const useMyApiKeys = (pagination?: HokPaginationInput) => {\n return useQuery({\n queryKey: [QK, 'api-keys', pagination ?? {}],\n queryFn: async () => {\n const result = await globalQuery<{ myApiKeys: ApiKeyConnection }>(\n `query HokMyApiKeys($pagination: PaginationInput) {\n myApiKeys(pagination: $pagination) {\n apiKeys { ${API_KEY_FIELDS} }\n totalCount\n hasMore\n }\n }`,\n { pagination }\n );\n return result.myApiKeys;\n },\n });\n};\n\nexport interface ApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface GenerateApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n/**\n * Mint a developer API key. The plaintext `apiSecret` is returned exactly once —\n * the caller must surface it immediately (it is never retrievable again).\n */\nexport const useGenerateApiKey = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: GenerateApiKeyInput) => {\n const result = await globalQuery<{ generateAPIKey: ApiKeyResult }>(\n `mutation HokGenerateApiKey($input: GenerateAPIKeyInput!) {\n generateAPIKey(input: $input) { apiKey apiSecret keyId }\n }`,\n { input }\n );\n return result.generateAPIKey;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'api-keys'] });\n },\n });\n};\n\nexport const useRevokeApiKey = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (keyId: string) => {\n const result = await globalQuery<{ revokeAPIKey: boolean }>(\n `mutation HokRevokeApiKey($keyId: String!) { revokeAPIKey(keyId: $keyId) }`,\n { keyId }\n );\n return result.revokeAPIKey;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'api-keys'] });\n },\n });\n};\n\n// ============================================================================\n// Global-i18n reuse (language catalog + user language preference) — GLOBAL gateway\n// ============================================================================\n\nexport type LanguageDirection = 'LTR' | 'RTL';\n\nexport type LanguageStatus = 'ACTIVE' | 'DEPRECATED' | 'DRAFT';\n\nexport interface Language {\n id: string;\n code: string;\n name: string;\n nativeName: string;\n direction: LanguageDirection;\n status: LanguageStatus;\n isDefault: boolean;\n}\n\nexport interface LanguageList {\n items: Language[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface LanguageFilter {\n status?: LanguageStatus;\n direction?: LanguageDirection;\n search?: string;\n}\n\nexport const useLanguages = (filter?: LanguageFilter, limit = 50, offset = 0) => {\n return useQuery({\n queryKey: [QK, 'languages', filter ?? {}, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ languages: LanguageList }>(\n `query HokLanguages($filter: LanguageFilterInput, $limit: Int, $offset: Int) {\n languages(filter: $filter, limit: $limit, offset: $offset) {\n items { id code name nativeName direction status isDefault }\n total\n hasMore\n }\n }`,\n { filter, limit, offset }\n );\n return result.languages;\n },\n staleTime: 5 * 60 * 1000,\n });\n};\n\nexport interface UserLanguagePreference {\n id: string;\n userId: string;\n languageCode: string;\n}\n\nexport interface SetUserLanguagePreferenceInput {\n userId: string;\n languageCode: string;\n country?: string;\n currency?: string;\n timezone?: string;\n}\n\nexport const useSetUserLanguagePreference = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: SetUserLanguagePreferenceInput) => {\n const result = await globalQuery<{ setUserLanguagePreference: UserLanguagePreference }>(\n `mutation HokSetUserLanguagePreference($input: SetUserLanguagePreferenceInput!) {\n setUserLanguagePreference(input: $input) { id userId languageCode }\n }`,\n { input }\n );\n return result.setUserLanguagePreference;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'language-preference'] });\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useHookMoviesApi.js","names":[],"sources":["../../../src/hookmovies/hooks/useHookMoviesApi.ts"],"sourcesContent":["/**\n * HookMovies API hooks\n * @module hookmovies/hooks\n *\n * Real data layer for the HookMovies workspace subgraph (`hookmovies` Hive\n * service / `wspace-hookmovies-svc`). Every hook talks to the live workspace\n * GraphQL gateway via {@link graphqlFetch} with inline operations whose fields\n * mirror `.hive-schema.graphql` exactly. No mocks.\n *\n * Conventions (mirrors microfe-kadaikodi):\n * - `hookmoviesQuery` wraps graphqlFetch({ gateway: 'workspace', workspaceToken: true })\n * and throws on GraphQL errors / missing data.\n * - One react-query `useQuery` per read op and `useMutation` per write op.\n * - Strict hand-written result interfaces — no `any`.\n * - Pagination uses the subgraph's `PaginationInput` (limit/offset/cursor) and\n * `Hok*Connection { items, pageInfo { cursor hasMore } }` shapes verbatim.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useHookMovies } from '../context';\n\n// ============================================================================\n// Low-level query runner\n// ============================================================================\n\nconst hookmoviesQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // This MFE bypasses Apollo, so fe-libs' short-lived graphqlFetch read cache\n // (~15s) would otherwise serve pre-write data to the very next refetch issued\n // by a mutation's onSuccess invalidation. Clear it after any successful\n // mutation so every downstream read is fresh (fleet-wide stale-read-after-\n // write fix).\n if (query.trimStart().startsWith('mutation')) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\n/**\n * Low-level runner for the GLOBAL gateway. HookMovies reuses several platform\n * services that live in the global layer — global-billing (checkout / earnings /\n * payouts), global-auth (developer API keys) and global-i18n (languages / user\n * language preference). Those ops are global-scoped, so we do NOT attach the\n * workspace token and we let fe-libs resolve the runtime global gateway URL\n * (never the workspace `apiGatewayUrl`). Auth + locale headers are added\n * automatically by {@link graphqlFetch}.\n */\nconst globalQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'global',\n query,\n variables,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // Same stale-read-after-write guard as hookmoviesQuery (see there).\n if (query.trimStart().startsWith('mutation')) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst QK = 'hookmovies' as const;\n\n// ============================================================================\n// Shared scalar / enum types (mirror .hive-schema.graphql)\n// ============================================================================\n\nexport interface HokPaginationInput {\n cursor?: string | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface HokPageInfo {\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport type HokTitleType =\n | 'MOVIE'\n | 'SERIES'\n | 'SHORT_FILM'\n | 'DOCUMENTARY'\n | 'ANIME'\n | 'SHORT_FORM'\n | 'LONG_FORM'\n | 'LIVE_EVENT'\n | 'TRAILER'\n | 'COLLECTION'\n | 'FAST_CHANNEL';\n\nexport type HokTitleStatus =\n 'DRAFT' | 'IN_REVIEW' | 'SCHEDULED' | 'PUBLISHED' | 'UNPUBLISHED' | 'ARCHIVED';\n\nexport type HokProductionStatus =\n 'DEVELOPMENT' | 'GREENLIT' | 'IN_PRODUCTION' | 'POST_PRODUCTION' | 'RELEASED' | 'SHELVED';\n\nexport type HokAuditionStatus = 'OPEN' | 'REVIEWING' | 'CALLBACKS' | 'CLOSED' | 'CANCELLED';\n\nexport type HokApplicationStatus =\n 'SUBMITTED' | 'SHORTLISTED' | 'CALLBACK' | 'OFFERED' | 'REJECTED' | 'WITHDRAWN';\n\nexport type HokCreditRole =\n | 'ACTOR'\n | 'DIRECTOR'\n | 'WRITER'\n | 'PRODUCER'\n | 'CINEMATOGRAPHER'\n | 'EDITOR'\n | 'COMPOSER'\n | 'VOICE_ACTOR'\n | 'CREW';\n\nexport type HokReviewStatus = 'PENDING' | 'PUBLISHED' | 'HIDDEN' | 'REMOVED';\n\nexport type HokRightsWindowStatus = 'DRAFT' | 'PENDING' | 'ACTIVE' | 'EXPIRED' | 'REVOKED';\n\nexport type HokMonetizationMode = 'FREE_AVOD' | 'SVOD' | 'TVOD_RENT' | 'TVOD_BUY' | 'PPV' | 'FAST';\n\nexport type HokEntitlementSource = 'SUBSCRIPTION' | 'PURCHASE' | 'RENTAL' | 'PROMO' | 'FREE';\n\nexport type HokEntitlementStatus = 'ACTIVE' | 'EXPIRED' | 'REVOKED';\n\nexport type HokListKind = 'WATCHLIST' | 'PLAYLIST';\n\nexport type HokListVisibility = 'PRIVATE' | 'UNLISTED' | 'PUBLIC';\n\n// ============================================================================\n// Domain object types\n// ============================================================================\n\nexport interface HokStudio {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n country: string | null;\n websiteUrl: string | null;\n isVerified: boolean;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokPerson {\n id: string;\n name: string;\n biography: string | null;\n knownFor: string | null;\n primaryLanguage: string | null;\n portfolioRef: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokCredit {\n id: string;\n personId: string;\n titleId: string;\n role: HokCreditRole;\n characterName: string | null;\n billingOrder: number;\n person: Pick<HokPerson, 'id' | 'name' | 'knownFor'> | null;\n}\n\nexport interface HokEpisodeSummary {\n id: string;\n name: string;\n number: number;\n seasonId: string | null;\n synopsis: string | null;\n runtimeMinutes: number | null;\n airDate: string | null;\n}\n\nexport interface HokSeasonSummary {\n id: string;\n name: string | null;\n number: number;\n synopsis: string | null;\n}\n\nexport interface HokTitle {\n id: string;\n title: string;\n slug: string | null;\n type: HokTitleType;\n status: HokTitleStatus;\n synopsis: string | null;\n genres: string[];\n tags: string[];\n originalLanguage: string | null;\n originCountry: string | null;\n releaseYear: number | null;\n releaseDate: string | null;\n runtimeMinutes: number | null;\n certification: string | null;\n aiDisclosure: boolean;\n studioId: string | null;\n posterFileId: string | null;\n backdropFileId: string | null;\n trailerFileId: string | null;\n videoFileId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokTitleDetail extends HokTitle {\n studio: Pick<HokStudio, 'id' | 'name'> | null;\n credits: HokCredit[];\n seasons: HokSeasonSummary[];\n episodes: HokEpisodeSummary[];\n}\n\nexport interface HokProduction {\n id: string;\n title: string;\n logline: string | null;\n synopsis: string | null;\n status: HokProductionStatus;\n currency: string;\n budgetMinorUnits: string;\n studioId: string | null;\n producerId: string | null;\n resultingTitleId: string | null;\n artistrybaseProjectRef: string | null;\n tags: string[];\n startDate: string | null;\n endDate: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokAuditionSummary {\n id: string;\n roleName: string;\n status: HokAuditionStatus;\n isMinorRole: boolean;\n payMinorUnits: string;\n currency: string;\n location: string | null;\n language: string | null;\n submissionDeadline: string | null;\n}\n\nexport interface HokProductionDetail extends HokProduction {\n auditions: HokAuditionSummary[];\n}\n\nexport interface HokAudition {\n id: string;\n productionId: string;\n roleName: string;\n description: string | null;\n status: HokAuditionStatus;\n isMinorRole: boolean;\n payMinorUnits: string;\n currency: string;\n location: string | null;\n language: string | null;\n submissionDeadline: string | null;\n createdAt: string;\n updatedAt: string;\n production: Pick<HokProduction, 'id' | 'title'> | null;\n}\n\nexport interface HokApplication {\n id: string;\n auditionId: string;\n applicantId: string;\n coverNote: string | null;\n score: number | null;\n status: HokApplicationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokReview {\n id: string;\n titleId: string;\n authorId: string;\n score: number;\n body: string | null;\n hasSpoilers: boolean;\n helpfulCount: number;\n verifiedWatch: boolean;\n status: HokReviewStatus;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokRightsWindow {\n id: string;\n titleId: string;\n status: HokRightsWindowStatus;\n modes: HokMonetizationMode[];\n territories: string[];\n exclusive: boolean;\n currency: string;\n licenseeId: string | null;\n startsAt: string | null;\n endsAt: string | null;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokEntitlement {\n id: string;\n titleId: string;\n userId: string;\n mode: HokMonetizationMode;\n source: HokEntitlementSource;\n status: HokEntitlementStatus;\n territory: string | null;\n expiresAt: string | null;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title'> | null;\n}\n\nexport interface HokList {\n id: string;\n name: string;\n description: string | null;\n kind: HokListKind;\n visibility: HokListVisibility;\n ownerId: string;\n itemCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokWatchProgress {\n id: string;\n titleId: string;\n episodeId: string | null;\n positionSeconds: number;\n completed: boolean;\n lastDevice: string | null;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n}\n\n// ============================================================================\n// Connection wrappers\n// ============================================================================\n\ninterface HokConnection<TItem> {\n items: TItem[];\n pageInfo: HokPageInfo;\n /** Total rows matching the current filters, across all pages. */\n totalCount: number;\n}\n\n// ============================================================================\n// Inline field selections (reused across ops)\n// ============================================================================\n\nconst TITLE_FIELDS = `\n id title slug type status synopsis genres tags originalLanguage originCountry\n releaseYear releaseDate runtimeMinutes certification aiDisclosure studioId\n posterFileId backdropFileId trailerFileId videoFileId\n createdAt updatedAt\n`;\n\nconst STUDIO_FIELDS = `\n id name slug description country websiteUrl isVerified tags createdAt updatedAt\n`;\n\nconst PERSON_FIELDS = `\n id name biography knownFor primaryLanguage portfolioRef tags createdAt updatedAt\n`;\n\nconst PRODUCTION_FIELDS = `\n id title logline synopsis status currency budgetMinorUnits studioId producerId\n resultingTitleId artistrybaseProjectRef tags startDate endDate createdAt updatedAt\n`;\n\nconst AUDITION_FIELDS = `\n id productionId roleName description status isMinorRole payMinorUnits currency\n location language submissionDeadline createdAt updatedAt\n`;\n\nconst REVIEW_FIELDS = `\n id titleId authorId score body hasSpoilers helpfulCount verifiedWatch status\n createdAt updatedAt\n`;\n\nconst RIGHTS_FIELDS = `\n id titleId status modes territories exclusive currency licenseeId startsAt endsAt\n createdAt updatedAt\n`;\n\nconst LIST_FIELDS = `\n id name description kind visibility ownerId itemCount createdAt updatedAt\n`;\n\nconst PAGE_INFO = `pageInfo { cursor hasMore }\n totalCount`;\n\n// ============================================================================\n// Titles\n// ============================================================================\n\nexport interface HokTitleFilters {\n status?: HokTitleStatus;\n type?: HokTitleType;\n studioId?: string;\n}\n\nexport const useTitles = (\n filters: HokTitleFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'titles', filters, pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListTitles: HokConnection<HokTitle> }>(\n `query HokTitles($pagination: PaginationInput, $search: String, $status: HokTitleStatus, $type: HokTitleType, $studioId: ID) {\n hokListTitles(pagination: $pagination, search: $search, status: $status, type: $type, studioId: $studioId) {\n items { ${TITLE_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n {\n pagination,\n search: search?.trim() ? search.trim() : undefined,\n status: filters.status,\n type: filters.type,\n studioId: filters.studioId,\n },\n apiGatewayUrl\n );\n return result.hokListTitles;\n },\n });\n};\n\nexport const useTitle = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'title', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokTitle: HokTitleDetail | null }>(\n `query HokTitle($id: ID!) {\n hokTitle(id: $id) {\n ${TITLE_FIELDS}\n studio { id name }\n credits {\n id personId titleId role characterName billingOrder\n person { id name knownFor }\n }\n seasons { id name number synopsis }\n episodes { id name number seasonId synopsis runtimeMinutes airDate }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokTitle;\n },\n enabled: Boolean(id),\n });\n};\n\nexport interface CreateTitleInput {\n title: string;\n type?: HokTitleType;\n synopsis?: string;\n genres?: string[];\n tags?: string[];\n originalLanguage?: string;\n originCountry?: string;\n releaseYear?: number;\n runtimeMinutes?: number;\n certification?: string;\n slug?: string;\n studioId?: string;\n aiDisclosure?: boolean;\n}\n\nexport const useCreateTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateTitleInput) => {\n const result = await hookmoviesQuery<{ hokCreateTitle: HokTitle }>(\n `mutation HokCreateTitle($input: HokCreateTitleInput!) {\n hokCreateTitle(input: $input) { ${TITLE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateTitle;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n },\n });\n};\n\nexport interface UpdateTitleInput {\n title?: string;\n type?: HokTitleType;\n synopsis?: string;\n genres?: string[];\n tags?: string[];\n originalLanguage?: string;\n originCountry?: string;\n releaseYear?: number;\n runtimeMinutes?: number;\n certification?: string;\n slug?: string;\n studioId?: string;\n aiDisclosure?: boolean;\n posterFileId?: string;\n backdropFileId?: string;\n trailerFileId?: string;\n videoFileId?: string;\n}\n\nexport const useUpdateTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: UpdateTitleInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateTitle: HokTitle }>(\n `mutation HokUpdateTitle($id: ID!, $input: HokUpdateTitleInput!) {\n hokUpdateTitle(id: $id, input: $input) { ${TITLE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateTitle;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.id] });\n },\n });\n};\n\nexport const useTransitionTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokTitleStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionTitle: HokTitle }>(\n `mutation HokTransitionTitle($id: ID!, $status: HokTitleStatus!) {\n hokTransitionTitle(id: $id, status: $status) { ${TITLE_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionTitle;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.id] });\n },\n });\n};\n\nexport const useArchiveTitle = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokArchiveTitle: boolean }>(\n `mutation HokArchiveTitle($id: ID!) { hokArchiveTitle(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokArchiveTitle;\n },\n onSuccess: (_data, id) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'titles'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', id] });\n },\n });\n};\n\n// ============================================================================\n// Studios\n// ============================================================================\n\nexport const useStudios = (\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'studios', pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListStudios: HokConnection<HokStudio> }>(\n `query HokStudios($pagination: PaginationInput, $search: String) {\n hokListStudios(pagination: $pagination, search: $search) {\n items { ${STUDIO_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, search: search?.trim() ? search.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListStudios;\n },\n });\n};\n\nexport interface CreateStudioInput {\n name: string;\n slug?: string;\n description?: string;\n country?: string;\n websiteUrl?: string;\n tags?: string[];\n}\n\nexport const useCreateStudio = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateStudioInput) => {\n const result = await hookmoviesQuery<{ hokCreateStudio: HokStudio }>(\n `mutation HokCreateStudio($input: HokCreateStudioInput!) {\n hokCreateStudio(input: $input) { ${STUDIO_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateStudio;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'studios'] });\n },\n });\n};\n\n// ============================================================================\n// People\n// ============================================================================\n\nexport const usePeople = (\n pagination: HokPaginationInput = { limit: 50, offset: 0 },\n search?: string\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'people', pagination, search ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListPeople: HokConnection<HokPerson> }>(\n `query HokPeople($pagination: PaginationInput, $search: String) {\n hokListPeople(pagination: $pagination, search: $search) {\n items { ${PERSON_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, search: search?.trim() ? search.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListPeople;\n },\n });\n};\n\nexport interface CreatePersonInput {\n name: string;\n biography?: string;\n knownFor?: string;\n primaryLanguage?: string;\n portfolioRef?: string;\n tags?: string[];\n}\n\nexport const useCreatePerson = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreatePersonInput) => {\n const result = await hookmoviesQuery<{ hokCreatePerson: HokPerson }>(\n `mutation HokCreatePerson($input: HokCreatePersonInput!) {\n hokCreatePerson(input: $input) { ${PERSON_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreatePerson;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'people'] });\n },\n });\n};\n\n// ============================================================================\n// Productions\n// ============================================================================\n\nexport interface HokProductionFilters {\n status?: HokProductionStatus;\n studioId?: string;\n}\n\nexport const useProductions = (\n filters: HokProductionFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'productions', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListProductions: HokConnection<HokProduction> }>(\n `query HokProductions($pagination: PaginationInput, $status: HokProductionStatus, $studioId: ID) {\n hokListProductions(pagination: $pagination, status: $status, studioId: $studioId) {\n items { ${PRODUCTION_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, studioId: filters.studioId },\n apiGatewayUrl\n );\n return result.hokListProductions;\n },\n });\n};\n\nexport const useProduction = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'production', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokProduction: HokProductionDetail | null }>(\n `query HokProduction($id: ID!) {\n hokProduction(id: $id) {\n ${PRODUCTION_FIELDS}\n auditions {\n id roleName status isMinorRole payMinorUnits currency location language submissionDeadline\n }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokProduction;\n },\n enabled: Boolean(id),\n });\n};\n\nexport interface CreateProductionInput {\n title: string;\n logline?: string;\n synopsis?: string;\n currency?: string;\n budgetMinorUnits?: string;\n studioId?: string;\n producerId?: string;\n artistrybaseProjectRef?: string;\n tags?: string[];\n startDate?: string;\n endDate?: string;\n}\n\nexport const useCreateProduction = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateProductionInput) => {\n const result = await hookmoviesQuery<{ hokCreateProduction: HokProduction }>(\n `mutation HokCreateProduction($input: HokCreateProductionInput!) {\n hokCreateProduction(input: $input) { ${PRODUCTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateProduction;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'productions'] });\n },\n });\n};\n\nexport const useTransitionProduction = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokProductionStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionProduction: HokProduction }>(\n `mutation HokTransitionProduction($id: ID!, $status: HokProductionStatus!) {\n hokTransitionProduction(id: $id, status: $status) { ${PRODUCTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionProduction;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'productions'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'production', data.id] });\n },\n });\n};\n\n// ============================================================================\n// Auditions & Applications\n// ============================================================================\n\nexport interface HokAuditionFilters {\n status?: HokAuditionStatus;\n productionId?: string;\n}\n\nexport const useAuditions = (\n filters: HokAuditionFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'auditions', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListAuditions: HokConnection<HokAudition> }>(\n `query HokAuditions($pagination: PaginationInput, $status: HokAuditionStatus, $productionId: ID) {\n hokListAuditions(pagination: $pagination, status: $status, productionId: $productionId) {\n items {\n ${AUDITION_FIELDS}\n production { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, productionId: filters.productionId },\n apiGatewayUrl\n );\n return result.hokListAuditions;\n },\n });\n};\n\n/**\n * Resolve a single audition by id. The subgraph exposes no `hokAudition(id)`\n * root field, so we read the (workspace-scoped) audition list and pick the row.\n * Fetched with a generous page size since auditions are workspace-bounded.\n */\nexport const useAuditionById = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'audition-by-id', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListAuditions: HokConnection<HokAudition> }>(\n `query HokAuditionLookup($pagination: PaginationInput) {\n hokListAuditions(pagination: $pagination) {\n items {\n ${AUDITION_FIELDS}\n production { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination: { limit: 200, offset: 0 } },\n apiGatewayUrl\n );\n return result.hokListAuditions.items.find((a) => a.id === id) ?? null;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useAuditionApplications = (auditionId: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'applications', auditionId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListApplications: HokApplication[] }>(\n `query HokApplications($auditionId: ID!) {\n hokListApplications(auditionId: $auditionId) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { auditionId },\n apiGatewayUrl\n );\n return result.hokListApplications;\n },\n enabled: Boolean(auditionId),\n });\n};\n\nexport interface CreateAuditionInput {\n productionId: string;\n roleName: string;\n description?: string;\n payMinorUnits?: string;\n currency?: string;\n location?: string;\n language?: string;\n isMinorRole?: boolean;\n submissionDeadline?: string;\n}\n\nexport const useCreateAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateAuditionInput) => {\n const result = await hookmoviesQuery<{ hokCreateAudition: HokAudition }>(\n `mutation HokCreateAudition($input: HokCreateAuditionInput!) {\n hokCreateAudition(input: $input) { ${AUDITION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateAudition;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'auditions'] });\n },\n });\n};\n\nexport const useCloseAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokCloseAudition: HokAudition }>(\n `mutation HokCloseAudition($id: ID!) {\n hokCloseAudition(id: $id) { ${AUDITION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokCloseAudition;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'auditions'] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'audition-by-id', data.id] });\n },\n });\n};\n\nexport interface ApplyToAuditionInput {\n auditionId: string;\n coverNote?: string;\n selfTapeFileId?: string;\n}\n\nexport const useApplyToAudition = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: ApplyToAuditionInput) => {\n const result = await hookmoviesQuery<{ hokApplyToAudition: HokApplication }>(\n `mutation HokApplyToAudition($input: HokApplyToAuditionInput!) {\n hokApplyToAudition(input: $input) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokApplyToAudition;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'applications', data.auditionId] });\n },\n });\n};\n\nexport const useScoreApplication = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, score }: { id: string; score: number }) => {\n const result = await hookmoviesQuery<{ hokScoreApplication: HokApplication }>(\n `mutation HokScoreApplication($id: ID!, $score: Int!) {\n hokScoreApplication(id: $id, score: $score) {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }`,\n { id, score },\n apiGatewayUrl\n );\n return result.hokScoreApplication;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'applications', data.auditionId] });\n },\n });\n};\n\n// ============================================================================\n// Reviews\n// ============================================================================\n\nexport interface HokReviewFilters {\n status?: HokReviewStatus;\n titleId?: string;\n}\n\nexport const useReviews = (\n filters: HokReviewFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'reviews', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListReviews: HokConnection<HokReview> }>(\n `query HokReviews($pagination: PaginationInput, $status: HokReviewStatus, $titleId: ID) {\n hokListReviews(pagination: $pagination, status: $status, titleId: $titleId) {\n items {\n ${REVIEW_FIELDS}\n title { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, titleId: filters.titleId },\n apiGatewayUrl\n );\n return result.hokListReviews;\n },\n });\n};\n\nexport interface CreateReviewInput {\n titleId: string;\n score: number;\n body?: string;\n hasSpoilers?: boolean;\n aspectScores?: Record<string, unknown>;\n}\n\nexport const useCreateReview = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateReviewInput) => {\n const result = await hookmoviesQuery<{ hokCreateReview: HokReview }>(\n `mutation HokCreateReview($input: HokCreateReviewInput!) {\n hokCreateReview(input: $input) { ${REVIEW_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateReview;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\nexport const useDeleteReview = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteReview: boolean }>(\n `mutation HokDeleteReview($id: ID!) { hokDeleteReview(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteReview;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\n// ============================================================================\n// Rights Windows\n// ============================================================================\n\nexport interface HokRightsFilters {\n status?: HokRightsWindowStatus;\n titleId?: string;\n}\n\nexport const useRightsWindows = (\n filters: HokRightsFilters = {},\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'rights', filters, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{\n hokListRightsWindows: HokConnection<HokRightsWindow>;\n }>(\n `query HokRightsWindows($pagination: PaginationInput, $status: HokRightsWindowStatus, $titleId: ID) {\n hokListRightsWindows(pagination: $pagination, status: $status, titleId: $titleId) {\n items {\n ${RIGHTS_FIELDS}\n title { id title }\n }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status: filters.status, titleId: filters.titleId },\n apiGatewayUrl\n );\n return result.hokListRightsWindows;\n },\n });\n};\n\nexport interface CreateRightsWindowInput {\n titleId: string;\n modes: HokMonetizationMode[];\n territories?: string[];\n exclusive?: boolean;\n currency?: string;\n licenseeId?: string;\n startsAt?: string;\n endsAt?: string;\n contractFileId?: string;\n priceMinorUnits?: Record<string, unknown>;\n}\n\nexport const useCreateRightsWindow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateRightsWindowInput) => {\n const result = await hookmoviesQuery<{ hokCreateRightsWindow: HokRightsWindow }>(\n `mutation HokCreateRightsWindow($input: HokCreateRightsWindowInput!) {\n hokCreateRightsWindow(input: $input) { ${RIGHTS_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateRightsWindow;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'rights'] });\n },\n });\n};\n\nexport const useTransitionRightsWindow = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: HokRightsWindowStatus }) => {\n const result = await hookmoviesQuery<{ hokTransitionRightsWindow: HokRightsWindow }>(\n `mutation HokTransitionRightsWindow($id: ID!, $status: HokRightsWindowStatus!) {\n hokTransitionRightsWindow(id: $id, status: $status) { ${RIGHTS_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.hokTransitionRightsWindow;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'rights'] });\n },\n });\n};\n\nexport const useRevokeEntitlement = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokRevokeEntitlement: boolean }>(\n `mutation HokRevokeEntitlement($id: ID!) { hokRevokeEntitlement(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokRevokeEntitlement;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-entitlements'] });\n },\n });\n};\n\n// ============================================================================\n// Entitlements (self-scoped)\n// ============================================================================\n\nexport const useMyEntitlements = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-entitlements', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyEntitlements: HokEntitlement[] }>(\n `query HokMyEntitlements($titleId: ID) {\n hokMyEntitlements(titleId: $titleId) {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyEntitlements;\n },\n });\n};\n\n// ============================================================================\n// Lists / Watchlists (self-scoped)\n// ============================================================================\n\nexport const useMyLists = (\n kind?: HokListKind,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-lists', kind, pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyLists: HokConnection<HokList> }>(\n `query HokMyLists($kind: HokListKind, $pagination: PaginationInput) {\n hokMyLists(kind: $kind, pagination: $pagination) {\n items { ${LIST_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { kind, pagination },\n apiGatewayUrl\n );\n return result.hokMyLists;\n },\n });\n};\n\nexport interface CreateListInput {\n name: string;\n description?: string;\n kind?: HokListKind;\n visibility?: HokListVisibility;\n items?: Record<string, unknown>;\n}\n\nexport const useCreateList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateListInput) => {\n const result = await hookmoviesQuery<{ hokCreateList: HokList }>(\n `mutation HokCreateList($input: HokCreateListInput!) {\n hokCreateList(input: $input) { ${LIST_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\nexport const useDeleteList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteList: boolean }>(\n `mutation HokDeleteList($id: ID!) { hokDeleteList(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\n// ============================================================================\n// Watch progress / Continue Watching (self-scoped)\n// ============================================================================\n\nexport const useMyWatchProgress = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'my-watch-progress', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyWatchProgress: HokWatchProgress[] }>(\n `query HokMyWatchProgress($titleId: ID) {\n hokMyWatchProgress(titleId: $titleId) {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyWatchProgress;\n },\n });\n};\n\n// ============================================================================\n// Credits (cast & crew on a title)\n// ============================================================================\n\nexport interface HokCreateCreditInput {\n personId: string;\n titleId: string;\n role?: HokCreditRole;\n characterName?: string;\n billingOrder?: number;\n}\n\n/**\n * Attach a person to a title as cast/crew. Invalidates the affected title's\n * detail query (`[QK,'title',titleId]`) — credits are read as part of that\n * detail selection, so refetching it surfaces the new credit.\n */\nexport const useAddCredit = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateCreditInput) => {\n const result = await hookmoviesQuery<{ hokAddCredit: HokCredit }>(\n `mutation HokAddCredit($input: HokCreateCreditInput!) {\n hokAddCredit(input: $input) {\n id personId titleId role characterName billingOrder\n person { id name knownFor }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokAddCredit;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\n// ============================================================================\n// Seasons & Episodes (series structure under a title)\n// ============================================================================\n\nexport interface HokSeason {\n id: string;\n titleId: string;\n number: number;\n name: string | null;\n synopsis: string | null;\n airDate: string | null;\n}\n\nexport interface HokEpisode {\n id: string;\n titleId: string;\n seasonId: string | null;\n number: number;\n name: string;\n synopsis: string | null;\n runtimeMinutes: number | null;\n airDate: string | null;\n}\n\nexport interface HokCreateSeasonInput {\n titleId: string;\n number: number;\n name?: string;\n synopsis?: string;\n airDate?: string;\n}\n\n/** Add a season to a series title; refetches the title detail (seasons live there). */\nexport const useCreateSeason = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateSeasonInput) => {\n const result = await hookmoviesQuery<{ hokCreateSeason: HokSeason }>(\n `mutation HokCreateSeason($input: HokCreateSeasonInput!) {\n hokCreateSeason(input: $input) {\n id titleId number name synopsis airDate\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateSeason;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\nexport interface HokCreateEpisodeInput {\n titleId: string;\n number: number;\n name: string;\n seasonId?: string;\n synopsis?: string;\n runtimeMinutes?: number;\n airDate?: string;\n fileId?: string;\n}\n\n/** Add an episode to a title; refetches the title detail (episodes live there). */\nexport const useCreateEpisode = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateEpisodeInput) => {\n const result = await hookmoviesQuery<{ hokCreateEpisode: HokEpisode }>(\n `mutation HokCreateEpisode($input: HokCreateEpisodeInput!) {\n hokCreateEpisode(input: $input) {\n id titleId seasonId number name synopsis runtimeMinutes airDate\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateEpisode;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'title', data.titleId] });\n },\n });\n};\n\n// ============================================================================\n// Watch progress mutation (self-scoped)\n// ============================================================================\n\nexport interface HokRecordProgressInput {\n titleId: string;\n positionSeconds: number;\n completed?: boolean;\n episodeId?: string;\n lastDevice?: string;\n}\n\n/** Record playback position for the calling user; invalidates continue-watching. */\nexport const useRecordProgress = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokRecordProgressInput) => {\n const result = await hookmoviesQuery<{ hokRecordProgress: HokWatchProgress }>(\n `mutation HokRecordProgress($input: HokRecordProgressInput!) {\n hokRecordProgress(input: $input) {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokRecordProgress;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-watch-progress'] });\n },\n });\n};\n\n// ============================================================================\n// Entitlements — check (self) & grant (wspace)\n// ============================================================================\n\nexport interface HokEntitlementCheck {\n entitled: boolean;\n modes: HokMonetizationMode[];\n}\n\n/** Whether the calling user may watch a title, and under which monetization modes. */\nexport const useCheckEntitlement = (titleId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'check-entitlement', titleId],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokCheckEntitlement: HokEntitlementCheck }>(\n `query HokCheckEntitlement($titleId: ID!) {\n hokCheckEntitlement(titleId: $titleId) { entitled modes }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokCheckEntitlement;\n },\n enabled: Boolean(titleId),\n });\n};\n\nexport interface HokGrantEntitlementInput {\n titleId: string;\n userId: string;\n mode: HokMonetizationMode;\n source?: HokEntitlementSource;\n territory?: string;\n expiresAt?: string;\n}\n\n/** Grant a user access to a title; invalidates the caller's entitlements list. */\nexport const useGrantEntitlement = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokGrantEntitlementInput) => {\n const result = await hookmoviesQuery<{ hokGrantEntitlement: HokEntitlement }>(\n `mutation HokGrantEntitlement($input: HokGrantEntitlementInput!) {\n hokGrantEntitlement(input: $input) {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokGrantEntitlement;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-entitlements'] });\n },\n });\n};\n\n// ============================================================================\n// List updates (self-scoped)\n// ============================================================================\n\nexport interface HokUpdateListInput {\n name?: string;\n description?: string;\n visibility?: HokListVisibility;\n items?: Record<string, unknown>;\n}\n\n/** Rename / re-scope / re-order a list's items; invalidates the caller's lists. */\nexport const useUpdateList = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: HokUpdateListInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateList: HokList }>(\n `mutation HokUpdateList($id: ID!, $input: HokUpdateListInput!) {\n hokUpdateList(id: $id, input: $input) { ${LIST_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateList;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'my-lists'] });\n },\n });\n};\n\n// ============================================================================\n// Clips (short-form promos / bonus content attached to a title)\n// ============================================================================\n\nexport type HokClipStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';\n\nexport interface HokClip {\n id: string;\n titleId: string;\n videoFileId: string;\n posterFileId: string | null;\n caption: string | null;\n durationSeconds: number | null;\n language: string | null;\n}\n\nconst CLIP_FIELDS = `\n id titleId videoFileId posterFileId caption durationSeconds language\n`;\n\n/** Clips for a title (optionally filtered by language). */\nexport const useClips = (\n titleId?: string,\n language?: string,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'clips', titleId ?? '', language ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListClips: HokConnection<HokClip> }>(\n `query HokClips($pagination: PaginationInput, $titleId: ID, $language: String) {\n hokListClips(pagination: $pagination, titleId: $titleId, language: $language) {\n items { ${CLIP_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n {\n pagination,\n titleId,\n language: language?.trim() ? language.trim() : undefined,\n },\n apiGatewayUrl\n );\n return result.hokListClips;\n },\n enabled: Boolean(titleId),\n });\n};\n\nexport interface HokCreateClipInput {\n titleId: string;\n videoFileId: string;\n posterFileId?: string;\n caption?: string;\n durationSeconds?: number;\n language?: string;\n order?: number;\n}\n\n/** Attach a clip (video file ref) to a title; invalidates that title's clip list. */\nexport const useCreateClip = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: HokCreateClipInput) => {\n const result = await hookmoviesQuery<{ hokCreateClip: HokClip }>(\n `mutation HokCreateClip($input: HokCreateClipInput!) {\n hokCreateClip(input: $input) { ${CLIP_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateClip;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'clips', data.titleId] });\n },\n });\n};\n\n/**\n * Delete a clip. `hokDeleteClip` takes only the clip id, so the caller passes\n * the owning `titleId` too — used purely to invalidate the right clip list.\n */\nexport const useDeleteClip = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id }: { id: string; titleId: string }) => {\n const result = await hookmoviesQuery<{ hokDeleteClip: boolean }>(\n `mutation HokDeleteClip($id: ID!) { hokDeleteClip(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteClip;\n },\n onSuccess: (_data, { titleId }) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'clips', titleId] });\n },\n });\n};\n\n// ============================================================================\n// Localizations (subtitle / caption / dub tracks — for player track menus)\n// ============================================================================\n\nexport type HokLocalizationKind = 'SUBTITLE' | 'CAPTION' | 'DUB';\n\nexport type HokLocalizationStatus = 'DRAFT' | 'READY' | 'ARCHIVED';\n\nexport interface HokLocalization {\n id: string;\n language: string;\n kind: HokLocalizationKind;\n fileId: string;\n isDefault: boolean;\n titleId: string | null;\n episodeId: string | null;\n status: HokLocalizationStatus;\n localizedTitle: string | null;\n localizedSynopsis: string | null;\n}\n\nconst LOCALIZATION_FIELDS = `\n id language kind fileId isDefault titleId episodeId status\n localizedTitle localizedSynopsis\n`;\n\n/**\n * Localization tracks for a title (and optionally a specific episode). Used by\n * the player to build its subtitle / caption / dub track menu.\n */\nexport const useLocalizations = (titleId?: string, episodeId?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'localizations', titleId ?? '', episodeId ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListLocalizations: HokLocalization[] }>(\n `query HokLocalizations($titleId: ID, $episodeId: ID) {\n hokListLocalizations(titleId: $titleId, episodeId: $episodeId) {\n ${LOCALIZATION_FIELDS}\n }\n }`,\n { titleId, episodeId },\n apiGatewayUrl\n );\n return result.hokListLocalizations;\n },\n enabled: Boolean(titleId) || Boolean(episodeId),\n });\n};\n\n// ============================================================================\n// Health probe (used by the dashboard service-status card)\n// ============================================================================\n\nexport const useHealth = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'health'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokHealth: string }>(\n `query HokHealth { hokHealth }`,\n {},\n apiGatewayUrl\n );\n return result.hokHealth;\n },\n staleTime: 60 * 1000,\n });\n};\n\n// ============================================================================\n// Profiles (Netflix-style per-account viewing profiles, self-scoped)\n// ============================================================================\n\nexport interface HokProfile {\n id: string;\n accountUserId: string;\n name: string;\n avatarFileId: string | null;\n isKids: boolean;\n hasPin: boolean;\n languages: string[];\n maturityLimit: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nconst PROFILE_FIELDS = `\n id accountUserId name avatarFileId isKids hasPin languages maturityLimit\n createdAt updatedAt\n`;\n\n/** The calling account's viewing profiles (self-scoped to ctx.actorId). */\nexport const useMyProfiles = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'profiles'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyProfiles: HokProfile[] }>(\n `query HokMyProfiles { hokMyProfiles { ${PROFILE_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyProfiles;\n },\n });\n};\n\nexport interface CreateProfileInput {\n name: string;\n avatarFileId?: string;\n isKids?: boolean;\n languages?: string[];\n maturityLimit?: string;\n pin?: string;\n}\n\nexport const useCreateProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateProfileInput) => {\n const result = await hookmoviesQuery<{ hokCreateProfile: HokProfile }>(\n `mutation HokCreateProfile($input: HokCreateProfileInput!) {\n hokCreateProfile(input: $input) { ${PROFILE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\nexport interface UpdateProfileInput {\n name?: string;\n avatarFileId?: string;\n isKids?: boolean;\n languages?: string[];\n maturityLimit?: string;\n pin?: string;\n}\n\nexport const useUpdateProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: UpdateProfileInput }) => {\n const result = await hookmoviesQuery<{ hokUpdateProfile: HokProfile }>(\n `mutation HokUpdateProfile($id: ID!, $input: HokUpdateProfileInput!) {\n hokUpdateProfile(id: $id, input: $input) { ${PROFILE_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.hokUpdateProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\nexport const useDeleteProfile = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteProfile: boolean }>(\n `mutation HokDeleteProfile($id: ID!) { hokDeleteProfile(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteProfile;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'profiles'] });\n },\n });\n};\n\n// ============================================================================\n// Watch parties (synchronized co-viewing rooms, self-scoped host/join)\n// ============================================================================\n\nexport type HokWatchPartyStatus = 'LIVE' | 'PAUSED' | 'ENDED';\n\nexport interface HokWatchPartyMember {\n id: string;\n partyId: string;\n userId: string;\n role: string;\n joinedAt: string;\n}\n\nexport interface HokWatchParty {\n id: string;\n titleId: string;\n episodeId: string | null;\n hostUserId: string;\n isPlaying: boolean;\n positionSeconds: number;\n status: HokWatchPartyStatus;\n createdAt: string;\n updatedAt: string;\n members: HokWatchPartyMember[];\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n}\n\nconst WATCH_PARTY_FIELDS = `\n id titleId episodeId hostUserId isPlaying positionSeconds status createdAt updatedAt\n members { id partyId userId role joinedAt }\n title { id title type }\n`;\n\nexport interface CreateWatchPartyInput {\n titleId: string;\n episodeId?: string;\n isPlaying?: boolean;\n positionSeconds?: number;\n}\n\nexport const useCreateWatchParty = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateWatchPartyInput) => {\n const result = await hookmoviesQuery<{ hokCreateWatchParty: HokWatchParty }>(\n `mutation HokCreateWatchParty($input: HokCreateWatchPartyInput!) {\n hokCreateWatchParty(input: $input) { ${WATCH_PARTY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateWatchParty;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\n/** Fetch a single watch party by id (workspace-scoped read). */\nexport const useWatchParty = (id: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'watch-party', id],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokWatchParty: HokWatchParty | null }>(\n `query HokWatchParty($id: ID!) {\n hokWatchParty(id: $id) { ${WATCH_PARTY_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokWatchParty;\n },\n enabled: Boolean(id),\n });\n};\n\nexport const useJoinWatchParty = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokJoinWatchParty: HokWatchParty }>(\n `mutation HokJoinWatchParty($id: ID!) {\n hokJoinWatchParty(id: $id) { ${WATCH_PARTY_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokJoinWatchParty;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\nexport const useUpdatePartyPlayback = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({\n id,\n isPlaying,\n positionSeconds,\n }: {\n id: string;\n isPlaying: boolean;\n positionSeconds: number;\n }) => {\n const result = await hookmoviesQuery<{ hokUpdatePartyPlayback: HokWatchParty }>(\n `mutation HokUpdatePartyPlayback($id: ID!, $isPlaying: Boolean!, $positionSeconds: Int!) {\n hokUpdatePartyPlayback(id: $id, isPlaying: $isPlaying, positionSeconds: $positionSeconds) {\n ${WATCH_PARTY_FIELDS}\n }\n }`,\n { id, isPlaying, positionSeconds },\n apiGatewayUrl\n );\n return result.hokUpdatePartyPlayback;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'watch-party', data.id] });\n },\n });\n};\n\n// ============================================================================\n// Review helpfulness votes (self-scoped; invalidate reviews)\n// ============================================================================\n\nexport const useVoteReviewHelpful = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (reviewId: string) => {\n const result = await hookmoviesQuery<{ hokVoteReviewHelpful: HokReview }>(\n `mutation HokVoteReviewHelpful($reviewId: ID!) {\n hokVoteReviewHelpful(reviewId: $reviewId) {\n ${REVIEW_FIELDS}\n title { id title }\n }\n }`,\n { reviewId },\n apiGatewayUrl\n );\n return result.hokVoteReviewHelpful;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\nexport const useUnvoteReviewHelpful = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (reviewId: string) => {\n const result = await hookmoviesQuery<{ hokUnvoteReviewHelpful: HokReview }>(\n `mutation HokUnvoteReviewHelpful($reviewId: ID!) {\n hokUnvoteReviewHelpful(reviewId: $reviewId) {\n ${REVIEW_FIELDS}\n title { id title }\n }\n }`,\n { reviewId },\n apiGatewayUrl\n );\n return result.hokUnvoteReviewHelpful;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'reviews'] });\n },\n });\n};\n\n// ============================================================================\n// Moderation (report content self-scoped; review queue wspace-scoped)\n// ============================================================================\n\nexport type HokModerationSeverity = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\n\nexport type HokModerationStatus = 'OPEN' | 'REVIEWING' | 'RESOLVED' | 'DISMISSED';\n\nexport interface HokModerationFlag {\n id: string;\n entityId: string;\n entityType: string;\n reason: string;\n reportedByUserId: string;\n resolution: string | null;\n severity: HokModerationSeverity;\n status: HokModerationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst MODERATION_FIELDS = `\n id entityId entityType reason reportedByUserId resolution severity status\n createdAt updatedAt\n`;\n\nexport interface ReportContentInput {\n entityType: string;\n entityId: string;\n reason: string;\n}\n\nexport const useReportContent = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ entityType, entityId, reason }: ReportContentInput) => {\n const result = await hookmoviesQuery<{ hokReportContent: HokModerationFlag }>(\n `mutation HokReportContent($entityType: String!, $entityId: ID!, $reason: String!) {\n hokReportContent(entityType: $entityType, entityId: $entityId, reason: $reason) {\n ${MODERATION_FIELDS}\n }\n }`,\n { entityType, entityId, reason },\n apiGatewayUrl\n );\n return result.hokReportContent;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'moderation-flags'] });\n },\n });\n};\n\nexport const useModerationFlags = (\n status?: HokModerationStatus,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'moderation-flags', status ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{\n hokListModerationFlags: HokConnection<HokModerationFlag>;\n }>(\n `query HokModerationFlags($pagination: PaginationInput, $status: HokModerationStatus) {\n hokListModerationFlags(pagination: $pagination, status: $status) {\n items { ${MODERATION_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, status },\n apiGatewayUrl\n );\n return result.hokListModerationFlags;\n },\n });\n};\n\nexport const useResolveModerationFlag = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n resolution,\n }: {\n id: string;\n status: HokModerationStatus;\n resolution?: string;\n }) => {\n const result = await hookmoviesQuery<{ hokResolveModerationFlag: HokModerationFlag }>(\n `mutation HokResolveModerationFlag($id: ID!, $status: HokModerationStatus!, $resolution: String) {\n hokResolveModerationFlag(id: $id, status: $status, resolution: $resolution) {\n ${MODERATION_FIELDS}\n }\n }`,\n { id, status, resolution },\n apiGatewayUrl\n );\n return result.hokResolveModerationFlag;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'moderation-flags'] });\n },\n });\n};\n\n// ============================================================================\n// Preferences (onboarding — languages / content types / maturity, self-scoped)\n// ============================================================================\n\nexport interface HokPreferences {\n id: string;\n userId: string;\n languages: string[];\n contentTypes: string[];\n maturityLimit: string | null;\n onboardedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nconst PREFERENCES_FIELDS = `\n id userId languages contentTypes maturityLimit onboardedAt createdAt updatedAt\n`;\n\nexport const useMyPreferences = () => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'preferences'],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokMyPreferences: HokPreferences | null }>(\n `query HokMyPreferences { hokMyPreferences { ${PREFERENCES_FIELDS} } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyPreferences;\n },\n });\n};\n\nexport interface SetPreferencesInput {\n languages?: string[];\n contentTypes?: string[];\n maturityLimit?: string;\n onboarded?: boolean;\n}\n\nexport const useSetPreferences = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: SetPreferencesInput) => {\n const result = await hookmoviesQuery<{ hokSetPreferences: HokPreferences }>(\n `mutation HokSetPreferences($input: HokSetPreferencesInput!) {\n hokSetPreferences(input: $input) { ${PREFERENCES_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokSetPreferences;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'preferences'] });\n },\n });\n};\n\n// ============================================================================\n// FAST channels & linear schedule (wspace-scoped)\n// ============================================================================\n\nexport type HokChannelStatus = 'DRAFT' | 'LIVE' | 'OFFLINE';\n\nexport interface HokChannel {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n language: string;\n timezone: string;\n genres: string[];\n status: HokChannelStatus;\n logoFileId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface HokScheduleBlock {\n id: string;\n channelId: string;\n titleId: string | null;\n episodeId: string | null;\n startAt: string;\n endAt: string;\n createdAt: string;\n updatedAt: string;\n title: Pick<HokTitle, 'id' | 'title' | 'type'> | null;\n channel: Pick<HokChannel, 'id' | 'name'> | null;\n}\n\nconst CHANNEL_FIELDS = `\n id name slug description language timezone genres status logoFileId\n createdAt updatedAt\n`;\n\nconst SCHEDULE_BLOCK_FIELDS = `\n id channelId titleId episodeId startAt endAt createdAt updatedAt\n title { id title type }\n channel { id name }\n`;\n\nexport const useChannels = (\n language?: string,\n pagination: HokPaginationInput = { limit: 50, offset: 0 }\n) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'channels', language ?? '', pagination],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokListChannels: HokConnection<HokChannel> }>(\n `query HokChannels($pagination: PaginationInput, $language: String) {\n hokListChannels(pagination: $pagination, language: $language) {\n items { ${CHANNEL_FIELDS} }\n ${PAGE_INFO}\n }\n }`,\n { pagination, language: language?.trim() ? language.trim() : undefined },\n apiGatewayUrl\n );\n return result.hokListChannels;\n },\n });\n};\n\nexport const useChannelSchedule = (channelId: string | undefined, from?: string, to?: string) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'channel-schedule', channelId ?? '', from ?? '', to ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokChannelSchedule: HokScheduleBlock[] }>(\n `query HokChannelSchedule($channelId: ID!, $from: DateTime, $to: DateTime) {\n hokChannelSchedule(channelId: $channelId, from: $from, to: $to) {\n ${SCHEDULE_BLOCK_FIELDS}\n }\n }`,\n { channelId, from, to },\n apiGatewayUrl\n );\n return result.hokChannelSchedule;\n },\n enabled: Boolean(channelId),\n });\n};\n\nexport const useNowPlaying = (channelId: string | undefined) => {\n const { apiGatewayUrl } = useHookMovies();\n return useQuery({\n queryKey: [QK, 'now-playing', channelId ?? ''],\n queryFn: async () => {\n const result = await hookmoviesQuery<{ hokNowPlaying: HokScheduleBlock | null }>(\n `query HokNowPlaying($channelId: ID!) {\n hokNowPlaying(channelId: $channelId) { ${SCHEDULE_BLOCK_FIELDS} }\n }`,\n { channelId },\n apiGatewayUrl\n );\n return result.hokNowPlaying;\n },\n enabled: Boolean(channelId),\n });\n};\n\nexport interface CreateChannelInput {\n name: string;\n slug?: string;\n description?: string;\n language?: string;\n timezone?: string;\n genres?: string[];\n logoFileId?: string;\n}\n\nexport const useCreateChannel = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateChannelInput) => {\n const result = await hookmoviesQuery<{ hokCreateChannel: HokChannel }>(\n `mutation HokCreateChannel($input: HokCreateChannelInput!) {\n hokCreateChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateChannel;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channels'] });\n },\n });\n};\n\nexport interface ScheduleBlockInput {\n channelId: string;\n startAt: string;\n endAt: string;\n titleId?: string;\n episodeId?: string;\n}\n\nexport const useScheduleBlock = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: ScheduleBlockInput) => {\n const result = await hookmoviesQuery<{ hokScheduleBlock: HokScheduleBlock }>(\n `mutation HokScheduleBlock($input: HokScheduleBlockInput!) {\n hokScheduleBlock(input: $input) { ${SCHEDULE_BLOCK_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokScheduleBlock;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channel-schedule', data.channelId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'now-playing', data.channelId] });\n },\n });\n};\n\nexport const useRemoveScheduleBlock = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async ({ id }: { id: string; channelId: string }) => {\n const result = await hookmoviesQuery<{ hokRemoveScheduleBlock: boolean }>(\n `mutation HokRemoveScheduleBlock($id: ID!) { hokRemoveScheduleBlock(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokRemoveScheduleBlock;\n },\n onSuccess: (_data, { channelId }) => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'channel-schedule', channelId] });\n void queryClient.invalidateQueries({ queryKey: [QK, 'now-playing', channelId] });\n },\n });\n};\n\n// ============================================================================\n// Localization mutations (wspace-scoped; reads via useLocalizations above)\n// ============================================================================\n\nexport interface CreateLocalizationInput {\n language: string;\n fileId: string;\n kind?: HokLocalizationKind;\n titleId?: string;\n episodeId?: string;\n isDefault?: boolean;\n localizedTitle?: string;\n localizedSynopsis?: string;\n}\n\nexport const useCreateLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (input: CreateLocalizationInput) => {\n const result = await hookmoviesQuery<{ hokCreateLocalization: HokLocalization }>(\n `mutation HokCreateLocalization($input: HokCreateLocalizationInput!) {\n hokCreateLocalization(input: $input) { ${LOCALIZATION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.hokCreateLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\nexport const useDeleteLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokDeleteLocalization: boolean }>(\n `mutation HokDeleteLocalization($id: ID!) { hokDeleteLocalization(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.hokDeleteLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\nexport const useSetDefaultLocalization = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useHookMovies();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await hookmoviesQuery<{ hokSetDefaultLocalization: HokLocalization }>(\n `mutation HokSetDefaultLocalization($id: ID!) {\n hokSetDefaultLocalization(id: $id) { ${LOCALIZATION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.hokSetDefaultLocalization;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'localizations'] });\n },\n });\n};\n\n// ============================================================================\n// Global-billing reuse (checkout / earnings / payouts) — GLOBAL gateway\n// ============================================================================\n\nexport interface BillingAccount {\n id: string;\n name: string | null;\n orgId: string | null;\n currency: string | null;\n creditAmount: number | null;\n isDefault: boolean | null;\n}\n\n/**\n * Billing accounts owned by the calling actor. HookMovies uses one to anchor\n * checkout orders (title purchases / rentals) and creator earnings & payouts.\n */\nexport const useMyBillingAccounts = () => {\n return useQuery({\n queryKey: [QK, 'billing-accounts'],\n queryFn: async () => {\n const result = await globalQuery<{ myBillingAccounts: BillingAccount[] }>(\n `query HokMyBillingAccounts {\n myBillingAccounts { id name orgId currency creditAmount isDefault }\n }`,\n {}\n );\n return result.myBillingAccounts;\n },\n });\n};\n\nexport type BillingOrderStatus =\n 'CREATED' | 'PAYMENT_PENDING' | 'COMPLETED' | 'FAILED' | 'CANCELED' | 'EXPIRED';\n\nexport interface BillingOrder {\n id: string;\n status: BillingOrderStatus;\n currency: string;\n subtotal: number;\n externalService: string;\n description: string | null;\n createdAt: string;\n}\n\nexport interface CreateBillingOrderResponse {\n success: boolean;\n error: string | null;\n order: BillingOrder | null;\n}\n\nexport interface BillingOrderItemInput {\n name: string;\n quantity: number;\n unitPrice: number;\n description?: string;\n}\n\nexport interface CreateBillingOrderInput {\n billingAccountId: string;\n currency: string;\n externalOrderId: string;\n externalService: string;\n subtotal: number;\n items: BillingOrderItemInput[];\n description?: string;\n expiryMinutes?: number;\n}\n\n/** Open a checkout order (e.g. a TVOD title purchase / rental) via global-billing. */\nexport const useCreateBillingOrder = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: CreateBillingOrderInput) => {\n const result = await globalQuery<{ createBillingOrder: CreateBillingOrderResponse }>(\n `mutation HokCreateBillingOrder($input: CreateBillingOrderInput!) {\n createBillingOrder(input: $input) {\n success\n error\n order { id status currency subtotal externalService description createdAt }\n }\n }`,\n { input }\n );\n return result.createBillingOrder;\n },\n onSuccess: (_data, variables) => {\n void queryClient.invalidateQueries({\n queryKey: [QK, 'billing-accounts'],\n });\n void queryClient.invalidateQueries({\n queryKey: [QK, 'earnings-summary', variables.billingAccountId],\n });\n },\n });\n};\n\nexport interface EarningsCategoryBreakdown {\n category: string;\n amount: number;\n count: number;\n}\n\nexport interface EarningsSummary {\n availableAmount: number;\n reservedAmount: number;\n paidAmount: number;\n pendingAmount: number;\n moneyAmount: number;\n creditsAmount: number;\n totalLifetimeAmount: number;\n categoryBreakdown: EarningsCategoryBreakdown[];\n}\n\nexport const useMyEarningsSummary = (billingAccountId: string | undefined) => {\n return useQuery({\n queryKey: [QK, 'earnings-summary', billingAccountId],\n queryFn: async () => {\n const result = await globalQuery<{ myEarningsSummary: EarningsSummary }>(\n `query HokMyEarningsSummary($billingAccountId: ID!) {\n myEarningsSummary(billingAccountId: $billingAccountId) {\n availableAmount reservedAmount paidAmount pendingAmount\n moneyAmount creditsAmount totalLifetimeAmount\n categoryBreakdown { category amount count }\n }\n }`,\n { billingAccountId }\n );\n return result.myEarningsSummary;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type EarningsEntryStatus = 'AVAILABLE' | 'RESERVED' | 'PAID' | 'REVERSED';\n\nexport interface EarningsEntry {\n id: string;\n billingAccountId: string;\n amount: number;\n currency: string;\n description: string | null;\n sourceCategory: string;\n status: EarningsEntryStatus;\n availableAt: string;\n createdAt: string;\n}\n\nexport interface EarningsEntryConnection {\n items: EarningsEntry[];\n totalCount: number;\n hasMore: boolean;\n}\n\nexport interface EarningsEntryFilter {\n status?: EarningsEntryStatus;\n sourceCategory?: string;\n startDate?: string;\n endDate?: string;\n}\n\nexport const useMyEarningsEntries = (\n billingAccountId: string | undefined,\n filter?: EarningsEntryFilter,\n limit = 20,\n offset = 0\n) => {\n return useQuery({\n queryKey: [QK, 'earnings-entries', billingAccountId, filter ?? {}, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ myEarningsEntries: EarningsEntryConnection }>(\n `query HokMyEarningsEntries($billingAccountId: ID!, $filter: EarningsEntryFilterInput, $limit: Int, $offset: Int) {\n myEarningsEntries(billingAccountId: $billingAccountId, filter: $filter, limit: $limit, offset: $offset) {\n items {\n id billingAccountId amount currency description sourceCategory status\n availableAt createdAt\n }\n totalCount\n hasMore\n }\n }`,\n { billingAccountId, filter, limit, offset }\n );\n return result.myEarningsEntries;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type PayoutAccountType = 'BANK_ACCOUNT' | 'UPI' | 'WALLET';\n\nexport type PayoutAccountStatus =\n 'PENDING_VERIFICATION' | 'ACTIVE' | 'FAILED_VERIFICATION' | 'ARCHIVED';\n\nexport interface PayoutAccount {\n id: string;\n billingAccountId: string;\n label: string;\n displayName: string | null;\n type: PayoutAccountType;\n currency: string;\n accountLast4: string | null;\n isDefault: boolean;\n isActive: boolean;\n status: PayoutAccountStatus;\n createdAt: string;\n}\n\nexport const useMyPayoutAccounts = (billingAccountId: string | undefined) => {\n return useQuery({\n queryKey: [QK, 'payout-accounts', billingAccountId],\n queryFn: async () => {\n const result = await globalQuery<{ myPayoutAccounts: PayoutAccount[] }>(\n `query HokMyPayoutAccounts($billingAccountId: ID!) {\n myPayoutAccounts(billingAccountId: $billingAccountId) {\n id billingAccountId label displayName type currency accountLast4\n isDefault isActive status createdAt\n }\n }`,\n { billingAccountId }\n );\n return result.myPayoutAccounts;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport type PayoutRequestStatus =\n 'APPROVED' | 'PENDING' | 'PROCESSING' | 'PAID' | 'REJECTED' | 'FAILED';\n\nexport interface PayoutRequest {\n id: string;\n billingAccountId: string;\n requestedAmount: number;\n approvedAmount: number | null;\n currency: string;\n status: PayoutRequestStatus;\n provider: string;\n userNotes: string | null;\n createdAt: string;\n paidAt: string | null;\n}\n\nexport interface PayoutRequestConnection {\n items: PayoutRequest[];\n totalCount: number;\n hasMore: boolean;\n}\n\nconst PAYOUT_REQUEST_FIELDS = `\n id billingAccountId requestedAmount approvedAmount currency status provider\n userNotes createdAt paidAt\n`;\n\nexport const useMyPayoutRequests = (\n billingAccountId: string | undefined,\n limit = 20,\n offset = 0\n) => {\n return useQuery({\n queryKey: [QK, 'payout-requests', billingAccountId, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ myPayoutRequests: PayoutRequestConnection }>(\n `query HokMyPayoutRequests($billingAccountId: ID!, $limit: Int, $offset: Int) {\n myPayoutRequests(billingAccountId: $billingAccountId, limit: $limit, offset: $offset) {\n items { ${PAYOUT_REQUEST_FIELDS} }\n totalCount\n hasMore\n }\n }`,\n { billingAccountId, limit, offset }\n );\n return result.myPayoutRequests;\n },\n enabled: Boolean(billingAccountId),\n });\n};\n\nexport interface RequestPayoutInput {\n billingAccountId: string;\n payoutAccountId: string;\n amount: number;\n currency: string;\n notes?: string;\n}\n\nexport const useRequestPayout = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: RequestPayoutInput) => {\n const result = await globalQuery<{ requestBillingPayout: PayoutRequest }>(\n `mutation HokRequestPayout($input: RequestPayoutInput!) {\n requestBillingPayout(input: $input) { ${PAYOUT_REQUEST_FIELDS} }\n }`,\n { input }\n );\n return result.requestBillingPayout;\n },\n onSuccess: (data) => {\n void queryClient.invalidateQueries({\n queryKey: [QK, 'payout-requests', data.billingAccountId],\n });\n void queryClient.invalidateQueries({\n queryKey: [QK, 'earnings-summary', data.billingAccountId],\n });\n },\n });\n};\n\n// ============================================================================\n// Global-auth reuse (developer API keys) — GLOBAL gateway\n// ============================================================================\n\nexport interface ApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName: string | null;\n createdAt: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n}\n\nexport interface ApiKeyConnection {\n apiKeys: ApiKey[];\n totalCount: number;\n hasMore: boolean;\n}\n\nconst API_KEY_FIELDS = `\n id name prefix scopes appId appName createdAt expiresAt lastUsedAt\n`;\n\nexport const useMyApiKeys = (pagination?: HokPaginationInput) => {\n return useQuery({\n queryKey: [QK, 'api-keys', pagination ?? {}],\n queryFn: async () => {\n const result = await globalQuery<{ myApiKeys: ApiKeyConnection }>(\n `query HokMyApiKeys($pagination: PaginationInput) {\n myApiKeys(pagination: $pagination) {\n apiKeys { ${API_KEY_FIELDS} }\n totalCount\n hasMore\n }\n }`,\n { pagination }\n );\n return result.myApiKeys;\n },\n });\n};\n\nexport interface ApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface GenerateApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n/**\n * Mint a developer API key. The plaintext `apiSecret` is returned exactly once —\n * the caller must surface it immediately (it is never retrievable again).\n */\nexport const useGenerateApiKey = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: GenerateApiKeyInput) => {\n const result = await globalQuery<{ generateAPIKey: ApiKeyResult }>(\n `mutation HokGenerateApiKey($input: GenerateAPIKeyInput!) {\n generateAPIKey(input: $input) { apiKey apiSecret keyId }\n }`,\n { input }\n );\n return result.generateAPIKey;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'api-keys'] });\n },\n });\n};\n\nexport const useRevokeApiKey = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (keyId: string) => {\n const result = await globalQuery<{ revokeAPIKey: boolean }>(\n `mutation HokRevokeApiKey($keyId: String!) { revokeAPIKey(keyId: $keyId) }`,\n { keyId }\n );\n return result.revokeAPIKey;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'api-keys'] });\n },\n });\n};\n\n// ============================================================================\n// Global-i18n reuse (language catalog + user language preference) — GLOBAL gateway\n// ============================================================================\n\nexport type LanguageDirection = 'LTR' | 'RTL';\n\nexport type LanguageStatus = 'ACTIVE' | 'DEPRECATED' | 'DRAFT';\n\nexport interface Language {\n id: string;\n code: string;\n name: string;\n nativeName: string;\n direction: LanguageDirection;\n status: LanguageStatus;\n isDefault: boolean;\n}\n\nexport interface LanguageList {\n items: Language[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface LanguageFilter {\n status?: LanguageStatus;\n direction?: LanguageDirection;\n search?: string;\n}\n\nexport const useLanguages = (filter?: LanguageFilter, limit = 50, offset = 0) => {\n return useQuery({\n queryKey: [QK, 'languages', filter ?? {}, limit, offset],\n queryFn: async () => {\n const result = await globalQuery<{ languages: LanguageList }>(\n `query HokLanguages($filter: LanguageFilterInput, $limit: Int, $offset: Int) {\n languages(filter: $filter, limit: $limit, offset: $offset) {\n items { id code name nativeName direction status isDefault }\n total\n hasMore\n }\n }`,\n { filter, limit, offset }\n );\n return result.languages;\n },\n staleTime: 5 * 60 * 1000,\n });\n};\n\nexport interface UserLanguagePreference {\n id: string;\n userId: string;\n languageCode: string;\n}\n\nexport interface SetUserLanguagePreferenceInput {\n userId: string;\n languageCode: string;\n country?: string;\n currency?: string;\n timezone?: string;\n}\n\nexport const useSetUserLanguagePreference = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: SetUserLanguagePreferenceInput) => {\n const result = await globalQuery<{ setUserLanguagePreference: UserLanguagePreference }>(\n `mutation HokSetUserLanguagePreference($input: SetUserLanguagePreferenceInput!) {\n setUserLanguagePreference(input: $input) { id userId languageCode }\n }`,\n { input }\n );\n return result.setUserLanguagePreference;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [QK, 'language-preference'] });\n },\n });\n};\n"],"mappings":"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"}
@@ -140,7 +140,7 @@ var M = [
140
140
  {
141
141
  title: "Point at the GraphQL endpoint",
142
142
  body: /* @__PURE__ */ A(O, { children: [
143
- "All HookMovies data is served from a single Apollo Federation gateway. The endpoint is shown in the ",
143
+ "All HookMovies data is served from a single GraphQL API. The endpoint is shown in the ",
144
144
  /* @__PURE__ */ k("strong", { children: "GraphQL API" }),
145
145
  " tab."
146
146
  ] })
@@ -236,7 +236,7 @@ var M = [
236
236
  /* @__PURE__ */ k(z, {
237
237
  icon: v,
238
238
  title: "GraphQL API",
239
- children: "One federated GraphQL endpoint serves the entire HookMovies domain. Send POST requests with your API key as a bearer token."
239
+ children: "One GraphQL endpoint serves the entire HookMovies domain. Send POST requests with your API key as a bearer token."
240
240
  }),
241
241
  /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("h3", {
242
242
  className: "mb-2 text-sm font-semibold text-text-primary",
@@ -778,7 +778,7 @@ var M = [
778
778
  return /* @__PURE__ */ A(n, {
779
779
  title: "Developer Portal",
780
780
  description: "Build on the HookMovies platform API",
781
- purpose: "Everything you need to integrate with HookMovies — authenticate with an API key, query the federated GraphQL gateway, pull in the official SDKs or MCP server, and embed the player anywhere. API keys are issued through the platform identity service; HookMovies never stores your secret.",
781
+ purpose: "Everything you need to integrate with HookMovies — authenticate with an API key, query the GraphQL gateway, pull in the official SDKs or MCP server, and embed the player anywhere. API keys are issued through the platform identity service; HookMovies never stores your secret.",
782
782
  children: [/* @__PURE__ */ k("div", {
783
783
  className: "mb-6 flex gap-1 overflow-x-auto rounded-xl border border-border-seam bg-bg-surface p-1",
784
784
  role: "tablist",
@@ -1 +1 @@
1
- {"version":3,"file":"DevPortalPage.js","names":[],"sources":["../../../../src/hookmovies/pages/developer/DevPortalPage.tsx"],"sourcesContent":["/**\n * Developer Portal\n * @module hookmovies/pages/developer\n *\n * Thin, product-branded developer surface (~95% reuse). It is documentation +\n * a live API-key manager, NOT a new key store: the keys panel reuses the\n * platform's global-auth service verbatim through the shared data-layer hooks\n * (`useMyApiKeys` / `useGenerateApiKey` / `useRevokeApiKey`, all on the GLOBAL\n * gateway). The rest of the page is static, tokenized reference content:\n *\n * - Getting Started — how to authenticate and issue a first request.\n * - GraphQL API — the real workspace gateway endpoint plus a runnable\n * `hokListTitles` query / response sample.\n * - API Keys — list, mint (secret shown exactly once) and revoke.\n * - SDKs & MCP — links to the real HookMovies packages.\n * - Embeddable Player — a copy-paste <iframe> embed for `/hookmovies/watch/:id`.\n */\n\nimport { type FC, type ReactNode, type FormEvent, useEffect, useMemo, useState } from 'react';\nimport {\n Rocket,\n Code2,\n KeyRound,\n Package,\n Clapperboard,\n Copy,\n Check,\n Plus,\n Trash2,\n ShieldAlert,\n ExternalLink,\n Terminal,\n BookOpen,\n Boxes,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/StateViews';\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useMyApiKeys,\n useGenerateApiKey,\n useRevokeApiKey,\n type ApiKey,\n type ApiKeyResult,\n} from '../../hooks/useHookMoviesApi';\nimport { formatDate, formatRelativeTime } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Section model\n// ============================================================================\n\ntype SectionId = 'overview' | 'graphql' | 'keys' | 'sdks' | 'embed';\n\ninterface SectionMeta {\n id: SectionId;\n label: string;\n icon: typeof Rocket;\n}\n\nconst SECTIONS: SectionMeta[] = [\n { id: 'overview', label: 'Getting Started', icon: Rocket },\n { id: 'graphql', label: 'GraphQL API', icon: Code2 },\n { id: 'keys', label: 'API Keys', icon: KeyRound },\n { id: 'sdks', label: 'SDKs & MCP', icon: Package },\n { id: 'embed', label: 'Embeddable Player', icon: Clapperboard },\n];\n\n/** API-key scopes offered by the mint form (global-auth scopes are free-form strings). */\nconst SCOPE_OPTIONS: { value: string; label: string; description: string }[] = [\n { value: 'read', label: 'Read', description: 'Query the catalog, titles, reviews and metadata.' },\n {\n value: 'write',\n label: 'Write',\n description: 'Create and update titles, reviews and other resources.',\n },\n];\n\n// ============================================================================\n// Copy-to-clipboard button\n// ============================================================================\n\nconst useCopy = (): [boolean, (text: string) => void] => {\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1800);\n return () => window.clearTimeout(timer);\n }, [copied]);\n\n const copy = (text: string) => {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n void navigator.clipboard.writeText(text).then(\n () => setCopied(true),\n () => setCopied(false)\n );\n };\n\n return [copied, copy];\n};\n\nconst CopyButton: FC<{ value: string; label?: string; className?: string }> = ({\n value,\n label,\n className,\n}) => {\n const [copied, copy] = useCopy();\n return (\n <button\n type=\"button\"\n onClick={() => copy(value)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border-seam bg-bg-surface px-2.5 py-1 text-xs font-medium text-text-secondary transition-colors hover:border-border-strong hover:text-text-primary',\n className\n )}\n aria-label={copied ? 'Copied' : `Copy ${label ?? 'to clipboard'}`}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-status-success-text\" aria-hidden=\"true\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n {copied ? 'Copied' : (label ?? 'Copy')}\n </button>\n );\n};\n\n// ============================================================================\n// Tokenized code block (semantic tokens only — no raw colours)\n// ============================================================================\n\n/**\n * Lightweight, allocation-safe syntax highlighter. A single ordered alternation\n * classifies comments, strings, numbers and a small keyword set (GraphQL / shell\n * / JS) and maps each class onto a fe-libs semantic colour token. Everything else\n * renders as `text-text-primary`, so the block degrades gracefully for any input.\n */\nconst HIGHLIGHT_RE =\n /(#[^\\n]*|\\/\\/[^\\n]*)|(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`)|(\\b\\d+(?:\\.\\d+)?\\b)|(\\b(?:query|mutation|subscription|fragment|type|input|enum|schema|on|true|false|null|const|let|var|import|from|export|default|function|return|await|async|new|curl|POST|GET|Authorization|Bearer|Content-Type)\\b)/g;\n\nconst highlightCode = (code: string): ReactNode[] => {\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n let key = 0;\n for (const match of code.matchAll(HIGHLIGHT_RE)) {\n const index = match.index ?? 0;\n if (index > lastIndex) {\n nodes.push(<span key={key++}>{code.slice(lastIndex, index)}</span>);\n }\n const [full, comment, str, num, keyword] = match;\n if (comment) {\n nodes.push(\n <span key={key++} className=\"text-text-muted italic\">\n {full}\n </span>\n );\n } else if (str) {\n nodes.push(\n <span key={key++} className=\"text-status-success-text\">\n {full}\n </span>\n );\n } else if (num) {\n nodes.push(\n <span key={key++} className=\"text-status-warning-text\">\n {full}\n </span>\n );\n } else if (keyword) {\n nodes.push(\n <span key={key++} className=\"text-status-info-text font-medium\">\n {full}\n </span>\n );\n } else {\n nodes.push(<span key={key++}>{full}</span>);\n }\n lastIndex = index + full.length;\n }\n if (lastIndex < code.length) {\n nodes.push(<span key={key++}>{code.slice(lastIndex)}</span>);\n }\n return nodes;\n};\n\nconst CodeBlock: FC<{ code: string; language: string; className?: string }> = ({\n code,\n language,\n className,\n}) => (\n <div\n className={cn('overflow-hidden rounded-xl border border-border-seam bg-bg-sunken', className)}\n >\n <div className=\"flex items-center justify-between border-b border-border-seam bg-bg-surface px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-text-muted\">\n <Terminal className=\"h-3 w-3\" aria-hidden=\"true\" />\n {language}\n </span>\n <CopyButton value={code} label=\"Copy\" />\n </div>\n <div className=\"overflow-x-auto\">\n <pre className=\"min-w-0 px-4 py-3 text-[13px] leading-relaxed\">\n <code className=\"font-mono text-text-primary\">{highlightCode(code)}</code>\n </pre>\n </div>\n </div>\n);\n\n// ============================================================================\n// Small presentational helpers\n// ============================================================================\n\nconst SectionHeading: FC<{ icon: typeof Rocket; title: string; children?: ReactNode }> = ({\n icon: Icon,\n title,\n children,\n}) => (\n <div className=\"mb-4\">\n <h2 className=\"flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Icon className=\"h-5 w-5 text-action-primary-bg\" aria-hidden=\"true\" />\n {title}\n </h2>\n {children && <p className=\"mt-1 max-w-2xl text-sm text-text-secondary\">{children}</p>}\n </div>\n);\n\nconst InlineCode: FC<{ children: ReactNode }> = ({ children }) => (\n <code className=\"rounded bg-bg-sunken px-1.5 py-0.5 font-mono text-[0.85em] text-text-primary\">\n {children}\n </code>\n);\n\n// ============================================================================\n// Getting Started\n// ============================================================================\n\nconst GETTING_STARTED_STEPS: { title: string; body: ReactNode }[] = [\n {\n title: 'Create an API key',\n body: (\n <>\n Head to the <strong>API Keys</strong> tab and mint a key for your registered app. The secret\n is shown once at creation — copy it somewhere safe.\n </>\n ),\n },\n {\n title: 'Point at the GraphQL endpoint',\n body: (\n <>\n All HookMovies data is served from a single Apollo Federation gateway. The endpoint is shown\n in the <strong>GraphQL API</strong> tab.\n </>\n ),\n },\n {\n title: 'Authenticate every request',\n body: (\n <>\n Send your key as a bearer token in the <InlineCode>Authorization</InlineCode> header:{' '}\n <InlineCode>Authorization: Bearer &lt;apiSecret&gt;</InlineCode>.\n </>\n ),\n },\n {\n title: 'Make your first query',\n body: (\n <>\n Call <InlineCode>hokListTitles</InlineCode> to page through the catalog, then drill into a\n title with <InlineCode>hokTitle(id)</InlineCode>.\n </>\n ),\n },\n];\n\nconst GettingStartedSection: FC<{ endpoint: string }> = ({ endpoint }) => (\n <div className=\"space-y-6\">\n <SectionHeading icon={Rocket} title=\"Getting Started\">\n Build with the HookMovies platform API — a single GraphQL gateway that powers the catalog,\n productions, auditions, entitlements and playback surfaces you see in this app.\n </SectionHeading>\n\n <ol className=\"grid gap-4 sm:grid-cols-2\">\n {GETTING_STARTED_STEPS.map((step, i) => (\n <li key={step.title}>\n <GlassCard treatment=\"glass\" className=\"h-full border-border-seam p-4\">\n <div className=\"flex items-start gap-3\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-sm font-semibold text-action-primary-text\">\n {i + 1}\n </span>\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{step.title}</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{step.body}</p>\n </div>\n </div>\n </GlassCard>\n </li>\n ))}\n </ol>\n\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <BookOpen className=\"h-4 w-4 text-action-primary-bg\" aria-hidden=\"true\" />\n Base endpoint\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Every request targets the workspace GraphQL gateway:\n </p>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 font-mono text-sm text-text-primary\">\n {endpoint}\n </code>\n <CopyButton value={endpoint} label=\"Copy URL\" />\n </div>\n </GlassCard>\n </div>\n);\n\n// ============================================================================\n// GraphQL API\n// ============================================================================\n\nconst SAMPLE_QUERY = `query FirstTitles {\n hokListTitles(pagination: { limit: 10, offset: 0 }, status: PUBLISHED) {\n items {\n id\n title\n type\n status\n releaseYear\n genres\n }\n pageInfo { cursor hasMore }\n totalCount\n }\n}`;\n\nconst SAMPLE_RESPONSE = `{\n \"data\": {\n \"hokListTitles\": {\n \"items\": [\n {\n \"id\": \"9f2c…\",\n \"title\": \"Midnight in Marseille\",\n \"type\": \"MOVIE\",\n \"status\": \"PUBLISHED\",\n \"releaseYear\": 2025,\n \"genres\": [\"Drama\", \"Thriller\"]\n }\n ],\n \"pageInfo\": { \"cursor\": null, \"hasMore\": true },\n \"totalCount\": 128\n }\n }\n}`;\n\nconst GraphqlSection: FC<{ endpoint: string }> = ({ endpoint }) => {\n const curl = `curl -X POST '${endpoint}' \\\\\n -H 'Content-Type: application/json' \\\\\n -H 'Authorization: Bearer <apiSecret>' \\\\\n -d '{\"query\": \"query { hokListTitles(pagination: { limit: 5 }) { items { id title } totalCount } }\"}'`;\n\n return (\n <div className=\"space-y-6\">\n <SectionHeading icon={Code2} title=\"GraphQL API\">\n One federated GraphQL endpoint serves the entire HookMovies domain. Send POST requests with\n your API key as a bearer token.\n </SectionHeading>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Endpoint</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 font-mono text-sm text-text-primary\">\n {endpoint}\n </code>\n <CopyButton value={endpoint} label=\"Copy URL\" />\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Sample query</h3>\n <CodeBlock language=\"graphql\" code={SAMPLE_QUERY} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Sample response</h3>\n <CodeBlock language=\"json\" code={SAMPLE_RESPONSE} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Run it with cURL</h3>\n <CodeBlock language=\"bash\" code={curl} />\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// API Keys — reuses global-auth via the shared data-layer hooks\n// ============================================================================\n\nconst SecretReveal: FC<{ result: ApiKeyResult; onDismiss: () => void }> = ({\n result,\n onDismiss,\n}) => (\n <GlassCard\n treatment=\"glass\"\n className=\"mb-6 border-status-warning-border bg-status-warning-bg-subtle p-5\"\n >\n <div className=\"flex items-start gap-3\">\n <ShieldAlert\n className=\"mt-0.5 h-5 w-5 shrink-0 text-status-warning-text\"\n aria-hidden=\"true\"\n />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Save your API secret now</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n This secret is shown only once and cannot be retrieved again. Store it somewhere safe\n before dismissing this panel.\n </p>\n\n <dl className=\"mt-4 space-y-3\">\n {(\n [\n { label: 'API key', value: result.apiKey },\n { label: 'API secret', value: result.apiSecret },\n { label: 'Key ID', value: result.keyId },\n ] as const\n ).map((row) => (\n <div key={row.label}>\n <dt className=\"mb-1 text-xs font-medium text-text-secondary\">{row.label}</dt>\n <dd className=\"flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-surface px-3 py-2 font-mono text-sm text-text-primary\">\n {row.value}\n </code>\n <CopyButton value={row.value} label=\"Copy\" />\n </dd>\n </div>\n ))}\n </dl>\n\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"mt-4 rounded-lg border border-border-seam bg-bg-surface px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n I've saved it — dismiss\n </button>\n </div>\n </div>\n </GlassCard>\n);\n\nconst fieldClass =\n 'w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\nconst labelClass = 'mb-1.5 block text-xs font-medium text-text-secondary';\n\nconst GenerateKeyForm: FC<{\n onGenerated: (result: ApiKeyResult) => void;\n onClose: () => void;\n}> = ({ onGenerated, onClose }) => {\n const generate = useGenerateApiKey();\n const [name, setName] = useState('');\n const [appId, setAppId] = useState('');\n const [scopes, setScopes] = useState<string[]>(['read']);\n const [expiresAt, setExpiresAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const toggleScope = (value: string) => {\n setScopes((prev) =>\n prev.includes(value) ? prev.filter((s) => s !== value) : [...prev, value]\n );\n };\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n if (!name.trim()) {\n setError('Give the key a recognisable name.');\n return;\n }\n if (!appId.trim()) {\n setError('Enter the App ID this key will act on behalf of.');\n return;\n }\n if (scopes.length === 0) {\n setError('Select at least one scope.');\n return;\n }\n try {\n const result = await generate.mutateAsync({\n appId: appId.trim(),\n name: name.trim(),\n scope: scopes,\n expiresAt: expiresAt ? new Date(expiresAt).toISOString() : undefined,\n });\n onGenerated(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to generate the API key.');\n }\n };\n\n return (\n <GlassCard treatment=\"glass\" className=\"mb-6 border-border-seam p-5\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <KeyRound className=\"h-4 w-4 text-action-primary-bg\" aria-hidden=\"true\" />\n Generate a new API key\n </h3>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {error && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {error}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label htmlFor=\"key-name\" className={labelClass}>\n Key name *\n </label>\n <input\n id=\"key-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Production ingest\"\n className={fieldClass}\n required\n />\n </div>\n <div>\n <label htmlFor=\"key-app-id\" className={labelClass}>\n App ID *\n </label>\n <input\n id=\"key-app-id\"\n value={appId}\n onChange={(e) => setAppId(e.target.value)}\n placeholder=\"Your registered app's ID\"\n className={fieldClass}\n required\n />\n <p className=\"mt-1 text-[11px] text-text-muted\">\n The client app this key acts on behalf of — find it in your workspace app settings.\n </p>\n </div>\n </div>\n\n <fieldset>\n <legend className={labelClass}>Scopes *</legend>\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {SCOPE_OPTIONS.map((scope) => {\n const checked = scopes.includes(scope.value);\n return (\n <label\n key={scope.value}\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-lg border p-3 text-sm transition-colors',\n checked\n ? 'border-action-primary-bg bg-action-primary-bg/10'\n : 'border-border-subtle hover:border-border-strong'\n )}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggleScope(scope.value)}\n className=\"mt-0.5 accent-[var(--color-action-primary-bg)]\"\n />\n <span className=\"min-w-0\">\n <span className=\"block font-medium text-text-primary\">{scope.label}</span>\n <span className=\"block text-xs text-text-secondary\">{scope.description}</span>\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n\n <div>\n <label htmlFor=\"key-expires\" className={labelClass}>\n Expires (optional)\n </label>\n <input\n id=\"key-expires\"\n type=\"date\"\n value={expiresAt}\n onChange={(e) => setExpiresAt(e.target.value)}\n className={cn(fieldClass, 'sm:max-w-xs')}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"submit\"\n disabled={generate.isPending}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90 disabled:opacity-50\"\n >\n {generate.isPending ? 'Generating…' : 'Generate key'}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n Cancel\n </button>\n </div>\n </form>\n </GlassCard>\n );\n};\n\nconst ApiKeyRow: FC<{ apiKey: ApiKey }> = ({ apiKey }) => {\n const revoke = useRevokeApiKey();\n const [confirming, setConfirming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleRevoke = async () => {\n setError(null);\n try {\n await revoke.mutateAsync(apiKey.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to revoke this key.');\n setConfirming(false);\n }\n };\n\n return (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-semibold text-text-primary\">{apiKey.name}</span>\n <code className=\"rounded bg-bg-sunken px-1.5 py-0.5 font-mono text-xs text-text-secondary\">\n {apiKey.prefix}…\n </code>\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-muted\">\n {apiKey.appName && <span>{apiKey.appName}</span>}\n <span aria-hidden=\"true\">·</span>\n <span>\n Created {formatDate(apiKey.createdAt, { hour: undefined, minute: undefined })}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span>\n {apiKey.lastUsedAt\n ? `Last used ${formatRelativeTime(apiKey.lastUsedAt)}`\n : 'Never used'}\n </span>\n {apiKey.expiresAt && (\n <>\n <span aria-hidden=\"true\">·</span>\n <span>\n Expires {formatDate(apiKey.expiresAt, { hour: undefined, minute: undefined })}\n </span>\n </>\n )}\n </div>\n {apiKey.scopes.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {apiKey.scopes.map((scope) => (\n <span\n key={scope}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-text-secondary\"\n >\n {scope}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"shrink-0\">\n {confirming ? (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={revoke.isPending}\n onClick={() => void handleRevoke()}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-1.5 text-xs font-medium text-status-error-text transition-opacity hover:opacity-90 disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {revoke.isPending ? 'Revoking…' : 'Confirm revoke'}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirming(false)}\n className=\"rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setConfirming(true)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-secondary transition-colors hover:border-status-error-border hover:text-status-error-text\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Revoke\n </button>\n )}\n </div>\n </div>\n {error && <p className=\"mt-2 text-xs text-status-error-text\">{error}</p>}\n </GlassCard>\n );\n};\n\nconst ApiKeysSection: FC = () => {\n const { data, isLoading, isError, refetch } = useMyApiKeys();\n const [showForm, setShowForm] = useState(false);\n const [revealed, setRevealed] = useState<ApiKeyResult | null>(null);\n\n const keys = data?.apiKeys ?? [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <SectionHeading icon={KeyRound} title=\"API Keys\">\n Keys authenticate server-to-server calls to the HookMovies GraphQL gateway. They are\n issued and revoked through the platform identity service — HookMovies never stores your\n secret.\n </SectionHeading>\n <button\n type=\"button\"\n onClick={() => setShowForm((v) => !v)}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n New key\n </button>\n </div>\n\n {revealed && <SecretReveal result={revealed} onDismiss={() => setRevealed(null)} />}\n\n {showForm && (\n <GenerateKeyForm\n onGenerated={(result) => {\n setRevealed(result);\n setShowForm(false);\n }}\n onClose={() => setShowForm(false)}\n />\n )}\n\n {isLoading ? (\n <LoadingState label=\"Loading your API keys…\" />\n ) : isError ? (\n <ErrorState message=\"We couldn't load your API keys.\" onRetry={() => void refetch()} />\n ) : keys.length === 0 ? (\n <EmptyState\n icon={<KeyRound className=\"h-12 w-12\" />}\n title=\"No API keys yet\"\n description=\"Generate your first key to start calling the HookMovies API.\"\n action={\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n Generate key\n </button>\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {keys.map((apiKey) => (\n <ApiKeyRow key={apiKey.id} apiKey={apiKey} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// SDKs & MCP\n// ============================================================================\n\ninterface PackageCard {\n name: string;\n repo: string;\n description: string;\n icon: typeof Package;\n install: { language: string; code: string };\n}\n\nconst PACKAGES: PackageCard[] = [\n {\n name: 'Node SDK',\n repo: 'hookmovies-sdk-node',\n description:\n 'Typed TypeScript client for the HookMovies GraphQL API — catalog, titles, reviews and playback.',\n icon: Boxes,\n install: {\n language: 'bash',\n code: 'bun add hookmovies-sdk-node\\n# or: npm install hookmovies-sdk-node',\n },\n },\n {\n name: 'Python SDK',\n repo: 'hookmovies-sdk-python',\n description: 'Pythonic client with async support for backend integrations and data pipelines.',\n icon: Package,\n install: { language: 'bash', code: 'pip install hookmovies-sdk-python' },\n },\n {\n name: 'MCP Server',\n repo: 'hookmovies-mcp',\n description:\n 'Model Context Protocol server that exposes HookMovies tools to AI agents and assistants.',\n icon: Boxes,\n install: { language: 'bash', code: 'bunx hookmovies-mcp --help' },\n },\n {\n name: 'CLI',\n repo: 'hookmovies-cli',\n description:\n 'Command-line tool to manage titles, productions and rights from your terminal or CI.',\n icon: Terminal,\n install: { language: 'bash', code: 'bunx hookmovies-cli titles list' },\n },\n];\n\nconst SdksSection: FC = () => (\n <div className=\"space-y-6\">\n <SectionHeading icon={Package} title=\"SDKs & MCP\">\n Official HookMovies packages wrap the GraphQL API so you can build in your language of choice\n — or plug the platform straight into an AI agent via MCP.\n </SectionHeading>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {PACKAGES.map((pkg) => {\n const Icon = pkg.icon;\n const repoUrl = `https://github.com/algoshred/${pkg.repo}`;\n return (\n <GlassCard\n key={pkg.repo}\n treatment=\"glass\"\n className=\"flex h-full flex-col border-border-seam p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Icon className=\"h-5 w-5 text-action-primary-bg\" aria-hidden=\"true\" />\n </span>\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{pkg.name}</h3>\n <code className=\"text-[11px] text-text-muted\">{pkg.repo}</code>\n </div>\n </div>\n <a\n href={repoUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center gap-1 rounded-md border border-border-seam px-2 py-1 text-xs font-medium text-text-secondary transition-colors hover:border-border-strong hover:text-text-primary\"\n >\n Repo\n <ExternalLink className=\"h-3 w-3\" aria-hidden=\"true\" />\n </a>\n </div>\n <p className=\"mt-3 flex-1 text-sm text-text-secondary\">{pkg.description}</p>\n <div className=\"mt-3\">\n <CodeBlock language={pkg.install.language} code={pkg.install.code} />\n </div>\n </GlassCard>\n );\n })}\n </div>\n </div>\n);\n\n// ============================================================================\n// Embeddable Player\n// ============================================================================\n\nconst EmbedSection: FC<{ watchUrl: string }> = ({ watchUrl }) => {\n const iframeSnippet = `<iframe\n src=\"${watchUrl}\"\n width=\"100%\"\n height=\"480\"\n frameborder=\"0\"\n allow=\"autoplay; fullscreen; encrypted-media\"\n allowfullscreen\n title=\"HookMovies player\"\n></iframe>`;\n\n const responsiveSnippet = `<div style=\"position: relative; padding-top: 56.25%;\">\n <iframe\n src=\"${watchUrl}\"\n style=\"position: absolute; inset: 0; width: 100%; height: 100%; border: 0;\"\n allow=\"autoplay; fullscreen; encrypted-media\"\n allowfullscreen\n title=\"HookMovies player\"\n ></iframe>\n</div>`;\n\n return (\n <div className=\"space-y-6\">\n <SectionHeading icon={Clapperboard} title=\"Embeddable Player\">\n Drop a HookMovies title into any web page with a single{' '}\n <InlineCode>&lt;iframe&gt;</InlineCode>. Replace <InlineCode>YOUR_TITLE_ID</InlineCode> with\n the id of any published title.\n </SectionHeading>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Basic embed</h3>\n <CodeBlock language=\"html\" code={iframeSnippet} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Responsive (16:9) embed</h3>\n <p className=\"mb-2 text-sm text-text-secondary\">\n Wrap the iframe in an aspect-ratio box so the player scales fluidly on any device.\n </p>\n <CodeBlock language=\"html\" code={responsiveSnippet} />\n </div>\n\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <p className=\"text-sm text-text-secondary\">\n The embedded player respects the viewer's entitlements and profile preferences. Viewers\n who aren't entitled to a title are prompted to sign in or purchase access inside the\n frame.\n </p>\n </GlassCard>\n </div>\n );\n};\n\n// ============================================================================\n// Page\n// ============================================================================\n\nexport const DevPortalPage: FC = () => {\n const { apiGatewayUrl, getPath } = useHookMovies();\n const [active, setActive] = useState<SectionId>('overview');\n\n const endpoint = apiGatewayUrl || 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n const watchUrl = useMemo(() => {\n const origin =\n typeof window !== 'undefined' ? window.location.origin : 'https://app.hookmovies.com';\n return `${origin}${getPath('watch/YOUR_TITLE_ID')}`;\n }, [getPath]);\n\n return (\n <PageLayout\n title=\"Developer Portal\"\n description=\"Build on the HookMovies platform API\"\n purpose=\"Everything you need to integrate with HookMovies — authenticate with an API key, query the federated GraphQL gateway, pull in the official SDKs or MCP server, and embed the player anywhere. API keys are issued through the platform identity service; HookMovies never stores your secret.\"\n >\n {/* Section navigation — horizontal, scrollable on small screens */}\n <div\n className=\"mb-6 flex gap-1 overflow-x-auto rounded-xl border border-border-seam bg-bg-surface p-1\"\n role=\"tablist\"\n aria-label=\"Developer portal sections\"\n >\n {SECTIONS.map((section) => {\n const Icon = section.icon;\n const selected = active === section.id;\n return (\n <button\n key={section.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActive(section.id)}\n className={cn(\n 'inline-flex shrink-0 items-center gap-2 rounded-lg px-3.5 py-2 text-sm font-medium transition-colors',\n selected\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n {section.label}\n </button>\n );\n })}\n </div>\n\n <div className=\"max-w-4xl\">\n {active === 'overview' && <GettingStartedSection endpoint={endpoint} />}\n {active === 'graphql' && <GraphqlSection endpoint={endpoint} />}\n {active === 'keys' && <ApiKeysSection />}\n {active === 'sdks' && <SdksSection />}\n {active === 'embed' && <EmbedSection watchUrl={watchUrl} />}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevPortalPage.js","names":[],"sources":["../../../../src/hookmovies/pages/developer/DevPortalPage.tsx"],"sourcesContent":["/**\n * Developer Portal\n * @module hookmovies/pages/developer\n *\n * Thin, product-branded developer surface (~95% reuse). It is documentation +\n * a live API-key manager, NOT a new key store: the keys panel reuses the\n * platform's global-auth service verbatim through the shared data-layer hooks\n * (`useMyApiKeys` / `useGenerateApiKey` / `useRevokeApiKey`, all on the GLOBAL\n * gateway). The rest of the page is static, tokenized reference content:\n *\n * - Getting Started — how to authenticate and issue a first request.\n * - GraphQL API — the real workspace gateway endpoint plus a runnable\n * `hokListTitles` query / response sample.\n * - API Keys — list, mint (secret shown exactly once) and revoke.\n * - SDKs & MCP — links to the real HookMovies packages.\n * - Embeddable Player — a copy-paste <iframe> embed for `/hookmovies/watch/:id`.\n */\n\nimport { type FC, type ReactNode, type FormEvent, useEffect, useMemo, useState } from 'react';\nimport {\n Rocket,\n Code2,\n KeyRound,\n Package,\n Clapperboard,\n Copy,\n Check,\n Plus,\n Trash2,\n ShieldAlert,\n ExternalLink,\n Terminal,\n BookOpen,\n Boxes,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/StateViews';\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useMyApiKeys,\n useGenerateApiKey,\n useRevokeApiKey,\n type ApiKey,\n type ApiKeyResult,\n} from '../../hooks/useHookMoviesApi';\nimport { formatDate, formatRelativeTime } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Section model\n// ============================================================================\n\ntype SectionId = 'overview' | 'graphql' | 'keys' | 'sdks' | 'embed';\n\ninterface SectionMeta {\n id: SectionId;\n label: string;\n icon: typeof Rocket;\n}\n\nconst SECTIONS: SectionMeta[] = [\n { id: 'overview', label: 'Getting Started', icon: Rocket },\n { id: 'graphql', label: 'GraphQL API', icon: Code2 },\n { id: 'keys', label: 'API Keys', icon: KeyRound },\n { id: 'sdks', label: 'SDKs & MCP', icon: Package },\n { id: 'embed', label: 'Embeddable Player', icon: Clapperboard },\n];\n\n/** API-key scopes offered by the mint form (global-auth scopes are free-form strings). */\nconst SCOPE_OPTIONS: { value: string; label: string; description: string }[] = [\n { value: 'read', label: 'Read', description: 'Query the catalog, titles, reviews and metadata.' },\n {\n value: 'write',\n label: 'Write',\n description: 'Create and update titles, reviews and other resources.',\n },\n];\n\n// ============================================================================\n// Copy-to-clipboard button\n// ============================================================================\n\nconst useCopy = (): [boolean, (text: string) => void] => {\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1800);\n return () => window.clearTimeout(timer);\n }, [copied]);\n\n const copy = (text: string) => {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n void navigator.clipboard.writeText(text).then(\n () => setCopied(true),\n () => setCopied(false)\n );\n };\n\n return [copied, copy];\n};\n\nconst CopyButton: FC<{ value: string; label?: string; className?: string }> = ({\n value,\n label,\n className,\n}) => {\n const [copied, copy] = useCopy();\n return (\n <button\n type=\"button\"\n onClick={() => copy(value)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border-seam bg-bg-surface px-2.5 py-1 text-xs font-medium text-text-secondary transition-colors hover:border-border-strong hover:text-text-primary',\n className\n )}\n aria-label={copied ? 'Copied' : `Copy ${label ?? 'to clipboard'}`}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-status-success-text\" aria-hidden=\"true\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n {copied ? 'Copied' : (label ?? 'Copy')}\n </button>\n );\n};\n\n// ============================================================================\n// Tokenized code block (semantic tokens only — no raw colours)\n// ============================================================================\n\n/**\n * Lightweight, allocation-safe syntax highlighter. A single ordered alternation\n * classifies comments, strings, numbers and a small keyword set (GraphQL / shell\n * / JS) and maps each class onto a fe-libs semantic colour token. Everything else\n * renders as `text-text-primary`, so the block degrades gracefully for any input.\n */\nconst HIGHLIGHT_RE =\n /(#[^\\n]*|\\/\\/[^\\n]*)|(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`)|(\\b\\d+(?:\\.\\d+)?\\b)|(\\b(?:query|mutation|subscription|fragment|type|input|enum|schema|on|true|false|null|const|let|var|import|from|export|default|function|return|await|async|new|curl|POST|GET|Authorization|Bearer|Content-Type)\\b)/g;\n\nconst highlightCode = (code: string): ReactNode[] => {\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n let key = 0;\n for (const match of code.matchAll(HIGHLIGHT_RE)) {\n const index = match.index ?? 0;\n if (index > lastIndex) {\n nodes.push(<span key={key++}>{code.slice(lastIndex, index)}</span>);\n }\n const [full, comment, str, num, keyword] = match;\n if (comment) {\n nodes.push(\n <span key={key++} className=\"text-text-muted italic\">\n {full}\n </span>\n );\n } else if (str) {\n nodes.push(\n <span key={key++} className=\"text-status-success-text\">\n {full}\n </span>\n );\n } else if (num) {\n nodes.push(\n <span key={key++} className=\"text-status-warning-text\">\n {full}\n </span>\n );\n } else if (keyword) {\n nodes.push(\n <span key={key++} className=\"text-status-info-text font-medium\">\n {full}\n </span>\n );\n } else {\n nodes.push(<span key={key++}>{full}</span>);\n }\n lastIndex = index + full.length;\n }\n if (lastIndex < code.length) {\n nodes.push(<span key={key++}>{code.slice(lastIndex)}</span>);\n }\n return nodes;\n};\n\nconst CodeBlock: FC<{ code: string; language: string; className?: string }> = ({\n code,\n language,\n className,\n}) => (\n <div\n className={cn('overflow-hidden rounded-xl border border-border-seam bg-bg-sunken', className)}\n >\n <div className=\"flex items-center justify-between border-b border-border-seam bg-bg-surface px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-text-muted\">\n <Terminal className=\"h-3 w-3\" aria-hidden=\"true\" />\n {language}\n </span>\n <CopyButton value={code} label=\"Copy\" />\n </div>\n <div className=\"overflow-x-auto\">\n <pre className=\"min-w-0 px-4 py-3 text-[13px] leading-relaxed\">\n <code className=\"font-mono text-text-primary\">{highlightCode(code)}</code>\n </pre>\n </div>\n </div>\n);\n\n// ============================================================================\n// Small presentational helpers\n// ============================================================================\n\nconst SectionHeading: FC<{ icon: typeof Rocket; title: string; children?: ReactNode }> = ({\n icon: Icon,\n title,\n children,\n}) => (\n <div className=\"mb-4\">\n <h2 className=\"flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Icon className=\"h-5 w-5 text-action-primary-bg\" aria-hidden=\"true\" />\n {title}\n </h2>\n {children && <p className=\"mt-1 max-w-2xl text-sm text-text-secondary\">{children}</p>}\n </div>\n);\n\nconst InlineCode: FC<{ children: ReactNode }> = ({ children }) => (\n <code className=\"rounded bg-bg-sunken px-1.5 py-0.5 font-mono text-[0.85em] text-text-primary\">\n {children}\n </code>\n);\n\n// ============================================================================\n// Getting Started\n// ============================================================================\n\nconst GETTING_STARTED_STEPS: { title: string; body: ReactNode }[] = [\n {\n title: 'Create an API key',\n body: (\n <>\n Head to the <strong>API Keys</strong> tab and mint a key for your registered app. The secret\n is shown once at creation — copy it somewhere safe.\n </>\n ),\n },\n {\n title: 'Point at the GraphQL endpoint',\n body: (\n <>\n All HookMovies data is served from a single GraphQL API. The endpoint is shown\n in the <strong>GraphQL API</strong> tab.\n </>\n ),\n },\n {\n title: 'Authenticate every request',\n body: (\n <>\n Send your key as a bearer token in the <InlineCode>Authorization</InlineCode> header:{' '}\n <InlineCode>Authorization: Bearer &lt;apiSecret&gt;</InlineCode>.\n </>\n ),\n },\n {\n title: 'Make your first query',\n body: (\n <>\n Call <InlineCode>hokListTitles</InlineCode> to page through the catalog, then drill into a\n title with <InlineCode>hokTitle(id)</InlineCode>.\n </>\n ),\n },\n];\n\nconst GettingStartedSection: FC<{ endpoint: string }> = ({ endpoint }) => (\n <div className=\"space-y-6\">\n <SectionHeading icon={Rocket} title=\"Getting Started\">\n Build with the HookMovies platform API — a single GraphQL gateway that powers the catalog,\n productions, auditions, entitlements and playback surfaces you see in this app.\n </SectionHeading>\n\n <ol className=\"grid gap-4 sm:grid-cols-2\">\n {GETTING_STARTED_STEPS.map((step, i) => (\n <li key={step.title}>\n <GlassCard treatment=\"glass\" className=\"h-full border-border-seam p-4\">\n <div className=\"flex items-start gap-3\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-sm font-semibold text-action-primary-text\">\n {i + 1}\n </span>\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{step.title}</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{step.body}</p>\n </div>\n </div>\n </GlassCard>\n </li>\n ))}\n </ol>\n\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <BookOpen className=\"h-4 w-4 text-action-primary-bg\" aria-hidden=\"true\" />\n Base endpoint\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Every request targets the workspace GraphQL gateway:\n </p>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 font-mono text-sm text-text-primary\">\n {endpoint}\n </code>\n <CopyButton value={endpoint} label=\"Copy URL\" />\n </div>\n </GlassCard>\n </div>\n);\n\n// ============================================================================\n// GraphQL API\n// ============================================================================\n\nconst SAMPLE_QUERY = `query FirstTitles {\n hokListTitles(pagination: { limit: 10, offset: 0 }, status: PUBLISHED) {\n items {\n id\n title\n type\n status\n releaseYear\n genres\n }\n pageInfo { cursor hasMore }\n totalCount\n }\n}`;\n\nconst SAMPLE_RESPONSE = `{\n \"data\": {\n \"hokListTitles\": {\n \"items\": [\n {\n \"id\": \"9f2c…\",\n \"title\": \"Midnight in Marseille\",\n \"type\": \"MOVIE\",\n \"status\": \"PUBLISHED\",\n \"releaseYear\": 2025,\n \"genres\": [\"Drama\", \"Thriller\"]\n }\n ],\n \"pageInfo\": { \"cursor\": null, \"hasMore\": true },\n \"totalCount\": 128\n }\n }\n}`;\n\nconst GraphqlSection: FC<{ endpoint: string }> = ({ endpoint }) => {\n const curl = `curl -X POST '${endpoint}' \\\\\n -H 'Content-Type: application/json' \\\\\n -H 'Authorization: Bearer <apiSecret>' \\\\\n -d '{\"query\": \"query { hokListTitles(pagination: { limit: 5 }) { items { id title } totalCount } }\"}'`;\n\n return (\n <div className=\"space-y-6\">\n <SectionHeading icon={Code2} title=\"GraphQL API\">\n One GraphQL endpoint serves the entire HookMovies domain. Send POST requests with\n your API key as a bearer token.\n </SectionHeading>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Endpoint</h3>\n <div className=\"flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 font-mono text-sm text-text-primary\">\n {endpoint}\n </code>\n <CopyButton value={endpoint} label=\"Copy URL\" />\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Sample query</h3>\n <CodeBlock language=\"graphql\" code={SAMPLE_QUERY} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Sample response</h3>\n <CodeBlock language=\"json\" code={SAMPLE_RESPONSE} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Run it with cURL</h3>\n <CodeBlock language=\"bash\" code={curl} />\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// API Keys — reuses global-auth via the shared data-layer hooks\n// ============================================================================\n\nconst SecretReveal: FC<{ result: ApiKeyResult; onDismiss: () => void }> = ({\n result,\n onDismiss,\n}) => (\n <GlassCard\n treatment=\"glass\"\n className=\"mb-6 border-status-warning-border bg-status-warning-bg-subtle p-5\"\n >\n <div className=\"flex items-start gap-3\">\n <ShieldAlert\n className=\"mt-0.5 h-5 w-5 shrink-0 text-status-warning-text\"\n aria-hidden=\"true\"\n />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Save your API secret now</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n This secret is shown only once and cannot be retrieved again. Store it somewhere safe\n before dismissing this panel.\n </p>\n\n <dl className=\"mt-4 space-y-3\">\n {(\n [\n { label: 'API key', value: result.apiKey },\n { label: 'API secret', value: result.apiSecret },\n { label: 'Key ID', value: result.keyId },\n ] as const\n ).map((row) => (\n <div key={row.label}>\n <dt className=\"mb-1 text-xs font-medium text-text-secondary\">{row.label}</dt>\n <dd className=\"flex flex-wrap items-center gap-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto rounded-lg border border-border-seam bg-bg-surface px-3 py-2 font-mono text-sm text-text-primary\">\n {row.value}\n </code>\n <CopyButton value={row.value} label=\"Copy\" />\n </dd>\n </div>\n ))}\n </dl>\n\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"mt-4 rounded-lg border border-border-seam bg-bg-surface px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n I've saved it — dismiss\n </button>\n </div>\n </div>\n </GlassCard>\n);\n\nconst fieldClass =\n 'w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\nconst labelClass = 'mb-1.5 block text-xs font-medium text-text-secondary';\n\nconst GenerateKeyForm: FC<{\n onGenerated: (result: ApiKeyResult) => void;\n onClose: () => void;\n}> = ({ onGenerated, onClose }) => {\n const generate = useGenerateApiKey();\n const [name, setName] = useState('');\n const [appId, setAppId] = useState('');\n const [scopes, setScopes] = useState<string[]>(['read']);\n const [expiresAt, setExpiresAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const toggleScope = (value: string) => {\n setScopes((prev) =>\n prev.includes(value) ? prev.filter((s) => s !== value) : [...prev, value]\n );\n };\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n if (!name.trim()) {\n setError('Give the key a recognisable name.');\n return;\n }\n if (!appId.trim()) {\n setError('Enter the App ID this key will act on behalf of.');\n return;\n }\n if (scopes.length === 0) {\n setError('Select at least one scope.');\n return;\n }\n try {\n const result = await generate.mutateAsync({\n appId: appId.trim(),\n name: name.trim(),\n scope: scopes,\n expiresAt: expiresAt ? new Date(expiresAt).toISOString() : undefined,\n });\n onGenerated(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to generate the API key.');\n }\n };\n\n return (\n <GlassCard treatment=\"glass\" className=\"mb-6 border-border-seam p-5\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <KeyRound className=\"h-4 w-4 text-action-primary-bg\" aria-hidden=\"true\" />\n Generate a new API key\n </h3>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {error && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {error}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label htmlFor=\"key-name\" className={labelClass}>\n Key name *\n </label>\n <input\n id=\"key-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Production ingest\"\n className={fieldClass}\n required\n />\n </div>\n <div>\n <label htmlFor=\"key-app-id\" className={labelClass}>\n App ID *\n </label>\n <input\n id=\"key-app-id\"\n value={appId}\n onChange={(e) => setAppId(e.target.value)}\n placeholder=\"Your registered app's ID\"\n className={fieldClass}\n required\n />\n <p className=\"mt-1 text-[11px] text-text-muted\">\n The client app this key acts on behalf of — find it in your workspace app settings.\n </p>\n </div>\n </div>\n\n <fieldset>\n <legend className={labelClass}>Scopes *</legend>\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {SCOPE_OPTIONS.map((scope) => {\n const checked = scopes.includes(scope.value);\n return (\n <label\n key={scope.value}\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-lg border p-3 text-sm transition-colors',\n checked\n ? 'border-action-primary-bg bg-action-primary-bg/10'\n : 'border-border-subtle hover:border-border-strong'\n )}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggleScope(scope.value)}\n className=\"mt-0.5 accent-[var(--color-action-primary-bg)]\"\n />\n <span className=\"min-w-0\">\n <span className=\"block font-medium text-text-primary\">{scope.label}</span>\n <span className=\"block text-xs text-text-secondary\">{scope.description}</span>\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n\n <div>\n <label htmlFor=\"key-expires\" className={labelClass}>\n Expires (optional)\n </label>\n <input\n id=\"key-expires\"\n type=\"date\"\n value={expiresAt}\n onChange={(e) => setExpiresAt(e.target.value)}\n className={cn(fieldClass, 'sm:max-w-xs')}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"submit\"\n disabled={generate.isPending}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90 disabled:opacity-50\"\n >\n {generate.isPending ? 'Generating…' : 'Generate key'}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n Cancel\n </button>\n </div>\n </form>\n </GlassCard>\n );\n};\n\nconst ApiKeyRow: FC<{ apiKey: ApiKey }> = ({ apiKey }) => {\n const revoke = useRevokeApiKey();\n const [confirming, setConfirming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleRevoke = async () => {\n setError(null);\n try {\n await revoke.mutateAsync(apiKey.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to revoke this key.');\n setConfirming(false);\n }\n };\n\n return (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-semibold text-text-primary\">{apiKey.name}</span>\n <code className=\"rounded bg-bg-sunken px-1.5 py-0.5 font-mono text-xs text-text-secondary\">\n {apiKey.prefix}…\n </code>\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-muted\">\n {apiKey.appName && <span>{apiKey.appName}</span>}\n <span aria-hidden=\"true\">·</span>\n <span>\n Created {formatDate(apiKey.createdAt, { hour: undefined, minute: undefined })}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span>\n {apiKey.lastUsedAt\n ? `Last used ${formatRelativeTime(apiKey.lastUsedAt)}`\n : 'Never used'}\n </span>\n {apiKey.expiresAt && (\n <>\n <span aria-hidden=\"true\">·</span>\n <span>\n Expires {formatDate(apiKey.expiresAt, { hour: undefined, minute: undefined })}\n </span>\n </>\n )}\n </div>\n {apiKey.scopes.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {apiKey.scopes.map((scope) => (\n <span\n key={scope}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-text-secondary\"\n >\n {scope}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"shrink-0\">\n {confirming ? (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={revoke.isPending}\n onClick={() => void handleRevoke()}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-1.5 text-xs font-medium text-status-error-text transition-opacity hover:opacity-90 disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {revoke.isPending ? 'Revoking…' : 'Confirm revoke'}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirming(false)}\n className=\"rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setConfirming(true)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-secondary transition-colors hover:border-status-error-border hover:text-status-error-text\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Revoke\n </button>\n )}\n </div>\n </div>\n {error && <p className=\"mt-2 text-xs text-status-error-text\">{error}</p>}\n </GlassCard>\n );\n};\n\nconst ApiKeysSection: FC = () => {\n const { data, isLoading, isError, refetch } = useMyApiKeys();\n const [showForm, setShowForm] = useState(false);\n const [revealed, setRevealed] = useState<ApiKeyResult | null>(null);\n\n const keys = data?.apiKeys ?? [];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <SectionHeading icon={KeyRound} title=\"API Keys\">\n Keys authenticate server-to-server calls to the HookMovies GraphQL gateway. They are\n issued and revoked through the platform identity service — HookMovies never stores your\n secret.\n </SectionHeading>\n <button\n type=\"button\"\n onClick={() => setShowForm((v) => !v)}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n New key\n </button>\n </div>\n\n {revealed && <SecretReveal result={revealed} onDismiss={() => setRevealed(null)} />}\n\n {showForm && (\n <GenerateKeyForm\n onGenerated={(result) => {\n setRevealed(result);\n setShowForm(false);\n }}\n onClose={() => setShowForm(false)}\n />\n )}\n\n {isLoading ? (\n <LoadingState label=\"Loading your API keys…\" />\n ) : isError ? (\n <ErrorState message=\"We couldn't load your API keys.\" onRetry={() => void refetch()} />\n ) : keys.length === 0 ? (\n <EmptyState\n icon={<KeyRound className=\"h-12 w-12\" />}\n title=\"No API keys yet\"\n description=\"Generate your first key to start calling the HookMovies API.\"\n action={\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n Generate key\n </button>\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {keys.map((apiKey) => (\n <ApiKeyRow key={apiKey.id} apiKey={apiKey} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// SDKs & MCP\n// ============================================================================\n\ninterface PackageCard {\n name: string;\n repo: string;\n description: string;\n icon: typeof Package;\n install: { language: string; code: string };\n}\n\nconst PACKAGES: PackageCard[] = [\n {\n name: 'Node SDK',\n repo: 'hookmovies-sdk-node',\n description:\n 'Typed TypeScript client for the HookMovies GraphQL API — catalog, titles, reviews and playback.',\n icon: Boxes,\n install: {\n language: 'bash',\n code: 'bun add hookmovies-sdk-node\\n# or: npm install hookmovies-sdk-node',\n },\n },\n {\n name: 'Python SDK',\n repo: 'hookmovies-sdk-python',\n description: 'Pythonic client with async support for backend integrations and data pipelines.',\n icon: Package,\n install: { language: 'bash', code: 'pip install hookmovies-sdk-python' },\n },\n {\n name: 'MCP Server',\n repo: 'hookmovies-mcp',\n description:\n 'Model Context Protocol server that exposes HookMovies tools to AI agents and assistants.',\n icon: Boxes,\n install: { language: 'bash', code: 'bunx hookmovies-mcp --help' },\n },\n {\n name: 'CLI',\n repo: 'hookmovies-cli',\n description:\n 'Command-line tool to manage titles, productions and rights from your terminal or CI.',\n icon: Terminal,\n install: { language: 'bash', code: 'bunx hookmovies-cli titles list' },\n },\n];\n\nconst SdksSection: FC = () => (\n <div className=\"space-y-6\">\n <SectionHeading icon={Package} title=\"SDKs & MCP\">\n Official HookMovies packages wrap the GraphQL API so you can build in your language of choice\n — or plug the platform straight into an AI agent via MCP.\n </SectionHeading>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {PACKAGES.map((pkg) => {\n const Icon = pkg.icon;\n const repoUrl = `https://github.com/algoshred/${pkg.repo}`;\n return (\n <GlassCard\n key={pkg.repo}\n treatment=\"glass\"\n className=\"flex h-full flex-col border-border-seam p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Icon className=\"h-5 w-5 text-action-primary-bg\" aria-hidden=\"true\" />\n </span>\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{pkg.name}</h3>\n <code className=\"text-[11px] text-text-muted\">{pkg.repo}</code>\n </div>\n </div>\n <a\n href={repoUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center gap-1 rounded-md border border-border-seam px-2 py-1 text-xs font-medium text-text-secondary transition-colors hover:border-border-strong hover:text-text-primary\"\n >\n Repo\n <ExternalLink className=\"h-3 w-3\" aria-hidden=\"true\" />\n </a>\n </div>\n <p className=\"mt-3 flex-1 text-sm text-text-secondary\">{pkg.description}</p>\n <div className=\"mt-3\">\n <CodeBlock language={pkg.install.language} code={pkg.install.code} />\n </div>\n </GlassCard>\n );\n })}\n </div>\n </div>\n);\n\n// ============================================================================\n// Embeddable Player\n// ============================================================================\n\nconst EmbedSection: FC<{ watchUrl: string }> = ({ watchUrl }) => {\n const iframeSnippet = `<iframe\n src=\"${watchUrl}\"\n width=\"100%\"\n height=\"480\"\n frameborder=\"0\"\n allow=\"autoplay; fullscreen; encrypted-media\"\n allowfullscreen\n title=\"HookMovies player\"\n></iframe>`;\n\n const responsiveSnippet = `<div style=\"position: relative; padding-top: 56.25%;\">\n <iframe\n src=\"${watchUrl}\"\n style=\"position: absolute; inset: 0; width: 100%; height: 100%; border: 0;\"\n allow=\"autoplay; fullscreen; encrypted-media\"\n allowfullscreen\n title=\"HookMovies player\"\n ></iframe>\n</div>`;\n\n return (\n <div className=\"space-y-6\">\n <SectionHeading icon={Clapperboard} title=\"Embeddable Player\">\n Drop a HookMovies title into any web page with a single{' '}\n <InlineCode>&lt;iframe&gt;</InlineCode>. Replace <InlineCode>YOUR_TITLE_ID</InlineCode> with\n the id of any published title.\n </SectionHeading>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Basic embed</h3>\n <CodeBlock language=\"html\" code={iframeSnippet} />\n </div>\n\n <div>\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">Responsive (16:9) embed</h3>\n <p className=\"mb-2 text-sm text-text-secondary\">\n Wrap the iframe in an aspect-ratio box so the player scales fluidly on any device.\n </p>\n <CodeBlock language=\"html\" code={responsiveSnippet} />\n </div>\n\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-4\">\n <p className=\"text-sm text-text-secondary\">\n The embedded player respects the viewer's entitlements and profile preferences. Viewers\n who aren't entitled to a title are prompted to sign in or purchase access inside the\n frame.\n </p>\n </GlassCard>\n </div>\n );\n};\n\n// ============================================================================\n// Page\n// ============================================================================\n\nexport const DevPortalPage: FC = () => {\n const { apiGatewayUrl, getPath } = useHookMovies();\n const [active, setActive] = useState<SectionId>('overview');\n\n const endpoint = apiGatewayUrl || 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql';\n\n const watchUrl = useMemo(() => {\n const origin =\n typeof window !== 'undefined' ? window.location.origin : 'https://app.hookmovies.com';\n return `${origin}${getPath('watch/YOUR_TITLE_ID')}`;\n }, [getPath]);\n\n return (\n <PageLayout\n title=\"Developer Portal\"\n description=\"Build on the HookMovies platform API\"\n purpose=\"Everything you need to integrate with HookMovies — authenticate with an API key, query the GraphQL gateway, pull in the official SDKs or MCP server, and embed the player anywhere. API keys are issued through the platform identity service; HookMovies never stores your secret.\"\n >\n {/* Section navigation — horizontal, scrollable on small screens */}\n <div\n className=\"mb-6 flex gap-1 overflow-x-auto rounded-xl border border-border-seam bg-bg-surface p-1\"\n role=\"tablist\"\n aria-label=\"Developer portal sections\"\n >\n {SECTIONS.map((section) => {\n const Icon = section.icon;\n const selected = active === section.id;\n return (\n <button\n key={section.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActive(section.id)}\n className={cn(\n 'inline-flex shrink-0 items-center gap-2 rounded-lg px-3.5 py-2 text-sm font-medium transition-colors',\n selected\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n {section.label}\n </button>\n );\n })}\n </div>\n\n <div className=\"max-w-4xl\">\n {active === 'overview' && <GettingStartedSection endpoint={endpoint} />}\n {active === 'graphql' && <GraphqlSection endpoint={endpoint} />}\n {active === 'keys' && <ApiKeysSection />}\n {active === 'sdks' && <SdksSection />}\n {active === 'embed' && <EmbedSection watchUrl={watchUrl} />}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { EmptyState } from '../hookmovies/components/EmptyState';
3
+
4
+ declare const meta: Meta<typeof EmptyState>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const IconOnly: Story;
8
+ export declare const WithAction: Story;
9
+ export declare const Illustrated: Story;
10
+ //# sourceMappingURL=EmptyState.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.stories.d.ts","sourceRoot":"","sources":["../../src/stories/EmptyState.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAMjC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAexB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { MetricsCard } from '../hookmovies/components/MetricsCard';
3
+
4
+ declare const meta: Meta<typeof MetricsCard>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const Default: Story;
8
+ export declare const WithTrend: Story;
9
+ export declare const Featured: Story;
10
+ //# sourceMappingURL=MetricsCard.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsCard.stories.d.ts","sourceRoot":"","sources":["../../src/stories/MetricsCard.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAMlC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { RatingDisplay } from '../hookmovies/components/RatingDisplay';
3
+
4
+ declare const meta: Meta<typeof RatingDisplay>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const Default: Story;
8
+ export declare const HighRating: Story;
9
+ export declare const NoCount: Story;
10
+ //# sourceMappingURL=RatingDisplay.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RatingDisplay.stories.d.ts","sourceRoot":"","sources":["../../src/stories/RatingDisplay.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAMpC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { StatusBadge } from '../hookmovies/components/StatusBadge';
3
+
4
+ declare const meta: Meta<typeof StatusBadge>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const Published: Story;
8
+ export declare const InProduction: Story;
9
+ export declare const OpenAudition: Story;
10
+ export declare const Rejected: Story;
11
+ //# sourceMappingURL=StatusBadge.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.stories.d.ts","sourceRoot":"","sources":["../../src/stories/StatusBadge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAYlC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAItB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/types/assistant.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAE/C,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhG,MAAM,MAAM,2BAA2B,GACnC,MAAM,GACN,cAAc,GACd,YAAY,GACZ,WAAW,GACX,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,wBAAwB,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,EAAE,mBAAmB,EAAkC,CAAC"}
1
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/types/assistant.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAE/C,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhG,MAAM,MAAM,2BAA2B,GACrC,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,wBAAwB,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,EAAE,mBAAmB,EAAkC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-hookmovies",
3
- "version": "2026.713.1",
3
+ "version": "2026.719.1",
4
4
  "description": "Burdenoff HookMovies Microfrontend — discovery, catalog, engagement, auditions, productions, distribution, and library surfaces for the global creative-media network.",
5
5
  "type": "module",
6
6
  "files": [
@@ -34,7 +34,10 @@
34
34
  "lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
35
35
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
36
36
  "type:check": "tsc --noEmit",
37
- "sanity": "bun run codegen && bun run lint:sanity && bun run format && bun run type:check && bun run build",
37
+ "sanity": "bun run codegen && bun run lint:sanity && bun run format && bun run type:check && bun run build && bun run build-storybook",
38
+ "storybook": "storybook dev -p 6006",
39
+ "build-storybook": "storybook build",
40
+ "test:storybook": "test-storybook",
38
41
  "switch:status": "bun scripts/deps-mode.ts status",
39
42
  "switch:remote": "bun scripts/deps-mode.ts remote",
40
43
  "switch:local": "bun scripts/deps-mode.ts local",
@@ -64,6 +67,12 @@
64
67
  "@graphql-codegen/typescript": "^4.0.0",
65
68
  "@graphql-codegen/typescript-operations": "^4.0.0",
66
69
  "@graphql-codegen/typescript-react-apollo": "^4.0.0",
70
+ "@storybook/addon-essentials": "^8.6.0",
71
+ "@storybook/addon-interactions": "^8.6.0",
72
+ "@storybook/react": "^8.6.0",
73
+ "@storybook/react-vite": "^8.6.0",
74
+ "@storybook/test": "^8.6.0",
75
+ "@storybook/test-runner": "0.22.0",
67
76
  "@types/react": "^19.0.2",
68
77
  "@types/react-dom": "^19.0.2",
69
78
  "@vitejs/plugin-react": "^4.3.4",
@@ -74,6 +83,7 @@
74
83
  "lefthook": "^2.1.1",
75
84
  "postcss": "^8.4.49",
76
85
  "prettier": "^3.4.2",
86
+ "storybook": "^8.6.0",
77
87
  "tailwindcss": "^4.0.0",
78
88
  "typescript": "^5.9.0",
79
89
  "typescript-eslint": "^8.46.0",