@burdenoff/microfe-channel 2026.1013.1 → 2026.1107.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.
Files changed (161) hide show
  1. package/dist/channel/ChannelRoot.d.ts +0 -2
  2. package/dist/channel/ChannelRoot.js +9 -6
  3. package/dist/channel/ChannelRoot.js.map +1 -1
  4. package/dist/channel/ChannelRoutes.d.ts +1 -2
  5. package/dist/channel/ChannelRoutes.js +5 -6
  6. package/dist/channel/ChannelRoutes.js.map +1 -1
  7. package/dist/channel/components/AdapterCredentialsForm.d.ts +2 -4
  8. package/dist/channel/components/AdapterCredentialsForm.js +2 -3
  9. package/dist/channel/components/AdapterCredentialsForm.js.map +1 -1
  10. package/dist/channel/components/FeatureNotEnabled.d.ts +1 -2
  11. package/dist/channel/components/FeatureNotEnabled.js +1 -2
  12. package/dist/channel/components/FeatureNotEnabled.js.map +1 -1
  13. package/dist/channel/components/MarkdownEditor.d.ts +1 -2
  14. package/dist/channel/components/MarkdownEditor.js +2 -5
  15. package/dist/channel/components/MarkdownEditor.js.map +1 -1
  16. package/dist/channel/components/PermissionGuard.d.ts +0 -2
  17. package/dist/channel/components/PermissionGuard.js +1 -2
  18. package/dist/channel/components/PermissionGuard.js.map +1 -1
  19. package/dist/channel/config/adapterCredentials.d.ts +0 -2
  20. package/dist/channel/config/adapterCredentials.js +3 -7
  21. package/dist/channel/config/adapterCredentials.js.map +1 -1
  22. package/dist/channel/constants/permissions.d.ts +0 -1
  23. package/dist/channel/constants/permissions.js +1 -2
  24. package/dist/channel/constants/permissions.js.map +1 -1
  25. package/dist/channel/graphql/global-client.d.ts +0 -2
  26. package/dist/channel/graphql/global-client.js +5 -6
  27. package/dist/channel/graphql/global-client.js.map +1 -1
  28. package/dist/channel/hooks/useChannelOrgSettings.d.ts +0 -2
  29. package/dist/channel/hooks/useChannelOrgSettings.js +20 -21
  30. package/dist/channel/hooks/useChannelOrgSettings.js.map +1 -1
  31. package/dist/channel/hooks/useChannelSubscription.d.ts +0 -1
  32. package/dist/channel/hooks/useChannelSubscription.js +7 -12
  33. package/dist/channel/hooks/useChannelSubscription.js.map +1 -1
  34. package/dist/channel/hooks/useChannels.d.ts +20 -30
  35. package/dist/channel/hooks/useChannels.js +100 -101
  36. package/dist/channel/hooks/useChannels.js.map +1 -1
  37. package/dist/channel/hooks/useTr.d.ts +0 -1
  38. package/dist/channel/hooks/useTr.js +1 -2
  39. package/dist/channel/hooks/useTr.js.map +1 -1
  40. package/dist/channel/index.d.ts +0 -1
  41. package/dist/channel/index.js +3 -2
  42. package/dist/channel/modules/channels/hooks/useExport.d.ts +0 -2
  43. package/dist/channel/modules/channels/hooks/useExport.js +77 -80
  44. package/dist/channel/modules/channels/hooks/useExport.js.map +1 -1
  45. package/dist/channel/modules/channels/i18n.d.ts +0 -2
  46. package/dist/channel/modules/channels/i18n.js +1 -2
  47. package/dist/channel/modules/channels/i18n.js.map +1 -1
  48. package/dist/channel/modules/channels/pages/ChannelDashboardPage.d.ts +1 -2
  49. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +12 -13
  50. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  51. package/dist/channel/modules/channels/pages/ChannelDetailsPage.d.ts +1 -2
  52. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +400 -401
  53. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
  54. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts +1 -2
  55. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +11 -10
  56. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
  57. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts +1 -2
  58. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +6 -11
  59. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  60. package/dist/channel/modules/channels/pages/ChannelsListPage.d.ts +1 -2
  61. package/dist/channel/modules/channels/pages/ChannelsListPage.js +289 -290
  62. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
  63. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts +1 -2
  64. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +11 -12
  65. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  66. package/dist/channel/modules/channels/pages/ConnectionsListPage.d.ts +1 -2
  67. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +3 -4
  68. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
  69. package/dist/channel/modules/channels/pages/CreateChannelPage.d.ts +1 -2
  70. package/dist/channel/modules/channels/pages/CreateChannelPage.js +6 -7
  71. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  72. package/dist/channel/modules/channels/pages/CreateConnectionPage.d.ts +1 -2
  73. package/dist/channel/modules/channels/pages/CreateConnectionPage.js +39 -40
  74. package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -1
  75. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.d.ts +1 -2
  76. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +8 -13
  77. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
  78. package/dist/channel/modules/channels/pages/EditChannelPage.d.ts +1 -2
  79. package/dist/channel/modules/channels/pages/EditChannelPage.js +108 -106
  80. package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -1
  81. package/dist/channel/modules/channels/pages/EditConnectionPage.d.ts +1 -2
  82. package/dist/channel/modules/channels/pages/EditConnectionPage.js +22 -23
  83. package/dist/channel/modules/channels/pages/EditConnectionPage.js.map +1 -1
  84. package/dist/channel/modules/channels/pages/SendMessagePage.d.ts +1 -2
  85. package/dist/channel/modules/channels/pages/SendMessagePage.js +181 -188
  86. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
  87. package/dist/channel/modules/channels/pages/WebhookEventsPage.d.ts +1 -2
  88. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +145 -150
  89. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
  90. package/dist/channel/pages/ChannelLandingPage.d.ts +1 -2
  91. package/dist/channel/pages/ChannelLandingPage.js +20 -21
  92. package/dist/channel/pages/ChannelLandingPage.js.map +1 -1
  93. package/dist/channel/providers/ChannelProvider.d.ts +0 -2
  94. package/dist/channel/providers/ChannelProvider.js +1 -2
  95. package/dist/channel/providers/ChannelProvider.js.map +1 -1
  96. package/dist/channel/types/index.d.ts +0 -2
  97. package/dist/channel/utils/shellBridge.d.ts +0 -1
  98. package/dist/channel/utils/shellBridge.js +1 -2
  99. package/dist/channel/utils/shellBridge.js.map +1 -1
  100. package/dist/dev/App.d.ts +1 -2
  101. package/dist/dev/main.d.ts +0 -2
  102. package/dist/generated/global-operations.d.ts +885 -336
  103. package/dist/generated/global-operations.js +2 -3
  104. package/dist/generated/global-operations.js.map +1 -1
  105. package/dist/generated/global-types.d.ts +2 -22
  106. package/dist/generated/global-types.js +1 -2
  107. package/dist/generated/global-types.js.map +1 -1
  108. package/dist/generated/wspace-operations.d.ts +4 -2
  109. package/dist/generated/wspace-types.d.ts +4 -24
  110. package/dist/index.d.ts +0 -1
  111. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +1 -2
  112. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -1
  113. package/dist/node_modules/@apollo/client/errors/utils.js +1 -2
  114. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -1
  115. package/dist/translations/en.d.ts +0 -1
  116. package/dist/utils/nativeBridge.d.ts +0 -1
  117. package/dist/utils/nativeBridge.js +1 -2
  118. package/package.json +65 -43
  119. package/dist/channel/ChannelRoot.d.ts.map +0 -1
  120. package/dist/channel/ChannelRoutes.d.ts.map +0 -1
  121. package/dist/channel/components/AdapterCredentialsForm.d.ts.map +0 -1
  122. package/dist/channel/components/FeatureNotEnabled.d.ts.map +0 -1
  123. package/dist/channel/components/MarkdownEditor.d.ts.map +0 -1
  124. package/dist/channel/components/PermissionGuard.d.ts.map +0 -1
  125. package/dist/channel/config/adapterCredentials.d.ts.map +0 -1
  126. package/dist/channel/constants/permissions.d.ts.map +0 -1
  127. package/dist/channel/graphql/global-client.d.ts.map +0 -1
  128. package/dist/channel/hooks/useChannelOrgSettings.d.ts.map +0 -1
  129. package/dist/channel/hooks/useChannelSubscription.d.ts.map +0 -1
  130. package/dist/channel/hooks/useChannels.d.ts.map +0 -1
  131. package/dist/channel/hooks/useTr.d.ts.map +0 -1
  132. package/dist/channel/index.d.ts.map +0 -1
  133. package/dist/channel/modules/channels/hooks/useExport.d.ts.map +0 -1
  134. package/dist/channel/modules/channels/i18n.d.ts.map +0 -1
  135. package/dist/channel/modules/channels/pages/ChannelDashboardPage.d.ts.map +0 -1
  136. package/dist/channel/modules/channels/pages/ChannelDetailsPage.d.ts.map +0 -1
  137. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts.map +0 -1
  138. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts.map +0 -1
  139. package/dist/channel/modules/channels/pages/ChannelsListPage.d.ts.map +0 -1
  140. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts.map +0 -1
  141. package/dist/channel/modules/channels/pages/ConnectionsListPage.d.ts.map +0 -1
  142. package/dist/channel/modules/channels/pages/CreateChannelPage.d.ts.map +0 -1
  143. package/dist/channel/modules/channels/pages/CreateConnectionPage.d.ts.map +0 -1
  144. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.d.ts.map +0 -1
  145. package/dist/channel/modules/channels/pages/EditChannelPage.d.ts.map +0 -1
  146. package/dist/channel/modules/channels/pages/EditConnectionPage.d.ts.map +0 -1
  147. package/dist/channel/modules/channels/pages/SendMessagePage.d.ts.map +0 -1
  148. package/dist/channel/modules/channels/pages/WebhookEventsPage.d.ts.map +0 -1
  149. package/dist/channel/pages/ChannelLandingPage.d.ts.map +0 -1
  150. package/dist/channel/providers/ChannelProvider.d.ts.map +0 -1
  151. package/dist/channel/types/index.d.ts.map +0 -1
  152. package/dist/channel/utils/shellBridge.d.ts.map +0 -1
  153. package/dist/dev/App.d.ts.map +0 -1
  154. package/dist/dev/main.d.ts.map +0 -1
  155. package/dist/generated/global-operations.d.ts.map +0 -1
  156. package/dist/generated/global-types.d.ts.map +0 -1
  157. package/dist/generated/wspace-operations.d.ts.map +0 -1
  158. package/dist/generated/wspace-types.d.ts.map +0 -1
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/translations/en.d.ts.map +0 -1
  161. package/dist/utils/nativeBridge.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useChannels.js","names":[],"sources":["../../../src/channel/hooks/useChannels.ts"],"sourcesContent":["/**\n * Channel Hooks\n * GraphQL queries and mutations for channel management\n *\n * All types are derived from codegen-generated types (src/generated/global-types.ts)\n * and operation result types (src/generated/global-operations.ts).\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { getGlobalChannelClient } from '../graphql/global-client';\nimport { useChannel as useChannelContext } from '../providers/ChannelProvider';\nimport { emitShellEvent, reportShellError } from '../utils/shellBridge';\nimport {\n GetChannelsDocument,\n GetChannelDocument,\n CreateChannelDocument,\n UpdateChannelDocument,\n DeleteChannelDocument,\n ActivateChannelDocument,\n DeactivateChannelDocument,\n RunChannelHealthCheckDocument,\n CreateConnectionDocument,\n UpdateConnectionDocument,\n DeleteConnectionDocument,\n TestConnectionHealthDocument,\n DeliverNotificationDocument,\n GetDeliveryAttemptsDocument,\n GetWebhookEventsDocument,\n GetUserPlatformConnectionsDocument,\n RetryDeliveryDocument,\n GetDeliveryStatsDocument,\n type GetChannelsQuery,\n type GetChannelQuery,\n type CreateChannelMutation,\n type UpdateChannelMutation,\n type RunChannelHealthCheckMutation,\n type CreateConnectionMutation,\n type UpdateConnectionMutation,\n type TestConnectionHealthMutation,\n type DeliverNotificationMutation,\n type GetDeliveryAttemptsQuery,\n type GetWebhookEventsQuery,\n type GetUserPlatformConnectionsQuery,\n type RetryDeliveryMutation,\n type GetDeliveryStatsQuery,\n} from '../../generated/global-operations';\n\n/** Forward an operational error to the shell SRE sink. */\nfunction report(error: unknown, action: string, context: Record<string, unknown> = {}) {\n reportShellError(error, { module: 'channel', context: { action, ...context } });\n}\n\n// ============================================================================\n// TYPES — derived from codegen, exposed as string unions for convenience.\n//\n// Codegen generates TypeScript enums (e.g., ChannelPlatform.Email = 'EMAIL').\n// Pages/components use string literals ('EMAIL', 'ACTIVE', etc.) which are\n// not directly assignable to TS enums. We re-export the underlying string\n// union types so consumers can use plain strings without casting.\n// ============================================================================\n\nimport type {\n ChannelPlatform as _ChannelPlatform,\n ChannelStatus as _ChannelStatus,\n ChannelAuthType as _ChannelAuthType,\n ConnectionHealth as _ConnectionHealth,\n AdapterType as _AdapterType,\n DeliveryPriority as _DeliveryPriority,\n DeliveryStatus as _DeliveryStatus,\n ChannelFilterInput as _ChannelFilterInput,\n CreateChannelInput as _CreateChannelInput,\n UpdateChannelInput as _UpdateChannelInput,\n CreateConnectionInput as _CreateConnectionInput,\n UpdateConnectionInput as _UpdateConnectionInput,\n ChannelHealthCheck as _ChannelHealthCheck,\n ConnectionTestResult as _ConnectionTestResult,\n ChannelDeliveryResult as _ChannelDeliveryResult,\n ChannelDeliveryError as _ChannelDeliveryError,\n ChannelDeliveryContentInput as _ChannelDeliveryContentInput,\n ChannelDeliveryInput as _ChannelDeliveryInput,\n BulkChannelDeliveryResult as _BulkChannelDeliveryResult,\n UserPresenceStatus as _UserPresenceStatus,\n PairingStatus as _PairingStatus,\n WebhookProcessingStatus as _WebhookProcessingStatus,\n} from '../../generated/global-types';\n\n// ── Enum-like string unions (backward-compatible with string literal usage) ──\n\n/** Communication platform — extends generated enum with values pending backend schema update */\nexport type ChannelPlatform = `${_ChannelPlatform}` | 'INAPP';\n/** Channel lifecycle status */\nexport type ChannelStatus = `${_ChannelStatus}`;\n/** Authentication method for connections */\nexport type ChannelAuthType = `${_ChannelAuthType}`;\n/** Connection health status */\nexport type ConnectionHealth = `${_ConnectionHealth}`;\n/** Specific adapter/provider type — extends generated enum with values pending backend schema update */\nexport type AdapterType =\n | `${_AdapterType}`\n | 'INAPP_NATIVE'\n | 'NOVU'\n | 'KNOCKLABS'\n | 'SENDGRID'\n | 'MAILGUN'\n | 'POSTMARK'\n | 'MANDRILL'\n | 'RESEND'\n | 'SMTP'\n | 'VONAGE'\n | 'PLIVO'\n | 'MESSAGEBIRD'\n | 'INFOBIP'\n | 'APNS'\n | 'ONESIGNAL'\n | 'EXPO'\n | 'WEBCHAT_NATIVE'\n | 'SLACK_WEBHOOK'\n | 'TEAMS_WEBHOOK'\n | 'DISCORD_WEBHOOK';\n/** Delivery priority level */\nexport type DeliveryPriority = `${_DeliveryPriority}`;\n/** Message delivery status */\nexport type DeliveryStatus = `${_DeliveryStatus}`;\n/** User presence status on a platform */\nexport type UserPresenceStatus = `${_UserPresenceStatus}`;\n/** Pairing status for Bundle-2 flow */\nexport type PairingStatus = `${_PairingStatus}`;\n/** Webhook event processing status */\nexport type WebhookProcessingStatus = `${_WebhookProcessingStatus}`;\n\n// ── Utility: recursively unwrap codegen enums to string unions ──────────────\n// Codegen generates TS enums that are not assignable from string literals.\n// This mapped type converts `ChannelPlatform` (enum) → `'EMAIL' | 'SMS' | ...`\n// at every nested level of a type, making all Input/Result types compatible\n// with plain string usage.\n\ntype EnumToString<T> = [T] extends [null]\n ? null\n : T extends null | undefined\n ? EnumToString<NonNullable<T>> | Extract<T, null | undefined>\n : T extends _ChannelPlatform\n ? ChannelPlatform\n : T extends _ChannelStatus\n ? ChannelStatus\n : T extends _ChannelAuthType\n ? ChannelAuthType\n : T extends _ConnectionHealth\n ? ConnectionHealth\n : T extends _AdapterType\n ? AdapterType\n : T extends _DeliveryPriority\n ? DeliveryPriority\n : T extends _DeliveryStatus\n ? DeliveryStatus\n : T extends _UserPresenceStatus\n ? UserPresenceStatus\n : T extends _PairingStatus\n ? PairingStatus\n : T extends _WebhookProcessingStatus\n ? WebhookProcessingStatus\n : T extends Array<infer U>\n ? Array<EnumToString<U>>\n : T extends object\n ? { [K in keyof T]: EnumToString<T[K]> }\n : T;\n\n// ── Input types (used by mutations) ─────────────────────────────────────────\n\nexport type CreateChannelInput = EnumToString<_CreateChannelInput>;\nexport type UpdateChannelInput = EnumToString<_UpdateChannelInput>;\nexport type CreateConnectionInput = EnumToString<_CreateConnectionInput>;\nexport type UpdateConnectionInput = EnumToString<_UpdateConnectionInput>;\nexport type ChannelFilterInput = EnumToString<_ChannelFilterInput>;\nexport type ChannelDeliveryContentInput = EnumToString<_ChannelDeliveryContentInput>;\nexport type ChannelDeliveryInput = EnumToString<_ChannelDeliveryInput>;\nexport type {\n ChannelPaginationInput,\n ChannelDeliveryOptionsInput,\n ChannelRetryPolicyInput,\n BulkChannelDeliveryInput,\n} from '../../generated/global-types';\n\n// ── Schema result types ─────────────────────────────────────────────────────\n\nexport type ChannelHealthCheck = EnumToString<_ChannelHealthCheck>;\nexport type ConnectionTestResult = EnumToString<_ConnectionTestResult>;\nexport type ChannelDeliveryResult = EnumToString<_ChannelDeliveryResult>;\nexport type ChannelDeliveryError = EnumToString<_ChannelDeliveryError>;\nexport type BulkChannelDeliveryResult = EnumToString<_BulkChannelDeliveryResult>;\n\n// ── Derived types from query results ──────────────────────────────────────\n// These represent the actual shape of data returned by our GraphQL operations,\n// not the full schema types (which include __typename, nested relations, etc.)\n\n/** Channel as returned by GetChannels query (list item) */\nexport type Channel = NonNullable<GetChannelsQuery['getChannels']['items'][number]>;\n\n/** Channel as returned by GetChannel query (full detail) */\nexport type ChannelDetail = NonNullable<GetChannelQuery['getChannel']>;\n\n/** ChannelConnection from the GetChannel query (full connection detail) */\nexport type ChannelConnection = NonNullable<ChannelDetail['connection']>;\n\n/** ChannelList response shape */\nexport type ChannelList = GetChannelsQuery['getChannels'];\n\n/** Message delivery attempt as returned by GetDeliveryAttempts query */\nexport type DeliveryAttempt = NonNullable<\n GetDeliveryAttemptsQuery['getChannelDeliveryAttempts']['items'][number]\n>;\n\n/** Webhook event as returned by GetWebhookEvents query */\nexport type WebhookEvent = NonNullable<\n GetWebhookEventsQuery['getChannelWebhookEvents']['items'][number]\n>;\n\n/** User platform connection as returned by GetUserPlatformConnections query */\nexport type UserPlatformConnection = NonNullable<\n GetUserPlatformConnectionsQuery['listUserPlatformConnectionsByChannel']['items'][number]\n>;\n\n/** Delivery statistics as returned by GetDeliveryStats query */\nexport type DeliveryStats = NonNullable<GetDeliveryStatsQuery['getDeliveryStats']>;\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Hook for managing channels list\n */\nexport function useChannels(initialFilter?: ChannelFilterInput) {\n const { authToken, apiGatewayUrl, organizationId } = useChannelContext();\n const [channels, setChannels] = useState<Channel[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [total, setTotal] = useState(0);\n const [filter, setFilter] = useState<ChannelFilterInput>(initialFilter ?? {});\n\n // Get Apollo client with auth token and organization context\n const getClient = useCallback(() => {\n return getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n }, [apiGatewayUrl, authToken, organizationId]);\n\n // Fetch channels\n const fetchChannels = useCallback(\n async (pagination?: { offset?: number; limit?: number }) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const client = getClient();\n const result = await client.query<GetChannelsQuery>({\n query: GetChannelsDocument,\n variables: {\n filter,\n pagination: pagination ?? { offset: 0, limit: 50 },\n },\n fetchPolicy: 'network-only',\n });\n\n const data = result.data?.getChannels;\n if (data) {\n setChannels(data.items);\n setTotal(data.total);\n setHasMore(data.hasMore);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch channels';\n report(err, 'Failed to fetch channels');\n setError(message);\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, filter]\n );\n\n // Initial fetch — defer to microtask to avoid synchronous setState in effect\n useEffect(() => {\n void Promise.resolve().then(() => fetchChannels());\n }, [fetchChannels]);\n\n // Create channel\n const createChannel = useCallback(\n async (input: CreateChannelInput): Promise<Channel | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<CreateChannelMutation>({\n mutation: CreateChannelDocument,\n variables: { input },\n });\n const created = (result.data?.createChannel as Channel) ?? null;\n if (created) {\n emitShellEvent('channel.created', { id: created.id, platform: created.platform });\n }\n await fetchChannels();\n return created;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to create channel';\n report(err, 'Failed to create channel');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Update channel\n const updateChannel = useCallback(\n async (id: string, input: UpdateChannelInput): Promise<Channel | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<UpdateChannelMutation>({\n mutation: UpdateChannelDocument,\n variables: { id, input },\n });\n emitShellEvent('channel.updated', { id });\n await fetchChannels();\n return (result.data?.updateChannel as Channel) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update channel';\n report(err, 'Failed to update channel');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Delete channel\n const deleteChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeleteChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.deleted', { id });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to delete channel';\n report(err, 'Failed to delete channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Activate channel\n const activateChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: ActivateChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.updated', { id, action: 'activated' });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to activate channel';\n report(err, 'Failed to activate channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Deactivate channel\n const deactivateChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeactivateChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.updated', { id, action: 'deactivated' });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to deactivate channel';\n report(err, 'Failed to deactivate channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Run health check\n const runHealthCheck = useCallback(\n async (id: string): Promise<ChannelHealthCheck | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<RunChannelHealthCheckMutation>({\n mutation: RunChannelHealthCheckDocument,\n variables: { id },\n });\n await fetchChannels();\n return (result.data?.runChannelHealthCheck as ChannelHealthCheck) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to run health check';\n report(err, 'Failed to run health check');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Update filter\n const updateFilter = useCallback((newFilter: Partial<ChannelFilterInput>) => {\n setFilter((prev) => ({ ...prev, ...newFilter }));\n }, []);\n\n // Reset filter\n const resetFilter = useCallback(() => {\n setFilter({});\n }, []);\n\n // Deliver notification via channel\n const deliverNotification = useCallback(\n async (\n input: ChannelDeliveryInput\n ): Promise<{ success: boolean; results?: ChannelDeliveryResult[]; error?: string }> => {\n try {\n const client = getClient();\n const result = await client.mutate<DeliverNotificationMutation>({\n mutation: DeliverNotificationDocument,\n variables: { input },\n });\n\n const data = result.data?.deliverNotification;\n if (data) {\n emitShellEvent('delivery.completed', {\n success: data.success ?? false,\n messageId: data.messageId,\n platform: data.platform,\n status: data.status,\n });\n return {\n success: data.success ?? false,\n results: [data as ChannelDeliveryResult],\n };\n }\n return { success: false, error: 'No data returned' };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to deliver notification';\n report(err, 'Failed to deliver notification');\n return { success: false, error: message };\n }\n },\n [getClient]\n );\n\n return {\n channels,\n isLoading,\n error,\n hasMore,\n total,\n filter,\n refetch: fetchChannels,\n createChannel,\n updateChannel,\n deleteChannel,\n activateChannel,\n deactivateChannel,\n runHealthCheck,\n updateFilter,\n resetFilter,\n deliverNotification,\n };\n}\n\n/**\n * Hook for managing a single channel\n */\nexport function useChannel(id: string | undefined) {\n const { authToken, apiGatewayUrl, organizationId } = useChannelContext();\n const [channel, setChannel] = useState<ChannelDetail | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get Apollo client with auth token and organization context\n const getClient = useCallback(() => {\n return getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n }, [apiGatewayUrl, authToken, organizationId]);\n\n // Fetch channel\n const fetchChannel = useCallback(async () => {\n if (!id) {\n setChannel(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const client = getClient();\n const result = await client.query<GetChannelQuery>({\n query: GetChannelDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n setChannel(result.data?.getChannel ?? null);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch channel';\n report(err, 'Failed to fetch channel');\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [id, getClient]);\n\n useEffect(() => {\n void Promise.resolve().then(() => fetchChannel());\n }, [fetchChannel]);\n\n // Update channel\n const updateChannel = useCallback(\n async (input: UpdateChannelInput): Promise<ChannelDetail | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<UpdateChannelMutation>({\n mutation: UpdateChannelDocument,\n variables: { id, input },\n });\n emitShellEvent('channel.updated', { id });\n await fetchChannel();\n return (result.data?.updateChannel as ChannelDetail) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update channel';\n report(err, 'Failed to update channel');\n setError(message);\n return null;\n }\n },\n [id, getClient, fetchChannel]\n );\n\n // Run health check\n const runHealthCheck = useCallback(async (): Promise<ChannelHealthCheck | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<RunChannelHealthCheckMutation>({\n mutation: RunChannelHealthCheckDocument,\n variables: { id },\n });\n await fetchChannel();\n return (result.data?.runChannelHealthCheck as ChannelHealthCheck) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to run health check';\n report(err, 'Failed to run health check');\n setError(message);\n return null;\n }\n }, [id, getClient, fetchChannel]);\n\n // Create connection\n const createConnection = useCallback(\n async (input: Omit<CreateConnectionInput, 'channelId'>): Promise<ChannelConnection | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<CreateConnectionMutation>({\n mutation: CreateConnectionDocument,\n variables: { input: { ...input, channelId: id } },\n });\n const created = (result.data?.createConnection as ChannelConnection) ?? null;\n if (created) {\n emitShellEvent('connection.created', { id: created.id, channelId: id });\n }\n await fetchChannel();\n return created;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to create connection';\n report(err, 'Failed to create connection');\n setError(message);\n return null;\n }\n },\n [id, getClient, fetchChannel]\n );\n\n // Update connection\n const updateConnection = useCallback(\n async (\n connectionId: string,\n input: UpdateConnectionInput\n ): Promise<ChannelConnection | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<UpdateConnectionMutation>({\n mutation: UpdateConnectionDocument,\n variables: { id: connectionId, input },\n });\n emitShellEvent('connection.updated', { id: connectionId });\n await fetchChannel();\n return (result.data?.updateConnection as ChannelConnection) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update connection';\n report(err, 'Failed to update connection');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Delete connection\n // Returns void on success; throws on failure (never returns false).\n const deleteConnection = useCallback(\n async (connectionId: string): Promise<void> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeleteConnectionDocument,\n variables: { id: connectionId },\n update(cache) {\n cache.evict({ id: `ChannelConnection:${connectionId}` });\n cache.gc();\n },\n });\n emitShellEvent('connection.deleted', { id: connectionId });\n await fetchChannel();\n } catch (err: unknown) {\n report(err, 'Failed to delete connection');\n throw err;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Test connection\n const testConnection = useCallback(\n async (connectionId: string): Promise<ConnectionTestResult | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<TestConnectionHealthMutation>({\n mutation: TestConnectionHealthDocument,\n variables: { id: connectionId },\n });\n await fetchChannel();\n return (result.data?.testConnectionHealth as ConnectionTestResult) ?? null;\n } catch (err: unknown) {\n report(err, 'Failed to test connection');\n throw err;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Send test message via channel using deliverNotification\n const sendTestNotification = useCallback(\n async (\n recipient: string,\n message: string,\n options?: { subject?: string; html?: string }\n ): Promise<ChannelDeliveryResult | null> => {\n if (!channel) return null;\n\n try {\n const client = getClient();\n\n // Build content based on platform\n const content: ChannelDeliveryContentInput = {\n text: message,\n };\n\n // Add platform-specific content\n if (channel.platform === 'EMAIL') {\n content.subject = options?.subject ?? 'Test Notification';\n if (options?.html) {\n content.html = options.html;\n }\n } else if (channel.platform === 'PUSH') {\n content.title = options?.subject ?? 'Test Notification';\n }\n\n const input: ChannelDeliveryInput = {\n platform: channel.platform,\n organizationId: channel.organizationId,\n recipient,\n content,\n connectionId: channel.connection?.id,\n };\n\n const result = await client.mutate<DeliverNotificationMutation>({\n mutation: DeliverNotificationDocument,\n variables: { input },\n });\n\n const out = (result.data?.deliverNotification as ChannelDeliveryResult) ?? null;\n if (out) {\n emitShellEvent('delivery.completed', {\n success: out.success ?? false,\n messageId: out.messageId,\n platform: out.platform,\n status: out.status,\n test: true,\n });\n }\n return out;\n } catch (err: unknown) {\n report(err, 'Failed to send test message');\n throw err;\n }\n },\n [channel, getClient]\n );\n\n // Fetch delivery attempts\n const fetchDeliveryAttempts = useCallback(\n async (\n limit: number = 25,\n cursor?: string\n ): Promise<{\n items: DeliveryAttempt[];\n nextCursor?: string;\n hasMore: boolean;\n total: number;\n }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetDeliveryAttemptsQuery>({\n query: GetDeliveryAttemptsDocument,\n variables: { channelId: id, limit, cursor },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.getChannelDeliveryAttempts;\n return {\n items: data?.items ?? [],\n nextCursor: data?.nextCursor ?? undefined,\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch delivery attempts';\n report(err, 'Failed to fetch delivery attempts');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Fetch webhook events\n const fetchWebhookEvents = useCallback(\n async (\n limit: number = 25,\n cursor?: string\n ): Promise<{ items: WebhookEvent[]; nextCursor?: string; hasMore: boolean; total: number }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetWebhookEventsQuery>({\n query: GetWebhookEventsDocument,\n variables: { channelId: id, limit, cursor },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.getChannelWebhookEvents;\n return {\n items: data?.items ?? [],\n nextCursor: data?.nextCursor ?? undefined,\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch webhook events';\n report(err, 'Failed to fetch webhook events');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Fetch user platform connections\n const fetchUserPlatformConnections = useCallback(\n async (\n limit: number = 25,\n offset: number = 0\n ): Promise<{ items: UserPlatformConnection[]; hasMore: boolean; total: number }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetUserPlatformConnectionsQuery>({\n query: GetUserPlatformConnectionsDocument,\n variables: { channelId: id, pagination: { limit, offset } },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.listUserPlatformConnectionsByChannel;\n return {\n items: data?.items ?? [],\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : 'Failed to fetch user platform connections';\n report(err, 'Failed to fetch user platform connections');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Retry a failed delivery\n const retryDelivery = useCallback(\n async (attemptId: string): Promise<{ success: boolean; error?: string }> => {\n try {\n const client = getClient();\n const result = await client.mutate<RetryDeliveryMutation>({\n mutation: RetryDeliveryDocument,\n variables: { attemptId },\n });\n const data = result.data?.retryDelivery;\n if (data?.success) {\n emitShellEvent('delivery.completed', {\n success: true,\n attemptId,\n messageId: data.messageId,\n retried: true,\n });\n // Refresh the delivery attempts list\n await fetchDeliveryAttempts();\n return { success: true };\n } else {\n return { success: false, error: data?.error || 'Retry failed' };\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to retry delivery';\n report(err, 'Failed to retry delivery');\n return { success: false, error: message };\n }\n },\n [getClient, fetchDeliveryAttempts]\n );\n\n // Fetch delivery statistics\n const fetchDeliveryStats = useCallback(\n async (startDate?: string, endDate?: string): Promise<DeliveryStats | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.query<GetDeliveryStatsQuery>({\n query: GetDeliveryStatsDocument,\n variables: { channelId: id, startDate, endDate },\n fetchPolicy: 'network-only',\n });\n return result.data?.getDeliveryStats ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch delivery stats';\n report(err, 'Failed to fetch delivery stats');\n setError(message);\n return null;\n }\n },\n [id, getClient]\n );\n\n return {\n channel,\n isLoading,\n error,\n refetch: fetchChannel,\n updateChannel,\n runHealthCheck,\n createConnection,\n updateConnection,\n deleteConnection,\n testConnection,\n sendTestNotification,\n fetchDeliveryAttempts,\n fetchWebhookEvents,\n fetchUserPlatformConnections,\n retryDelivery,\n fetchDeliveryStats,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useChannels.js","names":["useChannelContext","useChannel$1","report","error","context","useChannels","channels","setChannels","useState","isLoading","setIsLoading","setError","hasMore","setHasMore","total","setTotal","filter","setFilter","initialFilter","getClient","useCallback","getGlobalChannelClient","apiGatewayUrl","authToken","organizationId","fetchChannels","data","GetChannelsDocument","pagination","err","message","useEffect","created","CreateChannelDocument","emitShellEvent","result","UpdateChannelDocument","DeleteChannelDocument","ActivateChannelDocument","DeactivateChannelDocument","RunChannelHealthCheckDocument","prev","newFilter","DeliverNotificationDocument","useChannel","channel","setChannel","fetchChannel","id","GetChannelDocument","updateChannel","runHealthCheck","createConnection","CreateConnectionDocument","input","updateConnection","UpdateConnectionDocument","connectionId","deleteConnection","DeleteConnectionDocument","cache","testConnection","TestConnectionHealthDocument","sendTestNotification","client","content","options","out","fetchDeliveryAttempts","GetDeliveryAttemptsDocument","GetWebhookEventsDocument","GetUserPlatformConnectionsDocument","RetryDeliveryDocument","GetDeliveryStatsDocument"],"sources":["../../../src/channel/hooks/useChannels.ts"],"sourcesContent":["/**\n * Channel Hooks\n * GraphQL queries and mutations for channel management\n *\n * All types are derived from codegen-generated types (src/generated/global-types.ts)\n * and operation result types (src/generated/global-operations.ts).\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { getGlobalChannelClient } from '../graphql/global-client';\nimport { useChannel as useChannelContext } from '../providers/ChannelProvider';\nimport { emitShellEvent, reportShellError } from '../utils/shellBridge';\nimport {\n GetChannelsDocument,\n GetChannelDocument,\n CreateChannelDocument,\n UpdateChannelDocument,\n DeleteChannelDocument,\n ActivateChannelDocument,\n DeactivateChannelDocument,\n RunChannelHealthCheckDocument,\n CreateConnectionDocument,\n UpdateConnectionDocument,\n DeleteConnectionDocument,\n TestConnectionHealthDocument,\n DeliverNotificationDocument,\n GetDeliveryAttemptsDocument,\n GetWebhookEventsDocument,\n GetUserPlatformConnectionsDocument,\n RetryDeliveryDocument,\n GetDeliveryStatsDocument,\n type GetChannelsQuery,\n type GetChannelQuery,\n type CreateChannelMutation,\n type UpdateChannelMutation,\n type RunChannelHealthCheckMutation,\n type CreateConnectionMutation,\n type UpdateConnectionMutation,\n type TestConnectionHealthMutation,\n type DeliverNotificationMutation,\n type GetDeliveryAttemptsQuery,\n type GetWebhookEventsQuery,\n type GetUserPlatformConnectionsQuery,\n type RetryDeliveryMutation,\n type GetDeliveryStatsQuery,\n} from '../../generated/global-operations';\n\n/** Forward an operational error to the shell SRE sink. */\nfunction report(error: unknown, action: string, context: Record<string, unknown> = {}) {\n reportShellError(error, { module: 'channel', context: { action, ...context } });\n}\n\n// ============================================================================\n// TYPES — derived from codegen, exposed as string unions for convenience.\n//\n// Codegen generates TypeScript enums (e.g., ChannelPlatform.Email = 'EMAIL').\n// Pages/components use string literals ('EMAIL', 'ACTIVE', etc.) which are\n// not directly assignable to TS enums. We re-export the underlying string\n// union types so consumers can use plain strings without casting.\n// ============================================================================\n\nimport type {\n ChannelPlatform as _ChannelPlatform,\n ChannelStatus as _ChannelStatus,\n ChannelAuthType as _ChannelAuthType,\n ConnectionHealth as _ConnectionHealth,\n AdapterType as _AdapterType,\n DeliveryPriority as _DeliveryPriority,\n DeliveryStatus as _DeliveryStatus,\n ChannelFilterInput as _ChannelFilterInput,\n CreateChannelInput as _CreateChannelInput,\n UpdateChannelInput as _UpdateChannelInput,\n CreateConnectionInput as _CreateConnectionInput,\n UpdateConnectionInput as _UpdateConnectionInput,\n ChannelHealthCheck as _ChannelHealthCheck,\n ConnectionTestResult as _ConnectionTestResult,\n ChannelDeliveryResult as _ChannelDeliveryResult,\n ChannelDeliveryError as _ChannelDeliveryError,\n ChannelDeliveryContentInput as _ChannelDeliveryContentInput,\n ChannelDeliveryInput as _ChannelDeliveryInput,\n BulkChannelDeliveryResult as _BulkChannelDeliveryResult,\n UserPresenceStatus as _UserPresenceStatus,\n PairingStatus as _PairingStatus,\n WebhookProcessingStatus as _WebhookProcessingStatus,\n} from '../../generated/global-types';\n\n// ── Enum-like string unions (backward-compatible with string literal usage) ──\n\n/** Communication platform — extends generated enum with values pending backend schema update */\nexport type ChannelPlatform = `${_ChannelPlatform}` | 'INAPP';\n/** Channel lifecycle status */\nexport type ChannelStatus = `${_ChannelStatus}`;\n/** Authentication method for connections */\nexport type ChannelAuthType = `${_ChannelAuthType}`;\n/** Connection health status */\nexport type ConnectionHealth = `${_ConnectionHealth}`;\n/** Specific adapter/provider type — extends generated enum with values pending backend schema update */\nexport type AdapterType =\n | `${_AdapterType}`\n | 'INAPP_NATIVE'\n | 'NOVU'\n | 'KNOCKLABS'\n | 'SENDGRID'\n | 'MAILGUN'\n | 'POSTMARK'\n | 'MANDRILL'\n | 'RESEND'\n | 'SMTP'\n | 'VONAGE'\n | 'PLIVO'\n | 'MESSAGEBIRD'\n | 'INFOBIP'\n | 'APNS'\n | 'ONESIGNAL'\n | 'EXPO'\n | 'WEBCHAT_NATIVE'\n | 'SLACK_WEBHOOK'\n | 'TEAMS_WEBHOOK'\n | 'DISCORD_WEBHOOK';\n/** Delivery priority level */\nexport type DeliveryPriority = `${_DeliveryPriority}`;\n/** Message delivery status */\nexport type DeliveryStatus = `${_DeliveryStatus}`;\n/** User presence status on a platform */\nexport type UserPresenceStatus = `${_UserPresenceStatus}`;\n/** Pairing status for Bundle-2 flow */\nexport type PairingStatus = `${_PairingStatus}`;\n/** Webhook event processing status */\nexport type WebhookProcessingStatus = `${_WebhookProcessingStatus}`;\n\n// ── Utility: recursively unwrap codegen enums to string unions ──────────────\n// Codegen generates TS enums that are not assignable from string literals.\n// This mapped type converts `ChannelPlatform` (enum) → `'EMAIL' | 'SMS' | ...`\n// at every nested level of a type, making all Input/Result types compatible\n// with plain string usage.\n\ntype EnumToString<T> = [T] extends [null]\n ? null\n : T extends null | undefined\n ? EnumToString<NonNullable<T>> | Extract<T, null | undefined>\n : T extends _ChannelPlatform\n ? ChannelPlatform\n : T extends _ChannelStatus\n ? ChannelStatus\n : T extends _ChannelAuthType\n ? ChannelAuthType\n : T extends _ConnectionHealth\n ? ConnectionHealth\n : T extends _AdapterType\n ? AdapterType\n : T extends _DeliveryPriority\n ? DeliveryPriority\n : T extends _DeliveryStatus\n ? DeliveryStatus\n : T extends _UserPresenceStatus\n ? UserPresenceStatus\n : T extends _PairingStatus\n ? PairingStatus\n : T extends _WebhookProcessingStatus\n ? WebhookProcessingStatus\n : T extends Array<infer U>\n ? Array<EnumToString<U>>\n : T extends object\n ? { [K in keyof T]: EnumToString<T[K]> }\n : T;\n\n// ── Input types (used by mutations) ─────────────────────────────────────────\n\nexport type CreateChannelInput = EnumToString<_CreateChannelInput>;\nexport type UpdateChannelInput = EnumToString<_UpdateChannelInput>;\nexport type CreateConnectionInput = EnumToString<_CreateConnectionInput>;\nexport type UpdateConnectionInput = EnumToString<_UpdateConnectionInput>;\nexport type ChannelFilterInput = EnumToString<_ChannelFilterInput>;\nexport type ChannelDeliveryContentInput = EnumToString<_ChannelDeliveryContentInput>;\nexport type ChannelDeliveryInput = EnumToString<_ChannelDeliveryInput>;\nexport type {\n ChannelPaginationInput,\n ChannelDeliveryOptionsInput,\n ChannelRetryPolicyInput,\n BulkChannelDeliveryInput,\n} from '../../generated/global-types';\n\n// ── Schema result types ─────────────────────────────────────────────────────\n\nexport type ChannelHealthCheck = EnumToString<_ChannelHealthCheck>;\nexport type ConnectionTestResult = EnumToString<_ConnectionTestResult>;\nexport type ChannelDeliveryResult = EnumToString<_ChannelDeliveryResult>;\nexport type ChannelDeliveryError = EnumToString<_ChannelDeliveryError>;\nexport type BulkChannelDeliveryResult = EnumToString<_BulkChannelDeliveryResult>;\n\n// ── Derived types from query results ──────────────────────────────────────\n// These represent the actual shape of data returned by our GraphQL operations,\n// not the full schema types (which include __typename, nested relations, etc.)\n\n/** Channel as returned by GetChannels query (list item) */\nexport type Channel = NonNullable<GetChannelsQuery['getChannels']['items'][number]>;\n\n/** Channel as returned by GetChannel query (full detail) */\nexport type ChannelDetail = NonNullable<GetChannelQuery['getChannel']>;\n\n/** ChannelConnection from the GetChannel query (full connection detail) */\nexport type ChannelConnection = NonNullable<ChannelDetail['connection']>;\n\n/** ChannelList response shape */\nexport type ChannelList = GetChannelsQuery['getChannels'];\n\n/** Message delivery attempt as returned by GetDeliveryAttempts query */\nexport type DeliveryAttempt = NonNullable<\n GetDeliveryAttemptsQuery['getChannelDeliveryAttempts']['items'][number]\n>;\n\n/** Webhook event as returned by GetWebhookEvents query */\nexport type WebhookEvent = NonNullable<\n GetWebhookEventsQuery['getChannelWebhookEvents']['items'][number]\n>;\n\n/** User platform connection as returned by GetUserPlatformConnections query */\nexport type UserPlatformConnection = NonNullable<\n GetUserPlatformConnectionsQuery['listUserPlatformConnectionsByChannel']['items'][number]\n>;\n\n/** Delivery statistics as returned by GetDeliveryStats query */\nexport type DeliveryStats = NonNullable<GetDeliveryStatsQuery['getDeliveryStats']>;\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Hook for managing channels list\n */\nexport function useChannels(initialFilter?: ChannelFilterInput) {\n const { authToken, apiGatewayUrl, organizationId } = useChannelContext();\n const [channels, setChannels] = useState<Channel[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [total, setTotal] = useState(0);\n const [filter, setFilter] = useState<ChannelFilterInput>(initialFilter ?? {});\n\n // Get Apollo client with auth token and organization context\n const getClient = useCallback(() => {\n return getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n }, [apiGatewayUrl, authToken, organizationId]);\n\n // Fetch channels\n const fetchChannels = useCallback(\n async (pagination?: { offset?: number; limit?: number }) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const client = getClient();\n const result = await client.query<GetChannelsQuery>({\n query: GetChannelsDocument,\n variables: {\n filter,\n pagination: pagination ?? { offset: 0, limit: 50 },\n },\n fetchPolicy: 'network-only',\n });\n\n const data = result.data?.getChannels;\n if (data) {\n setChannels(data.items);\n setTotal(data.total);\n setHasMore(data.hasMore);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch channels';\n report(err, 'Failed to fetch channels');\n setError(message);\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, filter]\n );\n\n // Initial fetch — defer to microtask to avoid synchronous setState in effect\n useEffect(() => {\n void Promise.resolve().then(() => fetchChannels());\n }, [fetchChannels]);\n\n // Create channel\n const createChannel = useCallback(\n async (input: CreateChannelInput): Promise<Channel | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<CreateChannelMutation>({\n mutation: CreateChannelDocument,\n variables: { input },\n });\n const created = (result.data?.createChannel as Channel) ?? null;\n if (created) {\n emitShellEvent('channel.created', { id: created.id, platform: created.platform });\n }\n await fetchChannels();\n return created;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to create channel';\n report(err, 'Failed to create channel');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Update channel\n const updateChannel = useCallback(\n async (id: string, input: UpdateChannelInput): Promise<Channel | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<UpdateChannelMutation>({\n mutation: UpdateChannelDocument,\n variables: { id, input },\n });\n emitShellEvent('channel.updated', { id });\n await fetchChannels();\n return (result.data?.updateChannel as Channel) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update channel';\n report(err, 'Failed to update channel');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Delete channel\n const deleteChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeleteChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.deleted', { id });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to delete channel';\n report(err, 'Failed to delete channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Activate channel\n const activateChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: ActivateChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.updated', { id, action: 'activated' });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to activate channel';\n report(err, 'Failed to activate channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Deactivate channel\n const deactivateChannel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeactivateChannelDocument,\n variables: { id },\n });\n emitShellEvent('channel.updated', { id, action: 'deactivated' });\n await fetchChannels();\n return true;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to deactivate channel';\n report(err, 'Failed to deactivate channel');\n setError(message);\n return false;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Run health check\n const runHealthCheck = useCallback(\n async (id: string): Promise<ChannelHealthCheck | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<RunChannelHealthCheckMutation>({\n mutation: RunChannelHealthCheckDocument,\n variables: { id },\n });\n await fetchChannels();\n return (result.data?.runChannelHealthCheck as ChannelHealthCheck) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to run health check';\n report(err, 'Failed to run health check');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannels]\n );\n\n // Update filter\n const updateFilter = useCallback((newFilter: Partial<ChannelFilterInput>) => {\n setFilter((prev) => ({ ...prev, ...newFilter }));\n }, []);\n\n // Reset filter\n const resetFilter = useCallback(() => {\n setFilter({});\n }, []);\n\n // Deliver notification via channel\n const deliverNotification = useCallback(\n async (\n input: ChannelDeliveryInput\n ): Promise<{ success: boolean; results?: ChannelDeliveryResult[]; error?: string }> => {\n try {\n const client = getClient();\n const result = await client.mutate<DeliverNotificationMutation>({\n mutation: DeliverNotificationDocument,\n variables: { input },\n });\n\n const data = result.data?.deliverNotification;\n if (data) {\n emitShellEvent('delivery.completed', {\n success: data.success ?? false,\n messageId: data.messageId,\n platform: data.platform,\n status: data.status,\n });\n return {\n success: data.success ?? false,\n results: [data as ChannelDeliveryResult],\n };\n }\n return { success: false, error: 'No data returned' };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to deliver notification';\n report(err, 'Failed to deliver notification');\n return { success: false, error: message };\n }\n },\n [getClient]\n );\n\n return {\n channels,\n isLoading,\n error,\n hasMore,\n total,\n filter,\n refetch: fetchChannels,\n createChannel,\n updateChannel,\n deleteChannel,\n activateChannel,\n deactivateChannel,\n runHealthCheck,\n updateFilter,\n resetFilter,\n deliverNotification,\n };\n}\n\n/**\n * Hook for managing a single channel\n */\nexport function useChannel(id: string | undefined) {\n const { authToken, apiGatewayUrl, organizationId } = useChannelContext();\n const [channel, setChannel] = useState<ChannelDetail | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get Apollo client with auth token and organization context\n const getClient = useCallback(() => {\n return getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n }, [apiGatewayUrl, authToken, organizationId]);\n\n // Fetch channel\n const fetchChannel = useCallback(async () => {\n if (!id) {\n setChannel(null);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const client = getClient();\n const result = await client.query<GetChannelQuery>({\n query: GetChannelDocument,\n variables: { id },\n fetchPolicy: 'network-only',\n });\n\n setChannel(result.data?.getChannel ?? null);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch channel';\n report(err, 'Failed to fetch channel');\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [id, getClient]);\n\n useEffect(() => {\n void Promise.resolve().then(() => fetchChannel());\n }, [fetchChannel]);\n\n // Update channel\n const updateChannel = useCallback(\n async (input: UpdateChannelInput): Promise<ChannelDetail | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<UpdateChannelMutation>({\n mutation: UpdateChannelDocument,\n variables: { id, input },\n });\n emitShellEvent('channel.updated', { id });\n await fetchChannel();\n return (result.data?.updateChannel as ChannelDetail) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update channel';\n report(err, 'Failed to update channel');\n setError(message);\n return null;\n }\n },\n [id, getClient, fetchChannel]\n );\n\n // Run health check\n const runHealthCheck = useCallback(async (): Promise<ChannelHealthCheck | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<RunChannelHealthCheckMutation>({\n mutation: RunChannelHealthCheckDocument,\n variables: { id },\n });\n await fetchChannel();\n return (result.data?.runChannelHealthCheck as ChannelHealthCheck) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to run health check';\n report(err, 'Failed to run health check');\n setError(message);\n return null;\n }\n }, [id, getClient, fetchChannel]);\n\n // Create connection\n const createConnection = useCallback(\n async (input: Omit<CreateConnectionInput, 'channelId'>): Promise<ChannelConnection | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.mutate<CreateConnectionMutation>({\n mutation: CreateConnectionDocument,\n variables: { input: { ...input, channelId: id } },\n });\n const created = (result.data?.createConnection as ChannelConnection) ?? null;\n if (created) {\n emitShellEvent('connection.created', { id: created.id, channelId: id });\n }\n await fetchChannel();\n return created;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to create connection';\n report(err, 'Failed to create connection');\n setError(message);\n return null;\n }\n },\n [id, getClient, fetchChannel]\n );\n\n // Update connection\n const updateConnection = useCallback(\n async (\n connectionId: string,\n input: UpdateConnectionInput\n ): Promise<ChannelConnection | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<UpdateConnectionMutation>({\n mutation: UpdateConnectionDocument,\n variables: { id: connectionId, input },\n });\n emitShellEvent('connection.updated', { id: connectionId });\n await fetchChannel();\n return (result.data?.updateConnection as ChannelConnection) ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to update connection';\n report(err, 'Failed to update connection');\n setError(message);\n return null;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Delete connection\n // Returns void on success; throws on failure (never returns false).\n const deleteConnection = useCallback(\n async (connectionId: string): Promise<void> => {\n try {\n const client = getClient();\n await client.mutate({\n mutation: DeleteConnectionDocument,\n variables: { id: connectionId },\n update(cache) {\n cache.evict({ id: `ChannelConnection:${connectionId}` });\n cache.gc();\n },\n });\n emitShellEvent('connection.deleted', { id: connectionId });\n await fetchChannel();\n } catch (err: unknown) {\n report(err, 'Failed to delete connection');\n throw err;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Test connection\n const testConnection = useCallback(\n async (connectionId: string): Promise<ConnectionTestResult | null> => {\n try {\n const client = getClient();\n const result = await client.mutate<TestConnectionHealthMutation>({\n mutation: TestConnectionHealthDocument,\n variables: { id: connectionId },\n });\n await fetchChannel();\n return (result.data?.testConnectionHealth as ConnectionTestResult) ?? null;\n } catch (err: unknown) {\n report(err, 'Failed to test connection');\n throw err;\n }\n },\n [getClient, fetchChannel]\n );\n\n // Send test message via channel using deliverNotification\n const sendTestNotification = useCallback(\n async (\n recipient: string,\n message: string,\n options?: { subject?: string; html?: string }\n ): Promise<ChannelDeliveryResult | null> => {\n if (!channel) return null;\n\n try {\n const client = getClient();\n\n // Build content based on platform\n const content: ChannelDeliveryContentInput = {\n text: message,\n };\n\n // Add platform-specific content\n if (channel.platform === 'EMAIL') {\n content.subject = options?.subject ?? 'Test Notification';\n if (options?.html) {\n content.html = options.html;\n }\n } else if (channel.platform === 'PUSH') {\n content.title = options?.subject ?? 'Test Notification';\n }\n\n const input: ChannelDeliveryInput = {\n platform: channel.platform,\n organizationId: channel.organizationId,\n recipient,\n content,\n connectionId: channel.connection?.id,\n };\n\n const result = await client.mutate<DeliverNotificationMutation>({\n mutation: DeliverNotificationDocument,\n variables: { input },\n });\n\n const out = (result.data?.deliverNotification as ChannelDeliveryResult) ?? null;\n if (out) {\n emitShellEvent('delivery.completed', {\n success: out.success ?? false,\n messageId: out.messageId,\n platform: out.platform,\n status: out.status,\n test: true,\n });\n }\n return out;\n } catch (err: unknown) {\n report(err, 'Failed to send test message');\n throw err;\n }\n },\n [channel, getClient]\n );\n\n // Fetch delivery attempts\n const fetchDeliveryAttempts = useCallback(\n async (\n limit: number = 25,\n cursor?: string\n ): Promise<{\n items: DeliveryAttempt[];\n nextCursor?: string;\n hasMore: boolean;\n total: number;\n }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetDeliveryAttemptsQuery>({\n query: GetDeliveryAttemptsDocument,\n variables: { channelId: id, limit, cursor },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.getChannelDeliveryAttempts;\n return {\n items: data?.items ?? [],\n nextCursor: data?.nextCursor ?? undefined,\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch delivery attempts';\n report(err, 'Failed to fetch delivery attempts');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Fetch webhook events\n const fetchWebhookEvents = useCallback(\n async (\n limit: number = 25,\n cursor?: string\n ): Promise<{ items: WebhookEvent[]; nextCursor?: string; hasMore: boolean; total: number }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetWebhookEventsQuery>({\n query: GetWebhookEventsDocument,\n variables: { channelId: id, limit, cursor },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.getChannelWebhookEvents;\n return {\n items: data?.items ?? [],\n nextCursor: data?.nextCursor ?? undefined,\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch webhook events';\n report(err, 'Failed to fetch webhook events');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Fetch user platform connections\n const fetchUserPlatformConnections = useCallback(\n async (\n limit: number = 25,\n offset: number = 0\n ): Promise<{ items: UserPlatformConnection[]; hasMore: boolean; total: number }> => {\n if (!id) return { items: [], hasMore: false, total: 0 };\n\n try {\n const client = getClient();\n const result = await client.query<GetUserPlatformConnectionsQuery>({\n query: GetUserPlatformConnectionsDocument,\n variables: { channelId: id, pagination: { limit, offset } },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.listUserPlatformConnectionsByChannel;\n return {\n items: data?.items ?? [],\n hasMore: data?.hasMore ?? false,\n total: data?.total ?? 0,\n };\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : 'Failed to fetch user platform connections';\n report(err, 'Failed to fetch user platform connections');\n setError(message);\n return { items: [], hasMore: false, total: 0 };\n }\n },\n [id, getClient]\n );\n\n // Retry a failed delivery\n const retryDelivery = useCallback(\n async (attemptId: string): Promise<{ success: boolean; error?: string }> => {\n try {\n const client = getClient();\n const result = await client.mutate<RetryDeliveryMutation>({\n mutation: RetryDeliveryDocument,\n variables: { attemptId },\n });\n const data = result.data?.retryDelivery;\n if (data?.success) {\n emitShellEvent('delivery.completed', {\n success: true,\n attemptId,\n messageId: data.messageId,\n retried: true,\n });\n // Refresh the delivery attempts list\n await fetchDeliveryAttempts();\n return { success: true };\n } else {\n return { success: false, error: data?.error || 'Retry failed' };\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to retry delivery';\n report(err, 'Failed to retry delivery');\n return { success: false, error: message };\n }\n },\n [getClient, fetchDeliveryAttempts]\n );\n\n // Fetch delivery statistics\n const fetchDeliveryStats = useCallback(\n async (startDate?: string, endDate?: string): Promise<DeliveryStats | null> => {\n if (!id) return null;\n\n try {\n const client = getClient();\n const result = await client.query<GetDeliveryStatsQuery>({\n query: GetDeliveryStatsDocument,\n variables: { channelId: id, startDate, endDate },\n fetchPolicy: 'network-only',\n });\n return result.data?.getDeliveryStats ?? null;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to fetch delivery stats';\n report(err, 'Failed to fetch delivery stats');\n setError(message);\n return null;\n }\n },\n [id, getClient]\n );\n\n return {\n channel,\n isLoading,\n error,\n refetch: fetchChannel,\n updateChannel,\n runHealthCheck,\n createConnection,\n updateConnection,\n deleteConnection,\n testConnection,\n sendTestNotification,\n fetchDeliveryAttempts,\n fetchWebhookEvents,\n fetchUserPlatformConnections,\n retryDelivery,\n fetchDeliveryStats,\n };\n}\n"],"mappings":"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"}
@@ -14,4 +14,3 @@
14
14
  * return <p>{tr('channel.selectedCount', '{{count}} selected', { count: 5 })}</p>;
15
15
  */
16
16
  export declare function useTr(): (key: string, fallback: string, params?: Record<string, string | number>) => string;
17
- //# sourceMappingURL=useTr.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { useCallback as e } from "react";
2
2
  import { useI18n as t } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
- //#region src/channel/hooks/useTr.ts
3
+ // src/channel/hooks/useTr.ts
4
4
  function n() {
5
5
  let { t: n } = t();
6
6
  return e((e, t, r) => {
@@ -8,7 +8,6 @@ function n() {
8
8
  return r ? Object.entries(r).reduce((e, [t, n]) => e.replace(RegExp(`\\{\\{${t}\\}\\}`, "g"), String(n)), a) : a;
9
9
  }, [n]);
10
10
  }
11
- //#endregion
12
11
  export { n as useTr };
13
12
 
14
13
  //# sourceMappingURL=useTr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTr.js","names":[],"sources":["../../../src/channel/hooks/useTr.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n/**\n * useTr — translation hook with fallback semantics.\n *\n * Wraps `useI18n().t()` so that when a key has no translation (i.e. the\n * provider returns the key itself), the caller's English fallback is used\n * instead. This keeps consumer call sites consistent and avoids leaking\n * untranslated keys into the UI.\n *\n * Supports optional interpolation params using `{{key}}` placeholders.\n *\n * @example\n * const tr = useTr();\n * return <h1>{tr('channel.dashboard.title', 'Dashboard')}</h1>;\n * return <p>{tr('channel.selectedCount', '{{count}} selected', { count: 5 })}</p>;\n */\nexport function useTr(): (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string {\n const { t } = useI18n();\n return useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>): string => {\n const translated = t(key);\n const raw = translated === key ? fallback : translated;\n if (!params) return raw;\n return Object.entries(params).reduce(\n (str, [k, v]) => str.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), String(v)),\n raw\n );\n },\n [t]\n );\n}\n"],"mappings":";;;AAkBA,SAAgB,IAIJ;CACV,IAAM,EAAE,SAAM,GAAS;AACvB,QAAO,GACJ,GAAa,GAAkB,MAAqD;EACnF,IAAM,IAAa,EAAE,EAAI,EACnB,IAAM,MAAe,IAAM,IAAW;AAE5C,SADK,IACE,OAAO,QAAQ,EAAO,CAAC,QAC3B,GAAK,CAAC,GAAG,OAAO,EAAI,QAAY,OAAO,SAAS,EAAE,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,EAC5E,EACD,GAJmB;IAMtB,CAAC,EAAE,CACJ"}
1
+ {"version":3,"file":"useTr.js","names":["useTr","useI18n","useCallback","translated","t","key","raw","fallback","params","k","v","str"],"sources":["../../../src/channel/hooks/useTr.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n/**\n * useTr — translation hook with fallback semantics.\n *\n * Wraps `useI18n().t()` so that when a key has no translation (i.e. the\n * provider returns the key itself), the caller's English fallback is used\n * instead. This keeps consumer call sites consistent and avoids leaking\n * untranslated keys into the UI.\n *\n * Supports optional interpolation params using `{{key}}` placeholders.\n *\n * @example\n * const tr = useTr();\n * return <h1>{tr('channel.dashboard.title', 'Dashboard')}</h1>;\n * return <p>{tr('channel.selectedCount', '{{count}} selected', { count: 5 })}</p>;\n */\nexport function useTr(): (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string {\n const { t } = useI18n();\n return useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>): string => {\n const translated = t(key);\n const raw = translated === key ? fallback : translated;\n if (!params) return raw;\n return Object.entries(params).reduce(\n (str, [k, v]) => str.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), String(v)),\n raw\n );\n },\n [t]\n );\n}\n"],"mappings":";;;AAkBA,SAAgBA,IAIJ;CACV,IAAM,EAAE,SAAMC,EAAQ;CACtB,OAAOC,GACJ,GAAa,GAAkB,MAAqD;EACnF,IAAMC,IAAaC,EAAEC,CAAG,GAClBC,IAAMH,MAAeE,IAAME,IAAWJ;EAE5C,OADKK,IACE,OAAO,QAAQA,CAAM,CAAC,CAAC,QAC3B,GAAK,CAACC,GAAGC,OAAOC,EAAI,QAAY,OAAO,SAASF,EAAE,SAAS,GAAG,GAAG,OAAOC,CAAC,CAAC,GAC3EJ,CACF,IAJoBA;CAKtB,GACA,CAACF,CAAC,CACJ;AACF"}
@@ -9,4 +9,3 @@
9
9
  export { ChannelRoot } from './ChannelRoot';
10
10
  export { useChannel } from './providers/ChannelProvider';
11
11
  export type { ChannelRootProps, NavItem, FooterItem } from './types';
12
- //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,3 @@
1
- import "./providers/ChannelProvider.js";
2
- import "./ChannelRoot.js";
1
+ import { ChannelRoot as e } from "./ChannelRoot.js";
2
+ import { useChannel as t } from "./providers/ChannelProvider.js";
3
+ export { e as ChannelRoot, t as useChannel };
@@ -1,5 +1,4 @@
1
1
  import { ChannelExportFormat } from '../../../../generated/global-types';
2
-
3
2
  type ExportJobResult = {
4
3
  id: string;
5
4
  status: string;
@@ -42,4 +41,3 @@ export declare function useExportChannelUsers(organizationId: string | undefined
42
41
  triggerExport: (format?: ChannelExportFormat) => Promise<void>;
43
42
  };
44
43
  export {};
45
- //# sourceMappingURL=useExport.d.ts.map
@@ -1,10 +1,10 @@
1
- import { useChannel as e } from "../../../providers/ChannelProvider.js";
2
- import { reportShellError as t } from "../../../utils/shellBridge.js";
3
- import { getGlobalChannelClient as n } from "../../../graphql/global-client.js";
1
+ import { getGlobalChannelClient as e } from "../../../graphql/global-client.js";
2
+ import { useChannel as t } from "../../../providers/ChannelProvider.js";
3
+ import { reportShellError as n } from "../../../utils/shellBridge.js";
4
4
  import { ExportChannelUsersDocument as r, ExportChannelsDocument as i, ExportDeliveryAttemptsDocument as a, ExportWebhookEventsDocument as o, GetChannelExportJobDocument as s } from "../../../../generated/global-operations.js";
5
5
  import { ChannelExportFormat as c, ChannelExportStatus as l } from "../../../../generated/global-types.js";
6
6
  import { useCallback as u, useState as d } from "react";
7
- //#region src/channel/modules/channels/hooks/useExport.ts
7
+ // src/channel/modules/channels/hooks/useExport.ts
8
8
  function f(e) {
9
9
  window.location.href = e;
10
10
  }
@@ -22,35 +22,34 @@ async function p(e, t, n = 1500, r = 80) {
22
22
  throw Error("Export timed out waiting for job completion");
23
23
  }
24
24
  function m(r, a) {
25
- let { authToken: o, apiGatewayUrl: s } = e(), [l, m] = d(!1), [h, g] = d(null);
25
+ let { authToken: o, apiGatewayUrl: s } = t(), [l, m] = d(!1), [h, g] = d(null);
26
26
  return {
27
- triggerExport: u(async (e = c.Csv) => {
28
- if (!r) {
29
- g("Organization ID is required for export");
30
- return;
31
- }
32
- m(!0), g(null);
33
- try {
34
- let t = n(s, o, r), c = {
35
- filter: { organizationId: r },
36
- format: e
37
- }, l = (await t.mutate({
38
- mutation: i,
39
- variables: c
40
- })).data?.exportChannels;
41
- if (!l) throw Error("No export job returned");
42
- if (l.error) throw Error(l.error);
43
- let u = l.downloadUrl ? l : await p(t, l.id);
44
- if (u.error) throw Error(u.error);
45
- u.downloadUrl && (f(u.downloadUrl), a?.onComplete?.(u));
46
- } catch (e) {
47
- let n = e instanceof Error ? e.message : "Export failed";
48
- g(n), a?.onError?.(n), t(e, {
49
- module: "channel",
50
- context: { action: "Export channels failed" }
51
- }, "[channel] Export channels failed");
52
- } finally {
53
- m(!1);
27
+ triggerExport: u(async (t = c.Csv) => {
28
+ if (!r) g("Organization ID is required for export");
29
+ else {
30
+ m(!0), g(null);
31
+ try {
32
+ let n = e(s, o, r), c = {
33
+ filter: { organizationId: r },
34
+ format: t
35
+ }, l = (await n.mutate({
36
+ mutation: i,
37
+ variables: c
38
+ })).data?.exportChannels;
39
+ if (!l) throw Error("No export job returned");
40
+ if (l.error) throw Error(l.error);
41
+ let u = l.downloadUrl ? l : await p(n, l.id);
42
+ if (u.error) throw Error(u.error);
43
+ u.downloadUrl && (f(u.downloadUrl), a?.onComplete?.(u));
44
+ } catch (e) {
45
+ let t = e instanceof Error ? e.message : "Export failed";
46
+ g(t), a?.onError?.(t), n(e, {
47
+ module: "channel",
48
+ context: { action: "Export channels failed" }
49
+ }, "[channel] Export channels failed");
50
+ } finally {
51
+ m(!1);
52
+ }
54
53
  }
55
54
  }, [
56
55
  s,
@@ -63,29 +62,29 @@ function m(r, a) {
63
62
  };
64
63
  }
65
64
  function h(r, i, o) {
66
- let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
65
+ let { authToken: s, apiGatewayUrl: l } = t(), [m, h] = d(!1), [g, _] = d(null);
67
66
  return {
68
- triggerExport: u(async (e = c.Csv) => {
67
+ triggerExport: u(async (t = c.Csv) => {
69
68
  h(!0), _(null);
70
69
  try {
71
- let t = n(l, s, r), c = {
70
+ let n = e(l, s, r), c = {
72
71
  filter: {
73
72
  organizationId: r ?? null,
74
73
  channelId: i ?? null
75
74
  },
76
- format: e
77
- }, u = (await t.mutate({
75
+ format: t
76
+ }, u = (await n.mutate({
78
77
  mutation: a,
79
78
  variables: c
80
79
  })).data?.exportDeliveryAttempts;
81
80
  if (!u) throw Error("No export job returned");
82
81
  if (u.error) throw Error(u.error);
83
- let d = u.downloadUrl ? u : await p(t, u.id);
82
+ let d = u.downloadUrl ? u : await p(n, u.id);
84
83
  if (d.error) throw Error(d.error);
85
84
  d.downloadUrl && (f(d.downloadUrl), o?.onComplete?.(d));
86
85
  } catch (e) {
87
- let n = e instanceof Error ? e.message : "Export failed";
88
- _(n), o?.onError?.(n), t(e, {
86
+ let t = e instanceof Error ? e.message : "Export failed";
87
+ _(t), o?.onError?.(t), n(e, {
89
88
  module: "channel",
90
89
  context: { action: "Export delivery attempts failed" }
91
90
  }, "[channel] Export delivery attempts failed");
@@ -104,29 +103,29 @@ function h(r, i, o) {
104
103
  };
105
104
  }
106
105
  function g(r, i, a) {
107
- let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
106
+ let { authToken: s, apiGatewayUrl: l } = t(), [m, h] = d(!1), [g, _] = d(null);
108
107
  return {
109
- triggerExport: u(async (e = c.Csv) => {
108
+ triggerExport: u(async (t = c.Csv) => {
110
109
  h(!0), _(null);
111
110
  try {
112
- let t = n(l, s, r), c = {
111
+ let n = e(l, s, r), c = {
113
112
  filter: {
114
113
  organizationId: r ?? null,
115
114
  channelId: i ?? null
116
115
  },
117
- format: e
118
- }, u = (await t.mutate({
116
+ format: t
117
+ }, u = (await n.mutate({
119
118
  mutation: o,
120
119
  variables: c
121
120
  })).data?.exportWebhookEvents;
122
121
  if (!u) throw Error("No export job returned");
123
122
  if (u.error) throw Error(u.error);
124
- let d = u.downloadUrl ? u : await p(t, u.id);
123
+ let d = u.downloadUrl ? u : await p(n, u.id);
125
124
  if (d.error) throw Error(d.error);
126
125
  d.downloadUrl && (f(d.downloadUrl), a?.onComplete?.(d));
127
126
  } catch (e) {
128
- let n = e instanceof Error ? e.message : "Export failed";
129
- _(n), a?.onError?.(n), t(e, {
127
+ let t = e instanceof Error ? e.message : "Export failed";
128
+ _(t), a?.onError?.(t), n(e, {
130
129
  module: "channel",
131
130
  context: { action: "Export webhook events failed" }
132
131
  }, "[channel] Export webhook events failed");
@@ -145,38 +144,37 @@ function g(r, i, a) {
145
144
  };
146
145
  }
147
146
  function _(i, a, o) {
148
- let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
147
+ let { authToken: s, apiGatewayUrl: l } = t(), [m, h] = d(!1), [g, _] = d(null);
149
148
  return {
150
- triggerExport: u(async (e = c.Csv) => {
151
- if (!i) {
152
- _("Organization ID is required for export");
153
- return;
154
- }
155
- h(!0), _(null);
156
- try {
157
- let t = n(l, s, i), c = {
158
- filter: {
159
- organizationId: i,
160
- channelId: a ?? null
161
- },
162
- format: e
163
- }, u = (await t.mutate({
164
- mutation: r,
165
- variables: c
166
- })).data?.exportChannelUsers;
167
- if (!u) throw Error("No export job returned");
168
- if (u.error) throw Error(u.error);
169
- let d = u.downloadUrl ? u : await p(t, u.id);
170
- if (d.error) throw Error(d.error);
171
- d.downloadUrl && (f(d.downloadUrl), o?.onComplete?.(d));
172
- } catch (e) {
173
- let n = e instanceof Error ? e.message : "Export failed";
174
- _(n), o?.onError?.(n), t(e, {
175
- module: "channel",
176
- context: { action: "Export channel users failed" }
177
- }, "[channel] Export channel users failed");
178
- } finally {
179
- h(!1);
149
+ triggerExport: u(async (t = c.Csv) => {
150
+ if (!i) _("Organization ID is required for export");
151
+ else {
152
+ h(!0), _(null);
153
+ try {
154
+ let n = e(l, s, i), c = {
155
+ filter: {
156
+ organizationId: i,
157
+ channelId: a ?? null
158
+ },
159
+ format: t
160
+ }, u = (await n.mutate({
161
+ mutation: r,
162
+ variables: c
163
+ })).data?.exportChannelUsers;
164
+ if (!u) throw Error("No export job returned");
165
+ if (u.error) throw Error(u.error);
166
+ let d = u.downloadUrl ? u : await p(n, u.id);
167
+ if (d.error) throw Error(d.error);
168
+ d.downloadUrl && (f(d.downloadUrl), o?.onComplete?.(d));
169
+ } catch (e) {
170
+ let t = e instanceof Error ? e.message : "Export failed";
171
+ _(t), o?.onError?.(t), n(e, {
172
+ module: "channel",
173
+ context: { action: "Export channel users failed" }
174
+ }, "[channel] Export channel users failed");
175
+ } finally {
176
+ h(!1);
177
+ }
180
178
  }
181
179
  }, [
182
180
  l,
@@ -189,7 +187,6 @@ function _(i, a, o) {
189
187
  exportError: g
190
188
  };
191
189
  }
192
- //#endregion
193
190
  export { _ as useExportChannelUsers, m as useExportChannels, h as useExportDeliveryAttempts, g as useExportWebhookEvents };
194
191
 
195
192
  //# sourceMappingURL=useExport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useExport.js","names":[],"sources":["../../../../../src/channel/modules/channels/hooks/useExport.ts"],"sourcesContent":["/**\n * useExport hook\n *\n * Generic export hook for channel entities. Calls a provided mutation function,\n * waits for the job to have a downloadUrl, then triggers a browser download.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { getGlobalChannelClient } from '../../../graphql/global-client';\nimport { useChannel as useChannelContext } from '../../../providers/ChannelProvider';\nimport { reportShellError } from '../../../utils/shellBridge';\nimport {\n ExportChannelUsersDocument,\n ExportChannelsDocument,\n ExportDeliveryAttemptsDocument,\n ExportWebhookEventsDocument,\n GetChannelExportJobDocument,\n type ExportChannelUsersMutation,\n type ExportChannelUsersMutationVariables,\n type ExportChannelsMutation,\n type ExportChannelsMutationVariables,\n type ExportDeliveryAttemptsMutation,\n type ExportDeliveryAttemptsMutationVariables,\n type ExportWebhookEventsMutation,\n type ExportWebhookEventsMutationVariables,\n type GetChannelExportJobQuery,\n type GetChannelExportJobQueryVariables,\n} from '../../../../generated/global-operations';\nimport { ChannelExportFormat, ChannelExportStatus } from '../../../../generated/global-types';\n\ntype ExportJobResult = {\n id: string;\n status: string;\n entityType: string;\n format: string;\n rowCount?: number | null;\n downloadUrl?: string | null;\n error?: string | null;\n};\n\ntype UseExportOptions = {\n onComplete?: (job: ExportJobResult) => void;\n onError?: (error: string) => void;\n};\n\ntype UseExportReturn = {\n isExporting: boolean;\n exportError: string | null;\n};\n\nfunction triggerDownload(url: string): void {\n // Use same-tab navigation so the download is not blocked by popup protection.\n // window.open loses the user-activation context after an async await, causing\n // browsers with standard popup blocking to silently suppress the new tab.\n window.location.href = url;\n}\n\n/**\n * Poll the channelExportJob query until the job reaches a terminal state\n * (COMPLETED or FAILED), then return the final job result.\n *\n * Export mutations enqueue an async job and return status=CREATED immediately.\n * downloadUrl is only populated once status=COMPLETED, so we must poll.\n */\nasync function pollExportJob(\n client: ReturnType<typeof getGlobalChannelClient>,\n jobId: string,\n intervalMs = 1500,\n // 80 attempts × 1.5 s = 120 s max wait, accommodating larger datasets or\n // transient backend load that would exceed the previous 60 s cap.\n maxAttempts = 80\n): Promise<ExportJobResult> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise<void>((resolve) => setTimeout(resolve, intervalMs));\n\n const result = await client.query<GetChannelExportJobQuery, GetChannelExportJobQueryVariables>({\n query: GetChannelExportJobDocument,\n variables: { id: jobId },\n fetchPolicy: 'network-only',\n });\n\n const job = result.data?.channelExportJob;\n if (!job) throw new Error('Export job not found');\n\n if (job.status === ChannelExportStatus.Completed || job.status === ChannelExportStatus.Failed) {\n return job as ExportJobResult;\n }\n // Still CREATED or RUNNING — keep polling\n }\n throw new Error('Export timed out waiting for job completion');\n}\n\n/**\n * Hook to export channels (list) to CSV/JSON\n */\nexport function useExportChannels(\n organizationId: string | undefined,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n if (!organizationId) {\n setExportError('Organization ID is required for export');\n return;\n }\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportChannelsMutationVariables = {\n filter: { organizationId },\n format,\n };\n const result = await client.mutate<ExportChannelsMutation>({\n mutation: ExportChannelsDocument,\n variables,\n });\n const pendingJob = result.data?.exportChannels as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export channels failed' } },\n '[channel] Export channels failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export delivery attempts for a channel\n */\nexport function useExportDeliveryAttempts(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportDeliveryAttemptsMutationVariables = {\n filter: {\n organizationId: organizationId ?? null,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportDeliveryAttemptsMutation>({\n mutation: ExportDeliveryAttemptsDocument,\n variables,\n });\n const pendingJob = result.data?.exportDeliveryAttempts as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export delivery attempts failed' } },\n '[channel] Export delivery attempts failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export webhook events for a channel\n */\nexport function useExportWebhookEvents(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportWebhookEventsMutationVariables = {\n filter: {\n organizationId: organizationId ?? null,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportWebhookEventsMutation>({\n mutation: ExportWebhookEventsDocument,\n variables,\n });\n const pendingJob = result.data?.exportWebhookEvents as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export webhook events failed' } },\n '[channel] Export webhook events failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export channel users (UserPlatformConnection records)\n */\nexport function useExportChannelUsers(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n if (!organizationId) {\n setExportError('Organization ID is required for export');\n return;\n }\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportChannelUsersMutationVariables = {\n filter: {\n organizationId,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportChannelUsersMutation>({\n mutation: ExportChannelUsersDocument,\n variables,\n });\n const pendingJob = result.data?.exportChannelUsers as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export channel users failed' } },\n '[channel] Export channel users failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useExport.js","names":["useChannelContext","triggerDownload","url","pollExportJob","attempt","maxAttempts","resolve","intervalMs","job","client","GetChannelExportJobDocument","jobId","ChannelExportStatus","useExportChannels","useChannel","isExporting","setIsExporting","useState","exportError","setExportError","useCallback","ChannelExportFormat","organizationId","getGlobalChannelClient","apiGatewayUrl","authToken","variables","pendingJob","ExportChannelsDocument","opts","err","msg","reportShellError","useExportDeliveryAttempts","channelId","ExportDeliveryAttemptsDocument","useExportWebhookEvents","ExportWebhookEventsDocument","useExportChannelUsers","ExportChannelUsersDocument"],"sources":["../../../../../src/channel/modules/channels/hooks/useExport.ts"],"sourcesContent":["/**\n * useExport hook\n *\n * Generic export hook for channel entities. Calls a provided mutation function,\n * waits for the job to have a downloadUrl, then triggers a browser download.\n */\n\nimport { useCallback, useState } from 'react';\n\nimport { getGlobalChannelClient } from '../../../graphql/global-client';\nimport { useChannel as useChannelContext } from '../../../providers/ChannelProvider';\nimport { reportShellError } from '../../../utils/shellBridge';\nimport {\n ExportChannelUsersDocument,\n ExportChannelsDocument,\n ExportDeliveryAttemptsDocument,\n ExportWebhookEventsDocument,\n GetChannelExportJobDocument,\n type ExportChannelUsersMutation,\n type ExportChannelUsersMutationVariables,\n type ExportChannelsMutation,\n type ExportChannelsMutationVariables,\n type ExportDeliveryAttemptsMutation,\n type ExportDeliveryAttemptsMutationVariables,\n type ExportWebhookEventsMutation,\n type ExportWebhookEventsMutationVariables,\n type GetChannelExportJobQuery,\n type GetChannelExportJobQueryVariables,\n} from '../../../../generated/global-operations';\nimport { ChannelExportFormat, ChannelExportStatus } from '../../../../generated/global-types';\n\ntype ExportJobResult = {\n id: string;\n status: string;\n entityType: string;\n format: string;\n rowCount?: number | null;\n downloadUrl?: string | null;\n error?: string | null;\n};\n\ntype UseExportOptions = {\n onComplete?: (job: ExportJobResult) => void;\n onError?: (error: string) => void;\n};\n\ntype UseExportReturn = {\n isExporting: boolean;\n exportError: string | null;\n};\n\nfunction triggerDownload(url: string): void {\n // Use same-tab navigation so the download is not blocked by popup protection.\n // window.open loses the user-activation context after an async await, causing\n // browsers with standard popup blocking to silently suppress the new tab.\n window.location.href = url;\n}\n\n/**\n * Poll the channelExportJob query until the job reaches a terminal state\n * (COMPLETED or FAILED), then return the final job result.\n *\n * Export mutations enqueue an async job and return status=CREATED immediately.\n * downloadUrl is only populated once status=COMPLETED, so we must poll.\n */\nasync function pollExportJob(\n client: ReturnType<typeof getGlobalChannelClient>,\n jobId: string,\n intervalMs = 1500,\n // 80 attempts × 1.5 s = 120 s max wait, accommodating larger datasets or\n // transient backend load that would exceed the previous 60 s cap.\n maxAttempts = 80\n): Promise<ExportJobResult> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise<void>((resolve) => setTimeout(resolve, intervalMs));\n\n const result = await client.query<GetChannelExportJobQuery, GetChannelExportJobQueryVariables>({\n query: GetChannelExportJobDocument,\n variables: { id: jobId },\n fetchPolicy: 'network-only',\n });\n\n const job = result.data?.channelExportJob;\n if (!job) throw new Error('Export job not found');\n\n if (job.status === ChannelExportStatus.Completed || job.status === ChannelExportStatus.Failed) {\n return job as ExportJobResult;\n }\n // Still CREATED or RUNNING — keep polling\n }\n throw new Error('Export timed out waiting for job completion');\n}\n\n/**\n * Hook to export channels (list) to CSV/JSON\n */\nexport function useExportChannels(\n organizationId: string | undefined,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n if (!organizationId) {\n setExportError('Organization ID is required for export');\n return;\n }\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportChannelsMutationVariables = {\n filter: { organizationId },\n format,\n };\n const result = await client.mutate<ExportChannelsMutation>({\n mutation: ExportChannelsDocument,\n variables,\n });\n const pendingJob = result.data?.exportChannels as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export channels failed' } },\n '[channel] Export channels failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export delivery attempts for a channel\n */\nexport function useExportDeliveryAttempts(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportDeliveryAttemptsMutationVariables = {\n filter: {\n organizationId: organizationId ?? null,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportDeliveryAttemptsMutation>({\n mutation: ExportDeliveryAttemptsDocument,\n variables,\n });\n const pendingJob = result.data?.exportDeliveryAttempts as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export delivery attempts failed' } },\n '[channel] Export delivery attempts failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export webhook events for a channel\n */\nexport function useExportWebhookEvents(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportWebhookEventsMutationVariables = {\n filter: {\n organizationId: organizationId ?? null,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportWebhookEventsMutation>({\n mutation: ExportWebhookEventsDocument,\n variables,\n });\n const pendingJob = result.data?.exportWebhookEvents as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export webhook events failed' } },\n '[channel] Export webhook events failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n\n/**\n * Hook to export channel users (UserPlatformConnection records)\n */\nexport function useExportChannelUsers(\n organizationId: string | undefined,\n channelId?: string,\n opts?: UseExportOptions\n): UseExportReturn & {\n triggerExport: (format?: ChannelExportFormat) => Promise<void>;\n} {\n const { authToken, apiGatewayUrl } = useChannelContext();\n const [isExporting, setIsExporting] = useState(false);\n const [exportError, setExportError] = useState<string | null>(null);\n\n const triggerExport = useCallback(\n async (format: ChannelExportFormat = ChannelExportFormat.Csv) => {\n if (!organizationId) {\n setExportError('Organization ID is required for export');\n return;\n }\n setIsExporting(true);\n setExportError(null);\n try {\n const client = getGlobalChannelClient(apiGatewayUrl, authToken, organizationId);\n const variables: ExportChannelUsersMutationVariables = {\n filter: {\n organizationId,\n channelId: channelId ?? null,\n },\n format,\n };\n const result = await client.mutate<ExportChannelUsersMutation>({\n mutation: ExportChannelUsersDocument,\n variables,\n });\n const pendingJob = result.data?.exportChannelUsers as ExportJobResult | undefined;\n if (!pendingJob) throw new Error('No export job returned');\n if (pendingJob.error) throw new Error(pendingJob.error);\n // Job is async — poll until COMPLETED or FAILED\n const job = pendingJob.downloadUrl\n ? pendingJob\n : await pollExportJob(client, pendingJob.id);\n if (job.error) throw new Error(job.error);\n if (job.downloadUrl) {\n triggerDownload(job.downloadUrl);\n opts?.onComplete?.(job);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Export failed';\n setExportError(msg);\n opts?.onError?.(msg);\n reportShellError(\n err,\n { module: 'channel', context: { action: 'Export channel users failed' } },\n '[channel] Export channel users failed'\n );\n } finally {\n setIsExporting(false);\n }\n },\n [apiGatewayUrl, authToken, organizationId, channelId, opts]\n );\n\n return { triggerExport, isExporting, exportError };\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { ChannelAuthType, ChannelPlatform, ChannelStatus, ConnectionHealth } from '../../hooks/useChannels';
2
-
3
2
  export type TranslateFn = (key: string, fallback: string) => string;
4
3
  type I18nLabel = {
5
4
  key: string;
@@ -11,4 +10,3 @@ export declare const HEALTH_I18N: Record<ConnectionHealth, I18nLabel>;
11
10
  export declare const AUTH_TYPE_I18N: Record<ChannelAuthType, I18nLabel>;
12
11
  export declare function translateLabel<T extends string>(value: T, labels: Partial<Record<T, I18nLabel>>, tr: TranslateFn): string;
13
12
  export {};
14
- //# sourceMappingURL=i18n.d.ts.map
@@ -1,4 +1,4 @@
1
- //#region src/channel/modules/channels/i18n.ts
1
+ // src/channel/modules/channels/i18n.ts
2
2
  var e = {
3
3
  EMAIL: {
4
4
  key: "channel.platformLabel.email",
@@ -104,7 +104,6 @@ function i(e, t, n) {
104
104
  let r = t[e];
105
105
  return r ? n(r.key, r.fallback) : e;
106
106
  }
107
- //#endregion
108
107
  export { r as AUTH_TYPE_I18N, n as HEALTH_I18N, e as PLATFORM_I18N, t as STATUS_I18N, i as translateLabel };
109
108
 
110
109
  //# sourceMappingURL=i18n.js.map