@burdenoff/microfe-hookmovies 2026.720.2 → 2026.726.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.
@@ -77,6 +77,8 @@ export interface HokEpisodeSummary {
77
77
  synopsis: string | null;
78
78
  runtimeMinutes: number | null;
79
79
  airDate: string | null;
80
+ /** The episode's master/mezzanine file id, resolved from `HokEpisode.file`. */
81
+ fileId: string | null;
80
82
  }
81
83
  export interface HokSeasonSummary {
82
84
  id: string;
@@ -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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"}
@@ -58,7 +58,8 @@ var o = async (e, t, n) => {
58
58
  "title",
59
59
  t
60
60
  ],
61
- queryFn: async () => (await o(`query HokTitle($id: ID!) {
61
+ queryFn: async () => {
62
+ let e = await o(`query HokTitle($id: ID!) {
62
63
  hokTitle(id: $id) {
63
64
  ${l}
64
65
  studio { id name }
@@ -67,9 +68,22 @@ var o = async (e, t, n) => {
67
68
  person { id name knownFor }
68
69
  }
69
70
  seasons { id name number synopsis }
70
- episodes { id name number seasonId synopsis runtimeMinutes airDate }
71
+ episodes {
72
+ id name number seasonId synopsis runtimeMinutes airDate
73
+ file { id }
74
+ }
71
75
  }
72
- }`, { id: t }, r)).hokTitle,
76
+ }`, { id: t }, r);
77
+ if (!e.hokTitle) return null;
78
+ let { episodes: n, ...i } = e.hokTitle;
79
+ return {
80
+ ...i,
81
+ episodes: n.map(({ file: e, ...t }) => ({
82
+ ...t,
83
+ fileId: e?.id ?? null
84
+ }))
85
+ };
86
+ },
73
87
  enabled: !!t
74
88
  });
75
89
  }, ne = () => {
@@ -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' | '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 // hokListApplications returns HokApplicationConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokListApplications: { items: HokApplication[] };\n }>(\n `query HokApplications($auditionId: ID!) {\n hokListApplications(auditionId: $auditionId) {\n items {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }\n }`,\n { auditionId },\n apiGatewayUrl\n );\n return result.hokListApplications.items;\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 // hokMyEntitlements returns HokEntitlementConnection (items + pageInfo +\n // totalCount), not a bare list — the fields below must be nested under\n // `items` or the gateway rejects the query with GRAPHQL_VALIDATION_FAILED.\n const result = await hookmoviesQuery<{\n hokMyEntitlements: { items: HokEntitlement[] };\n }>(\n `query HokMyEntitlements($titleId: ID) {\n hokMyEntitlements(titleId: $titleId) {\n items {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyEntitlements.items;\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 // hokMyWatchProgress returns HokWatchProgressConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokMyWatchProgress: { items: HokWatchProgress[] };\n }>(\n `query HokMyWatchProgress($titleId: ID) {\n hokMyWatchProgress(titleId: $titleId) {\n items {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyWatchProgress.items;\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 // hokListLocalizations returns HokLocalizationConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokListLocalizations: { items: HokLocalization[] };\n }>(\n `query HokLocalizations($titleId: ID, $episodeId: ID) {\n hokListLocalizations(titleId: $titleId, episodeId: $episodeId) {\n items {\n ${LOCALIZATION_FIELDS}\n }\n }\n }`,\n { titleId, episodeId },\n apiGatewayUrl\n );\n return result.hokListLocalizations.items;\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 // hokMyProfiles returns HokProfileConnection (items + pageInfo +\n // totalCount), not a bare list.\n const result = await hookmoviesQuery<{ hokMyProfiles: { items: HokProfile[] } }>(\n `query HokMyProfiles { hokMyProfiles { items { ${PROFILE_FIELDS} } } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyProfiles.items;\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 // hokChannelSchedule returns HokScheduleBlockConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokChannelSchedule: { items: HokScheduleBlock[] };\n }>(\n `query HokChannelSchedule($channelId: ID!, $from: DateTime, $to: DateTime) {\n hokChannelSchedule(channelId: $channelId, from: $from, to: $to) {\n items {\n ${SCHEDULE_BLOCK_FIELDS}\n }\n }\n }`,\n { channelId, from, to },\n apiGatewayUrl\n );\n return result.hokChannelSchedule.items;\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":";;;;;;AA6BA,IAAM,IAAkB,OACtB,GACA,GACA,MACmB;CACnB,IAAM,IAAW,MAAM,EAAoB;EACzC,SAAS;EACT;EACA;EACA;EACA,gBAAgB;EACjB,CAAC;AAEF,KAAI,EAAS,QAAQ,OACnB,OAAU,MAAM,EAAS,OAAO,IAAI,WAAW,yBAAyB;AAG1E,KAAI,CAAC,EAAS,KACZ,OAAU,MAAM,wCAAwC;AAY1D,QAJI,EAAM,WAAW,CAAC,WAAW,WAAW,IAC1C,GAAgC,EAG3B,EAAS;GAYZ,IAAc,OAClB,GACA,MACmB;CACnB,IAAM,IAAW,MAAM,EAAoB;EACzC,SAAS;EACT;EACA;EACD,CAAC;AAEF,KAAI,EAAS,QAAQ,OACnB,OAAU,MAAM,EAAS,OAAO,IAAI,WAAW,yBAAyB;AAG1E,KAAI,CAAC,EAAS,KACZ,OAAU,MAAM,wCAAwC;AAQ1D,QAJI,EAAM,WAAW,CAAC,WAAW,WAAW,IAC1C,GAAgC,EAG3B,EAAS;GAGZ,IAAK,cA4SL,IAAe,qPAOf,IAAgB,yFAIhB,IAAgB,0FAIhB,IAAoB,8KAKpB,IAAkB,oJAKlB,IAAgB,6GAKhB,IAAgB,kHAKhB,IAAc,mFAId,IAAY,+CAaL,MACX,IAA2B,EAAE,EAC7B,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,EACzD,MACG;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAU;GAAS;GAAY,KAAU;GAAG;EAC3D,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAa;cACrB,EAAU;;YAGhB;GACE;GACA,QAAQ,GAAQ,MAAM,GAAG,EAAO,MAAM,GAAG,KAAA;GACzC,QAAQ,EAAQ;GAChB,MAAM,EAAQ;GACd,UAAU,EAAQ;GACnB,EACD,EACD,EACa;EAEjB,CAAC;GAGS,MAAY,MAA2B;CAClD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAS;GAAG;EAC3B,SAAS,aACQ,MAAM,EACnB;;cAEM,EAAa;;;;;;;;;YAUnB,EAAE,OAAI,EACN,EACD,EACa;EAEhB,SAAS,EAAQ;EAClB,CAAC;GAmBS,WAAuB;CAClC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;4CACoC,EAAa;YAEjD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC;;EAEnE,CAAC;GAuBS,WAAuB;CAClC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,gBACR,MAAM,EACnB;qDAC6C,EAAa;YAE1D;GAAE;GAAI;GAAO,EACb,EACD,EACa;EAEhB,YAAY,MAAS;AAEd,GADA,EAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC,EAC3D,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAG,EAAE,CAAC;;EAE3E,CAAC;GAGS,WAA2B;CACtC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,iBACR,MAAM,EACnB;2DACmD,EAAa;YAEhE;GAAE;GAAI;GAAQ,EACd,EACD,EACa;EAEhB,YAAY,MAAS;AAEd,GADA,EAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC,EAC3D,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAG,EAAE,CAAC;;EAE3E,CAAC;GAGS,WAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,mEACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,YAAY,GAAO,MAAO;AAEnB,GADA,EAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC,EAC3D,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS;IAAG,EAAE,CAAC;;EAEtE,CAAC;GAOS,MACX,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,EACzD,MACG;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAW;GAAY,KAAU;GAAG;EACnD,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAc;cACtB,EAAU;;YAGhB;GAAE;GAAY,QAAQ,GAAQ,MAAM,GAAG,EAAO,MAAM,GAAG,KAAA;GAAW,EAClE,EACD,EACa;EAEjB,CAAC;GAYS,WAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;6CACqC,EAAc;YAEnD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,UAAU,EAAE,CAAC;;EAEpE,CAAC;GAOS,MACX,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,EACzD,MACG;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAU;GAAY,KAAU;GAAG;EAClD,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAc;cACtB,EAAU;;YAGhB;GAAE;GAAY,QAAQ,GAAQ,MAAM,GAAG,EAAO,MAAM,GAAG,KAAA;GAAW,EAClE,EACD,EACa;EAEjB,CAAC;GAYS,WAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;6CACqC,EAAc;YAEnD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC;;EAEnE,CAAC;GAYS,MACX,IAAgC,EAAE,EAClC,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAe;GAAS;GAAW;EAClD,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAkB;cAC1B,EAAU;;YAGhB;GAAE;GAAY,QAAQ,EAAQ;GAAQ,UAAU,EAAQ;GAAU,EAClE,EACD,EACa;EAEjB,CAAC;GAGS,KAAiB,MAA2B;CACvD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAc;GAAG;EAChC,SAAS,aACQ,MAAM,EACnB;;cAEM,EAAkB;;;;;YAMxB,EAAE,OAAI,EACN,EACD,EACa;EAEhB,SAAS,EAAQ;EAClB,CAAC;GAiBS,UAA4B;CACvC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;iDACyC,EAAkB;YAE3D,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,cAAc,EAAE,CAAC;;EAExE,CAAC;GAGS,UAAgC;CAC3C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,iBACR,MAAM,EACnB;gEACwD,EAAkB;YAE1E;GAAE;GAAI;GAAQ,EACd,EACD,EACa;EAEhB,YAAY,MAAS;AAEd,GADA,EAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,cAAc,EAAE,CAAC,EAChE,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAc,EAAK;IAAG,EAAE,CAAC;;EAEhF,CAAC;GAYS,KACX,IAA8B,EAAE,EAChC,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAa;GAAS;GAAW;EAChD,SAAS,aACQ,MAAM,EACnB;;;gBAGQ,EAAgB;;;cAGlB,EAAU;;YAGhB;GAAE;GAAY,QAAQ,EAAQ;GAAQ,cAAc,EAAQ;GAAc,EAC1E,EACD,EACa;EAEjB,CAAC;GAQS,KAAmB,MAA2B;CACzD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAkB;GAAG;EACpC,SAAS,aACQ,MAAM,EACnB;;;gBAGQ,EAAgB;;;cAGlB,EAAU;;YAGhB,EAAE,YAAY;GAAE,OAAO;GAAK,QAAQ;GAAG,EAAE,EACzC,EACD,EACa,iBAAiB,MAAM,MAAM,MAAM,EAAE,OAAO,EAAG,IAAI;EAEnE,SAAS,EAAQ;EAClB,CAAC;GAGS,KAA2B,MAAmC;CACzE,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAgB;GAAW;EAC1C,SAAS,aAGQ,MAAM,EAGnB,uPAOA,EAAE,eAAY,EACd,EACD,EACa,oBAAoB;EAEpC,SAAS,EAAQ;EAClB,CAAC;GAeS,UAA0B;CACrC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;+CACuC,EAAgB;YAEvD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,YAAY,EAAE,CAAC;;EAEtE,CAAC;GAGS,UAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;wCACgC,EAAgB;YAEhD,EAAE,OAAI,EACN,EACD,EACa;EAEhB,YAAY,MAAS;AAEd,GADA,EAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,YAAY,EAAE,CAAC,EAC9D,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAkB,EAAK;IAAG,EAAE,CAAC;;EAEpF,CAAC;GASS,UAA2B;CACtC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,4NAKA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAgB,EAAK;IAAW,EAAE,CAAC;;EAE1F,CAAC;GAGS,UAA4B;CACvC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,gBACR,MAAM,EACnB,6NAKA;GAAE;GAAI;GAAO,EACb,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAgB,EAAK;IAAW,EAAE,CAAC;;EAE1F,CAAC;GAYS,KACX,IAA4B,EAAE,EAC9B,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAW;GAAS;GAAW;EAC9C,SAAS,aACQ,MAAM,EACnB;;;gBAGQ,EAAc;;;cAGhB,EAAU;;YAGhB;GAAE;GAAY,QAAQ,EAAQ;GAAQ,SAAS,EAAQ;GAAS,EAChE,EACD,EACa;EAEjB,CAAC;GAWS,UAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;6CACqC,EAAc;YAEnD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,UAAU,EAAE,CAAC;;EAEpE,CAAC;GAGS,UAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,mEACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,UAAU,EAAE,CAAC;;EAEpE,CAAC;GAYS,KACX,IAA4B,EAAE,EAC9B,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAU;GAAS;GAAW;EAC7C,SAAS,aACQ,MAAM,EAGnB;;;gBAGQ,EAAc;;;cAGhB,EAAU;;YAGhB;GAAE;GAAY,QAAQ,EAAQ;GAAQ,SAAS,EAAQ;GAAS,EAChE,EACD,EACa;EAEjB,CAAC;GAgBS,UAA8B;CACzC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;mDAC2C,EAAc;YAEzD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC;;EAEnE,CAAC;GAGS,UAAkC;CAC7C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,iBACR,MAAM,EACnB;kEAC0D,EAAc;YAExE;GAAE;GAAI;GAAQ,EACd,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,SAAS,EAAE,CAAC;;EAEnE,CAAC;GAGS,UAA6B;CACxC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,6EACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,kBAAkB,EAAE,CAAC;;EAE5E,CAAC;GAOS,KAAqB,MAAqB;CACrD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAmB;GAAQ;EAC1C,SAAS,aAIQ,MAAM,EAGnB,uRAQA,EAAE,YAAS,EACX,EACD,EACa,kBAAkB;EAEnC,CAAC;GAOS,KACX,GACA,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAY;GAAM;GAAW;EAC5C,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAY;cACpB,EAAU;;YAGhB;GAAE;GAAM;GAAY,EACpB,EACD,EACa;EAEjB,CAAC;GAWS,UAAsB;CACjC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;2CACmC,EAAY;YAE/C,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAGS,UAAsB;CACjC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,+DACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAOS,KAAsB,MAAqB;CACtD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAqB;GAAQ;EAC5C,SAAS,aAGQ,MAAM,EAGnB,qRAQA,EAAE,YAAS,EACX,EACD,EACa,mBAAmB;EAEpC,CAAC;GAoBS,UAAqB;CAChC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,qOAMA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAQ,EAAE,CAAC;;EAEhF,CAAC;GAoCS,UAAwB;CACnC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,sLAKA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAQ,EAAE,CAAC;;EAEhF,CAAC;GAeS,UAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,iNAKA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAQ,EAAE,CAAC;;EAEhF,CAAC;GAgBS,UAA0B;CACrC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,6PAMA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,oBAAoB,EAAE,CAAC;;EAE9E,CAAC;GAaS,MAAuB,MAAqB;CACvD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAqB;GAAQ;EAC5C,SAAS,aACQ,MAAM,EACnB,8HAGA,EAAE,YAAS,EACX,EACD,EACa;EAEhB,SAAS,EAAQ;EAClB,CAAC;GAaS,WAA4B;CACvC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,uQAMA,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,kBAAkB,EAAE,CAAC;;EAE5E,CAAC;GAeS,WAAsB;CACjC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,gBACR,MAAM,EACnB;oDAC4C,EAAY;YAExD;GAAE;GAAI;GAAO,EACb,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAmBE,IAAc,8EAKP,MACX,GACA,GACA,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAS,KAAW;GAAI,KAAY;GAAI;GAAW;EAClE,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAY;cACpB,EAAU;;YAGhB;GACE;GACA;GACA,UAAU,GAAU,MAAM,GAAG,EAAS,MAAM,GAAG,KAAA;GAChD,EACD,EACD,EACa;EAEhB,SAAS,EAAQ;EAClB,CAAC;GAcS,WAAsB;CACjC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;2CACmC,EAAY;YAE/C,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS,EAAK;IAAQ,EAAE,CAAC;;EAEhF,CAAC;GAOS,WAAsB;CACjC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,aACJ,MAAM,EACnB,+DACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,YAAY,GAAO,EAAE,iBAAc;AAC5B,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAS;IAAQ,EAAE,CAAC;;EAE3E,CAAC;GAwBE,IAAsB,wGASf,MAAoB,GAAkB,MAAuB;CACxE,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAiB,KAAW;GAAI,KAAa;GAAG;EAC/D,SAAS,aAGQ,MAAM,EAGnB;;;gBAGQ,EAAoB;;;YAI5B;GAAE;GAAS;GAAW,EACtB,EACD,EACa,qBAAqB;EAErC,SAAS,EAAQ,KAAY,EAAQ;EACtC,CAAC;GAOS,WAAkB;CAC7B,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU,CAAC,GAAI,SAAS;EACxB,SAAS,aACQ,MAAM,EACnB,iCACA,EAAE,EACF,EACD,EACa;EAEhB,WAAW,KAAK;EACjB,CAAC;GAoBE,IAAiB,yGAMV,WAAsB;CACjC,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU,CAAC,GAAI,WAAW;EAC1B,SAAS,aAGQ,MAAM,EACnB,iDAAiD,EAAe,SAChE,EAAE,EACF,EACD,EACa,cAAc;EAE/B,CAAC;GAYS,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;8CACsC,EAAe;YAErD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAYS,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,OAAI,gBACR,MAAM,EACnB;uDAC+C,EAAe;YAE9D;GAAE;GAAI;GAAO,EACb,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAGS,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,qEACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GA+BE,IAAqB,wKAad,WAA4B;CACvC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;iDACyC,EAAmB;YAE5D,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAe,EAAK;IAAG,EAAE,CAAC;;EAEjF,CAAC;GAIS,MAAiB,MAA2B;CACvD,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAe;GAAG;EACjC,SAAS,aACQ,MAAM,EACnB;qCAC6B,EAAmB;YAEhD,EAAE,OAAI,EACN,EACD,EACa;EAEhB,SAAS,EAAQ;EAClB,CAAC;GAGS,WAA0B;CACrC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;yCACiC,EAAmB;YAEpD,EAAE,OAAI,EACN,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAe,EAAK;IAAG,EAAE,CAAC;;EAEjF,CAAC;GAGS,WAA+B;CAC1C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EACjB,OACA,cACA,0BAMe,MAAM,EACnB;;cAEM,EAAmB;;YAGzB;GAAE;GAAI;GAAW;GAAiB,EAClC,EACD,EACa;EAEhB,YAAY,MAAS;AACd,KAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAe,EAAK;IAAG,EAAE,CAAC;;EAEjF,CAAC;GAOS,WAA6B;CACxC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;;cAEM,EAAc;;;YAIpB,EAAE,aAAU,EACZ,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,UAAU,EAAE,CAAC;;EAEpE,CAAC;GAGS,WAA+B;CAC1C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;;cAEM,EAAc;;;YAIpB,EAAE,aAAU,EACZ,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,UAAU,EAAE,CAAC;;EAEpE,CAAC;GAwBE,IAAoB,0GAWb,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,eAAY,aAAU,iBAC1B,MAAM,EACnB;;cAEM,EAAkB;;YAGxB;GAAE;GAAY;GAAU;GAAQ,EAChC,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,mBAAmB,EAAE,CAAC;;EAE7E,CAAC;GAGS,MACX,GACA,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAoB,KAAU;GAAI;GAAW;EAC5D,SAAS,aACQ,MAAM,EAGnB;;sBAEc,EAAkB;cAC1B,EAAU;;YAGhB;GAAE;GAAY;GAAQ,EACtB,EACD,EACa;EAEjB,CAAC;GAGS,WAAiC;CAC5C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EACjB,OACA,WACA,qBAMe,MAAM,EACnB;;cAEM,EAAkB;;YAGxB;GAAE;GAAI;GAAQ;GAAY,EAC1B,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,mBAAmB,EAAE,CAAC;;EAE7E,CAAC;GAkBE,IAAqB,wFAId,WAAyB;CACpC,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU,CAAC,GAAI,cAAc;EAC7B,SAAS,aACQ,MAAM,EACnB,+CAA+C,EAAmB,OAClE,EAAE,EACF,EACD,EACa;EAEjB,CAAC;GAUS,WAA0B;CACrC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;+CACuC,EAAmB;YAE1D,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,cAAc,EAAE,CAAC;;EAExE,CAAC;GAoCE,IAAiB,oGAKjB,IAAwB,4HAMjB,MACX,GACA,IAAiC;CAAE,OAAO;CAAI,QAAQ;CAAG,KACtD;CACH,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAY,KAAY;GAAI;GAAW;EACtD,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAe;cACvB,EAAU;;YAGhB;GAAE;GAAY,UAAU,GAAU,MAAM,GAAG,EAAS,MAAM,GAAG,KAAA;GAAW,EACxE,EACD,EACa;EAEjB,CAAC;GAGS,MAAsB,GAA+B,GAAe,MAAgB;CAC/F,IAAM,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAS;EACd,UAAU;GAAC;GAAI;GAAoB,KAAa;GAAI,KAAQ;GAAI,KAAM;GAAG;EACzE,SAAS,aAGQ,MAAM,EAGnB;;;gBAGQ,EAAsB;;;YAI9B;GAAE;GAAW;GAAM;GAAI,EACvB,EACD,EACa,mBAAmB;EAEnC,SAAS,EAAQ;EAClB,CAAC;GA+BS,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;8CACsC,EAAe;YAErD,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAWS,WAAyB;CACpC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;8CACsC,EAAsB;YAE5D,EAAE,UAAO,EACT,EACD,EACa;EAEhB,YAAY,MAAS;AAEd,GADA,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAoB,EAAK;IAAU,EAAE,CAAC,EACrF,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAe,EAAK;IAAU,EAAE,CAAC;;EAExF,CAAC;GAGS,WAA+B;CAC1C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,aACJ,MAAM,EACnB,iFACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,YAAY,GAAO,EAAE,mBAAgB;AAE9B,GADA,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAoB;IAAU,EAAE,CAAC,EAChF,EAAY,kBAAkB,EAAE,UAAU;IAAC;IAAI;IAAe;IAAU,EAAE,CAAC;;EAEnF,CAAC;GAkBS,WAA8B;CACzC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;mDAC2C,EAAoB;YAE/D,EAAE,UAAO,EACT,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,gBAAgB,EAAE,CAAC;;EAE1E,CAAC;GAGS,WAA8B;CACzC,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,+EACA,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,gBAAgB,EAAE,CAAC;;EAE1E,CAAC;GAGS,WAAkC;CAC7C,IAAM,IAAc,GAAgB,EAC9B,EAAE,qBAAkB,GAAe;AACzC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;iDACyC,EAAoB;YAE7D,EAAE,OAAI,EACN,EACD,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,gBAAgB,EAAE,CAAC;;EAE1E,CAAC;GAoBS,WACJ,EAAS;CACd,UAAU,CAAC,GAAI,mBAAmB;CAClC,SAAS,aACQ,MAAM,EACnB,0HAGA,EAAE,CACH,EACa;CAEjB,CAAC,EAyCS,UAA8B;CACzC,IAAM,IAAc,GAAgB;AACpC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,8QAOA,EAAE,UAAO,CACV,EACa;EAEhB,YAAY,GAAO,MAAc;AAI1B,GAHA,EAAY,kBAAkB,EACjC,UAAU,CAAC,GAAI,mBAAmB,EACnC,CAAC,EACG,EAAY,kBAAkB,EACjC,UAAU;IAAC;IAAI;IAAoB,EAAU;IAAiB,EAC/D,CAAC;;EAEL,CAAC;GAoBS,MAAwB,MAC5B,EAAS;CACd,UAAU;EAAC;EAAI;EAAoB;EAAiB;CACpD,SAAS,aACQ,MAAM,EACnB,6UAOA,EAAE,qBAAkB,CACrB,EACa;CAEhB,SAAS,EAAQ;CAClB,CAAC,EA8BS,MACX,GACA,GACA,IAAQ,IACR,IAAS,MAEF,EAAS;CACd,UAAU;EAAC;EAAI;EAAoB;EAAkB,KAAU,EAAE;EAAE;EAAO;EAAO;CACjF,SAAS,aACQ,MAAM,EACnB,8cAUA;EAAE;EAAkB;EAAQ;EAAO;EAAQ,CAC5C,EACa;CAEhB,SAAS,EAAQ;CAClB,CAAC,EAsBS,MAAuB,MAC3B,EAAS;CACd,UAAU;EAAC;EAAI;EAAmB;EAAiB;CACnD,SAAS,aACQ,MAAM,EACnB,iRAMA,EAAE,qBAAkB,CACrB,EACa;CAEhB,SAAS,EAAQ;CAClB,CAAC,EAyBE,IAAwB,mHAKjB,MACX,GACA,IAAQ,IACR,IAAS,MAEF,EAAS;CACd,UAAU;EAAC;EAAI;EAAmB;EAAkB;EAAO;EAAO;CAClE,SAAS,aACQ,MAAM,EACnB;;sBAEc,EAAsB;;;;YAKpC;EAAE;EAAkB;EAAO;EAAQ,CACpC,EACa;CAEhB,SAAS,EAAQ;CAClB,CAAC,EAWS,WAAyB;CACpC,IAAM,IAAc,GAAgB;AACpC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB;kDAC0C,EAAsB;YAEhE,EAAE,UAAO,CACV,EACa;EAEhB,YAAY,MAAS;AAId,GAHA,EAAY,kBAAkB,EACjC,UAAU;IAAC;IAAI;IAAmB,EAAK;IAAiB,EACzD,CAAC,EACG,EAAY,kBAAkB,EACjC,UAAU;IAAC;IAAI;IAAoB,EAAK;IAAiB,EAC1D,CAAC;;EAEL,CAAC;GAyBE,KAAiB,4EAIV,MAAgB,MACpB,EAAS;CACd,UAAU;EAAC;EAAI;EAAY,KAAc,EAAE;EAAC;CAC5C,SAAS,aACQ,MAAM,EACnB;;wBAEgB,GAAe;;;;YAK/B,EAAE,eAAY,CACf,EACa;CAEjB,CAAC,EAoBS,WAA0B;CACrC,IAAM,IAAc,GAAgB;AACpC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,6IAGA,EAAE,UAAO,CACV,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAGS,WAAwB;CACnC,IAAM,IAAc,GAAgB;AACpC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,6EACA,EAAE,UAAO,CACV,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,WAAW,EAAE,CAAC;;EAErE,CAAC;GAiCS,MAAgB,GAAyB,IAAQ,IAAI,IAAS,MAClE,EAAS;CACd,UAAU;EAAC;EAAI;EAAa,KAAU,EAAE;EAAE;EAAO;EAAO;CACxD,SAAS,aACQ,MAAM,EACnB,mSAOA;EAAE;EAAQ;EAAO;EAAQ,CAC1B,EACa;CAEhB,WAAW,MAAS;CACrB,CAAC,EAiBS,WAAqC;CAChD,IAAM,IAAc,GAAgB;AACpC,QAAO,EAAY;EACjB,YAAY,OAAO,OACF,MAAM,EACnB,8KAGA,EAAE,UAAO,CACV,EACa;EAEhB,iBAAiB;AACV,KAAY,kBAAkB,EAAE,UAAU,CAAC,GAAI,sBAAsB,EAAE,CAAC;;EAEhF,CAAC"}
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 /** The episode's master/mezzanine file id, resolved from `HokEpisode.file`. */\n fileId: 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\n/** Wire shape of an episode row: the schema exposes `file: File`, not a flat id. */\ntype HokEpisodeWire = Omit<HokEpisodeSummary, 'fileId'> & { file: { id: string } | null };\ntype HokTitleDetailWire = Omit<HokTitleDetail, 'episodes'> & { episodes: HokEpisodeWire[] };\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: HokTitleDetailWire | 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 {\n id name number seasonId synopsis runtimeMinutes airDate\n file { id }\n }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n if (!result.hokTitle) return null;\n const { episodes, ...rest } = result.hokTitle;\n const detail: HokTitleDetail = {\n ...rest,\n episodes: episodes.map(({ file, ...episode }) => ({\n ...episode,\n fileId: file?.id ?? null,\n })),\n };\n return detail;\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 // hokListApplications returns HokApplicationConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokListApplications: { items: HokApplication[] };\n }>(\n `query HokApplications($auditionId: ID!) {\n hokListApplications(auditionId: $auditionId) {\n items {\n id auditionId applicantId coverNote score status createdAt updatedAt\n }\n }\n }`,\n { auditionId },\n apiGatewayUrl\n );\n return result.hokListApplications.items;\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 // hokMyEntitlements returns HokEntitlementConnection (items + pageInfo +\n // totalCount), not a bare list — the fields below must be nested under\n // `items` or the gateway rejects the query with GRAPHQL_VALIDATION_FAILED.\n const result = await hookmoviesQuery<{\n hokMyEntitlements: { items: HokEntitlement[] };\n }>(\n `query HokMyEntitlements($titleId: ID) {\n hokMyEntitlements(titleId: $titleId) {\n items {\n id titleId userId mode source status territory expiresAt createdAt updatedAt\n title { id title }\n }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyEntitlements.items;\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 // hokMyWatchProgress returns HokWatchProgressConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokMyWatchProgress: { items: HokWatchProgress[] };\n }>(\n `query HokMyWatchProgress($titleId: ID) {\n hokMyWatchProgress(titleId: $titleId) {\n items {\n id titleId episodeId positionSeconds completed lastDevice updatedAt\n title { id title type }\n }\n }\n }`,\n { titleId },\n apiGatewayUrl\n );\n return result.hokMyWatchProgress.items;\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 // hokListLocalizations returns HokLocalizationConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokListLocalizations: { items: HokLocalization[] };\n }>(\n `query HokLocalizations($titleId: ID, $episodeId: ID) {\n hokListLocalizations(titleId: $titleId, episodeId: $episodeId) {\n items {\n ${LOCALIZATION_FIELDS}\n }\n }\n }`,\n { titleId, episodeId },\n apiGatewayUrl\n );\n return result.hokListLocalizations.items;\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 // hokMyProfiles returns HokProfileConnection (items + pageInfo +\n // totalCount), not a bare list.\n const result = await hookmoviesQuery<{ hokMyProfiles: { items: HokProfile[] } }>(\n `query HokMyProfiles { hokMyProfiles { items { ${PROFILE_FIELDS} } } }`,\n {},\n apiGatewayUrl\n );\n return result.hokMyProfiles.items;\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 // hokChannelSchedule returns HokScheduleBlockConnection (items +\n // pageInfo + totalCount), not a bare list.\n const result = await hookmoviesQuery<{\n hokChannelSchedule: { items: HokScheduleBlock[] };\n }>(\n `query HokChannelSchedule($channelId: ID!, $from: DateTime, $to: DateTime) {\n hokChannelSchedule(channelId: $channelId, from: $from, to: $to) {\n items {\n ${SCHEDULE_BLOCK_FIELDS}\n }\n }\n }`,\n { channelId, from, to },\n apiGatewayUrl\n );\n return result.hokChannelSchedule.items;\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerPage.d.ts","sourceRoot":"","sources":["../../../../src/hookmovies/pages/consumer/PlayerPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAqD,MAAM,OAAO,CAAC;AA8FnF,eAAO,MAAM,UAAU,EAAE,EAwoBxB,CAAC"}
1
+ {"version":3,"file":"PlayerPage.d.ts","sourceRoot":"","sources":["../../../../src/hookmovies/pages/consumer/PlayerPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAqD,MAAM,OAAO,CAAC;AA8FnF,eAAO,MAAM,UAAU,EAAE,EAyoBxB,CAAC"}
@@ -30,7 +30,7 @@ var _ = 5, ye = .1, be = 1e4, xe = 15, Se = ({ localization: e }) => {
30
30
  default: e.isDefault
31
31
  });
32
32
  }, v = () => {
33
- let { titleId: f, episodeId: p } = ge(), { navigateTo: g } = e(), { data: v, isLoading: we, isError: Te, refetch: Ee } = a(f), S = t(f), C = n(f, p), w = r(f), De = i(), T = l(() => p ? v?.episodes.find((e) => e.id === p) ?? null : null, [p, v]), E = p ? void 0 : v?.videoFileId ?? void 0, D = o(E), O = o(v?.posterFileId ?? void 0), Oe = o(v?.backdropFileId ?? void 0), k = l(() => (C.data ?? []).filter((e) => e.kind === "SUBTITLE" || e.kind === "CAPTION"), [C.data]), ke = l(() => (C.data ?? []).filter((e) => e.kind === "DUB"), [C.data]), A = u(null), Ae = u(null), [j, M] = d(!1), [N, P] = d(0), [F, je] = d(0), [I, Me] = d(1), [L, Ne] = d(!1), [Pe, R] = d(!1), [z, Fe] = d(!1), [B, V] = d(!1), [Ie, Le] = d(!1), [Re, ze] = d(!0), [H, Be] = d("none"), [U, Ve] = d(-1), He = u(0), Ue = u(!1), We = u(!1), W = u(null), Ge = u(De.mutate);
33
+ let { titleId: f, episodeId: p } = ge(), { navigateTo: g } = e(), { data: v, isLoading: we, isError: Te, refetch: Ee } = a(f), S = t(f), C = n(f, p), w = r(f), De = i(), T = l(() => p ? v?.episodes.find((e) => e.id === p) ?? null : null, [p, v]), E = p ? T?.fileId ?? void 0 : v?.videoFileId ?? void 0, D = o(E), O = o(v?.posterFileId ?? void 0), Oe = o(v?.backdropFileId ?? void 0), k = l(() => (C.data ?? []).filter((e) => e.kind === "SUBTITLE" || e.kind === "CAPTION"), [C.data]), ke = l(() => (C.data ?? []).filter((e) => e.kind === "DUB"), [C.data]), A = u(null), Ae = u(null), [j, M] = d(!1), [N, P] = d(0), [F, je] = d(0), [I, Me] = d(1), [L, Ne] = d(!1), [Pe, R] = d(!1), [z, Fe] = d(!1), [B, V] = d(!1), [Ie, Le] = d(!1), [Re, ze] = d(!0), [H, Be] = d("none"), [U, Ve] = d(-1), He = u(0), Ue = u(!1), We = u(!1), W = u(null), Ge = u(De.mutate);
34
34
  Ge.current = De.mutate;
35
35
  let Ke = u(j);
36
36
  Ke.current = j;
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerPage.js","names":[],"sources":["../../../../src/hookmovies/pages/consumer/PlayerPage.tsx"],"sourcesContent":["/**\n * Player (Consumer)\n * @module hookmovies/pages/consumer\n *\n * A real, dependency-free HTML5 `<video>` player for a HookMovies title or a\n * specific episode. Routes:\n * /hookmovies/watch/:titleId\n * /hookmovies/watch/:titleId/episode/:episodeId\n *\n * Behaviour:\n * - Playback is GATED by `useCheckEntitlement(titleId)`. When the caller is not\n * entitled we render an honest \"where to watch\" panel that links back to the\n * title page — we never fabricate a player.\n * - When entitled, the `<video>` source is a presigned wspace-files URL resolved\n * from the title's `videoFileId` (movies) — see the note on episode sources\n * below. `.m3u8` sources rely on the browser's native HLS support (no player\n * library); everything else is a progressive MP4.\n * - Real subtitle / caption `<track>` elements are built from\n * `useLocalizations(titleId, episodeId)` (each track's `src` is a presigned\n * URL for its `fileId`); the default track is pre-selected.\n * - Custom, fully keyboard-accessible controls (no native chrome): play/pause,\n * a crimson (`action-primary`) scrubber, volume, a real subtitle/audio menu,\n * fullscreen and back. Cast / offline / quality are surfaced but disabled with\n * an honest tooltip because this player does not back them.\n * - Resume + heartbeat: on load we seek to `useMyWatchProgress(titleId)` and we\n * throttle `useRecordProgress` (~10s) while playing, marking `completed` near\n * the end and on `ended`, and saving once more on unmount / pause.\n *\n * NOTE on episode sources: the title-detail data layer (`useTitle`) exposes\n * episode summaries WITHOUT a media file reference, so a per-episode video URL\n * cannot be resolved from the current hooks. Rather than play the wrong asset,\n * the episode route shows the episode's context and an honest \"no video attached\"\n * state until the data layer surfaces an episode `fileId`.\n */\n\nimport { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n AlertCircle,\n ArrowLeft,\n Cast,\n Check,\n Download,\n Film,\n Loader2,\n Lock,\n Maximize,\n Minimize,\n Pause,\n Play,\n RotateCw,\n Settings,\n Subtitles,\n Volume1,\n Volume2,\n VolumeX,\n} from 'lucide-react';\n\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useCheckEntitlement,\n useLocalizations,\n useMyWatchProgress,\n useRecordProgress,\n useTitle,\n type HokLocalization,\n} from '../../hooks/useHookMoviesApi';\nimport { useFileUrl } from '../../hooks/useFiles';\n\n// ============================================================================\n// Small helpers\n// ============================================================================\n\n/** Seconds → `m:ss` or `h:mm:ss`. Non-finite (live / unknown) → `--:--`. */\nfunction formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '--:--';\n const total = Math.floor(seconds);\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n const two = (n: number) => n.toString().padStart(2, '0');\n return h > 0 ? `${h}:${two(m)}:${two(s)}` : `${m}:${two(s)}`;\n}\n\n/** ISO 639 code → human language name, with a graceful fallback. */\nfunction languageName(code: string): string {\n const trimmed = code.trim();\n if (!trimmed) return 'Unknown';\n try {\n const dn = new Intl.DisplayNames(['en'], { type: 'language' });\n return dn.of(trimmed) ?? trimmed.toUpperCase();\n } catch {\n return trimmed.toUpperCase();\n }\n}\n\nconst SEEK_STEP_SECONDS = 5;\nconst VOLUME_STEP = 0.1;\nconst SAVE_THROTTLE_MS = 10_000;\n/** Treat playback within this many seconds of the end as \"completed\". */\nconst COMPLETE_TAIL_SECONDS = 15;\n\n// ============================================================================\n// Subtitle track — resolves one localization's presigned URL into a <track>.\n// Rendered once per subtitle/caption localization (always present so the\n// video's `textTracks` indices stay aligned with `subtitleLocs`).\n// ============================================================================\n\nconst SubtitleTrack: FC<{ localization: HokLocalization }> = ({ localization }) => {\n const { data: url } = useFileUrl(localization.fileId);\n const label =\n localization.kind === 'CAPTION'\n ? `${languageName(localization.language)} (CC)`\n : languageName(localization.language);\n return (\n <track\n kind={localization.kind === 'CAPTION' ? 'captions' : 'subtitles'}\n label={label}\n srcLang={localization.language}\n src={url ?? undefined}\n default={localization.isDefault}\n />\n );\n};\n\n// ============================================================================\n// Player\n// ============================================================================\n\nexport const PlayerPage: FC = () => {\n const { titleId, episodeId } = useParams<{ titleId: string; episodeId?: string }>();\n const { navigateTo } = useHookMovies();\n\n // ── Data layer (all hooks unconditional; early returns happen after) ───────\n const { data: title, isLoading: titleLoading, isError: titleError, refetch } = useTitle(titleId);\n const entitlement = useCheckEntitlement(titleId);\n const localizations = useLocalizations(titleId, episodeId);\n const watchProgress = useMyWatchProgress(titleId);\n const recordProgress = useRecordProgress();\n\n const activeEpisode = useMemo(\n () => (episodeId ? (title?.episodes.find((e) => e.id === episodeId) ?? null) : null),\n [episodeId, title]\n );\n\n // Movies play the title's `videoFileId`. Episodes have no exposed media ref\n // (see file header) — so no source can be resolved for the episode route.\n const sourceFileId = episodeId ? undefined : (title?.videoFileId ?? undefined);\n const sourceUrlQuery = useFileUrl(sourceFileId);\n const posterUrlQuery = useFileUrl(title?.posterFileId ?? undefined);\n const backdropUrlQuery = useFileUrl(title?.backdropFileId ?? undefined);\n\n const subtitleLocs = useMemo(\n () => (localizations.data ?? []).filter((l) => l.kind === 'SUBTITLE' || l.kind === 'CAPTION'),\n [localizations.data]\n );\n const dubLocs = useMemo(\n () => (localizations.data ?? []).filter((l) => l.kind === 'DUB'),\n [localizations.data]\n );\n\n // ── Player element + UI state ──────────────────────────────────────────────\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [muted, setMuted] = useState(false);\n const [buffering, setBuffering] = useState(false);\n const [metadataLoaded, setMetadataLoaded] = useState(false);\n const [playbackError, setPlaybackError] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [controlsVisible, setControlsVisible] = useState(true);\n const [openMenu, setOpenMenu] = useState<'none' | 'subtitles' | 'settings'>('none');\n const [selectedSubIdx, setSelectedSubIdx] = useState(-1);\n\n // ── Refs for values consumed inside stable callbacks / cleanup ─────────────\n const lastSaveRef = useRef(0);\n const resumeAppliedRef = useRef(false);\n const defaultSubAppliedRef = useRef(false);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const recordRef = useRef(recordProgress.mutate);\n recordRef.current = recordProgress.mutate;\n const isPlayingRef = useRef(isPlaying);\n isPlayingRef.current = isPlaying;\n\n const sourceUrl = sourceFileId ? (sourceUrlQuery.data ?? null) : null;\n const isHls = Boolean(sourceUrl && sourceUrl.split('?')[0]?.toLowerCase().endsWith('.m3u8'));\n const hasTextTracks = subtitleLocs.length > 0;\n const isLive = !Number.isFinite(duration) || duration === 0;\n\n // ── Progress persistence ───────────────────────────────────────────────────\n const saveProgress = useCallback(\n (completed: boolean) => {\n const v = videoRef.current;\n if (!v || !titleId) return;\n const pos = Math.floor(v.currentTime);\n if (pos <= 0 && !completed) return;\n recordRef.current({\n titleId,\n episodeId,\n positionSeconds: pos,\n completed,\n lastDevice: 'web',\n });\n lastSaveRef.current = Date.now();\n },\n [titleId, episodeId]\n );\n\n // Save once more when leaving the player (covers navigation / tab close).\n useEffect(() => {\n return () => {\n if (isPlayingRef.current) saveProgress(false);\n };\n }, [saveProgress]);\n\n // ── Resume: seek to the caller's saved position once metadata + progress are\n // both settled (runs a single time). ────────────────────────────────────\n useEffect(() => {\n const v = videoRef.current;\n if (!v || resumeAppliedRef.current || !metadataLoaded || watchProgress.isLoading) return;\n resumeAppliedRef.current = true;\n const match = (watchProgress.data ?? []).find((p) =>\n episodeId ? p.episodeId === episodeId : !p.episodeId\n );\n if (\n match &&\n !match.completed &&\n match.positionSeconds > SEEK_STEP_SECONDS &&\n Number.isFinite(v.duration) &&\n match.positionSeconds < v.duration - SEEK_STEP_SECONDS\n ) {\n v.currentTime = match.positionSeconds;\n setCurrentTime(match.positionSeconds);\n }\n }, [metadataLoaded, watchProgress.isLoading, watchProgress.data, episodeId]);\n\n // ── Pre-select the default subtitle track once localizations arrive. ───────\n useEffect(() => {\n if (defaultSubAppliedRef.current || subtitleLocs.length === 0) return;\n defaultSubAppliedRef.current = true;\n setSelectedSubIdx(subtitleLocs.findIndex((l) => l.isDefault));\n }, [subtitleLocs]);\n\n // ── Apply the selected text-track mode to the media element. ───────────────\n const applyTextTracks = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n const tracks = v.textTracks;\n for (let i = 0; i < tracks.length; i += 1) {\n tracks[i].mode = i === selectedSubIdx ? 'showing' : 'disabled';\n }\n }, [selectedSubIdx]);\n\n useEffect(() => {\n applyTextTracks();\n }, [applyTextTracks, subtitleLocs.length, metadataLoaded]);\n\n // ── Fullscreen state sync ──────────────────────────────────────────────────\n useEffect(() => {\n const onChange = () => setIsFullscreen(Boolean(document.fullscreenElement));\n document.addEventListener('fullscreenchange', onChange);\n return () => document.removeEventListener('fullscreenchange', onChange);\n }, []);\n\n // ── Controls auto-hide ─────────────────────────────────────────────────────\n const revealControls = useCallback(() => {\n setControlsVisible(true);\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(() => {\n if (isPlayingRef.current && openMenu === 'none') setControlsVisible(false);\n }, 3000);\n }, [openMenu]);\n\n useEffect(() => {\n return () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n };\n }, []);\n\n // ── Media element imperatives ──────────────────────────────────────────────\n const togglePlay = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n if (v.paused) {\n void v.play().catch(() => setPlaybackError(true));\n } else {\n v.pause();\n }\n }, []);\n\n const seekBy = useCallback((delta: number) => {\n const v = videoRef.current;\n if (!v || !Number.isFinite(v.duration)) return;\n v.currentTime = Math.min(Math.max(v.currentTime + delta, 0), v.duration);\n setCurrentTime(v.currentTime);\n }, []);\n\n const seekTo = useCallback((value: number) => {\n const v = videoRef.current;\n if (!v) return;\n v.currentTime = value;\n setCurrentTime(value);\n }, []);\n\n const changeVolume = useCallback((value: number) => {\n const v = videoRef.current;\n if (!v) return;\n const clamped = Math.min(Math.max(value, 0), 1);\n v.volume = clamped;\n v.muted = clamped === 0;\n setVolume(clamped);\n setMuted(clamped === 0);\n }, []);\n\n const toggleMute = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n const next = !v.muted;\n v.muted = next;\n setMuted(next);\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n if (!document.fullscreenElement) {\n void el.requestFullscreen?.().catch(() => undefined);\n } else {\n void document.exitFullscreen?.().catch(() => undefined);\n }\n }, []);\n\n // ── Keyboard controls (space / arrows / f / m) ─────────────────────────────\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Don't hijack typing in the (rare) focusable control.\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'BUTTON') {\n if (e.key !== ' ' && e.key !== 'k') return;\n }\n switch (e.key) {\n case ' ':\n case 'k':\n e.preventDefault();\n togglePlay();\n revealControls();\n break;\n case 'ArrowRight':\n e.preventDefault();\n seekBy(SEEK_STEP_SECONDS);\n revealControls();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n seekBy(-SEEK_STEP_SECONDS);\n revealControls();\n break;\n case 'ArrowUp':\n e.preventDefault();\n changeVolume(volume + VOLUME_STEP);\n revealControls();\n break;\n case 'ArrowDown':\n e.preventDefault();\n changeVolume(volume - VOLUME_STEP);\n revealControls();\n break;\n case 'f':\n case 'F':\n e.preventDefault();\n toggleFullscreen();\n break;\n case 'm':\n case 'M':\n e.preventDefault();\n toggleMute();\n revealControls();\n break;\n default:\n break;\n }\n },\n [togglePlay, seekBy, changeVolume, toggleFullscreen, toggleMute, revealControls, volume]\n );\n\n // ── Media element event handlers ───────────────────────────────────────────\n const handleTimeUpdate = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n setCurrentTime(v.currentTime);\n if (!v.paused && Date.now() - lastSaveRef.current >= SAVE_THROTTLE_MS) {\n const nearEnd =\n Number.isFinite(v.duration) && v.currentTime >= v.duration - COMPLETE_TAIL_SECONDS;\n saveProgress(nearEnd);\n }\n }, [saveProgress]);\n\n const handleLoadedMetadata = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n setDuration(v.duration);\n setMetadataLoaded(true);\n setPlaybackError(false);\n applyTextTracks();\n }, [applyTextTracks]);\n\n const handleEnded = useCallback(() => {\n setIsPlaying(false);\n saveProgress(true);\n }, [saveProgress]);\n\n // ── Early returns (after every hook above) ─────────────────────────────────\n const backToTitle = () => navigateTo(`title/${titleId ?? ''}`);\n\n if (titleLoading || entitlement.isLoading) {\n return (\n <PlayerStage>\n <div className=\"flex flex-col items-center gap-3 text-text-inverse\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm opacity-80\">Loading…</p>\n </div>\n </PlayerStage>\n );\n }\n\n if (titleError || !title) {\n return (\n <PlayerStage>\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Title unavailable\"\n message=\"We couldn't load this title. It may have been removed or you may not have access.\"\n primary={{ label: 'Retry', onClick: () => void refetch() }}\n />\n </PlayerStage>\n );\n }\n\n if (entitlement.isError) {\n return (\n <PlayerStage>\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Couldn't verify access\"\n message=\"We couldn't check your entitlement for this title. Please try again.\"\n primary={{ label: 'Retry', onClick: () => void entitlement.refetch() }}\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </PlayerStage>\n );\n }\n\n // Entitlement gate — no fake player when the viewer can't watch.\n if (!entitlement.data?.entitled) {\n return (\n <PlayerStage backdrop={backdropUrlQuery.data ?? posterUrlQuery.data ?? null}>\n <div className=\"mx-auto flex max-w-md flex-col items-center gap-5 text-center text-text-inverse\">\n {posterUrlQuery.data ? (\n <img\n src={posterUrlQuery.data}\n alt={`Poster for ${title.title}`}\n className=\"h-48 w-32 rounded-lg object-cover shadow-lg\"\n />\n ) : (\n <div className=\"flex h-48 w-32 items-center justify-center rounded-lg bg-bg-overlay\">\n <Film className=\"h-10 w-10 opacity-70\" />\n </div>\n )}\n <div className=\"flex items-center gap-2 rounded-full bg-bg-overlay px-3 py-1 text-xs font-medium\">\n <Lock className=\"h-3.5 w-3.5\" />\n Not available to watch yet\n </div>\n <div>\n <h1 className=\"text-xl font-semibold\">{title.title}</h1>\n <p className=\"mt-2 text-sm opacity-80\">\n You don&apos;t have an active entitlement for this title. Open the title page to see\n where and how to watch, or to acquire access.\n </p>\n </div>\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <button\n type=\"button\"\n onClick={backToTitle}\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 hover:opacity-90 motion-safe:transition-opacity\"\n >\n Where to watch\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('browse')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-text-inverse/30 px-4 py-2 text-sm font-medium text-text-inverse hover:bg-bg-overlay motion-safe:transition-colors\"\n >\n Browse catalog\n </button>\n </div>\n </div>\n </PlayerStage>\n );\n }\n\n const heading = activeEpisode\n ? `${title.title} — E${activeEpisode.number} · ${activeEpisode.name}`\n : title.title;\n\n const sourceResolving = Boolean(sourceFileId) && sourceUrlQuery.isLoading;\n const noSource = !sourceFileId || (!sourceUrlQuery.isLoading && !sourceUrl);\n\n const VolumeIcon = muted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n const progressPct = duration > 0 ? Math.min((currentTime / duration) * 100, 100) : 0;\n\n return (\n <div className=\"flex h-full flex-col bg-bg-inverse\">\n {/* Top bar */}\n <div className=\"flex items-center gap-3 px-4 py-3 sm:px-6\">\n <button\n type=\"button\"\n onClick={backToTitle}\n className=\"inline-flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm font-medium text-text-inverse/90 hover:bg-bg-overlay motion-safe:transition-colors\"\n aria-label=\"Back to title\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back</span>\n </button>\n <h1 className=\"min-w-0 flex-1 truncate text-sm font-semibold text-text-inverse sm:text-base\">\n {heading}\n </h1>\n </div>\n\n {/* Stage */}\n <div className=\"flex flex-1 items-center justify-center px-0 sm:px-6 sm:pb-6\">\n <div\n ref={containerRef}\n className=\"group relative aspect-video w-full max-w-6xl overflow-hidden bg-bg-inverse sm:rounded-xl\"\n onMouseMove={revealControls}\n onKeyDown={onKeyDown}\n onClick={(e) => {\n if (e.target === videoRef.current) togglePlay();\n }}\n tabIndex={0}\n role=\"region\"\n aria-label={`Video player for ${heading}`}\n >\n {noSource ? (\n <div className=\"absolute inset-0 flex items-center justify-center p-6\">\n <StageMessage\n icon={<Film className=\"h-12 w-12\" />}\n title={activeEpisode ? 'Episode video not available' : 'No video attached'}\n message={\n activeEpisode\n ? 'This episode does not have a playable video file attached yet.'\n : 'This title does not have a playable video file attached yet.'\n }\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </div>\n ) : (\n <>\n {/* Caption <track>s are added dynamically from localizations below. */}\n <video\n ref={videoRef}\n className=\"h-full w-full bg-bg-inverse\"\n src={sourceUrl ?? undefined}\n poster={posterUrlQuery.data ?? undefined}\n crossOrigin={hasTextTracks ? 'anonymous' : undefined}\n playsInline\n preload=\"metadata\"\n onLoadedMetadata={handleLoadedMetadata}\n onDurationChange={() => {\n const v = videoRef.current;\n if (v) setDuration(v.duration);\n }}\n onTimeUpdate={handleTimeUpdate}\n onPlay={() => {\n setIsPlaying(true);\n revealControls();\n }}\n onPause={() => {\n setIsPlaying(false);\n setControlsVisible(true);\n saveProgress(false);\n }}\n onEnded={handleEnded}\n onWaiting={() => setBuffering(true)}\n onPlaying={() => setBuffering(false)}\n onCanPlay={() => setBuffering(false)}\n onError={() => setPlaybackError(true)}\n >\n {subtitleLocs.map((loc) => (\n <SubtitleTrack key={loc.id} localization={loc} />\n ))}\n </video>\n\n {/* Buffering / resolving overlay */}\n {(buffering || sourceResolving) && !playbackError && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-inverse\" />\n </div>\n )}\n\n {/* Playback error overlay */}\n {playbackError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-overlay-scrim p-6\">\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Playback failed\"\n message={\n isHls\n ? 'This stream is HLS (.m3u8) and your browser could not play it natively. Try a browser with native HLS support.'\n : 'We could not play this video. The link may have expired — reload to try again.'\n }\n primary={{\n label: 'Reload',\n onClick: () => {\n setPlaybackError(false);\n void sourceUrlQuery.refetch();\n },\n }}\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </div>\n )}\n\n {/* Center play affordance when paused */}\n {!isPlaying && !buffering && !playbackError && metadataLoaded && (\n <button\n type=\"button\"\n onClick={togglePlay}\n aria-label=\"Play\"\n className=\"absolute inset-0 flex items-center justify-center\"\n >\n <span className=\"flex h-16 w-16 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-lg motion-safe:transition-transform group-hover:scale-105\">\n <Play className=\"ml-1 h-7 w-7\" />\n </span>\n </button>\n )}\n\n {/* Control bar */}\n <div\n className={`absolute inset-x-0 bottom-0 bg-overlay-scrim px-3 pb-3 pt-10 motion-safe:transition-opacity motion-safe:duration-300 sm:px-4 ${\n controlsVisible || !isPlaying ? 'opacity-100' : 'pointer-events-none opacity-0'\n }`}\n >\n {/* Scrubber */}\n <div className=\"mb-2 flex items-center gap-3\">\n <span className=\"w-12 shrink-0 text-right text-xs tabular-nums text-text-inverse/90\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1\">\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-text-inverse/25\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg\"\n style={{ width: `${progressPct}%` }}\n />\n </div>\n <input\n type=\"range\"\n min={0}\n max={Number.isFinite(duration) && duration > 0 ? duration : 0}\n step=\"any\"\n value={currentTime}\n disabled={isLive}\n onChange={(e) => seekTo(Number(e.target.value))}\n aria-label=\"Seek\"\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed\"\n style={{ accentColor: 'var(--color-action-primary-bg)' }}\n />\n </div>\n <span className=\"w-12 shrink-0 text-xs tabular-nums text-text-inverse/70\">\n {isLive ? 'LIVE' : formatTime(duration)}\n </span>\n </div>\n\n {/* Buttons */}\n <div className=\"flex items-center gap-1 sm:gap-2\">\n <ControlButton label={isPlaying ? 'Pause' : 'Play'} onClick={togglePlay}>\n {isPlaying ? <Pause className=\"h-5 w-5\" /> : <Play className=\"h-5 w-5\" />}\n </ControlButton>\n\n {/* Volume */}\n <div className=\"flex items-center gap-1.5\">\n <ControlButton label={muted ? 'Unmute' : 'Mute'} onClick={toggleMute}>\n <VolumeIcon className=\"h-5 w-5\" />\n </ControlButton>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n value={muted ? 0 : volume}\n onChange={(e) => changeVolume(Number(e.target.value))}\n aria-label=\"Volume\"\n className=\"hidden h-1 w-20 cursor-pointer sm:block\"\n style={{ accentColor: 'var(--color-action-primary-bg)' }}\n />\n </div>\n\n <div className=\"ml-auto flex items-center gap-1 sm:gap-2\">\n {/* Subtitle / audio menu */}\n <div className=\"relative\">\n <ControlButton\n label=\"Subtitles & audio\"\n onClick={() =>\n setOpenMenu((m) => (m === 'subtitles' ? 'none' : 'subtitles'))\n }\n active={selectedSubIdx >= 0}\n expanded={openMenu === 'subtitles'}\n disabled={subtitleLocs.length === 0 && dubLocs.length === 0}\n disabledHint=\"No subtitle or audio tracks available for this title.\"\n >\n <Subtitles className=\"h-5 w-5\" />\n </ControlButton>\n {openMenu === 'subtitles' && (\n <TrackMenu\n subtitleLocs={subtitleLocs}\n dubLocs={dubLocs}\n selectedSubIdx={selectedSubIdx}\n onSelectSub={(idx) => {\n setSelectedSubIdx(idx);\n setOpenMenu('none');\n }}\n />\n )}\n </div>\n\n {/* Settings (quality) — honestly disabled */}\n <ControlButton\n label=\"Quality\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Adaptive quality selection isn't available for this source.\"\n >\n <Settings className=\"h-5 w-5\" />\n </ControlButton>\n\n {/* Cast — honestly disabled */}\n <ControlButton\n label=\"Cast\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Casting to external devices isn't supported in this player.\"\n >\n <Cast className=\"h-5 w-5\" />\n </ControlButton>\n\n {/* Offline / download — honestly disabled */}\n <ControlButton\n label=\"Download for offline\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Offline downloads aren't available for this title.\"\n >\n <Download className=\"h-5 w-5\" />\n </ControlButton>\n\n <ControlButton\n label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n onClick={toggleFullscreen}\n >\n {isFullscreen ? (\n <Minimize className=\"h-5 w-5\" />\n ) : (\n <Maximize className=\"h-5 w-5\" />\n )}\n </ControlButton>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// Presentational sub-components (kept local to the player surface)\n// ============================================================================\n\n/** Full-bleed dark stage used for loading / gated / error states. */\nconst PlayerStage: FC<{ children: React.ReactNode; backdrop?: string | null }> = ({\n children,\n backdrop,\n}) => (\n <div className=\"relative flex h-full min-h-[60vh] items-center justify-center overflow-hidden bg-bg-inverse p-6\">\n {backdrop && (\n <>\n <img\n src={backdrop}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 h-full w-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-overlay-scrim\" />\n </>\n )}\n <div className=\"relative z-10 w-full\">{children}</div>\n </div>\n);\n\ninterface StageAction {\n label: string;\n onClick: () => void;\n}\n\n/** Centered icon + copy + up to two actions, styled for the dark stage. */\nconst StageMessage: FC<{\n icon: React.ReactNode;\n title: string;\n message: string;\n primary?: StageAction;\n secondary?: StageAction;\n}> = ({ icon, title, message, primary, secondary }) => (\n <div className=\"mx-auto flex max-w-md flex-col items-center gap-4 text-center text-text-inverse\">\n <span className=\"text-text-inverse/80\">{icon}</span>\n <div>\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mt-1 text-sm opacity-80\">{message}</p>\n </div>\n {(primary || secondary) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {primary && (\n <button\n type=\"button\"\n onClick={primary.onClick}\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 hover:opacity-90 motion-safe:transition-opacity\"\n >\n <RotateCw className=\"h-4 w-4\" />\n {primary.label}\n </button>\n )}\n {secondary && (\n <button\n type=\"button\"\n onClick={secondary.onClick}\n className=\"inline-flex items-center gap-2 rounded-lg border border-text-inverse/30 px-4 py-2 text-sm font-medium text-text-inverse hover:bg-bg-overlay motion-safe:transition-colors\"\n >\n {secondary.label}\n </button>\n )}\n </div>\n )}\n </div>\n);\n\n/** A single icon control on the dark control bar. */\nconst ControlButton: FC<{\n label: string;\n onClick: () => void;\n children: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n disabledHint?: string;\n expanded?: boolean;\n}> = ({ label, onClick, children, active, disabled, disabledHint, expanded }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n title={disabled && disabledHint ? disabledHint : label}\n className={`relative rounded-lg p-2 motion-safe:transition-colors ${\n disabled ? 'cursor-not-allowed text-text-inverse/40' : 'text-text-inverse hover:bg-bg-overlay'\n }`}\n >\n {children}\n {active && !disabled && (\n <span className=\"absolute bottom-0.5 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-action-primary-bg\" />\n )}\n </button>\n);\n\n/** Popover listing real subtitle/caption tracks + (honest, disabled) dub tracks. */\nconst TrackMenu: FC<{\n subtitleLocs: HokLocalization[];\n dubLocs: HokLocalization[];\n selectedSubIdx: number;\n onSelectSub: (idx: number) => void;\n}> = ({ subtitleLocs, dubLocs, selectedSubIdx, onSelectSub }) => (\n <div\n role=\"menu\"\n aria-label=\"Subtitles and audio\"\n className=\"absolute bottom-full right-0 mb-2 max-h-72 w-56 overflow-y-auto rounded-lg border border-border-seam bg-bg-surface p-1.5 shadow-lg\"\n >\n <p className=\"px-2 py-1 text-[11px] font-semibold uppercase tracking-wide text-text-secondary\">\n Subtitles\n </p>\n <MenuRow label=\"Off\" selected={selectedSubIdx === -1} onClick={() => onSelectSub(-1)} />\n {subtitleLocs.map((loc, idx) => (\n <MenuRow\n key={loc.id}\n label={\n loc.kind === 'CAPTION' ? `${languageName(loc.language)} (CC)` : languageName(loc.language)\n }\n selected={selectedSubIdx === idx}\n onClick={() => onSelectSub(idx)}\n />\n ))}\n\n {dubLocs.length > 0 && (\n <>\n <p className=\"mt-1 px-2 py-1 text-[11px] font-semibold uppercase tracking-wide text-text-secondary\">\n Audio (dub)\n </p>\n {dubLocs.map((loc) => (\n <button\n key={loc.id}\n type=\"button\"\n role=\"menuitem\"\n disabled\n title=\"Alternate dub tracks are separate assets and can't be switched in this player.\"\n className=\"flex w-full cursor-not-allowed items-center justify-between rounded-md px-2 py-1.5 text-left text-sm text-text-disabled\"\n >\n <span>{languageName(loc.language)}</span>\n <Lock className=\"h-3.5 w-3.5\" />\n </button>\n ))}\n </>\n )}\n </div>\n);\n\nconst MenuRow: FC<{ label: string; selected: boolean; onClick: () => void }> = ({\n label,\n selected,\n onClick,\n}) => (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n onClick={onClick}\n className={`flex w-full items-center justify-between rounded-md px-2 py-1.5 text-left text-sm motion-safe:transition-colors ${\n selected\n ? 'bg-bg-sunken font-medium text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n }`}\n >\n <span className=\"truncate\">{label}</span>\n {selected && <Check className=\"h-4 w-4 shrink-0 text-action-primary-bg\" />}\n </button>\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"PlayerPage.js","names":[],"sources":["../../../../src/hookmovies/pages/consumer/PlayerPage.tsx"],"sourcesContent":["/**\n * Player (Consumer)\n * @module hookmovies/pages/consumer\n *\n * A real, dependency-free HTML5 `<video>` player for a HookMovies title or a\n * specific episode. Routes:\n * /hookmovies/watch/:titleId\n * /hookmovies/watch/:titleId/episode/:episodeId\n *\n * Behaviour:\n * - Playback is GATED by `useCheckEntitlement(titleId)`. When the caller is not\n * entitled we render an honest \"where to watch\" panel that links back to the\n * title page — we never fabricate a player.\n * - When entitled, the `<video>` source is a presigned wspace-files URL resolved\n * from the title's `videoFileId` (movies) — see the note on episode sources\n * below. `.m3u8` sources rely on the browser's native HLS support (no player\n * library); everything else is a progressive MP4.\n * - Real subtitle / caption `<track>` elements are built from\n * `useLocalizations(titleId, episodeId)` (each track's `src` is a presigned\n * URL for its `fileId`); the default track is pre-selected.\n * - Custom, fully keyboard-accessible controls (no native chrome): play/pause,\n * a crimson (`action-primary`) scrubber, volume, a real subtitle/audio menu,\n * fullscreen and back. Cast / offline / quality are surfaced but disabled with\n * an honest tooltip because this player does not back them.\n * - Resume + heartbeat: on load we seek to `useMyWatchProgress(titleId)` and we\n * throttle `useRecordProgress` (~10s) while playing, marking `completed` near\n * the end and on `ended`, and saving once more on unmount / pause.\n *\n * Movies resolve `title.videoFileId`; episodes resolve the active episode's own\n * `fileId` (from `HokEpisode.file`, surfaced by `useTitle`). If an episode has no\n * file attached yet, we show an honest \"no video attached\" state rather than\n * falling back to the movie/other-episode asset.\n */\n\nimport { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n AlertCircle,\n ArrowLeft,\n Cast,\n Check,\n Download,\n Film,\n Loader2,\n Lock,\n Maximize,\n Minimize,\n Pause,\n Play,\n RotateCw,\n Settings,\n Subtitles,\n Volume1,\n Volume2,\n VolumeX,\n} from 'lucide-react';\n\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useCheckEntitlement,\n useLocalizations,\n useMyWatchProgress,\n useRecordProgress,\n useTitle,\n type HokLocalization,\n} from '../../hooks/useHookMoviesApi';\nimport { useFileUrl } from '../../hooks/useFiles';\n\n// ============================================================================\n// Small helpers\n// ============================================================================\n\n/** Seconds → `m:ss` or `h:mm:ss`. Non-finite (live / unknown) → `--:--`. */\nfunction formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '--:--';\n const total = Math.floor(seconds);\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n const two = (n: number) => n.toString().padStart(2, '0');\n return h > 0 ? `${h}:${two(m)}:${two(s)}` : `${m}:${two(s)}`;\n}\n\n/** ISO 639 code → human language name, with a graceful fallback. */\nfunction languageName(code: string): string {\n const trimmed = code.trim();\n if (!trimmed) return 'Unknown';\n try {\n const dn = new Intl.DisplayNames(['en'], { type: 'language' });\n return dn.of(trimmed) ?? trimmed.toUpperCase();\n } catch {\n return trimmed.toUpperCase();\n }\n}\n\nconst SEEK_STEP_SECONDS = 5;\nconst VOLUME_STEP = 0.1;\nconst SAVE_THROTTLE_MS = 10_000;\n/** Treat playback within this many seconds of the end as \"completed\". */\nconst COMPLETE_TAIL_SECONDS = 15;\n\n// ============================================================================\n// Subtitle track — resolves one localization's presigned URL into a <track>.\n// Rendered once per subtitle/caption localization (always present so the\n// video's `textTracks` indices stay aligned with `subtitleLocs`).\n// ============================================================================\n\nconst SubtitleTrack: FC<{ localization: HokLocalization }> = ({ localization }) => {\n const { data: url } = useFileUrl(localization.fileId);\n const label =\n localization.kind === 'CAPTION'\n ? `${languageName(localization.language)} (CC)`\n : languageName(localization.language);\n return (\n <track\n kind={localization.kind === 'CAPTION' ? 'captions' : 'subtitles'}\n label={label}\n srcLang={localization.language}\n src={url ?? undefined}\n default={localization.isDefault}\n />\n );\n};\n\n// ============================================================================\n// Player\n// ============================================================================\n\nexport const PlayerPage: FC = () => {\n const { titleId, episodeId } = useParams<{ titleId: string; episodeId?: string }>();\n const { navigateTo } = useHookMovies();\n\n // ── Data layer (all hooks unconditional; early returns happen after) ───────\n const { data: title, isLoading: titleLoading, isError: titleError, refetch } = useTitle(titleId);\n const entitlement = useCheckEntitlement(titleId);\n const localizations = useLocalizations(titleId, episodeId);\n const watchProgress = useMyWatchProgress(titleId);\n const recordProgress = useRecordProgress();\n\n const activeEpisode = useMemo(\n () => (episodeId ? (title?.episodes.find((e) => e.id === episodeId) ?? null) : null),\n [episodeId, title]\n );\n\n // Movies play the title's `videoFileId`; episodes play their own `fileId`.\n const sourceFileId = episodeId\n ? (activeEpisode?.fileId ?? undefined)\n : (title?.videoFileId ?? undefined);\n const sourceUrlQuery = useFileUrl(sourceFileId);\n const posterUrlQuery = useFileUrl(title?.posterFileId ?? undefined);\n const backdropUrlQuery = useFileUrl(title?.backdropFileId ?? undefined);\n\n const subtitleLocs = useMemo(\n () => (localizations.data ?? []).filter((l) => l.kind === 'SUBTITLE' || l.kind === 'CAPTION'),\n [localizations.data]\n );\n const dubLocs = useMemo(\n () => (localizations.data ?? []).filter((l) => l.kind === 'DUB'),\n [localizations.data]\n );\n\n // ── Player element + UI state ──────────────────────────────────────────────\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [muted, setMuted] = useState(false);\n const [buffering, setBuffering] = useState(false);\n const [metadataLoaded, setMetadataLoaded] = useState(false);\n const [playbackError, setPlaybackError] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [controlsVisible, setControlsVisible] = useState(true);\n const [openMenu, setOpenMenu] = useState<'none' | 'subtitles' | 'settings'>('none');\n const [selectedSubIdx, setSelectedSubIdx] = useState(-1);\n\n // ── Refs for values consumed inside stable callbacks / cleanup ─────────────\n const lastSaveRef = useRef(0);\n const resumeAppliedRef = useRef(false);\n const defaultSubAppliedRef = useRef(false);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const recordRef = useRef(recordProgress.mutate);\n recordRef.current = recordProgress.mutate;\n const isPlayingRef = useRef(isPlaying);\n isPlayingRef.current = isPlaying;\n\n const sourceUrl = sourceFileId ? (sourceUrlQuery.data ?? null) : null;\n const isHls = Boolean(sourceUrl && sourceUrl.split('?')[0]?.toLowerCase().endsWith('.m3u8'));\n const hasTextTracks = subtitleLocs.length > 0;\n const isLive = !Number.isFinite(duration) || duration === 0;\n\n // ── Progress persistence ───────────────────────────────────────────────────\n const saveProgress = useCallback(\n (completed: boolean) => {\n const v = videoRef.current;\n if (!v || !titleId) return;\n const pos = Math.floor(v.currentTime);\n if (pos <= 0 && !completed) return;\n recordRef.current({\n titleId,\n episodeId,\n positionSeconds: pos,\n completed,\n lastDevice: 'web',\n });\n lastSaveRef.current = Date.now();\n },\n [titleId, episodeId]\n );\n\n // Save once more when leaving the player (covers navigation / tab close).\n useEffect(() => {\n return () => {\n if (isPlayingRef.current) saveProgress(false);\n };\n }, [saveProgress]);\n\n // ── Resume: seek to the caller's saved position once metadata + progress are\n // both settled (runs a single time). ────────────────────────────────────\n useEffect(() => {\n const v = videoRef.current;\n if (!v || resumeAppliedRef.current || !metadataLoaded || watchProgress.isLoading) return;\n resumeAppliedRef.current = true;\n const match = (watchProgress.data ?? []).find((p) =>\n episodeId ? p.episodeId === episodeId : !p.episodeId\n );\n if (\n match &&\n !match.completed &&\n match.positionSeconds > SEEK_STEP_SECONDS &&\n Number.isFinite(v.duration) &&\n match.positionSeconds < v.duration - SEEK_STEP_SECONDS\n ) {\n v.currentTime = match.positionSeconds;\n setCurrentTime(match.positionSeconds);\n }\n }, [metadataLoaded, watchProgress.isLoading, watchProgress.data, episodeId]);\n\n // ── Pre-select the default subtitle track once localizations arrive. ───────\n useEffect(() => {\n if (defaultSubAppliedRef.current || subtitleLocs.length === 0) return;\n defaultSubAppliedRef.current = true;\n setSelectedSubIdx(subtitleLocs.findIndex((l) => l.isDefault));\n }, [subtitleLocs]);\n\n // ── Apply the selected text-track mode to the media element. ───────────────\n const applyTextTracks = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n const tracks = v.textTracks;\n for (let i = 0; i < tracks.length; i += 1) {\n tracks[i].mode = i === selectedSubIdx ? 'showing' : 'disabled';\n }\n }, [selectedSubIdx]);\n\n useEffect(() => {\n applyTextTracks();\n }, [applyTextTracks, subtitleLocs.length, metadataLoaded]);\n\n // ── Fullscreen state sync ──────────────────────────────────────────────────\n useEffect(() => {\n const onChange = () => setIsFullscreen(Boolean(document.fullscreenElement));\n document.addEventListener('fullscreenchange', onChange);\n return () => document.removeEventListener('fullscreenchange', onChange);\n }, []);\n\n // ── Controls auto-hide ─────────────────────────────────────────────────────\n const revealControls = useCallback(() => {\n setControlsVisible(true);\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(() => {\n if (isPlayingRef.current && openMenu === 'none') setControlsVisible(false);\n }, 3000);\n }, [openMenu]);\n\n useEffect(() => {\n return () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n };\n }, []);\n\n // ── Media element imperatives ──────────────────────────────────────────────\n const togglePlay = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n if (v.paused) {\n void v.play().catch(() => setPlaybackError(true));\n } else {\n v.pause();\n }\n }, []);\n\n const seekBy = useCallback((delta: number) => {\n const v = videoRef.current;\n if (!v || !Number.isFinite(v.duration)) return;\n v.currentTime = Math.min(Math.max(v.currentTime + delta, 0), v.duration);\n setCurrentTime(v.currentTime);\n }, []);\n\n const seekTo = useCallback((value: number) => {\n const v = videoRef.current;\n if (!v) return;\n v.currentTime = value;\n setCurrentTime(value);\n }, []);\n\n const changeVolume = useCallback((value: number) => {\n const v = videoRef.current;\n if (!v) return;\n const clamped = Math.min(Math.max(value, 0), 1);\n v.volume = clamped;\n v.muted = clamped === 0;\n setVolume(clamped);\n setMuted(clamped === 0);\n }, []);\n\n const toggleMute = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n const next = !v.muted;\n v.muted = next;\n setMuted(next);\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n if (!document.fullscreenElement) {\n void el.requestFullscreen?.().catch(() => undefined);\n } else {\n void document.exitFullscreen?.().catch(() => undefined);\n }\n }, []);\n\n // ── Keyboard controls (space / arrows / f / m) ─────────────────────────────\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Don't hijack typing in the (rare) focusable control.\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'BUTTON') {\n if (e.key !== ' ' && e.key !== 'k') return;\n }\n switch (e.key) {\n case ' ':\n case 'k':\n e.preventDefault();\n togglePlay();\n revealControls();\n break;\n case 'ArrowRight':\n e.preventDefault();\n seekBy(SEEK_STEP_SECONDS);\n revealControls();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n seekBy(-SEEK_STEP_SECONDS);\n revealControls();\n break;\n case 'ArrowUp':\n e.preventDefault();\n changeVolume(volume + VOLUME_STEP);\n revealControls();\n break;\n case 'ArrowDown':\n e.preventDefault();\n changeVolume(volume - VOLUME_STEP);\n revealControls();\n break;\n case 'f':\n case 'F':\n e.preventDefault();\n toggleFullscreen();\n break;\n case 'm':\n case 'M':\n e.preventDefault();\n toggleMute();\n revealControls();\n break;\n default:\n break;\n }\n },\n [togglePlay, seekBy, changeVolume, toggleFullscreen, toggleMute, revealControls, volume]\n );\n\n // ── Media element event handlers ───────────────────────────────────────────\n const handleTimeUpdate = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n setCurrentTime(v.currentTime);\n if (!v.paused && Date.now() - lastSaveRef.current >= SAVE_THROTTLE_MS) {\n const nearEnd =\n Number.isFinite(v.duration) && v.currentTime >= v.duration - COMPLETE_TAIL_SECONDS;\n saveProgress(nearEnd);\n }\n }, [saveProgress]);\n\n const handleLoadedMetadata = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n setDuration(v.duration);\n setMetadataLoaded(true);\n setPlaybackError(false);\n applyTextTracks();\n }, [applyTextTracks]);\n\n const handleEnded = useCallback(() => {\n setIsPlaying(false);\n saveProgress(true);\n }, [saveProgress]);\n\n // ── Early returns (after every hook above) ─────────────────────────────────\n const backToTitle = () => navigateTo(`title/${titleId ?? ''}`);\n\n if (titleLoading || entitlement.isLoading) {\n return (\n <PlayerStage>\n <div className=\"flex flex-col items-center gap-3 text-text-inverse\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm opacity-80\">Loading…</p>\n </div>\n </PlayerStage>\n );\n }\n\n if (titleError || !title) {\n return (\n <PlayerStage>\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Title unavailable\"\n message=\"We couldn't load this title. It may have been removed or you may not have access.\"\n primary={{ label: 'Retry', onClick: () => void refetch() }}\n />\n </PlayerStage>\n );\n }\n\n if (entitlement.isError) {\n return (\n <PlayerStage>\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Couldn't verify access\"\n message=\"We couldn't check your entitlement for this title. Please try again.\"\n primary={{ label: 'Retry', onClick: () => void entitlement.refetch() }}\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </PlayerStage>\n );\n }\n\n // Entitlement gate — no fake player when the viewer can't watch.\n if (!entitlement.data?.entitled) {\n return (\n <PlayerStage backdrop={backdropUrlQuery.data ?? posterUrlQuery.data ?? null}>\n <div className=\"mx-auto flex max-w-md flex-col items-center gap-5 text-center text-text-inverse\">\n {posterUrlQuery.data ? (\n <img\n src={posterUrlQuery.data}\n alt={`Poster for ${title.title}`}\n className=\"h-48 w-32 rounded-lg object-cover shadow-lg\"\n />\n ) : (\n <div className=\"flex h-48 w-32 items-center justify-center rounded-lg bg-bg-overlay\">\n <Film className=\"h-10 w-10 opacity-70\" />\n </div>\n )}\n <div className=\"flex items-center gap-2 rounded-full bg-bg-overlay px-3 py-1 text-xs font-medium\">\n <Lock className=\"h-3.5 w-3.5\" />\n Not available to watch yet\n </div>\n <div>\n <h1 className=\"text-xl font-semibold\">{title.title}</h1>\n <p className=\"mt-2 text-sm opacity-80\">\n You don&apos;t have an active entitlement for this title. Open the title page to see\n where and how to watch, or to acquire access.\n </p>\n </div>\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <button\n type=\"button\"\n onClick={backToTitle}\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 hover:opacity-90 motion-safe:transition-opacity\"\n >\n Where to watch\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('browse')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-text-inverse/30 px-4 py-2 text-sm font-medium text-text-inverse hover:bg-bg-overlay motion-safe:transition-colors\"\n >\n Browse catalog\n </button>\n </div>\n </div>\n </PlayerStage>\n );\n }\n\n const heading = activeEpisode\n ? `${title.title} — E${activeEpisode.number} · ${activeEpisode.name}`\n : title.title;\n\n const sourceResolving = Boolean(sourceFileId) && sourceUrlQuery.isLoading;\n const noSource = !sourceFileId || (!sourceUrlQuery.isLoading && !sourceUrl);\n\n const VolumeIcon = muted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n const progressPct = duration > 0 ? Math.min((currentTime / duration) * 100, 100) : 0;\n\n return (\n <div className=\"flex h-full flex-col bg-bg-inverse\">\n {/* Top bar */}\n <div className=\"flex items-center gap-3 px-4 py-3 sm:px-6\">\n <button\n type=\"button\"\n onClick={backToTitle}\n className=\"inline-flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm font-medium text-text-inverse/90 hover:bg-bg-overlay motion-safe:transition-colors\"\n aria-label=\"Back to title\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back</span>\n </button>\n <h1 className=\"min-w-0 flex-1 truncate text-sm font-semibold text-text-inverse sm:text-base\">\n {heading}\n </h1>\n </div>\n\n {/* Stage */}\n <div className=\"flex flex-1 items-center justify-center px-0 sm:px-6 sm:pb-6\">\n <div\n ref={containerRef}\n className=\"group relative aspect-video w-full max-w-6xl overflow-hidden bg-bg-inverse sm:rounded-xl\"\n onMouseMove={revealControls}\n onKeyDown={onKeyDown}\n onClick={(e) => {\n if (e.target === videoRef.current) togglePlay();\n }}\n tabIndex={0}\n role=\"region\"\n aria-label={`Video player for ${heading}`}\n >\n {noSource ? (\n <div className=\"absolute inset-0 flex items-center justify-center p-6\">\n <StageMessage\n icon={<Film className=\"h-12 w-12\" />}\n title={activeEpisode ? 'Episode video not available' : 'No video attached'}\n message={\n activeEpisode\n ? 'This episode does not have a playable video file attached yet.'\n : 'This title does not have a playable video file attached yet.'\n }\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </div>\n ) : (\n <>\n {/* Caption <track>s are added dynamically from localizations below. */}\n <video\n ref={videoRef}\n className=\"h-full w-full bg-bg-inverse\"\n src={sourceUrl ?? undefined}\n poster={posterUrlQuery.data ?? undefined}\n crossOrigin={hasTextTracks ? 'anonymous' : undefined}\n playsInline\n preload=\"metadata\"\n onLoadedMetadata={handleLoadedMetadata}\n onDurationChange={() => {\n const v = videoRef.current;\n if (v) setDuration(v.duration);\n }}\n onTimeUpdate={handleTimeUpdate}\n onPlay={() => {\n setIsPlaying(true);\n revealControls();\n }}\n onPause={() => {\n setIsPlaying(false);\n setControlsVisible(true);\n saveProgress(false);\n }}\n onEnded={handleEnded}\n onWaiting={() => setBuffering(true)}\n onPlaying={() => setBuffering(false)}\n onCanPlay={() => setBuffering(false)}\n onError={() => setPlaybackError(true)}\n >\n {subtitleLocs.map((loc) => (\n <SubtitleTrack key={loc.id} localization={loc} />\n ))}\n </video>\n\n {/* Buffering / resolving overlay */}\n {(buffering || sourceResolving) && !playbackError && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-inverse\" />\n </div>\n )}\n\n {/* Playback error overlay */}\n {playbackError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-overlay-scrim p-6\">\n <StageMessage\n icon={<AlertCircle className=\"h-12 w-12\" />}\n title=\"Playback failed\"\n message={\n isHls\n ? 'This stream is HLS (.m3u8) and your browser could not play it natively. Try a browser with native HLS support.'\n : 'We could not play this video. The link may have expired — reload to try again.'\n }\n primary={{\n label: 'Reload',\n onClick: () => {\n setPlaybackError(false);\n void sourceUrlQuery.refetch();\n },\n }}\n secondary={{ label: 'Back to title', onClick: backToTitle }}\n />\n </div>\n )}\n\n {/* Center play affordance when paused */}\n {!isPlaying && !buffering && !playbackError && metadataLoaded && (\n <button\n type=\"button\"\n onClick={togglePlay}\n aria-label=\"Play\"\n className=\"absolute inset-0 flex items-center justify-center\"\n >\n <span className=\"flex h-16 w-16 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-lg motion-safe:transition-transform group-hover:scale-105\">\n <Play className=\"ml-1 h-7 w-7\" />\n </span>\n </button>\n )}\n\n {/* Control bar */}\n <div\n className={`absolute inset-x-0 bottom-0 bg-overlay-scrim px-3 pb-3 pt-10 motion-safe:transition-opacity motion-safe:duration-300 sm:px-4 ${\n controlsVisible || !isPlaying ? 'opacity-100' : 'pointer-events-none opacity-0'\n }`}\n >\n {/* Scrubber */}\n <div className=\"mb-2 flex items-center gap-3\">\n <span className=\"w-12 shrink-0 text-right text-xs tabular-nums text-text-inverse/90\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1\">\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-text-inverse/25\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg\"\n style={{ width: `${progressPct}%` }}\n />\n </div>\n <input\n type=\"range\"\n min={0}\n max={Number.isFinite(duration) && duration > 0 ? duration : 0}\n step=\"any\"\n value={currentTime}\n disabled={isLive}\n onChange={(e) => seekTo(Number(e.target.value))}\n aria-label=\"Seek\"\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed\"\n style={{ accentColor: 'var(--color-action-primary-bg)' }}\n />\n </div>\n <span className=\"w-12 shrink-0 text-xs tabular-nums text-text-inverse/70\">\n {isLive ? 'LIVE' : formatTime(duration)}\n </span>\n </div>\n\n {/* Buttons */}\n <div className=\"flex items-center gap-1 sm:gap-2\">\n <ControlButton label={isPlaying ? 'Pause' : 'Play'} onClick={togglePlay}>\n {isPlaying ? <Pause className=\"h-5 w-5\" /> : <Play className=\"h-5 w-5\" />}\n </ControlButton>\n\n {/* Volume */}\n <div className=\"flex items-center gap-1.5\">\n <ControlButton label={muted ? 'Unmute' : 'Mute'} onClick={toggleMute}>\n <VolumeIcon className=\"h-5 w-5\" />\n </ControlButton>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n value={muted ? 0 : volume}\n onChange={(e) => changeVolume(Number(e.target.value))}\n aria-label=\"Volume\"\n className=\"hidden h-1 w-20 cursor-pointer sm:block\"\n style={{ accentColor: 'var(--color-action-primary-bg)' }}\n />\n </div>\n\n <div className=\"ml-auto flex items-center gap-1 sm:gap-2\">\n {/* Subtitle / audio menu */}\n <div className=\"relative\">\n <ControlButton\n label=\"Subtitles & audio\"\n onClick={() =>\n setOpenMenu((m) => (m === 'subtitles' ? 'none' : 'subtitles'))\n }\n active={selectedSubIdx >= 0}\n expanded={openMenu === 'subtitles'}\n disabled={subtitleLocs.length === 0 && dubLocs.length === 0}\n disabledHint=\"No subtitle or audio tracks available for this title.\"\n >\n <Subtitles className=\"h-5 w-5\" />\n </ControlButton>\n {openMenu === 'subtitles' && (\n <TrackMenu\n subtitleLocs={subtitleLocs}\n dubLocs={dubLocs}\n selectedSubIdx={selectedSubIdx}\n onSelectSub={(idx) => {\n setSelectedSubIdx(idx);\n setOpenMenu('none');\n }}\n />\n )}\n </div>\n\n {/* Settings (quality) — honestly disabled */}\n <ControlButton\n label=\"Quality\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Adaptive quality selection isn't available for this source.\"\n >\n <Settings className=\"h-5 w-5\" />\n </ControlButton>\n\n {/* Cast — honestly disabled */}\n <ControlButton\n label=\"Cast\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Casting to external devices isn't supported in this player.\"\n >\n <Cast className=\"h-5 w-5\" />\n </ControlButton>\n\n {/* Offline / download — honestly disabled */}\n <ControlButton\n label=\"Download for offline\"\n onClick={() => undefined}\n disabled\n disabledHint=\"Offline downloads aren't available for this title.\"\n >\n <Download className=\"h-5 w-5\" />\n </ControlButton>\n\n <ControlButton\n label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n onClick={toggleFullscreen}\n >\n {isFullscreen ? (\n <Minimize className=\"h-5 w-5\" />\n ) : (\n <Maximize className=\"h-5 w-5\" />\n )}\n </ControlButton>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// Presentational sub-components (kept local to the player surface)\n// ============================================================================\n\n/** Full-bleed dark stage used for loading / gated / error states. */\nconst PlayerStage: FC<{ children: React.ReactNode; backdrop?: string | null }> = ({\n children,\n backdrop,\n}) => (\n <div className=\"relative flex h-full min-h-[60vh] items-center justify-center overflow-hidden bg-bg-inverse p-6\">\n {backdrop && (\n <>\n <img\n src={backdrop}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 h-full w-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-overlay-scrim\" />\n </>\n )}\n <div className=\"relative z-10 w-full\">{children}</div>\n </div>\n);\n\ninterface StageAction {\n label: string;\n onClick: () => void;\n}\n\n/** Centered icon + copy + up to two actions, styled for the dark stage. */\nconst StageMessage: FC<{\n icon: React.ReactNode;\n title: string;\n message: string;\n primary?: StageAction;\n secondary?: StageAction;\n}> = ({ icon, title, message, primary, secondary }) => (\n <div className=\"mx-auto flex max-w-md flex-col items-center gap-4 text-center text-text-inverse\">\n <span className=\"text-text-inverse/80\">{icon}</span>\n <div>\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mt-1 text-sm opacity-80\">{message}</p>\n </div>\n {(primary || secondary) && (\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {primary && (\n <button\n type=\"button\"\n onClick={primary.onClick}\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 hover:opacity-90 motion-safe:transition-opacity\"\n >\n <RotateCw className=\"h-4 w-4\" />\n {primary.label}\n </button>\n )}\n {secondary && (\n <button\n type=\"button\"\n onClick={secondary.onClick}\n className=\"inline-flex items-center gap-2 rounded-lg border border-text-inverse/30 px-4 py-2 text-sm font-medium text-text-inverse hover:bg-bg-overlay motion-safe:transition-colors\"\n >\n {secondary.label}\n </button>\n )}\n </div>\n )}\n </div>\n);\n\n/** A single icon control on the dark control bar. */\nconst ControlButton: FC<{\n label: string;\n onClick: () => void;\n children: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n disabledHint?: string;\n expanded?: boolean;\n}> = ({ label, onClick, children, active, disabled, disabledHint, expanded }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n title={disabled && disabledHint ? disabledHint : label}\n className={`relative rounded-lg p-2 motion-safe:transition-colors ${\n disabled ? 'cursor-not-allowed text-text-inverse/40' : 'text-text-inverse hover:bg-bg-overlay'\n }`}\n >\n {children}\n {active && !disabled && (\n <span className=\"absolute bottom-0.5 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-action-primary-bg\" />\n )}\n </button>\n);\n\n/** Popover listing real subtitle/caption tracks + (honest, disabled) dub tracks. */\nconst TrackMenu: FC<{\n subtitleLocs: HokLocalization[];\n dubLocs: HokLocalization[];\n selectedSubIdx: number;\n onSelectSub: (idx: number) => void;\n}> = ({ subtitleLocs, dubLocs, selectedSubIdx, onSelectSub }) => (\n <div\n role=\"menu\"\n aria-label=\"Subtitles and audio\"\n className=\"absolute bottom-full right-0 mb-2 max-h-72 w-56 overflow-y-auto rounded-lg border border-border-seam bg-bg-surface p-1.5 shadow-lg\"\n >\n <p className=\"px-2 py-1 text-[11px] font-semibold uppercase tracking-wide text-text-secondary\">\n Subtitles\n </p>\n <MenuRow label=\"Off\" selected={selectedSubIdx === -1} onClick={() => onSelectSub(-1)} />\n {subtitleLocs.map((loc, idx) => (\n <MenuRow\n key={loc.id}\n label={\n loc.kind === 'CAPTION' ? `${languageName(loc.language)} (CC)` : languageName(loc.language)\n }\n selected={selectedSubIdx === idx}\n onClick={() => onSelectSub(idx)}\n />\n ))}\n\n {dubLocs.length > 0 && (\n <>\n <p className=\"mt-1 px-2 py-1 text-[11px] font-semibold uppercase tracking-wide text-text-secondary\">\n Audio (dub)\n </p>\n {dubLocs.map((loc) => (\n <button\n key={loc.id}\n type=\"button\"\n role=\"menuitem\"\n disabled\n title=\"Alternate dub tracks are separate assets and can't be switched in this player.\"\n className=\"flex w-full cursor-not-allowed items-center justify-between rounded-md px-2 py-1.5 text-left text-sm text-text-disabled\"\n >\n <span>{languageName(loc.language)}</span>\n <Lock className=\"h-3.5 w-3.5\" />\n </button>\n ))}\n </>\n )}\n </div>\n);\n\nconst MenuRow: FC<{ label: string; selected: boolean; onClick: () => void }> = ({\n label,\n selected,\n onClick,\n}) => (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n onClick={onClick}\n className={`flex w-full items-center justify-between rounded-md px-2 py-1.5 text-left text-sm motion-safe:transition-colors ${\n selected\n ? 'bg-bg-sunken font-medium text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n }`}\n >\n <span className=\"truncate\">{label}</span>\n {selected && <Check className=\"h-4 w-4 shrink-0 text-action-primary-bg\" />}\n </button>\n);\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-hookmovies",
3
- "version": "2026.720.2",
3
+ "version": "2026.726.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": [