@burdenoff/microfe-channel 2026.510.112

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 (156) hide show
  1. package/README.md +147 -0
  2. package/dist/channel/ChannelRoot.d.ts +32 -0
  3. package/dist/channel/ChannelRoot.d.ts.map +1 -0
  4. package/dist/channel/ChannelRoot.js +81 -0
  5. package/dist/channel/ChannelRoot.js.map +1 -0
  6. package/dist/channel/ChannelRoutes.d.ts +10 -0
  7. package/dist/channel/ChannelRoutes.d.ts.map +1 -0
  8. package/dist/channel/ChannelRoutes.js +104 -0
  9. package/dist/channel/ChannelRoutes.js.map +1 -0
  10. package/dist/channel/components/AdapterCredentialsForm.d.ts +20 -0
  11. package/dist/channel/components/AdapterCredentialsForm.d.ts.map +1 -0
  12. package/dist/channel/components/AdapterCredentialsForm.js +230 -0
  13. package/dist/channel/components/AdapterCredentialsForm.js.map +1 -0
  14. package/dist/channel/components/FeatureNotEnabled.d.ts +10 -0
  15. package/dist/channel/components/FeatureNotEnabled.d.ts.map +1 -0
  16. package/dist/channel/components/FeatureNotEnabled.js +32 -0
  17. package/dist/channel/components/FeatureNotEnabled.js.map +1 -0
  18. package/dist/channel/components/PermissionGuard.d.ts +15 -0
  19. package/dist/channel/components/PermissionGuard.d.ts.map +1 -0
  20. package/dist/channel/components/PermissionGuard.js +23 -0
  21. package/dist/channel/components/PermissionGuard.js.map +1 -0
  22. package/dist/channel/config/adapterCredentials.d.ts +44 -0
  23. package/dist/channel/config/adapterCredentials.d.ts.map +1 -0
  24. package/dist/channel/config/adapterCredentials.js +946 -0
  25. package/dist/channel/config/adapterCredentials.js.map +1 -0
  26. package/dist/channel/constants/permissions.d.ts +32 -0
  27. package/dist/channel/constants/permissions.d.ts.map +1 -0
  28. package/dist/channel/constants/permissions.js +30 -0
  29. package/dist/channel/constants/permissions.js.map +1 -0
  30. package/dist/channel/graphql/global-client.d.ts +11 -0
  31. package/dist/channel/graphql/global-client.d.ts.map +1 -0
  32. package/dist/channel/graphql/global-client.js +56 -0
  33. package/dist/channel/graphql/global-client.js.map +1 -0
  34. package/dist/channel/hooks/useChannelOrgSettings.d.ts +22 -0
  35. package/dist/channel/hooks/useChannelOrgSettings.d.ts.map +1 -0
  36. package/dist/channel/hooks/useChannelOrgSettings.js +61 -0
  37. package/dist/channel/hooks/useChannelOrgSettings.js.map +1 -0
  38. package/dist/channel/hooks/useChannelSubscription.d.ts +36 -0
  39. package/dist/channel/hooks/useChannelSubscription.d.ts.map +1 -0
  40. package/dist/channel/hooks/useChannelSubscription.js +111 -0
  41. package/dist/channel/hooks/useChannelSubscription.js.map +1 -0
  42. package/dist/channel/hooks/useChannels.d.ts +214 -0
  43. package/dist/channel/hooks/useChannels.d.ts.map +1 -0
  44. package/dist/channel/hooks/useChannels.js +416 -0
  45. package/dist/channel/hooks/useChannels.js.map +1 -0
  46. package/dist/channel/index.d.ts +12 -0
  47. package/dist/channel/index.d.ts.map +1 -0
  48. package/dist/channel/index.js +2 -0
  49. package/dist/channel/modules/channels/hooks/useExport.d.ts +45 -0
  50. package/dist/channel/modules/channels/hooks/useExport.d.ts.map +1 -0
  51. package/dist/channel/modules/channels/hooks/useExport.js +195 -0
  52. package/dist/channel/modules/channels/hooks/useExport.js.map +1 -0
  53. package/dist/channel/modules/channels/i18n.d.ts +14 -0
  54. package/dist/channel/modules/channels/i18n.d.ts.map +1 -0
  55. package/dist/channel/modules/channels/i18n.js +110 -0
  56. package/dist/channel/modules/channels/i18n.js.map +1 -0
  57. package/dist/channel/modules/channels/pages/ChannelDashboardPage.d.ts +14 -0
  58. package/dist/channel/modules/channels/pages/ChannelDashboardPage.d.ts.map +1 -0
  59. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +680 -0
  60. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -0
  61. package/dist/channel/modules/channels/pages/ChannelDetailsPage.d.ts +7 -0
  62. package/dist/channel/modules/channels/pages/ChannelDetailsPage.d.ts.map +1 -0
  63. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +949 -0
  64. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -0
  65. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts +7 -0
  66. package/dist/channel/modules/channels/pages/ChannelSettingsPage.d.ts.map +1 -0
  67. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +404 -0
  68. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -0
  69. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts +7 -0
  70. package/dist/channel/modules/channels/pages/ChannelUsersPage.d.ts.map +1 -0
  71. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +315 -0
  72. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -0
  73. package/dist/channel/modules/channels/pages/ChannelsListPage.d.ts +7 -0
  74. package/dist/channel/modules/channels/pages/ChannelsListPage.d.ts.map +1 -0
  75. package/dist/channel/modules/channels/pages/ChannelsListPage.js +604 -0
  76. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -0
  77. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts +7 -0
  78. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.d.ts.map +1 -0
  79. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +323 -0
  80. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -0
  81. package/dist/channel/modules/channels/pages/ConnectionsListPage.d.ts +7 -0
  82. package/dist/channel/modules/channels/pages/ConnectionsListPage.d.ts.map +1 -0
  83. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +276 -0
  84. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -0
  85. package/dist/channel/modules/channels/pages/CreateChannelPage.d.ts +12 -0
  86. package/dist/channel/modules/channels/pages/CreateChannelPage.d.ts.map +1 -0
  87. package/dist/channel/modules/channels/pages/CreateChannelPage.js +456 -0
  88. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -0
  89. package/dist/channel/modules/channels/pages/CreateConnectionPage.d.ts +11 -0
  90. package/dist/channel/modules/channels/pages/CreateConnectionPage.d.ts.map +1 -0
  91. package/dist/channel/modules/channels/pages/CreateConnectionPage.js +219 -0
  92. package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -0
  93. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.d.ts +7 -0
  94. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.d.ts.map +1 -0
  95. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +375 -0
  96. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -0
  97. package/dist/channel/modules/channels/pages/EditChannelPage.d.ts +8 -0
  98. package/dist/channel/modules/channels/pages/EditChannelPage.d.ts.map +1 -0
  99. package/dist/channel/modules/channels/pages/EditChannelPage.js +459 -0
  100. package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -0
  101. package/dist/channel/modules/channels/pages/EditConnectionPage.d.ts +10 -0
  102. package/dist/channel/modules/channels/pages/EditConnectionPage.d.ts.map +1 -0
  103. package/dist/channel/modules/channels/pages/EditConnectionPage.js +199 -0
  104. package/dist/channel/modules/channels/pages/EditConnectionPage.js.map +1 -0
  105. package/dist/channel/modules/channels/pages/SendMessagePage.d.ts +8 -0
  106. package/dist/channel/modules/channels/pages/SendMessagePage.d.ts.map +1 -0
  107. package/dist/channel/modules/channels/pages/SendMessagePage.js +403 -0
  108. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -0
  109. package/dist/channel/modules/channels/pages/WebhookEventsPage.d.ts +7 -0
  110. package/dist/channel/modules/channels/pages/WebhookEventsPage.d.ts.map +1 -0
  111. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +303 -0
  112. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -0
  113. package/dist/channel/modules/channels/pages/index.d.ts +18 -0
  114. package/dist/channel/modules/channels/pages/index.d.ts.map +1 -0
  115. package/dist/channel/modules/channels/pages/index.js +14 -0
  116. package/dist/channel/pages/ChannelLandingPage.d.ts +9 -0
  117. package/dist/channel/pages/ChannelLandingPage.d.ts.map +1 -0
  118. package/dist/channel/pages/ChannelLandingPage.js +72 -0
  119. package/dist/channel/pages/ChannelLandingPage.js.map +1 -0
  120. package/dist/channel/providers/ChannelProvider.d.ts +16 -0
  121. package/dist/channel/providers/ChannelProvider.d.ts.map +1 -0
  122. package/dist/channel/providers/ChannelProvider.js +35 -0
  123. package/dist/channel/providers/ChannelProvider.js.map +1 -0
  124. package/dist/channel/types/index.d.ts +89 -0
  125. package/dist/channel/types/index.d.ts.map +1 -0
  126. package/dist/channel/utils/shellBridge.d.ts +59 -0
  127. package/dist/channel/utils/shellBridge.d.ts.map +1 -0
  128. package/dist/channel/utils/shellBridge.js +36 -0
  129. package/dist/channel/utils/shellBridge.js.map +1 -0
  130. package/dist/dev/App.d.ts +6 -0
  131. package/dist/dev/App.d.ts.map +1 -0
  132. package/dist/dev/main.d.ts +2 -0
  133. package/dist/dev/main.d.ts.map +1 -0
  134. package/dist/generated/global-operations.d.ts +1547 -0
  135. package/dist/generated/global-operations.d.ts.map +1 -0
  136. package/dist/generated/global-operations.js +466 -0
  137. package/dist/generated/global-operations.js.map +1 -0
  138. package/dist/generated/global-types.d.ts +21289 -0
  139. package/dist/generated/global-types.d.ts.map +1 -0
  140. package/dist/generated/global-types.js +14 -0
  141. package/dist/generated/global-types.js.map +1 -0
  142. package/dist/generated/wspace-operations.d.ts +2 -0
  143. package/dist/generated/wspace-operations.d.ts.map +1 -0
  144. package/dist/generated/wspace-types.d.ts +55214 -0
  145. package/dist/generated/wspace-types.d.ts.map +1 -0
  146. package/dist/index.d.ts +5 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +4 -0
  149. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  150. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  151. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  152. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  153. package/dist/utils/nativeBridge.d.ts +3 -0
  154. package/dist/utils/nativeBridge.d.ts.map +1 -0
  155. package/dist/utils/nativeBridge.js +2 -0
  156. package/package.json +116 -0
@@ -0,0 +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 } 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/** Log an operational error — console only, never escalate to shell error boundary. */\nfunction report(error: unknown, action: string, context: Record<string, unknown> = {}) {\n console.error(`[channel] ${action}`, error, 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 (limit: number = 50): Promise<DeliveryAttempt[]> => {\n if (!id) return [];\n\n try {\n const client = getClient();\n const result = await client.query<GetDeliveryAttemptsQuery>({\n query: GetDeliveryAttemptsDocument,\n variables: { channelId: id, limit },\n fetchPolicy: 'network-only',\n });\n return result.data?.getChannelDeliveryAttempts?.items ?? [];\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 [];\n }\n },\n [id, getClient]\n );\n\n // Fetch webhook events\n const fetchWebhookEvents = useCallback(\n async (limit: number = 50): Promise<WebhookEvent[]> => {\n if (!id) return [];\n\n try {\n const client = getClient();\n const result = await client.query<GetWebhookEventsQuery>({\n query: GetWebhookEventsDocument,\n variables: { channelId: id, limit },\n fetchPolicy: 'network-only',\n });\n return result.data?.getChannelWebhookEvents?.items ?? [];\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 [];\n }\n },\n [id, getClient]\n );\n\n // Fetch user platform connections\n const fetchUserPlatformConnections = useCallback(\n async (limit: number = 50): Promise<UserPlatformConnection[]> => {\n if (!id) return [];\n\n try {\n const client = getClient();\n const result = await client.query<GetUserPlatformConnectionsQuery>({\n query: GetUserPlatformConnectionsDocument,\n variables: { channelId: id, pagination: { limit } },\n fetchPolicy: 'network-only',\n });\n return result.data?.listUserPlatformConnectionsByChannel?.items ?? [];\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 [];\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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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Channel Microfrontend
3
+ *
4
+ * Provides a complete UI for managing communication channels, connections,
5
+ * and message delivery across multiple platforms (Email, SMS, Push, Slack, etc.)
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export { ChannelRoot } from './ChannelRoot';
10
+ export { useChannel } from './providers/ChannelProvider';
11
+ export type { ChannelRootProps, NavItem, FooterItem } from './types';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/channel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "./providers/ChannelProvider.js";
2
+ import "./ChannelRoot.js";
@@ -0,0 +1,45 @@
1
+ import { ChannelExportFormat } from '../../../../generated/global-types';
2
+
3
+ type ExportJobResult = {
4
+ id: string;
5
+ status: string;
6
+ entityType: string;
7
+ format: string;
8
+ rowCount?: number | null;
9
+ downloadUrl?: string | null;
10
+ error?: string | null;
11
+ };
12
+ type UseExportOptions = {
13
+ onComplete?: (job: ExportJobResult) => void;
14
+ onError?: (error: string) => void;
15
+ };
16
+ type UseExportReturn = {
17
+ isExporting: boolean;
18
+ exportError: string | null;
19
+ };
20
+ /**
21
+ * Hook to export channels (list) to CSV/JSON
22
+ */
23
+ export declare function useExportChannels(organizationId: string | undefined, opts?: UseExportOptions): UseExportReturn & {
24
+ triggerExport: (format?: ChannelExportFormat) => Promise<void>;
25
+ };
26
+ /**
27
+ * Hook to export delivery attempts for a channel
28
+ */
29
+ export declare function useExportDeliveryAttempts(organizationId: string | undefined, channelId?: string, opts?: UseExportOptions): UseExportReturn & {
30
+ triggerExport: (format?: ChannelExportFormat) => Promise<void>;
31
+ };
32
+ /**
33
+ * Hook to export webhook events for a channel
34
+ */
35
+ export declare function useExportWebhookEvents(organizationId: string | undefined, channelId?: string, opts?: UseExportOptions): UseExportReturn & {
36
+ triggerExport: (format?: ChannelExportFormat) => Promise<void>;
37
+ };
38
+ /**
39
+ * Hook to export channel users (UserPlatformConnection records)
40
+ */
41
+ export declare function useExportChannelUsers(organizationId: string | undefined, channelId?: string, opts?: UseExportOptions): UseExportReturn & {
42
+ triggerExport: (format?: ChannelExportFormat) => Promise<void>;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=useExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../../../src/channel/modules/channels/hooks/useExport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,OAAO,EAAE,mBAAmB,EAAuB,MAAM,oCAAoC,CAAC;AAE9F,KAAK,eAAe,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AA4CF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,CAAC,EAAE,gBAAgB,GACtB,eAAe,GAAG;IACnB,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAoDA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,eAAe,GAAG;IACnB,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAmDA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,eAAe,GAAG;IACnB,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAmDA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,eAAe,GAAG;IACnB,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAuDA"}
@@ -0,0 +1,195 @@
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";
4
+ import { ExportChannelUsersDocument as r, ExportChannelsDocument as i, ExportDeliveryAttemptsDocument as a, ExportWebhookEventsDocument as o, GetChannelExportJobDocument as s } from "../../../../generated/global-operations.js";
5
+ import { ChannelExportFormat as c, ChannelExportStatus as l } from "../../../../generated/global-types.js";
6
+ import { useCallback as u, useState as d } from "react";
7
+ //#region src/channel/modules/channels/hooks/useExport.ts
8
+ function f(e) {
9
+ window.location.href = e;
10
+ }
11
+ async function p(e, t, n = 1500, r = 80) {
12
+ for (let i = 0; i < r; i++) {
13
+ await new Promise((e) => setTimeout(e, n));
14
+ let r = (await e.query({
15
+ query: s,
16
+ variables: { id: t },
17
+ fetchPolicy: "network-only"
18
+ })).data?.channelExportJob;
19
+ if (!r) throw Error("Export job not found");
20
+ if (r.status === l.Completed || r.status === l.Failed) return r;
21
+ }
22
+ throw Error("Export timed out waiting for job completion");
23
+ }
24
+ function m(r, a) {
25
+ let { authToken: o, apiGatewayUrl: s } = e(), [l, m] = d(!1), [h, g] = d(null);
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);
54
+ }
55
+ }, [
56
+ s,
57
+ o,
58
+ r,
59
+ a
60
+ ]),
61
+ isExporting: l,
62
+ exportError: h
63
+ };
64
+ }
65
+ function h(r, i, o) {
66
+ let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
67
+ return {
68
+ triggerExport: u(async (e = c.Csv) => {
69
+ h(!0), _(null);
70
+ try {
71
+ let t = n(l, s, r), c = {
72
+ filter: {
73
+ organizationId: r ?? null,
74
+ channelId: i ?? null
75
+ },
76
+ format: e
77
+ }, u = (await t.mutate({
78
+ mutation: a,
79
+ variables: c
80
+ })).data?.exportDeliveryAttempts;
81
+ if (!u) throw Error("No export job returned");
82
+ if (u.error) throw Error(u.error);
83
+ let d = u.downloadUrl ? u : await p(t, u.id);
84
+ if (d.error) throw Error(d.error);
85
+ d.downloadUrl && (f(d.downloadUrl), o?.onComplete?.(d));
86
+ } catch (e) {
87
+ let n = e instanceof Error ? e.message : "Export failed";
88
+ _(n), o?.onError?.(n), t(e, {
89
+ module: "channel",
90
+ context: { action: "Export delivery attempts failed" }
91
+ }, "[channel] Export delivery attempts failed");
92
+ } finally {
93
+ h(!1);
94
+ }
95
+ }, [
96
+ l,
97
+ s,
98
+ r,
99
+ i,
100
+ o
101
+ ]),
102
+ isExporting: m,
103
+ exportError: g
104
+ };
105
+ }
106
+ function g(r, i, a) {
107
+ let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
108
+ return {
109
+ triggerExport: u(async (e = c.Csv) => {
110
+ h(!0), _(null);
111
+ try {
112
+ let t = n(l, s, r), c = {
113
+ filter: {
114
+ organizationId: r ?? null,
115
+ channelId: i ?? null
116
+ },
117
+ format: e
118
+ }, u = (await t.mutate({
119
+ mutation: o,
120
+ variables: c
121
+ })).data?.exportWebhookEvents;
122
+ if (!u) throw Error("No export job returned");
123
+ if (u.error) throw Error(u.error);
124
+ let d = u.downloadUrl ? u : await p(t, u.id);
125
+ if (d.error) throw Error(d.error);
126
+ d.downloadUrl && (f(d.downloadUrl), a?.onComplete?.(d));
127
+ } catch (e) {
128
+ let n = e instanceof Error ? e.message : "Export failed";
129
+ _(n), a?.onError?.(n), t(e, {
130
+ module: "channel",
131
+ context: { action: "Export webhook events failed" }
132
+ }, "[channel] Export webhook events failed");
133
+ } finally {
134
+ h(!1);
135
+ }
136
+ }, [
137
+ l,
138
+ s,
139
+ r,
140
+ i,
141
+ a
142
+ ]),
143
+ isExporting: m,
144
+ exportError: g
145
+ };
146
+ }
147
+ function _(i, a, o) {
148
+ let { authToken: s, apiGatewayUrl: l } = e(), [m, h] = d(!1), [g, _] = d(null);
149
+ 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);
180
+ }
181
+ }, [
182
+ l,
183
+ s,
184
+ i,
185
+ a,
186
+ o
187
+ ]),
188
+ isExporting: m,
189
+ exportError: g
190
+ };
191
+ }
192
+ //#endregion
193
+ export { _ as useExportChannelUsers, m as useExportChannels, h as useExportDeliveryAttempts, g as useExportWebhookEvents };
194
+
195
+ //# sourceMappingURL=useExport.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,14 @@
1
+ import { ChannelAuthType, ChannelPlatform, ChannelStatus, ConnectionHealth } from '../../hooks/useChannels';
2
+
3
+ export type TranslateFn = (key: string, fallback: string) => string;
4
+ type I18nLabel = {
5
+ key: string;
6
+ fallback: string;
7
+ };
8
+ export declare const PLATFORM_I18N: Record<ChannelPlatform, I18nLabel>;
9
+ export declare const STATUS_I18N: Record<ChannelStatus, I18nLabel>;
10
+ export declare const HEALTH_I18N: Record<ConnectionHealth, I18nLabel>;
11
+ export declare const AUTH_TYPE_I18N: Record<ChannelAuthType, I18nLabel>;
12
+ export declare function translateLabel<T extends string>(value: T, labels: Partial<Record<T, I18nLabel>>, tr: TranslateFn): string;
13
+ export {};
14
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../src/channel/modules/channels/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;AAEpE,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,CAW5D,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,CAMxD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAK3D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,CAM7D,CAAC;AAEF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EACrC,EAAE,EAAE,WAAW,GACd,MAAM,CAGR"}
@@ -0,0 +1,110 @@
1
+ //#region src/channel/modules/channels/i18n.ts
2
+ var e = {
3
+ EMAIL: {
4
+ key: "channel.platform.email",
5
+ fallback: "Email"
6
+ },
7
+ SMS: {
8
+ key: "channel.platform.sms",
9
+ fallback: "SMS"
10
+ },
11
+ PUSH: {
12
+ key: "channel.platform.push",
13
+ fallback: "Push"
14
+ },
15
+ INAPP: {
16
+ key: "channel.platform.inApp",
17
+ fallback: "In-App"
18
+ },
19
+ WEBHOOK: {
20
+ key: "channel.platform.webhook",
21
+ fallback: "Webhook"
22
+ },
23
+ SLACK: {
24
+ key: "channel.platform.slack",
25
+ fallback: "Slack"
26
+ },
27
+ TEAMS: {
28
+ key: "channel.platform.teams",
29
+ fallback: "Teams"
30
+ },
31
+ DISCORD: {
32
+ key: "channel.platform.discord",
33
+ fallback: "Discord"
34
+ },
35
+ WHATSAPP: {
36
+ key: "channel.platform.whatsapp",
37
+ fallback: "WhatsApp"
38
+ },
39
+ WEBCHAT: {
40
+ key: "channel.platform.webchat",
41
+ fallback: "Webchat"
42
+ }
43
+ }, t = {
44
+ ACTIVE: {
45
+ key: "channel.status.active",
46
+ fallback: "Active"
47
+ },
48
+ INACTIVE: {
49
+ key: "channel.status.inactive",
50
+ fallback: "Inactive"
51
+ },
52
+ ERROR: {
53
+ key: "channel.status.error",
54
+ fallback: "Error"
55
+ },
56
+ SUSPENDED: {
57
+ key: "channel.status.suspended",
58
+ fallback: "Suspended"
59
+ },
60
+ ARCHIVED: {
61
+ key: "channel.status.archived",
62
+ fallback: "Archived"
63
+ }
64
+ }, n = {
65
+ HEALTHY: {
66
+ key: "channel.health.healthy",
67
+ fallback: "Healthy"
68
+ },
69
+ DEGRADED: {
70
+ key: "channel.health.degraded",
71
+ fallback: "Degraded"
72
+ },
73
+ UNHEALTHY: {
74
+ key: "channel.health.unhealthy",
75
+ fallback: "Unhealthy"
76
+ },
77
+ UNKNOWN: {
78
+ key: "channel.health.unknown",
79
+ fallback: "Unknown"
80
+ }
81
+ }, r = {
82
+ API_KEY: {
83
+ key: "channel.authType.apiKey",
84
+ fallback: "API Key"
85
+ },
86
+ OAUTH2: {
87
+ key: "channel.authType.oauth2",
88
+ fallback: "OAuth 2.0"
89
+ },
90
+ BOT_TOKEN: {
91
+ key: "channel.authType.botToken",
92
+ fallback: "Bot Token"
93
+ },
94
+ WEBHOOK: {
95
+ key: "channel.authType.webhook",
96
+ fallback: "Webhook"
97
+ },
98
+ SMTP_IMAP: {
99
+ key: "channel.authType.smtpImap",
100
+ fallback: "SMTP/IMAP"
101
+ }
102
+ };
103
+ function i(e, t, n) {
104
+ let r = t[e];
105
+ return r ? n(r.key, r.fallback) : e;
106
+ }
107
+ //#endregion
108
+ export { r as AUTH_TYPE_I18N, n as HEALTH_I18N, e as PLATFORM_I18N, t as STATUS_I18N, i as translateLabel };
109
+
110
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","names":[],"sources":["../../../../src/channel/modules/channels/i18n.ts"],"sourcesContent":["import type {\n ChannelAuthType,\n ChannelPlatform,\n ChannelStatus,\n ConnectionHealth,\n} from '../../hooks/useChannels';\n\nexport type TranslateFn = (key: string, fallback: string) => string;\n\ntype I18nLabel = {\n key: string;\n fallback: string;\n};\n\nexport const PLATFORM_I18N: Record<ChannelPlatform, I18nLabel> = {\n EMAIL: { key: 'channel.platform.email', fallback: 'Email' },\n SMS: { key: 'channel.platform.sms', fallback: 'SMS' },\n PUSH: { key: 'channel.platform.push', fallback: 'Push' },\n INAPP: { key: 'channel.platform.inApp', fallback: 'In-App' },\n WEBHOOK: { key: 'channel.platform.webhook', fallback: 'Webhook' },\n SLACK: { key: 'channel.platform.slack', fallback: 'Slack' },\n TEAMS: { key: 'channel.platform.teams', fallback: 'Teams' },\n DISCORD: { key: 'channel.platform.discord', fallback: 'Discord' },\n WHATSAPP: { key: 'channel.platform.whatsapp', fallback: 'WhatsApp' },\n WEBCHAT: { key: 'channel.platform.webchat', fallback: 'Webchat' },\n};\n\nexport const STATUS_I18N: Record<ChannelStatus, I18nLabel> = {\n ACTIVE: { key: 'channel.status.active', fallback: 'Active' },\n INACTIVE: { key: 'channel.status.inactive', fallback: 'Inactive' },\n ERROR: { key: 'channel.status.error', fallback: 'Error' },\n SUSPENDED: { key: 'channel.status.suspended', fallback: 'Suspended' },\n ARCHIVED: { key: 'channel.status.archived', fallback: 'Archived' },\n};\n\nexport const HEALTH_I18N: Record<ConnectionHealth, I18nLabel> = {\n HEALTHY: { key: 'channel.health.healthy', fallback: 'Healthy' },\n DEGRADED: { key: 'channel.health.degraded', fallback: 'Degraded' },\n UNHEALTHY: { key: 'channel.health.unhealthy', fallback: 'Unhealthy' },\n UNKNOWN: { key: 'channel.health.unknown', fallback: 'Unknown' },\n};\n\nexport const AUTH_TYPE_I18N: Record<ChannelAuthType, I18nLabel> = {\n API_KEY: { key: 'channel.authType.apiKey', fallback: 'API Key' },\n OAUTH2: { key: 'channel.authType.oauth2', fallback: 'OAuth 2.0' },\n BOT_TOKEN: { key: 'channel.authType.botToken', fallback: 'Bot Token' },\n WEBHOOK: { key: 'channel.authType.webhook', fallback: 'Webhook' },\n SMTP_IMAP: { key: 'channel.authType.smtpImap', fallback: 'SMTP/IMAP' },\n};\n\nexport function translateLabel<T extends string>(\n value: T,\n labels: Partial<Record<T, I18nLabel>>,\n tr: TranslateFn\n): string {\n const label = labels[value];\n return label ? tr(label.key, label.fallback) : value;\n}\n"],"mappings":";AAcA,IAAa,IAAoD;CAC/D,OAAO;EAAE,KAAK;EAA0B,UAAU;EAAS;CAC3D,KAAK;EAAE,KAAK;EAAwB,UAAU;EAAO;CACrD,MAAM;EAAE,KAAK;EAAyB,UAAU;EAAQ;CACxD,OAAO;EAAE,KAAK;EAA0B,UAAU;EAAU;CAC5D,SAAS;EAAE,KAAK;EAA4B,UAAU;EAAW;CACjE,OAAO;EAAE,KAAK;EAA0B,UAAU;EAAS;CAC3D,OAAO;EAAE,KAAK;EAA0B,UAAU;EAAS;CAC3D,SAAS;EAAE,KAAK;EAA4B,UAAU;EAAW;CACjE,UAAU;EAAE,KAAK;EAA6B,UAAU;EAAY;CACpE,SAAS;EAAE,KAAK;EAA4B,UAAU;EAAW;CAClE,EAEY,IAAgD;CAC3D,QAAQ;EAAE,KAAK;EAAyB,UAAU;EAAU;CAC5D,UAAU;EAAE,KAAK;EAA2B,UAAU;EAAY;CAClE,OAAO;EAAE,KAAK;EAAwB,UAAU;EAAS;CACzD,WAAW;EAAE,KAAK;EAA4B,UAAU;EAAa;CACrE,UAAU;EAAE,KAAK;EAA2B,UAAU;EAAY;CACnE,EAEY,IAAmD;CAC9D,SAAS;EAAE,KAAK;EAA0B,UAAU;EAAW;CAC/D,UAAU;EAAE,KAAK;EAA2B,UAAU;EAAY;CAClE,WAAW;EAAE,KAAK;EAA4B,UAAU;EAAa;CACrE,SAAS;EAAE,KAAK;EAA0B,UAAU;EAAW;CAChE,EAEY,IAAqD;CAChE,SAAS;EAAE,KAAK;EAA2B,UAAU;EAAW;CAChE,QAAQ;EAAE,KAAK;EAA2B,UAAU;EAAa;CACjE,WAAW;EAAE,KAAK;EAA6B,UAAU;EAAa;CACtE,SAAS;EAAE,KAAK;EAA4B,UAAU;EAAW;CACjE,WAAW;EAAE,KAAK;EAA6B,UAAU;EAAa;CACvE;AAED,SAAgB,EACd,GACA,GACA,GACQ;CACR,IAAM,IAAQ,EAAO;AACrB,QAAO,IAAQ,EAAG,EAAM,KAAK,EAAM,SAAS,GAAG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Channel Dashboard Page
3
+ *
4
+ * Main overview page for the Channel microfrontend.
5
+ * Fetches real data from global-channel-svc via the useChannels hook.
6
+ *
7
+ * Sections:
8
+ * 1. Header with Create Channel action
9
+ * 2. KPI summary cards (total, active, healthy, connected)
10
+ * 3. Search + platform/status filters
11
+ * 4. Channel table with inline actions
12
+ */
13
+ export declare function ChannelDashboardPage(): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=ChannelDashboardPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelDashboardPage.d.ts","sourceRoot":"","sources":["../../../../../src/channel/modules/channels/pages/ChannelDashboardPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+JH,wBAAgB,oBAAoB,4CA2nBnC"}