{"version":3,"sources":["../../src/admin-portal-sso-connection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n  AdminPortalOpenButton,\n  AdminPortalSsoConnectionError,\n  AdminPortalSsoConnectionLoading,\n  AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport type {\n  AdminPortalSsoConnectionErrorProps,\n  AdminPortalSsoConnectionLoadingProps,\n  AdminPortalSsoConnectionStatusProps,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport {\n  type SsoConnection,\n  useListSsoConnections,\n  useGenerateAdminPortalLink,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport {\n  openAdminPortalViaForm,\n  unreachable,\n  WidgetRootDomProps,\n} from \"./lib/utils.js\";\nimport { IdentityProvider } from \"./lib/identity-providers.js\";\n\ninterface AdminPortalSsoConnectionProps extends WidgetRootDomProps {\n  authToken: AuthToken;\n}\n\nconst AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps> = ({\n  authToken,\n  ...domProps\n}) => {\n  const baseUrl = useWorkOsApiUrl();\n  return (\n    <ErrorBoundary\n      fallbackRender={({ error }) => (\n        <AdminPortalSsoConnectionError error={error} {...domProps} />\n      )}\n    >\n      <ApiProvider\n        widgetType=\"admin-portal-sso-connection\"\n        authToken={authToken}\n        baseUrl={baseUrl}\n      >\n        <AdminPortalSsoConnectionImpl {...domProps} />\n      </ApiProvider>\n    </ErrorBoundary>\n  );\n};\n\nconst AdminPortalSsoConnectionImpl = (props: WidgetRootDomProps) => {\n  const isApiReady = useApiReady();\n  const [currentDate, setCurrentDate] = React.useState<Date | null>(() =>\n    isApiReady ? new Date() : null,\n  );\n  if (isApiReady && currentDate === null) {\n    setCurrentDate(new Date());\n  }\n\n  const { mutate: generateAdminPortalLink, isPending } =\n    useGenerateAdminPortalLink({\n      mutation: {\n        onSuccess: (data) => {\n          openAdminPortalViaForm(data.link, {\n            target: \"_blank\",\n            rel: \"noopener noreferrer\",\n          });\n        },\n      },\n    });\n\n  const query = useListSsoConnections();\n\n  const initConfig = () => {\n    generateAdminPortalLink({\n      params: {\n        intent: \"sso\",\n      },\n    });\n  };\n\n  if (query.isLoading) {\n    return <AdminPortalSsoConnectionLoading {...props} />;\n  }\n\n  if (query.isError) {\n    return <AdminPortalSsoConnectionError error={query.error} {...props} />;\n  }\n\n  if (query.data) {\n    const connection = query.data[0];\n    if (!connection) {\n      return (\n        <ErrorBoundary\n          fallbackRender={({ error }) => (\n            <AdminPortalSsoConnectionError error={error} {...props} />\n          )}\n        >\n          <AdminPortalSsoConnectionPresentational\n            {...props}\n            connectionStatus=\"NotConfigured\"\n            currentDate={currentDate}\n            lastSession={null}\n            adminPortalOpenButton={\n              <AdminPortalOpenButton\n                isPending={isPending}\n                initConfig={initConfig}\n              />\n            }\n          />\n        </ErrorBoundary>\n      );\n    }\n\n    const connectionState = getConnectionState(connection, currentDate);\n    const statusProps: AdminPortalSsoConnectionStatusProps = (() => {\n      const connectionStatus = connectionState.status;\n      if (!connection || connectionStatus === \"NotConfigured\") {\n        return {\n          connectionStatus: \"NotConfigured\",\n        } satisfies AdminPortalSsoConnectionStatusProps;\n      }\n\n      const identityProvider = getIdentityProvider(connection);\n      switch (connectionStatus) {\n        case \"Active\":\n          return {\n            connectionStatus,\n            identityProvider,\n          } satisfies AdminPortalSsoConnectionStatusProps;\n        case \"Inactive\":\n          return {\n            connectionStatus,\n            identityProvider,\n          } satisfies AdminPortalSsoConnectionStatusProps;\n        case \"Expired\":\n        case \"Expiring\":\n          return {\n            connectionStatus,\n            expiryDate: connectionState.expiryDate,\n            identityProvider,\n          } satisfies AdminPortalSsoConnectionStatusProps;\n        default:\n          return unreachable(connectionState);\n      }\n    })();\n\n    const lastSession = connection.lastSession\n      ? new Date(connection.lastSession.createdAt)\n      : null;\n\n    return (\n      <ErrorBoundary\n        fallbackRender={({ error }) => (\n          <AdminPortalSsoConnectionError error={error} {...props} />\n        )}\n      >\n        <AdminPortalSsoConnectionPresentational\n          {...props}\n          {...statusProps}\n          currentDate={currentDate}\n          lastSession={lastSession}\n          adminPortalOpenButton={\n            <AdminPortalOpenButton\n              isPending={isPending}\n              initConfig={initConfig}\n            />\n          }\n        />\n      </ErrorBoundary>\n    );\n  }\n};\n\ntype ConnectionState =\n  | { status: \"NotConfigured\" }\n  | { status: \"Active\" }\n  | { status: \"Inactive\" }\n  | {\n      status: \"Expiring\";\n      daysUntilExpiry: number | null;\n      expiryDate: Date | null;\n    }\n  | { status: \"Expired\"; expiryDate: Date | null };\n\nfunction getConnectionState(\n  connection: SsoConnection,\n  currentDate: Date | null,\n): ConnectionState {\n  switch (connection.state) {\n    case \"Active\":\n    case \"Validating\":\n    case \"Deleting\": {\n      const activeStatus = { status: \"Active\" } satisfies ConnectionState;\n      if (connection.providerTag !== \"Saml\") {\n        return activeStatus;\n      }\n\n      if (connection.latestExpiredCertificate) {\n        return {\n          status: \"Expired\",\n          expiryDate: connection.latestExpiredCertificate.notAfter\n            ? new Date(connection.latestExpiredCertificate.notAfter)\n            : null,\n        };\n      }\n\n      const expiryTime = connection.latestExpiringCertificate?.notAfter;\n      if (currentDate == null || expiryTime == null) {\n        return activeStatus;\n      }\n\n      const expiryDate = new Date(expiryTime);\n      const daysUntilExpiry = (() => {\n        const diff = expiryDate.getTime() - currentDate.getTime();\n        if (diff < 0) {\n          return -1;\n        }\n\n        return diff / (1000 * 60 * 60 * 24);\n      })();\n\n      if (daysUntilExpiry !== -1 && daysUntilExpiry <= 30) {\n        return { status: \"Expiring\", daysUntilExpiry, expiryDate };\n      }\n\n      return activeStatus;\n    }\n    case \"Inactive\": {\n      return { status: \"Inactive\" };\n    }\n    default:\n      return unreachable(connection.state);\n  }\n}\n\nfunction getIdentityProvider(connection: SsoConnection): IdentityProvider {\n  switch (connection.type) {\n    case \"AdfsSaml\":\n    case \"EntraIdOidc\":\n      return \"microsoft\";\n    case \"Auth0Migration\":\n    case \"Auth0Saml\":\n      return \"auth0\";\n    case \"AzureSaml\":\n      return \"azure\";\n    case \"CasSaml\":\n      return \"cas\";\n    case \"ClassLinkSaml\":\n      return \"classlink\";\n    case \"CloudflareSaml\":\n      return \"cloudflare\";\n    case \"CyberArkSaml\":\n      return \"cyberark\";\n    case \"DuoSaml\":\n      return \"duo\";\n    case \"GenericSaml\":\n      return \"generic-saml\";\n    case \"GoogleSaml\":\n    case \"GoogleOidc\":\n      return \"google\";\n    case \"JumpCloudSaml\":\n      return \"jumpcloud\";\n    case \"KeycloakSaml\":\n      return \"keycloak\";\n    case \"LastPassSaml\":\n      return \"lastpass\";\n    case \"MiniOrangeSaml\":\n      return \"miniorange\";\n    case \"NetIqSaml\":\n      return \"net-iq\";\n    case \"OktaOidc\":\n    case \"OktaSaml\":\n      return \"okta\";\n    case \"OneLoginSaml\":\n      return \"onelogin\";\n    case \"OracleSaml\":\n      return \"oracle\";\n    case \"PingFederateSaml\":\n    case \"PingOneSaml\":\n      return \"ping-identity\";\n    case \"RipplingSaml\":\n      return \"rippling\";\n    case \"SalesforceSaml\":\n      return \"salesforce\";\n    case \"ShibbolethGenericSaml\":\n    case \"ShibbolethSaml\":\n      return \"shibboleth\";\n    case \"SimpleSamlPhpSaml\":\n      return \"simple-saml-php\";\n    case \"TestIdp\":\n      return \"test-idp\";\n    case \"VmWareSaml\":\n      return \"vmware\";\n    case \"AdpOidc\":\n      return \"adp\";\n    case \"GenericOidc\":\n      return \"generic-oidc\";\n    case \"LoginGovOidc\":\n      return \"login-gov\";\n    case \"CleverOidc\":\n      return \"clever\";\n    default:\n      return unreachable(connection);\n  }\n}\n\nexport type {\n  AdminPortalSsoConnectionProps,\n  AdminPortalSsoConnectionLoadingProps,\n  AdminPortalSsoConnectionErrorProps,\n};\nexport {\n  AdminPortalSsoConnection,\n  AdminPortalSsoConnectionLoading,\n  AdminPortalSsoConnectionError,\n};\n"],"mappings":"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","names":["AdminPortalSsoConnectionPresentational"]}