{"version":3,"sources":["../../../src/lib/admin-portal-audit-log-streaming.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Box, Card, Flex, Text } from \"@radix-ui/themes\";\nimport * as CardList from \"./card-list.js\";\nimport { Button, Skeleton } from \"./elements.js\";\nimport {\n  ExternalLinkIcon,\n  Cross2Icon,\n  InfoCircledIcon,\n} from \"@radix-ui/react-icons\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { GenericHttpsIcon } from \"./audit-log-stream-icons.js\";\nimport { Status } from \"./status.js\";\nimport {\n  getDomProps,\n  type WidgetRootState,\n  type WidgetRootDomProps,\n} from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\nimport { getErrorMessage } from \"./generic-error.js\";\nimport type { AuditLogStreamType } from \"../api/endpoint.js\";\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\ninterface NotConfiguredProps {\n  connectionStatus: \"NotConfigured\";\n}\n\ninterface InactiveProps {\n  connectionStatus: \"Inactive\";\n  destinationType: AuditLogStreamType;\n}\n\ninterface ActiveProps {\n  connectionStatus: \"Active\";\n  destinationType: AuditLogStreamType;\n  lastSyncedEventId?: string | null;\n}\n\ninterface ErrorProps {\n  connectionStatus: \"Error\";\n  destinationType: AuditLogStreamType;\n  lastSyncedEventId?: string | null;\n}\n\nconst AdminPortalAuditLogStreamingContext = React.createContext<{\n  connectionStatus: AdminPortalAuditLogStreamingStatusProps[\"connectionStatus\"];\n} | null>(null);\n\nfunction useAdminPortalAuditLogStreamingContext() {\n  const context = React.useContext(AdminPortalAuditLogStreamingContext);\n  if (!context) {\n    throw new Error(\n      \"useAdminPortalAuditLogStreamingContext must be used within a AdminPortalAuditLogStreamingContext provider\",\n    );\n  }\n  return context;\n}\n\nexport type AdminPortalAuditLogStreamingStatusProps =\n  | NotConfiguredProps\n  | InactiveProps\n  | ActiveProps\n  | ErrorProps;\n\ntype AdminPortalAuditLogStreamingProps = WidgetRootDomProps &\n  AdminPortalAuditLogStreamingStatusProps & {\n    adminPortalOpenButton: React.ReactNode;\n  };\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Maps AuditLogStreamType to display name\n */\nfunction getDestinationName(type: AuditLogStreamType): string {\n  switch (type) {\n    case \"Datadog\":\n      return \"Datadog\";\n    case \"Splunk\":\n      return \"Splunk\";\n    case \"S3\":\n      return \"AWS S3\";\n    case \"GoogleCloudStorage\":\n      return \"Google Cloud Storage\";\n    case \"AzureSentinel\":\n      return \"Azure Sentinel\";\n    case \"GenericHttps\":\n      return \"Generic HTTPS\";\n    default:\n      return type;\n  }\n}\n\n/**\n * Maps AuditLogStreamType to ProviderIcon provider name\n */\nfunction getDestinationIcon(\n  type: AuditLogStreamType,\n): \"datadog\" | \"splunk\" | \"aws\" | \"google-cloud\" | \"azure\" | undefined {\n  switch (type) {\n    case \"Datadog\":\n      return \"datadog\";\n    case \"Splunk\":\n      return \"splunk\";\n    case \"S3\":\n      return \"aws\";\n    case \"GoogleCloudStorage\":\n      return \"google-cloud\";\n    case \"AzureSentinel\":\n      return \"azure\";\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Helper to get the correct WidgetRootDomProps based on state\n */\nfunction getWidgetRootDomProps(\n  state: WidgetRootState,\n  domProps: WidgetRootDomProps,\n) {\n  return getDomProps({\n    ...domProps,\n    isWidgetRoot: true,\n    widgetId: \"admin-portal-audit-log-streaming\",\n    widgetState: state,\n  });\n}\n\nconst CROCKFORD_BASE32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nfunction decodeUlidTimestamp(ulid: string): Date | null {\n  if (!ulid || ulid.length < 10) return null;\n  let timestamp = 0;\n  for (let i = 0; i < 10; i++) {\n    const charIndex = CROCKFORD_BASE32.indexOf(ulid.charAt(i).toUpperCase());\n    if (charIndex === -1) return null;\n    timestamp = timestamp * 32 + charIndex;\n  }\n  return new Date(timestamp);\n}\n\nfunction getRelativeTimeString(currentDate: Date, pastDate: Date): string {\n  const rtf = new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\" });\n  const diff = pastDate.getTime() - currentDate.getTime();\n  const diffSeconds = Math.round(diff / 1000);\n  const diffMinutes = Math.round(diffSeconds / 60);\n  const diffHours = Math.round(diffMinutes / 60);\n  const diffDays = Math.round(diffHours / 24);\n  const diffMonths = Math.round(diffDays / 30);\n  const diffYears = Math.round(diffMonths / 12);\n\n  if (Math.abs(diffSeconds) < 60) return \"now\";\n  if (Math.abs(diffMinutes) < 60) return rtf.format(diffMinutes, \"minute\");\n  if (Math.abs(diffHours) < 24) return rtf.format(diffHours, \"hour\");\n  if (Math.abs(diffDays) < 30) return rtf.format(diffDays, \"day\");\n  if (Math.abs(diffMonths) < 12) return rtf.format(diffMonths, \"month\");\n  return rtf.format(diffYears, \"year\");\n}\n\nfunction AdminPortalAuditLogStreamingButton({\n  isPending,\n  href,\n  initConfig,\n}: {\n  isPending: boolean;\n  href: string | null;\n  initConfig: () => void;\n}) {\n  const { connectionStatus } = useAdminPortalAuditLogStreamingContext();\n  const label = (() => {\n    switch (connectionStatus) {\n      case \"NotConfigured\":\n        return (\n          <Translation\n            defaultMessage=\"Set up Log Streams\"\n            id=\"s3Wu7U\"\n            description=\"Button label to start log stream setup\"\n          />\n        );\n      case \"Inactive\":\n        return (\n          <Translation\n            defaultMessage=\"Continue setup\"\n            id=\"/oM/HY\"\n            description=\"Button label to continue incomplete log stream setup\"\n          />\n        );\n      case \"Active\":\n      case \"Error\":\n        return (\n          <Translation\n            defaultMessage=\"Manage\"\n            id=\"+k5uUi\"\n            description=\"Button label to manage log stream settings\"\n          />\n        );\n    }\n  })();\n\n  if (href) {\n    return (\n      <Button variant=\"secondary\" asChild>\n        <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n          {label} <ExternalLinkIcon aria-hidden />\n        </a>\n      </Button>\n    );\n  }\n\n  return (\n    <Button\n      variant=\"secondary\"\n      loading={isPending}\n      disabled={isPending}\n      onClick={initConfig}\n    >\n      {label} <ExternalLinkIcon aria-hidden />\n    </Button>\n  );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nconst AdminPortalAuditLogStreaming: React.FC<\n  AdminPortalAuditLogStreamingProps\n> = (props) => {\n  const { connectionStatus, adminPortalOpenButton, className } = props;\n\n  const destinationType =\n    connectionStatus !== \"NotConfigured\"\n      ? (props as InactiveProps | ActiveProps | ErrorProps).destinationType\n      : null;\n  const lastSyncedEventId =\n    connectionStatus === \"Active\" || connectionStatus === \"Error\"\n      ? (props as ActiveProps | ErrorProps).lastSyncedEventId\n      : undefined;\n  const lastSyncedAt = lastSyncedEventId\n    ? decodeUlidTimestamp(lastSyncedEventId)\n    : null;\n\n  const icon = destinationType ? getDestinationIcon(destinationType) : null;\n\n  return (\n    <AdminPortalAuditLogStreamingContext.Provider value={{ connectionStatus }}>\n      <CardList.Root {...getWidgetRootDomProps(\"resolved\", { className })}>\n        <CardList.Item>\n          <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n            <Flex gap=\"4\" align=\"center\">\n              {connectionStatus === \"NotConfigured\" ? (\n                <Text size=\"2\" color=\"gray\">\n                  <Translation\n                    defaultMessage=\"You haven't set up Log Streams yet.\"\n                    id=\"n4mruE\"\n                    description=\"Empty state message when log streaming is not configured\"\n                  />\n                </Text>\n              ) : (\n                <>\n                  <IconPanel color=\"panel\">\n                    {icon ? (\n                      <ProviderIcon provider={icon} size=\"2\" />\n                    ) : (\n                      <GenericHttpsIcon />\n                    )}\n                  </IconPanel>\n                  {lastSyncedAt ? (\n                    <Flex direction=\"column\">\n                      <Text size=\"2\" weight=\"bold\">\n                        {getDestinationName(destinationType!)}\n                      </Text>\n                      <Text size=\"2\" color=\"gray\">\n                        <Translation\n                          defaultMessage=\"Last sync {relativeTime}\"\n                          id=\"fT9f0p\"\n                          description=\"Label showing when the last log stream sync occurred\"\n                          values={{\n                            relativeTime: getRelativeTimeString(\n                              new Date(),\n                              lastSyncedAt,\n                            ),\n                          }}\n                        />\n                      </Text>\n                    </Flex>\n                  ) : (\n                    <Text size=\"2\" weight=\"bold\">\n                      {getDestinationName(destinationType!)}\n                    </Text>\n                  )}\n                </>\n              )}\n            </Flex>\n\n            <Flex gap=\"5\" align=\"center\">\n              {connectionStatus === \"NotConfigured\" ? (\n                adminPortalOpenButton\n              ) : (\n                <>\n                  {connectionStatus === \"Inactive\" && (\n                    <Status state=\"waiting\">\n                      <Translation\n                        defaultMessage=\"Setup in progress\"\n                        id=\"M6iKLG\"\n                        description=\"Status when log stream setup is incomplete\"\n                      />\n                    </Status>\n                  )}\n                  {connectionStatus === \"Active\" && (\n                    <Status state=\"success\">\n                      <Translation\n                        defaultMessage=\"Streaming\"\n                        id=\"25L0J+\"\n                        description=\"Status when log stream is active\"\n                      />\n                    </Status>\n                  )}\n                  {connectionStatus === \"Error\" && (\n                    <Status state=\"error\">\n                      <Translation\n                        defaultMessage=\"Not streaming\"\n                        id=\"7fAKZo\"\n                        description=\"Status when log stream has an error\"\n                      />\n                    </Status>\n                  )}\n                  {adminPortalOpenButton}\n                </>\n              )}\n            </Flex>\n          </Flex>\n        </CardList.Item>\n\n        {connectionStatus === \"Error\" && (\n          <CardList.Item>\n            <Flex align=\"start\" gap=\"2\">\n              <Box asChild mt=\"2px\" flexShrink=\"0\">\n                <InfoCircledIcon color=\"gray\" />\n              </Box>\n              <Text size=\"2\" color=\"gray\">\n                <Translation\n                  defaultMessage=\"The credentials provided are incorrect or missing. Please review and update your log stream configuration.\"\n                  id=\"23tmgn\"\n                  description=\"Error message shown when audit log stream has a configuration or delivery error\"\n                />\n              </Text>\n            </Flex>\n          </CardList.Item>\n        )}\n      </CardList.Root>\n    </AdminPortalAuditLogStreamingContext.Provider>\n  );\n};\n\n// ============================================================================\n// LOADING COMPONENT\n// ============================================================================\n\ninterface AdminPortalAuditLogStreamingLoadingProps extends WidgetRootDomProps {}\n\nconst AdminPortalAuditLogStreamingLoading: React.FC<\n  AdminPortalAuditLogStreamingLoadingProps\n> = (props) => {\n  return (\n    <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n      <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n        <Flex gap=\"4\" align=\"center\">\n          <Skeleton>\n            <IconPanel color=\"panel\">\n              <ProviderIcon provider=\"datadog\" size=\"2\" />\n            </IconPanel>\n          </Skeleton>\n          <Flex direction=\"column\" gap=\"1\" my=\"-4px\">\n            <Skeleton>\n              {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n              <Text size=\"1\">Datadog</Text>\n            </Skeleton>\n            <Skeleton>\n              {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n              <Text size=\"1\">Last sync 10 minutes ago</Text>\n            </Skeleton>\n          </Flex>\n        </Flex>\n\n        <Flex gap=\"5\" align=\"center\">\n          <Skeleton>\n            {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n            <Status state=\"success\">Streaming</Status>\n          </Skeleton>\n          <Skeleton>\n            {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n            <Button variant=\"secondary\">\n              Manage <ExternalLinkIcon aria-hidden />\n            </Button>\n          </Skeleton>\n        </Flex>\n      </Flex>\n    </Card>\n  );\n};\n\n// ============================================================================\n// ERROR COMPONENT\n// ============================================================================\n\ninterface AdminPortalAuditLogStreamingErrorProps extends WidgetRootDomProps {\n  error: unknown;\n}\n\nconst AdminPortalAuditLogStreamingError: React.FC<\n  AdminPortalAuditLogStreamingErrorProps\n> = ({ error, ...domProps }) => {\n  React.useEffect(() => {\n    console.error(error);\n  }, [error]);\n\n  const translate = useTranslation();\n  const { heading, message } = getErrorMessage(error, translate);\n\n  return (\n    <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n      <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n        <Flex gap=\"4\" align=\"center\">\n          {/* Error icon circle */}\n          <Flex\n            align=\"center\"\n            justify=\"center\"\n            width=\"24px\"\n            height=\"24px\"\n            style={{\n              borderRadius: \"9999px\",\n              backgroundColor: \"var(--red-a4)\",\n              color: \"var(--red-a11)\",\n              flexShrink: 0,\n            }}\n          >\n            <Cross2Icon width=\"18px\" height=\"18px\" />\n          </Flex>\n          {/* Error text */}\n          <Flex direction=\"column\">\n            <Text size=\"2\" weight=\"bold\">\n              {heading}\n            </Text>\n            <Text size=\"2\" color=\"gray\">\n              {message}\n            </Text>\n          </Flex>\n        </Flex>\n      </Flex>\n    </Card>\n  );\n};\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport type {\n  AdminPortalAuditLogStreamingProps,\n  AdminPortalAuditLogStreamingLoadingProps,\n  AdminPortalAuditLogStreamingErrorProps,\n};\n\nexport {\n  AdminPortalAuditLogStreaming,\n  AdminPortalAuditLogStreamingLoading,\n  AdminPortalAuditLogStreamingError,\n  /** @internal */\n  AdminPortalAuditLogStreamingButton,\n};\n"],"mappings":"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","names":[]}