{"version":3,"sources":["../../../src/lib/directory-sync.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Box, Card, Flex, Spinner, Text } from \"@radix-ui/themes\";\nimport { ExternalLinkIcon, InfoCircledIcon } from \"@radix-ui/react-icons\";\nimport { Button, Skeleton } from \"./elements.js\";\nimport { GenericError } from \"./generic-error.js\";\nimport * as CardList from \"./card-list.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n  getDirectoryTypeIcon,\n  getDirectoryTypeName,\n} from \"./identity-providers.js\";\nimport { Status } from \"./status.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport {\n  getDomProps,\n  type WidgetRootState,\n  type WidgetRootDomProps,\n} from \"./utils.js\";\nimport {\n  DirectoryMetadata,\n  DirectoryState,\n  type DirectoryType,\n} from \"../api/endpoint.js\";\n\ninterface BaseDirectorySyncProps {\n  type?: DirectoryType;\n  metadata?: DirectoryMetadata;\n  lastSyncAt?: string | null;\n  link?: string | null;\n  errorMessage?: never;\n  userCount?: never;\n  groupCount?: never;\n  currentDate?: never;\n  state: DirectoryState;\n}\n\ninterface NotConfiguredProps extends BaseDirectorySyncProps {\n  state: (typeof DirectoryState)[\"unlinked\"];\n}\n\ninterface SetupInProgressProps extends Omit<BaseDirectorySyncProps, \"type\"> {\n  state: (typeof DirectoryState)[\"validating\"];\n  type: DirectoryType;\n}\n\ninterface ErrorBeforeConfigProps extends Omit<\n  BaseDirectorySyncProps,\n  \"type\" | \"errorMessage\"\n> {\n  state: DirectoryState;\n  type: DirectoryType;\n  errorMessage: React.ReactNode;\n}\n\ninterface ValidatingProps extends Omit<BaseDirectorySyncProps, \"type\"> {\n  state: (typeof DirectoryState)[\"validating\"];\n  type: DirectoryType;\n}\n\ninterface ActiveProps extends Omit<\n  BaseDirectorySyncProps,\n  \"type\" | \"lastSyncAt\" | \"currentDate\" | \"errorMessage\"\n> {\n  state: (typeof DirectoryState)[\"linked\"];\n  type: DirectoryType;\n  lastSyncAt: string | null;\n  currentDate?: Date | null;\n  errorMessage?: React.ReactNode;\n}\n\ninterface InvalidCredentialsProps extends Omit<\n  BaseDirectorySyncProps,\n  \"type\" | \"errorMessage\"\n> {\n  state: (typeof DirectoryState)[\"invalid_credentials\"];\n  type: DirectoryType;\n  errorMessage: React.ReactNode;\n}\n\ninterface DeletingProps extends Omit<BaseDirectorySyncProps, \"type\"> {\n  state: (typeof DirectoryState)[\"deleting\"];\n  type: DirectoryType;\n}\n\ntype DirectorySyncStatusProps =\n  | NotConfiguredProps\n  | SetupInProgressProps\n  | ErrorBeforeConfigProps\n  | ValidatingProps\n  | ActiveProps\n  | InvalidCredentialsProps\n  | DeletingProps;\n\ntype DirectorySyncProps = WidgetRootDomProps & DirectorySyncStatusProps;\n\ninterface DirectorySyncContextValue {\n  state: DirectorySyncStatusProps[\"state\"];\n  type?: DirectoryType;\n}\n\nconst DirectorySyncContext =\n  React.createContext<DirectorySyncContextValue | null>(null);\nDirectorySyncContext.displayName = \"DirectorySyncContext\";\n\nfunction useDirectorySyncContext() {\n  const context = React.useContext(DirectorySyncContext);\n  if (!context) {\n    throw new Error(\n      \"useDirectorySyncContext must be used within a DirectorySyncContext provider\",\n    );\n  }\n  return context;\n}\n\nfunction DirectoryProviderInfo({\n  type,\n  subtitle,\n}: {\n  type: DirectoryType;\n  subtitle?: React.ReactNode;\n}) {\n  return (\n    <Flex gap=\"4\" align=\"center\">\n      <IconPanel color=\"panel\">\n        <ProviderIcon\n          provider={getDirectoryTypeIcon(type) ?? \"workos\"}\n          size=\"2\"\n        />\n      </IconPanel>\n      {subtitle ? (\n        <Flex direction=\"column\">\n          <Text size=\"2\" weight=\"bold\">\n            {getDirectoryTypeName(type)}\n          </Text>\n          {subtitle}\n        </Flex>\n      ) : (\n        <Text size=\"2\" weight=\"bold\">\n          {getDirectoryTypeName(type)}\n        </Text>\n      )}\n    </Flex>\n  );\n}\n\nfunction SpinnerMessage({ children }: { children: React.ReactNode }) {\n  return (\n    <Flex gap=\"2\" align=\"center\">\n      <Spinner />\n      <Text size=\"2\" color=\"gray\">\n        {children}\n      </Text>\n    </Flex>\n  );\n}\n\nfunction getStatusBadge(state: DirectoryState) {\n  switch (state) {\n    case DirectoryState.requires_type:\n    case DirectoryState.invalid_credentials:\n      return (\n        <Status state=\"error\">\n          <Translation\n            defaultMessage=\"Requires action\"\n            id=\"uuuXIF\"\n            description=\"Status badge when directory requires user action\"\n          />\n        </Status>\n      );\n    case DirectoryState.linked:\n      return (\n        <Status state=\"success\">\n          <Translation\n            defaultMessage=\"Connected\"\n            id=\"H/dAHq\"\n            description=\"Status badge when directory is active\"\n          />\n        </Status>\n      );\n    default:\n      return null;\n  }\n}\n\nfunction getSpinnerMessage(\n  state: DirectoryState,\n  hasType: boolean,\n): string | null {\n  if (state === DirectoryState.unlinked && hasType)\n    return \"Setup in progress...\";\n  if (state === DirectoryState.validating)\n    return \"Waiting for users and groups...\";\n  if (state === DirectoryState.deleting) return \"Deleting directory...\";\n  return null;\n}\n\nconst DirectorySync: React.FC<DirectorySyncProps> = ({\n  state,\n  className,\n  ...rest\n}) => {\n  const type =\n    \"type\" in rest ? (rest as { type: DirectoryType }).type : undefined;\n  const errorMessage =\n    \"errorMessage\" in rest\n      ? (rest as { errorMessage: React.ReactNode }).errorMessage\n      : undefined;\n  const metadata =\n    \"metadata\" in rest\n      ? (rest as { metadata: DirectoryMetadata }).metadata\n      : undefined;\n  const link =\n    \"link\" in rest ? (rest as { link: string | null }).link : undefined;\n  const userCount = metadata?.users.active ?? 0;\n  const groupCount = metadata?.groups ?? 0;\n  const lastSyncAt = rest.lastSyncAt ? new Date(rest.lastSyncAt) : null;\n\n  const currentDate =\n    \"currentDate\" in rest && rest.currentDate instanceof Date\n      ? rest.currentDate\n      : undefined;\n\n  const lastSyncString = lastSyncAt\n    ? getRelativeTimeString(currentDate ?? new Date(), lastSyncAt)\n    : null;\n\n  const showCounts =\n    state === DirectoryState.linked ||\n    state === DirectoryState.invalid_credentials ||\n    state === DirectoryState.deleting;\n  const statusBadge = getStatusBadge(state);\n  const spinnerMessage = getSpinnerMessage(state, !!type);\n  const showButton = state !== DirectoryState.deleting;\n  const domProps: WidgetRootDomProps = { className };\n\n  const countsSubtitle = showCounts ? (\n    <Text size=\"2\" color=\"gray\">\n      <Translation\n        defaultMessage=\"{userCount} {userLabel}\"\n        id=\"aZxx55\"\n        description=\"Directory sync user and group counts\"\n        values={{\n          userCount,\n          userLabel: userCount !== 1 ? \"users\" : \"user\",\n        }}\n      />\n      {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n      <span aria-hidden> ∙ </span>\n      <Translation\n        defaultMessage=\"{groupCount} {groupLabel}\"\n        id=\"SgiDio\"\n        description=\"Directory sync group count\"\n        values={{\n          groupCount,\n          groupLabel: groupCount !== 1 ? \"groups\" : \"group\",\n        }}\n      />\n      {lastSyncString && (\n        <>\n          {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n          <span aria-hidden> ∙ </span>\n          <Translation\n            defaultMessage=\"Last sync {lastSync}\"\n            id=\"UUqjnE\"\n            description=\"Last sync timestamp for directory\"\n            values={{ lastSync: lastSyncString }}\n          />\n        </>\n      )}\n    </Text>\n  ) : null;\n\n  return (\n    <CardList.Root {...getWidgetRootDomProps(\"resolved\", domProps)}>\n      <DirectorySyncContext.Provider value={{ state, type }}>\n        <CardList.Item>\n          <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n            {!type ? (\n              <>\n                <Text size=\"2\" color=\"gray\">\n                  <Translation\n                    defaultMessage=\"You haven't set up a directory yet.\"\n                    id=\"+ywYVl\"\n                    description=\"Empty state message when no directory is configured\"\n                  />\n                </Text>\n                <AdminPortalOpenButton href={link ?? null} />\n              </>\n            ) : (\n              <>\n                <DirectoryProviderInfo type={type} subtitle={countsSubtitle} />\n                <Flex gap=\"5\" align=\"center\">\n                  {statusBadge}\n                  {spinnerMessage && (\n                    <SpinnerMessage>{spinnerMessage}</SpinnerMessage>\n                  )}\n                  {showButton && <AdminPortalOpenButton href={link ?? null} />}\n                </Flex>\n              </>\n            )}\n          </Flex>\n        </CardList.Item>\n\n        {errorMessage && (\n          <CardList.Item>\n            <Flex align=\"start\" gap=\"2\">\n              <Box asChild mt=\"2px\" flexShrink=\"0\">\n                <InfoCircledIcon color=\"var(--gray-11)\" />\n              </Box>\n              <Text size=\"2\" color=\"gray\">\n                {errorMessage}\n              </Text>\n            </Flex>\n          </CardList.Item>\n        )}\n      </DirectorySyncContext.Provider>\n    </CardList.Root>\n  );\n};\n\nfunction AdminPortalOpenButton({\n  href,\n  children,\n}: {\n  href: string | null;\n  children?: React.ReactNode;\n}) {\n  const { state, type } = useDirectorySyncContext();\n\n  const label = (() => {\n    switch (state) {\n      case DirectoryState.unlinked:\n        return type ? \"Continue setup\" : \"Set up directory\";\n      case DirectoryState.validating:\n        return \"Manage\";\n      default:\n        return \"Manage\";\n    }\n  })();\n\n  if (href) {\n    return (\n      <Button variant=\"secondary\" asChild>\n        <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n          {children ?? label} <ExternalLinkIcon aria-hidden />\n        </a>\n      </Button>\n    );\n  }\n\n  return (\n    <Button variant=\"secondary\" disabled>\n      {children ?? label} <ExternalLinkIcon aria-hidden />\n    </Button>\n  );\n}\n\ninterface DirectorySyncLoadingProps extends WidgetRootDomProps {}\n\nconst DirectorySyncLoading: React.FC<DirectorySyncLoadingProps> = (props) => {\n  return (\n    <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n      <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n        <Skeleton>\n          {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n          <Text size=\"2\" color=\"gray\">\n            You haven't set up a directory yet.\n          </Text>\n        </Skeleton>\n        <Skeleton>\n          {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n          <Button variant=\"secondary\">\n            Set up directory <ExternalLinkIcon aria-hidden />\n          </Button>\n        </Skeleton>\n      </Flex>\n    </Card>\n  );\n};\n\ninterface DirectorySyncErrorProps extends WidgetRootDomProps {\n  error: unknown;\n}\n\nconst DirectorySyncError: React.FC<DirectorySyncErrorProps> = ({\n  error,\n  ...domProps\n}) => {\n  return (\n    <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n      <GenericError error={error} />\n    </Card>\n  );\n};\n\nfunction getWidgetRootDomProps(\n  state: WidgetRootState,\n  domProps: WidgetRootDomProps,\n) {\n  return getDomProps({\n    ...domProps,\n    isWidgetRoot: true,\n    widgetId: \"directory-sync\",\n    widgetState: state,\n  });\n}\n\nfunction getRelativeTimeString(\n  currentDate: Date | null,\n  lastSync: Date | null,\n) {\n  if (!currentDate || !lastSync) {\n    return null;\n  }\n\n  const rtf = new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\" });\n  const diff = lastSync.getTime() - currentDate.getTime();\n\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) {\n    return \"now\";\n  }\n\n  if (Math.abs(diffMinutes) < 60) {\n    return rtf.format(diffMinutes, \"minute\");\n  }\n\n  if (Math.abs(diffHours) < 24) {\n    return rtf.format(diffHours, \"hour\");\n  }\n\n  if (Math.abs(diffDays) < 30) {\n    return rtf.format(diffDays, \"day\");\n  }\n\n  if (Math.abs(diffMonths) < 12) {\n    return rtf.format(diffMonths, \"month\");\n  }\n\n  return rtf.format(diffYears, \"year\");\n}\n\nexport type {\n  DirectorySyncProps,\n  DirectorySyncLoadingProps,\n  DirectorySyncErrorProps,\n  DirectorySyncStatusProps,\n};\nexport { DirectorySync, DirectorySyncLoading, DirectorySyncError };\n"],"mappings":"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","names":[]}