@workos-inc/widgets 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -8
- package/dist/cjs/admin-portal-domain-verification.client.cjs +2 -3
- package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-sso-connection-client.cjs +3 -4
- package/dist/cjs/admin-portal-sso-connection-client.cjs.map +1 -1
- package/dist/cjs/api/api-provider.cjs +27 -19
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts +4 -3
- package/dist/cjs/api/utils.cjs +10 -0
- package/dist/cjs/api/utils.cjs.map +1 -1
- package/dist/cjs/api/utils.d.cts +7 -2
- package/dist/cjs/api/widgets-api-client.cjs +11 -5
- package/dist/cjs/api/widgets-api-client.cjs.map +1 -1
- package/dist/cjs/api-keys-client.cjs +3 -8
- package/dist/cjs/api-keys-client.cjs.map +1 -1
- package/dist/cjs/lib/add-mfa-dialog.cjs +1 -1
- package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-domain-verification.cjs +25 -18
- package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-sso-connection.cjs +5 -27
- package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
- package/dist/cjs/lib/card-list.cjs.map +1 -0
- package/dist/cjs/lib/errors.cjs +1 -1
- package/dist/cjs/lib/errors.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.cjs +27 -38
- package/dist/cjs/lib/generic-error.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.d.cts +5 -1
- package/dist/cjs/lib/use-permissions.cjs +7 -14
- package/dist/cjs/lib/use-permissions.cjs.map +1 -1
- package/dist/cjs/lib/use-permissions.d.cts +1 -1
- package/dist/cjs/lib/user-security.cjs +1 -1
- package/dist/cjs/lib/user-security.cjs.map +1 -1
- package/dist/cjs/lib/user-sessions.cjs +1 -1
- package/dist/cjs/lib/user-sessions.cjs.map +1 -1
- package/dist/cjs/organization-switcher.client.cjs +2 -4
- package/dist/cjs/organization-switcher.client.cjs.map +1 -1
- package/dist/cjs/user-profile.client.cjs +2 -6
- package/dist/cjs/user-profile.client.cjs.map +1 -1
- package/dist/cjs/user-security.client.cjs +5 -4
- package/dist/cjs/user-security.client.cjs.map +1 -1
- package/dist/cjs/user-sessions.client.cjs +8 -12
- package/dist/cjs/user-sessions.client.cjs.map +1 -1
- package/dist/cjs/users-management.client.cjs +3 -9
- package/dist/cjs/users-management.client.cjs.map +1 -1
- package/dist/esm/admin-portal-domain-verification.client.js +3 -4
- package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
- package/dist/esm/admin-portal-sso-connection-client.js +4 -5
- package/dist/esm/admin-portal-sso-connection-client.js.map +1 -1
- package/dist/esm/api/api-provider.d.ts +4 -3
- package/dist/esm/api/api-provider.js +26 -19
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/utils.d.ts +7 -2
- package/dist/esm/api/utils.js +9 -0
- package/dist/esm/api/utils.js.map +1 -1
- package/dist/esm/api/widgets-api-client.js +11 -5
- package/dist/esm/api/widgets-api-client.js.map +1 -1
- package/dist/esm/api-keys-client.js +4 -9
- package/dist/esm/api-keys-client.js.map +1 -1
- package/dist/esm/lib/add-mfa-dialog.js +1 -1
- package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/admin-portal-domain-verification.js +25 -18
- package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
- package/dist/esm/lib/admin-portal-sso-connection.js +5 -27
- package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
- package/dist/esm/lib/card-list.js.map +1 -0
- package/dist/esm/lib/errors.js +1 -1
- package/dist/esm/lib/errors.js.map +1 -1
- package/dist/esm/lib/generic-error.d.ts +5 -1
- package/dist/esm/lib/generic-error.js +27 -40
- package/dist/esm/lib/generic-error.js.map +1 -1
- package/dist/esm/lib/use-permissions.d.ts +1 -1
- package/dist/esm/lib/use-permissions.js +8 -15
- package/dist/esm/lib/use-permissions.js.map +1 -1
- package/dist/esm/lib/user-security.js +1 -1
- package/dist/esm/lib/user-security.js.map +1 -1
- package/dist/esm/lib/user-sessions.js +1 -1
- package/dist/esm/lib/user-sessions.js.map +1 -1
- package/dist/esm/organization-switcher.client.js +3 -5
- package/dist/esm/organization-switcher.client.js.map +1 -1
- package/dist/esm/user-profile.client.js +3 -7
- package/dist/esm/user-profile.client.js.map +1 -1
- package/dist/esm/user-security.client.js +6 -5
- package/dist/esm/user-security.client.js.map +1 -1
- package/dist/esm/user-sessions.client.js +10 -14
- package/dist/esm/user-sessions.client.js.map +1 -1
- package/dist/esm/users-management.client.js +4 -10
- package/dist/esm/users-management.client.js.map +1 -1
- package/package.json +4 -1
- package/dist/cjs/card-list.cjs.map +0 -1
- package/dist/esm/card-list.js.map +0 -1
- /package/dist/cjs/{card-list.cjs → lib/card-list.cjs} +0 -0
- /package/dist/cjs/{card-list.d.cts → lib/card-list.d.cts} +0 -0
- /package/dist/esm/{card-list.d.ts → lib/card-list.d.ts} +0 -0
- /package/dist/esm/{card-list.js → lib/card-list.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/user-security.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card, Flex, Grid, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { SecondaryButton, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { ButtonIcon, LockClosedIcon } from \"@radix-ui/react-icons\";\nimport { SetPasswordDialog } from \"./set-password-dialog.js\";\nimport { ChangePasswordDialog } from \"./change-password-dialog.js\";\nimport { AddMfaDialog } from \"./add-mfa-dialog.js\";\nimport type {\n AuthenticationInformationResponseData as AuthenticationSettings,\n AuthenticationInformationResponseDataVerificationMethodsPassword as PasswordVerificationMethod,\n AuthenticationInformationResponseDataVerificationMethodsMfa as MfaVerificationMethod,\n} from \"../api/endpoint.js\";\nimport { ResetMfaDialog } from \"./reset-mfa-dialog.js\";\nimport * as CardList from \"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/user-security.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card, Flex, Grid, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { SecondaryButton, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { ButtonIcon, LockClosedIcon } from \"@radix-ui/react-icons\";\nimport { SetPasswordDialog } from \"./set-password-dialog.js\";\nimport { ChangePasswordDialog } from \"./change-password-dialog.js\";\nimport { AddMfaDialog } from \"./add-mfa-dialog.js\";\nimport type {\n AuthenticationInformationResponseData as AuthenticationSettings,\n AuthenticationInformationResponseDataVerificationMethodsPassword as PasswordVerificationMethod,\n AuthenticationInformationResponseDataVerificationMethodsMfa as MfaVerificationMethod,\n} from \"../api/endpoint.js\";\nimport { ResetMfaDialog } from \"./reset-mfa-dialog.js\";\nimport * as CardList from \"./card-list.js\";\nimport { GenericError } from \"./generic-error.js\";\nimport { getComparativeReadableDate } from \"./utils.js\";\n\ninterface UserSecurityProps {\n settings: AuthenticationSettings;\n}\n\nexport const UserSecurity = ({ settings }: UserSecurityProps) => {\n const passwordSettings = settings.verificationMethods.Password;\n const mfaSettings = settings.verificationMethods.Mfa;\n\n return (\n <CardList.Root\n className={clsx(\"woswidgets-widget\")}\n data-woswidgets-widget-id=\"user-security\"\n >\n {passwordSettings && (\n <CardList.Item>\n <PasswordSettings settings={passwordSettings} />\n </CardList.Item>\n )}\n\n {mfaSettings && (\n <CardList.Item>\n <MfaSettings\n settings={mfaSettings}\n isPasswordSet={!!passwordSettings?.isSetUp}\n />\n </CardList.Item>\n )}\n </CardList.Root>\n );\n};\n\nexport function UserSecurityError({ error }: { error: unknown }) {\n return (\n <Card size=\"2\">\n <GenericError error={error} />\n </Card>\n );\n}\n\nexport const UserSecurityLoading: React.FC = () => {\n return (\n <Card size=\"2\">\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>Password</Skeleton>\n </Text>\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Skeleton>Set a password to access your account</Skeleton>\n </Text>\n </Flex>\n\n <ChangePasswordDialog>\n <Skeleton>\n <SecondaryButton>Change</SecondaryButton>\n </Skeleton>\n </ChangePasswordDialog>\n </Grid>\n </Card>\n );\n};\n\nfunction PasswordSettings({\n settings,\n}: {\n settings: NonNullable<PasswordVerificationMethod>;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <LockClosedIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Password\n </Text>\n\n {settings.isSetUp ? (\n settings.lastUsed && (\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n )\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Set a password to access your account\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ChangePasswordDialog>\n <SecondaryButton>Change</SecondaryButton>\n </ChangePasswordDialog>\n ) : (\n <SetPasswordDialog>\n <SecondaryButton>Set a password</SecondaryButton>\n </SetPasswordDialog>\n )}\n </Grid>\n );\n}\n\nfunction MfaSettings({\n settings,\n isPasswordSet,\n}: {\n settings: NonNullable<MfaVerificationMethod>;\n isPasswordSet: boolean;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <ButtonIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Multi-factor authentication\n </Text>\n\n {settings.isSetUp ? (\n <Text size=\"2\">\n Authenticator app\n {settings.lastUsed && (\n <>\n <Text size=\"2\" color=\"gray\" mx=\"1\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n </>\n )}\n </Text>\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Secure your account with an extra verification step\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ResetMfaDialog isPasswordSet={isPasswordSet}>\n <SecondaryButton>Disable</SecondaryButton>\n </ResetMfaDialog>\n ) : (\n <AddMfaDialog>\n <SecondaryButton>Set up authenticator app</SecondaryButton>\n </AddMfaDialog>\n )}\n </Grid>\n );\n}\n"],"mappings":"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","names":["clsx"]}
|
|
@@ -41,7 +41,7 @@ var import_elements = require("./elements.js");
|
|
|
41
41
|
var import_utils = require("./utils.js");
|
|
42
42
|
var import_logout_dialog = require("./logout-dialog.js");
|
|
43
43
|
var import_logout_all_sessions_dialog = require("./logout-all-sessions-dialog.js");
|
|
44
|
-
var CardList = __toESM(require("
|
|
44
|
+
var CardList = __toESM(require("./card-list.js"), 1);
|
|
45
45
|
var import_icon_panel = require("./icon-panel.js");
|
|
46
46
|
var import_react = require("react");
|
|
47
47
|
var import_generic_error = require("./generic-error.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/user-sessions.tsx"],"sourcesContent":["\"use client\";\n\nimport { Box, Button, Card, Flex, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { Badge, SecondaryButton, Skeleton } from \"./elements.js\";\nimport {\n getComparativeReadableDate,\n getUserLocation,\n parseUserAgent,\n} from \"./utils.js\";\nimport { LogoutDialog } from \"./logout-dialog.js\";\nimport { LogoutAllSessionsDialog } from \"./logout-all-sessions-dialog.js\";\nimport { ActiveSession } from \"../api/endpoint.js\";\nimport * as CardList from \"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/user-sessions.tsx"],"sourcesContent":["\"use client\";\n\nimport { Box, Button, Card, Flex, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { Badge, SecondaryButton, Skeleton } from \"./elements.js\";\nimport {\n getComparativeReadableDate,\n getUserLocation,\n parseUserAgent,\n} from \"./utils.js\";\nimport { LogoutDialog } from \"./logout-dialog.js\";\nimport { LogoutAllSessionsDialog } from \"./logout-all-sessions-dialog.js\";\nimport { ActiveSession } from \"../api/endpoint.js\";\nimport * as CardList from \"./card-list.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { useState } from \"react\";\nimport { GenericError } from \"./generic-error.js\";\nimport { LaptopIcon, MobileIcon } from \"@radix-ui/react-icons\";\n\ninterface UserSessionsProps {\n sessionsData: ActiveSession[];\n currentSessionId: string;\n}\n\nexport const UserSessions = ({\n sessionsData: sessions,\n currentSessionId,\n}: UserSessionsProps) => {\n const currentSession = sessions.find(\n (session) => session.id === currentSessionId,\n );\n const otherSessions = sessions.filter(\n (session) => session.id !== currentSessionId,\n );\n const [openLogoutDialog, setOpenLogoutDialog] = useState(false);\n const [sessionToSignOut, setSessionToSignOut] =\n useState<ActiveSession | null>(null);\n const [openLogoutAllSessionsDialog, setOpenLogoutAllSessionsDialog] =\n useState(false);\n\n return (\n <Flex\n direction=\"column\"\n gap=\"4\"\n className={clsx(\"woswidgets-widget\")}\n data-woswidgets-widget-id=\"user-sessions\"\n >\n <CardList.Root>\n {currentSession && (\n <CardList.Item>\n <UserSession session={currentSession} isCurrentSession />\n </CardList.Item>\n )}\n\n {otherSessions.map((session) => (\n <CardList.Item key={session.id}>\n <UserSession\n session={session}\n onSignOut={() => {\n setSessionToSignOut(session);\n setOpenLogoutDialog(true);\n }}\n />\n </CardList.Item>\n ))}\n </CardList.Root>\n\n {sessions.length > 1 && (\n <Card size=\"2\">\n <Flex gap=\"2\" justify=\"between\" align=\"center\">\n <Box>\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\">\n Sign out of all other devices\n </Text>\n <Text size=\"2\" color=\"gray\" as=\"p\">\n Remove access from all devices except this one\n </Text>\n </Box>\n\n <SecondaryButton\n onClick={() => {\n setOpenLogoutAllSessionsDialog(true);\n }}\n >\n Sign out\n </SecondaryButton>\n </Flex>\n </Card>\n )}\n\n {sessionToSignOut && (\n <LogoutDialog\n session={sessionToSignOut}\n open={openLogoutDialog}\n onOpenChange={setOpenLogoutDialog}\n />\n )}\n\n <LogoutAllSessionsDialog\n currentSessionId={currentSessionId}\n open={openLogoutAllSessionsDialog}\n onOpenChange={setOpenLogoutAllSessionsDialog}\n />\n </Flex>\n );\n};\n\nexport const UserSessionsLoading: React.FC = () => {\n return (\n <Card size=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>The location</Skeleton>\n </Text>\n\n <Text size=\"2\" color=\"gray\" as=\"p\">\n <Skeleton>The location</Skeleton>\n </Text>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\nexport function UserSessionsError({ error }: { error: unknown }) {\n return (\n <Card size=\"2\">\n <GenericError error={error} />\n </Card>\n );\n}\n\ninterface UserSessionProps {\n session: ActiveSession;\n isCurrentSession?: boolean;\n onSignOut?: (session: ActiveSession) => void;\n}\n\nconst UserSession = ({\n session,\n isCurrentSession = false,\n onSignOut,\n}: UserSessionProps) => {\n const userAgent = parseUserAgent(session.userAgent);\n const userLocation = getUserLocation(\n session.currentLocation,\n session.ipAddress,\n );\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel>\n {userAgent.isMobile ? <MobileIcon /> : <LaptopIcon />}\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n {userAgent.pretty}\n </Text>\n\n <Flex gap=\"1\" align=\"center\">\n <Text size=\"2\" color=\"gray\" as=\"p\">\n {userLocation}\n </Text>\n\n {isCurrentSession && <Badge ml=\"2\">This device</Badge>}\n\n {!isCurrentSession && session.lastActivityAt && (\n <>\n <Text size=\"2\" color=\"gray\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last seen{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(session.lastActivityAt),\n )}\n </Text>\n </>\n )}\n </Flex>\n </Flex>\n\n {!isCurrentSession && (\n <Flex ml=\"auto\" mr=\"2\">\n <Button\n variant=\"ghost\"\n onClick={() => {\n onSignOut?.(session);\n }}\n >\n Sign out\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n"],"mappings":"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","names":["clsx"]}
|
|
@@ -27,7 +27,6 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
27
27
|
var import_api_provider = require("./api/api-provider.js");
|
|
28
28
|
var import_endpoint = require("./api/endpoint.js");
|
|
29
29
|
var import_error_boundary = require("./lib/error-boundary.js");
|
|
30
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
31
30
|
var import_organization_switcher = require("./lib/organization-switcher.js");
|
|
32
31
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
33
32
|
var import_react_query = require("@tanstack/react-query");
|
|
@@ -51,15 +50,14 @@ const OrganizationSwitcherContent = ({
|
|
|
51
50
|
variant,
|
|
52
51
|
...rest
|
|
53
52
|
}) => {
|
|
54
|
-
const
|
|
53
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
55
54
|
const organizationsQuery = (0, import_endpoint.useOrganizations)({
|
|
56
55
|
query: {
|
|
57
56
|
placeholderData: import_react_query.keepPreviousData
|
|
58
57
|
}
|
|
59
58
|
});
|
|
60
59
|
const organizations = organizationsQuery.data?.data ?? emptyOrganizations;
|
|
61
|
-
if (organizationsQuery.isLoading ||
|
|
62
|
-
!isHydrated) {
|
|
60
|
+
if (organizationsQuery.isLoading || !isApiReady) {
|
|
63
61
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherLoading, {});
|
|
64
62
|
}
|
|
65
63
|
if (organizationsQuery.isError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/organization-switcher.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { ApiProvider, AuthToken } from \"./api/api-provider.js\";\nimport { OrganizationInfo, useOrganizations } from \"./api/endpoint.js\";\nimport * as React from \"react\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/organization-switcher.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { OrganizationInfo, useOrganizations } from \"./api/endpoint.js\";\nimport * as React from \"react\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport {\n OrganizationSwitcherError,\n OrganizationSwitcherLoading,\n OrganizationSwitcherPassthroughProps,\n OrganizationSwitcher as OrganizationSwitcherPresentational,\n} from \"./lib/organization-switcher.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\n\nexport interface OrganizationSwitcherProps\n extends OrganizationSwitcherPassthroughProps {\n authToken: AuthToken;\n}\n\nexport const OrganizationSwitcher: React.FC<OrganizationSwitcherProps> = ({\n authToken,\n ...passthroughProps\n}) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary FallbackComponent={OrganizationSwitcherError}>\n <ApiProvider\n widgetType=\"organization-switcher\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <OrganizationSwitcherContent {...passthroughProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\nexport { OrganizationSwitcherLoading };\n\n// Constant reference to avoid unnecessary prop changes\nconst emptyOrganizations: OrganizationInfo[] = [];\n\nconst OrganizationSwitcherContent = ({\n variant,\n ...rest\n}: OrganizationSwitcherPassthroughProps) => {\n const isApiReady = useApiReady();\n const organizationsQuery = useOrganizations({\n query: {\n placeholderData: keepPreviousData,\n },\n });\n\n const organizations = organizationsQuery.data?.data ?? emptyOrganizations;\n\n if (organizationsQuery.isLoading || !isApiReady) {\n return <OrganizationSwitcherLoading />;\n }\n\n if (organizationsQuery.isError) {\n return <OrganizationSwitcherError error={organizationsQuery.error} />;\n }\n\n return (\n <ErrorBoundary FallbackComponent={OrganizationSwitcherError}>\n <OrganizationSwitcherPresentational\n organizations={organizations}\n {...rest}\n />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCQ;AA/BR,0BAAoD;AACpD,sBAAmD;AAEnD,4BAA8B;AAC9B,mCAKO;AACP,6BAAgC;AAChC,yBAAiC;AAO1B,MAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,cAAU,wCAAgB;AAEhC,SACE,4CAAC,uCAAc,mBAAmB,wDAChC;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,+BAA6B,GAAG,kBAAkB;AAAA;AAAA,EACrD,GACF;AAEJ;AAKA,MAAM,qBAAyC,CAAC;AAEhD,MAAM,8BAA8B,CAAC;AAAA,EACnC;AAAA,EACA,GAAG;AACL,MAA4C;AAC1C,QAAM,iBAAa,iCAAY;AAC/B,QAAM,yBAAqB,kCAAiB;AAAA,IAC1C,OAAO;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,mBAAmB,MAAM,QAAQ;AAEvD,MAAI,mBAAmB,aAAa,CAAC,YAAY;AAC/C,WAAO,4CAAC,4DAA4B;AAAA,EACtC;AAEA,MAAI,mBAAmB,SAAS;AAC9B,WAAO,4CAAC,0DAA0B,OAAO,mBAAmB,OAAO;AAAA,EACrE;AAEA,SACE,4CAAC,uCAAc,mBAAmB,wDAChC;AAAA,IAAC,6BAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;","names":["OrganizationSwitcherPresentational"]}
|
|
@@ -25,7 +25,6 @@ __export(user_profile_client_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(user_profile_client_exports);
|
|
26
26
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
27
|
var import_user_profile = require("./lib/user-profile.js");
|
|
28
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
29
28
|
var import_endpoint = require("./api/endpoint.js");
|
|
30
29
|
var import_api_provider = require("./api/api-provider.js");
|
|
31
30
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
@@ -43,12 +42,9 @@ const UserProfile = ({ authToken }) => {
|
|
|
43
42
|
);
|
|
44
43
|
};
|
|
45
44
|
const UserProfileContent = () => {
|
|
46
|
-
const
|
|
45
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
47
46
|
const meQuery = (0, import_endpoint.useMe)();
|
|
48
|
-
if (
|
|
49
|
-
// render loading state on the server to prevent FOUC or hydration mismatch
|
|
50
|
-
!isHydrated || meQuery.isLoading
|
|
51
|
-
) {
|
|
47
|
+
if (!isApiReady || meQuery.isLoading) {
|
|
52
48
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_user_profile.UserProfileLoading, {});
|
|
53
49
|
}
|
|
54
50
|
if (meQuery.isError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/user-profile.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UserProfileError,\n UserProfileLoading,\n UserProfile as UserProfilePresentational,\n} from \"./lib/user-profile.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/user-profile.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UserProfileError,\n UserProfileLoading,\n UserProfile as UserProfilePresentational,\n} from \"./lib/user-profile.js\";\nimport { useMe } from \"./api/endpoint.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\n\nexport interface UserProfileProps {\n authToken: AuthToken;\n}\n\nexport const UserProfile: React.FC<UserProfileProps> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ApiProvider\n widgetType=\"user-profile\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <UserProfileContent />\n </ApiProvider>\n );\n};\n\nexport { UserProfileLoading };\n\nconst UserProfileContent = () => {\n const isApiReady = useApiReady();\n const meQuery = useMe();\n\n if (!isApiReady || meQuery.isLoading) {\n return <UserProfileLoading />;\n }\n\n if (meQuery.isError) {\n return <UserProfileError error={meQuery.error} />;\n }\n\n const user = meQuery.data!;\n\n return (\n <ErrorBoundary FallbackComponent={UserProfileError}>\n <UserProfilePresentational userData={user} />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BM;AAvBN,0BAIO;AACP,sBAAsB;AACtB,0BAAoD;AACpD,6BAAgC;AAChC,4BAA8B;AAMvB,MAAM,cAA0C,CAAC,EAAE,UAAU,MAAM;AACxE,QAAM,cAAU,wCAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,sBAAmB;AAAA;AAAA,EACtB;AAEJ;AAIA,MAAM,qBAAqB,MAAM;AAC/B,QAAM,iBAAa,iCAAY;AAC/B,QAAM,cAAU,uBAAM;AAEtB,MAAI,CAAC,cAAc,QAAQ,WAAW;AACpC,WAAO,4CAAC,0CAAmB;AAAA,EAC7B;AAEA,MAAI,QAAQ,SAAS;AACnB,WAAO,4CAAC,wCAAiB,OAAO,QAAQ,OAAO;AAAA,EACjD;AAEA,QAAM,OAAO,QAAQ;AAErB,SACE,4CAAC,uCAAc,mBAAmB,sCAChC,sDAAC,oBAAAA,aAAA,EAA0B,UAAU,MAAM,GAC7C;AAEJ;","names":["UserProfilePresentational"]}
|
|
@@ -27,7 +27,6 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
27
27
|
var import_api_provider = require("./api/api-provider.js");
|
|
28
28
|
var import_endpoint = require("./api/endpoint.js");
|
|
29
29
|
var import_user_security = require("./lib/user-security.js");
|
|
30
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
31
30
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
32
31
|
var import_error_boundary = require("./lib/error-boundary.js");
|
|
33
32
|
const UserSecurity = ({ authToken }) => {
|
|
@@ -43,15 +42,17 @@ const UserSecurity = ({ authToken }) => {
|
|
|
43
42
|
);
|
|
44
43
|
};
|
|
45
44
|
const UserSecurityContent = () => {
|
|
46
|
-
const
|
|
45
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
47
46
|
const {
|
|
48
47
|
data: settings,
|
|
49
48
|
isLoading,
|
|
50
49
|
isError,
|
|
51
50
|
isSuccess,
|
|
52
51
|
error
|
|
53
|
-
} = (0, import_endpoint.useAuthenticationInformation)(
|
|
54
|
-
|
|
52
|
+
} = (0, import_endpoint.useAuthenticationInformation)({
|
|
53
|
+
query: { enabled: isApiReady }
|
|
54
|
+
});
|
|
55
|
+
if (!isApiReady || isLoading) {
|
|
55
56
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_user_security.UserSecurityLoading, {});
|
|
56
57
|
}
|
|
57
58
|
if (isError || !isSuccess) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/user-security.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { ApiProvider, AuthToken } from \"./api/api-provider.js\";\nimport { useAuthenticationInformation } from \"./api/endpoint.js\";\nimport {\n UserSecurityError,\n UserSecurityLoading,\n UserSecurity as UserSecurityPresentational,\n} from \"./lib/user-security.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/user-security.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { useAuthenticationInformation } from \"./api/endpoint.js\";\nimport {\n UserSecurityError,\n UserSecurityLoading,\n UserSecurity as UserSecurityPresentational,\n} from \"./lib/user-security.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\n\nexport interface UserSecurityProps {\n authToken: AuthToken;\n}\n\nexport const UserSecurity: React.FC<UserSecurityProps> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ApiProvider\n widgetType=\"user-security\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <UserSecurityContent />\n </ApiProvider>\n );\n};\n\nexport { UserSecurityLoading };\n\nconst UserSecurityContent = () => {\n const isApiReady = useApiReady();\n const {\n data: settings,\n isLoading,\n isError,\n isSuccess,\n error,\n } = useAuthenticationInformation({\n query: { enabled: isApiReady },\n });\n\n if (!isApiReady || isLoading) {\n return <UserSecurityLoading />;\n }\n\n if (isError || !isSuccess) {\n return <UserSecurityError error={error} />;\n }\n\n return (\n <ErrorBoundary FallbackComponent={UserSecurityError}>\n <UserSecurityPresentational settings={settings.data} />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BM;AAvBN,0BAAoD;AACpD,sBAA6C;AAC7C,2BAIO;AACP,6BAAgC;AAChC,4BAA8B;AAMvB,MAAM,eAA4C,CAAC,EAAE,UAAU,MAAM;AAC1E,QAAM,cAAU,wCAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,uBAAoB;AAAA;AAAA,EACvB;AAEJ;AAIA,MAAM,sBAAsB,MAAM;AAChC,QAAM,iBAAa,iCAAY;AAC/B,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAA6B;AAAA,IAC/B,OAAO,EAAE,SAAS,WAAW;AAAA,EAC/B,CAAC;AAED,MAAI,CAAC,cAAc,WAAW;AAC5B,WAAO,4CAAC,4CAAoB;AAAA,EAC9B;AAEA,MAAI,WAAW,CAAC,WAAW;AACzB,WAAO,4CAAC,0CAAkB,OAAc;AAAA,EAC1C;AAEA,SACE,4CAAC,uCAAc,mBAAmB,wCAChC,sDAAC,qBAAAA,cAAA,EAA2B,UAAU,SAAS,MAAM,GACvD;AAEJ;","names":["UserSecurityPresentational"]}
|
|
@@ -25,12 +25,12 @@ __export(user_sessions_client_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(user_sessions_client_exports);
|
|
26
26
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
27
|
var import_user_sessions = require("./lib/user-sessions.js");
|
|
28
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
29
28
|
var import_endpoint = require("./api/endpoint.js");
|
|
30
29
|
var import_api_provider = require("./api/api-provider.js");
|
|
31
30
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
32
31
|
var import_error_boundary = require("./lib/error-boundary.js");
|
|
33
32
|
var import_react_query = require("@tanstack/react-query");
|
|
33
|
+
var import_utils = require("./api/utils.js");
|
|
34
34
|
const UserSessions = (props) => {
|
|
35
35
|
const baseUrl = (0, import_widgets_context.useWorkOsApiUrl)();
|
|
36
36
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -51,10 +51,10 @@ const UserSessions = (props) => {
|
|
|
51
51
|
const UserSessionsContent = ({
|
|
52
52
|
currentSessionId
|
|
53
53
|
}) => {
|
|
54
|
-
const
|
|
54
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
55
55
|
const sessionsQuery = (0, import_endpoint.useSessions)();
|
|
56
56
|
const currentSessionIdQuery = useCurrentSessionIdQuery(currentSessionId);
|
|
57
|
-
if (!
|
|
57
|
+
if (!isApiReady || sessionsQuery.isLoading || currentSessionIdQuery.isLoading) {
|
|
58
58
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_user_sessions.UserSessionsLoading, {});
|
|
59
59
|
}
|
|
60
60
|
if (sessionsQuery.isError || currentSessionIdQuery.isError) {
|
|
@@ -76,20 +76,16 @@ const UserSessionsContent = ({
|
|
|
76
76
|
function useCurrentSessionIdQuery(currentSessionId) {
|
|
77
77
|
const { authToken } = (0, import_api_provider.useApi)();
|
|
78
78
|
return (0, import_react_query.useQuery)({
|
|
79
|
-
queryKey: ["authToken"],
|
|
80
|
-
queryFn: async () => {
|
|
79
|
+
queryKey: ["authToken", authToken],
|
|
80
|
+
queryFn: authToken ? async () => {
|
|
81
81
|
if (currentSessionId) {
|
|
82
82
|
return currentSessionId;
|
|
83
83
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
84
|
+
const { sid } = (0, import_utils.getClaims)(authToken);
|
|
85
|
+
return sid;
|
|
86
|
+
} : import_react_query.skipToken
|
|
88
87
|
});
|
|
89
88
|
}
|
|
90
|
-
function getClaims(accessToken) {
|
|
91
|
-
return JSON.parse(atob(accessToken.split(".")[1]));
|
|
92
|
-
}
|
|
93
89
|
// Annotate the CommonJS export names for ESM import in node:
|
|
94
90
|
0 && (module.exports = {
|
|
95
91
|
UserSessions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/user-sessions.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UserSessionsError,\n UserSessionsLoading,\n UserSessions as UserSessionsPresentational,\n} from \"./lib/user-sessions.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/user-sessions.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UserSessionsError,\n UserSessionsLoading,\n UserSessions as UserSessionsPresentational,\n} from \"./lib/user-sessions.js\";\nimport { useSessions } from \"./api/endpoint.js\";\nimport { ApiProvider, useApi, useApiReady } from \"./api/api-provider.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { useQuery, skipToken } from \"@tanstack/react-query\";\nimport { getClaims } from \"./api/utils.js\";\n\ntype UserSessionsWithoutCurrentSessionIdProps = {\n authToken: () => Promise<string>;\n};\n\ntype UserSessionsWithCurrentSessionIdProps = {\n authToken: string;\n currentSessionId: string;\n};\n\nexport type UserSessionsProps =\n | UserSessionsWithoutCurrentSessionIdProps\n | UserSessionsWithCurrentSessionIdProps;\n\nexport const UserSessions: React.FC<UserSessionsProps> = (props) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ApiProvider\n widgetType=\"user-sessions\"\n authToken={props.authToken}\n baseUrl={baseUrl}\n >\n <UserSessionsContent\n currentSessionId={\n \"currentSessionId\" in props ? props.currentSessionId : undefined\n }\n />\n </ApiProvider>\n );\n};\n\nexport { UserSessionsLoading };\n\nconst UserSessionsContent = ({\n currentSessionId,\n}: {\n currentSessionId?: string;\n}) => {\n const isApiReady = useApiReady();\n const sessionsQuery = useSessions();\n const currentSessionIdQuery = useCurrentSessionIdQuery(currentSessionId);\n\n if (\n !isApiReady ||\n sessionsQuery.isLoading ||\n currentSessionIdQuery.isLoading\n ) {\n return <UserSessionsLoading />;\n }\n\n if (sessionsQuery.isError || currentSessionIdQuery.isError) {\n return (\n <UserSessionsError\n error={sessionsQuery.error || currentSessionIdQuery.error}\n />\n );\n }\n\n return (\n <ErrorBoundary FallbackComponent={UserSessionsError}>\n <UserSessionsPresentational\n sessionsData={sessionsQuery.data?.data || []}\n currentSessionId={currentSessionIdQuery.data ?? \"\"}\n />\n </ErrorBoundary>\n );\n};\n\nfunction useCurrentSessionIdQuery(currentSessionId?: string) {\n const { authToken } = useApi();\n\n return useQuery({\n queryKey: [\"authToken\", authToken],\n queryFn: authToken\n ? async () => {\n if (currentSessionId) {\n return currentSessionId;\n }\n\n const { sid } = getClaims(authToken);\n return sid;\n }\n : skipToken,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCM;AAlCN,2BAIO;AACP,sBAA4B;AAC5B,0BAAiD;AACjD,6BAAgC;AAChC,4BAA8B;AAC9B,yBAAoC;AACpC,mBAA0B;AAenB,MAAM,eAA4C,CAAC,UAAU;AAClE,QAAM,cAAU,wCAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAW,MAAM;AAAA,MACjB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,kBACE,sBAAsB,QAAQ,MAAM,mBAAmB;AAAA;AAAA,MAE3D;AAAA;AAAA,EACF;AAEJ;AAIA,MAAM,sBAAsB,CAAC;AAAA,EAC3B;AACF,MAEM;AACJ,QAAM,iBAAa,iCAAY;AAC/B,QAAM,oBAAgB,6BAAY;AAClC,QAAM,wBAAwB,yBAAyB,gBAAgB;AAEvE,MACE,CAAC,cACD,cAAc,aACd,sBAAsB,WACtB;AACA,WAAO,4CAAC,4CAAoB;AAAA,EAC9B;AAEA,MAAI,cAAc,WAAW,sBAAsB,SAAS;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,cAAc,SAAS,sBAAsB;AAAA;AAAA,IACtD;AAAA,EAEJ;AAEA,SACE,4CAAC,uCAAc,mBAAmB,wCAChC;AAAA,IAAC,qBAAAA;AAAA,IAAA;AAAA,MACC,cAAc,cAAc,MAAM,QAAQ,CAAC;AAAA,MAC3C,kBAAkB,sBAAsB,QAAQ;AAAA;AAAA,EAClD,GACF;AAEJ;AAEA,SAAS,yBAAyB,kBAA2B;AAC3D,QAAM,EAAE,UAAU,QAAI,4BAAO;AAE7B,aAAO,6BAAS;AAAA,IACd,UAAU,CAAC,aAAa,SAAS;AAAA,IACjC,SAAS,YACL,YAAY;AACV,UAAI,kBAAkB;AACpB,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,IAAI,QAAI,wBAAU,SAAS;AACnC,aAAO;AAAA,IACT,IACA;AAAA,EACN,CAAC;AACH;","names":["UserSessionsPresentational"]}
|
|
@@ -27,7 +27,6 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
27
27
|
var import_endpoint = require("./api/endpoint.js");
|
|
28
28
|
var import_api_provider = require("./api/api-provider.js");
|
|
29
29
|
var import_user = require("./lib/api/user.js");
|
|
30
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
31
30
|
var import_users_management = require("./lib/users-management.js");
|
|
32
31
|
var import_users_management_context = require("./lib/users-management-context.js");
|
|
33
32
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
@@ -48,18 +47,13 @@ const UsersManagement = ({
|
|
|
48
47
|
) });
|
|
49
48
|
};
|
|
50
49
|
const UsersManagementContent = () => {
|
|
51
|
-
const
|
|
50
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
52
51
|
const rolesAndConfigQuery = (0, import_endpoint.useRolesAndConfig)({
|
|
53
52
|
query: { initialData: { roles: [], multipleRolesEnabled: false } }
|
|
54
53
|
});
|
|
55
54
|
const usersQuery = (0, import_user.useUsers)();
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
"widgets:users-table:manage",
|
|
59
|
-
context.authToken
|
|
60
|
-
);
|
|
61
|
-
if (permissionsQuery.isLoading || usersQuery.isLoading || rolesAndConfigQuery.isLoading || usersQuery.isPending || // render loading state on the server to prevent FOUC or hydration mismatch
|
|
62
|
-
!isHydrated) {
|
|
55
|
+
const permissionsQuery = (0, import_use_permissions.usePermissions)("widgets:users-table:manage");
|
|
56
|
+
if (permissionsQuery.isLoading || usersQuery.isLoading || rolesAndConfigQuery.isLoading || usersQuery.isPending || !isApiReady) {
|
|
63
57
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_users_management.UsersManagementLoading, {});
|
|
64
58
|
}
|
|
65
59
|
if (permissionsQuery.isError || usersQuery.isError || rolesAndConfigQuery.isError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/users-management.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRolesAndConfig } from \"./api/endpoint.js\";\nimport { ApiProvider, AuthToken,
|
|
1
|
+
{"version":3,"sources":["../../src/users-management.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRolesAndConfig } from \"./api/endpoint.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport * as React from \"react\";\nimport { useUsers } from \"./lib/api/user.js\";\nimport {\n UsersManagementError,\n UsersManagementLoading,\n UsersManagement as UsersManagementPresentational,\n} from \"./lib/users-management.js\";\nimport { UsersManagementContextProvider } from \"./lib/users-management-context.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { usePermissions } from \"./lib/use-permissions.js\";\n\nexport interface UsersManagementProps {\n authToken: AuthToken;\n}\n\nexport const UsersManagement: React.FC<UsersManagementProps> = ({\n authToken,\n}) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary FallbackComponent={UsersManagementError}>\n <ApiProvider\n widgetType=\"user-management\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <UsersManagementContextProvider>\n <UsersManagementContent />\n </UsersManagementContextProvider>\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\nexport { UsersManagementLoading };\n\nconst UsersManagementContent = () => {\n const isApiReady = useApiReady();\n const rolesAndConfigQuery = useRolesAndConfig({\n query: { initialData: { roles: [], multipleRolesEnabled: false } },\n });\n const usersQuery = useUsers();\n const permissionsQuery = usePermissions(\"widgets:users-table:manage\");\n\n if (\n permissionsQuery.isLoading ||\n usersQuery.isLoading ||\n rolesAndConfigQuery.isLoading ||\n usersQuery.isPending ||\n !isApiReady\n ) {\n return <UsersManagementLoading />;\n }\n\n if (\n permissionsQuery.isError ||\n usersQuery.isError ||\n rolesAndConfigQuery.isError\n ) {\n return (\n <UsersManagementError\n error={\n permissionsQuery.error ||\n usersQuery.error ||\n rolesAndConfigQuery.error\n }\n />\n );\n }\n\n return (\n <ErrorBoundary FallbackComponent={UsersManagementError}>\n <UsersManagementPresentational\n userData={usersQuery.data}\n rolesData={rolesAndConfigQuery.data}\n isPending={usersQuery.isFetching}\n disableRolesFilter={\n rolesAndConfigQuery.isPending || rolesAndConfigQuery.isFetching\n }\n />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCU;AA/BV,sBAAkC;AAClC,0BAAoD;AAEpD,kBAAyB;AACzB,8BAIO;AACP,sCAA+C;AAC/C,6BAAgC;AAChC,4BAA8B;AAC9B,6BAA+B;AAMxB,MAAM,kBAAkD,CAAC;AAAA,EAC9D;AACF,MAAM;AACJ,QAAM,cAAU,wCAAgB;AAEhC,SACE,4CAAC,uCAAc,mBAAmB,8CAChC;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,kEACC,sDAAC,0BAAuB,GAC1B;AAAA;AAAA,EACF,GACF;AAEJ;AAIA,MAAM,yBAAyB,MAAM;AACnC,QAAM,iBAAa,iCAAY;AAC/B,QAAM,0BAAsB,mCAAkB;AAAA,IAC5C,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,sBAAsB,MAAM,EAAE;AAAA,EACnE,CAAC;AACD,QAAM,iBAAa,sBAAS;AAC5B,QAAM,uBAAmB,uCAAe,4BAA4B;AAEpE,MACE,iBAAiB,aACjB,WAAW,aACX,oBAAoB,aACpB,WAAW,aACX,CAAC,YACD;AACA,WAAO,4CAAC,kDAAuB;AAAA,EACjC;AAEA,MACE,iBAAiB,WACjB,WAAW,WACX,oBAAoB,SACpB;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OACE,iBAAiB,SACjB,WAAW,SACX,oBAAoB;AAAA;AAAA,IAExB;AAAA,EAEJ;AAEA,SACE,4CAAC,uCAAc,mBAAmB,8CAChC;AAAA,IAAC,wBAAAA;AAAA,IAAA;AAAA,MACC,UAAU,WAAW;AAAA,MACrB,WAAW,oBAAoB;AAAA,MAC/B,WAAW,WAAW;AAAA,MACtB,oBACE,oBAAoB,aAAa,oBAAoB;AAAA;AAAA,EAEzD,GACF;AAEJ;","names":["UsersManagementPresentational"]}
|
|
@@ -5,8 +5,7 @@ import {
|
|
|
5
5
|
AdminPortalDomainVerificationLoading,
|
|
6
6
|
AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational
|
|
7
7
|
} from "./lib/admin-portal-domain-verification.js";
|
|
8
|
-
import {
|
|
9
|
-
import { ApiProvider } from "./api/api-provider.js";
|
|
8
|
+
import { ApiProvider, useApiReady } from "./api/api-provider.js";
|
|
10
9
|
import {
|
|
11
10
|
useGenerateAdminPortalLink,
|
|
12
11
|
useListOrganizationDomains,
|
|
@@ -30,7 +29,7 @@ const AdminPortalDomainVerification = ({ authToken }) => {
|
|
|
30
29
|
);
|
|
31
30
|
};
|
|
32
31
|
const AdminPortalDomainVerificationContent = () => {
|
|
33
|
-
const
|
|
32
|
+
const isApiReady = useApiReady();
|
|
34
33
|
const queryClient = useQueryClient();
|
|
35
34
|
const {
|
|
36
35
|
data: organizationDomains,
|
|
@@ -75,7 +74,7 @@ const AdminPortalDomainVerificationContent = () => {
|
|
|
75
74
|
const handleReverifyDomain = (domainId) => {
|
|
76
75
|
reverifyDomain({ domainId });
|
|
77
76
|
};
|
|
78
|
-
if (!
|
|
77
|
+
if (!isApiReady || isLoading) {
|
|
79
78
|
return /* @__PURE__ */ jsx(AdminPortalDomainVerificationLoading, {});
|
|
80
79
|
}
|
|
81
80
|
if (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./lib/admin-portal-domain-verification.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./lib/admin-portal-domain-verification.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport {\n useGenerateAdminPortalLink,\n useListOrganizationDomains,\n getListOrganizationDomainsQueryKey,\n useDeleteOrganizationDomain,\n useReverifyOrganizationDomain,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nexport interface AdminPortalDomainVerificationProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalDomainVerificationLoading };\n\nconst AdminPortalDomainVerificationContent = () => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useListOrganizationDomains();\n\n const { mutate: generateAdminPortalLink, isPending } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const { mutate: deleteDomain } = useDeleteOrganizationDomain({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationDomainsQueryKey(),\n });\n },\n },\n });\n\n const { mutate: reverifyDomain } = useReverifyOrganizationDomain({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationDomainsQueryKey(),\n });\n },\n },\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink({\n params: {\n intent: \"domain_verification\",\n },\n });\n };\n\n const handleDeleteDomain = (domainId: string) => {\n deleteDomain({ domainId });\n };\n\n const handleReverifyDomain = (domainId: string) => {\n reverifyDomain({ domainId });\n };\n\n if (!isApiReady || isLoading) {\n return <AdminPortalDomainVerificationLoading />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} />;\n }\n\n const domains = organizationDomains?.data || [];\n\n return (\n <ErrorBoundary FallbackComponent={AdminPortalDomainVerificationError}>\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n />\n </ErrorBoundary>\n );\n};\n"],"mappings":";AAmCM;AAhCN;AAAA,EACE;AAAA,EACA;AAAA,EACA,iCAAiC;AAAA,OAC5B;AACP,SAAS,aAAwB,mBAAmB;AACpD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAMxB,MAAM,gCAET,CAAC,EAAE,UAAU,MAAM;AACrB,QAAM,UAAU,gBAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,8BAAC,wCAAqC;AAAA;AAAA,EACxC;AAEJ;AAIA,MAAM,uCAAuC,MAAM;AACjD,QAAM,aAAa,YAAY;AAC/B,QAAM,cAAc,eAAe;AACnC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,IAAI,2BAA2B;AAE/B,QAAM,EAAE,QAAQ,yBAAyB,UAAU,IACjD,2BAA2B;AAAA,IACzB,UAAU;AAAA,MACR,WAAW,CAAC,SAAS;AACnB,eAAO,KAAK,KAAK,MAAM,UAAU,qBAAqB;AAAA,MACxD;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QAAM,EAAE,QAAQ,aAAa,IAAI,4BAA4B;AAAA,IAC3D,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,UAAU,mCAAmC;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,EAAE,QAAQ,eAAe,IAAI,8BAA8B;AAAA,IAC/D,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,UAAU,mCAAmC;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,MAAM;AAC5B,4BAAwB;AAAA,MACtB,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,aAAqB;AAC/C,iBAAa,EAAE,SAAS,CAAC;AAAA,EAC3B;AAEA,QAAM,uBAAuB,CAAC,aAAqB;AACjD,mBAAe,EAAE,SAAS,CAAC;AAAA,EAC7B;AAEA,MAAI,CAAC,cAAc,WAAW;AAC5B,WAAO,oBAAC,wCAAqC;AAAA,EAC/C;AAEA,MAAI,OAAO;AACT,WAAO,oBAAC,sCAAmC,OAAc;AAAA,EAC3D;AAEA,QAAM,UAAU,qBAAqB,QAAQ,CAAC;AAE9C,SACE,oBAAC,iBAAc,mBAAmB,oCAChC;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqB;AAAA,MACrB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
|
|
@@ -7,8 +7,7 @@ import {
|
|
|
7
7
|
AdminPortalSsoConnectionLoading,
|
|
8
8
|
AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational
|
|
9
9
|
} from "./lib/admin-portal-sso-connection.js";
|
|
10
|
-
import {
|
|
11
|
-
import { ApiProvider } from "./api/api-provider.js";
|
|
10
|
+
import { ApiProvider, useApiReady } from "./api/api-provider.js";
|
|
12
11
|
import {
|
|
13
12
|
useGenerateAdminPortalLink,
|
|
14
13
|
useListSsoConnections
|
|
@@ -29,11 +28,11 @@ const AdminPortalSsoConnection = ({ authToken }) => {
|
|
|
29
28
|
);
|
|
30
29
|
};
|
|
31
30
|
const SingleSignOnContent = () => {
|
|
32
|
-
const
|
|
31
|
+
const isApiReady = useApiReady();
|
|
33
32
|
const [currentDate, setCurrentDate] = React.useState(
|
|
34
|
-
() =>
|
|
33
|
+
() => isApiReady ? /* @__PURE__ */ new Date() : null
|
|
35
34
|
);
|
|
36
|
-
if (
|
|
35
|
+
if (isApiReady && currentDate === null) {
|
|
37
36
|
setCurrentDate(/* @__PURE__ */ new Date());
|
|
38
37
|
}
|
|
39
38
|
const { mutate: generateAdminPortalLink, ...mutation } = useGenerateAdminPortalLink({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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 type AdminPortalSsoConnectionStatusProps,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport { useIsHydrated } from \"./lib/use-is-hydrated.js\";\nimport { ApiProvider, AuthToken } from \"./api/api-provider.js\";\nimport {\n type SsoConnection,\n useGenerateAdminPortalLink,\n useListSsoConnections,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { unreachable } from \"./lib/utils.js\";\nimport { IdentityProvider } from \"./lib/identity-providers.js\";\n\nexport interface AdminPortalSsoConnectionProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalSsoConnection: React.FC<\n AdminPortalSsoConnectionProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <SingleSignOnContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalSsoConnectionLoading };\n\nconst SingleSignOnContent = () => {\n const isHydrated = useIsHydrated();\n const [currentDate, setCurrentDate] = React.useState<Date | null>(() =>\n isHydrated ? new Date() : null,\n );\n if (isHydrated && currentDate === null) {\n setCurrentDate(new Date());\n }\n\n const { mutate: generateAdminPortalLink, ...mutation } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const adminPortalLink = mutation.data?.link ?? null;\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 />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} />;\n }\n\n if (query.data) {\n const connection = query.data[0];\n if (!connection) {\n return (\n <AdminPortalSsoConnectionPresentational\n connectionStatus=\"NotConfigured\"\n currentDate={currentDate}\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const connectionState = getConnectionState(connection, currentDate);\n const props: 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 FallbackComponent={AdminPortalSsoConnectionError}>\n <AdminPortalSsoConnectionPresentational\n {...props}\n currentDate={currentDate}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\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);\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 default:\n return unreachable(connection);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"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 type AdminPortalSsoConnectionStatusProps,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport {\n type SsoConnection,\n useGenerateAdminPortalLink,\n useListSsoConnections,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { unreachable } from \"./lib/utils.js\";\nimport { IdentityProvider } from \"./lib/identity-providers.js\";\n\nexport interface AdminPortalSsoConnectionProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalSsoConnection: React.FC<\n AdminPortalSsoConnectionProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <SingleSignOnContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalSsoConnectionLoading };\n\nconst SingleSignOnContent = () => {\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, ...mutation } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const adminPortalLink = mutation.data?.link ?? null;\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 />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} />;\n }\n\n if (query.data) {\n const connection = query.data[0];\n if (!connection) {\n return (\n <AdminPortalSsoConnectionPresentational\n connectionStatus=\"NotConfigured\"\n currentDate={currentDate}\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const connectionState = getConnectionState(connection, currentDate);\n const props: 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 FallbackComponent={AdminPortalSsoConnectionError}>\n <AdminPortalSsoConnectionPresentational\n {...props}\n currentDate={currentDate}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\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);\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 default:\n return unreachable(connection);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,8 +8,8 @@ interface ElevatedAccess {
|
|
|
8
8
|
expiresAt: string;
|
|
9
9
|
}
|
|
10
10
|
interface ApiConfig {
|
|
11
|
-
authToken:
|
|
12
|
-
|
|
11
|
+
authToken: string | undefined;
|
|
12
|
+
permissions: string[] | undefined;
|
|
13
13
|
baseUrl: string;
|
|
14
14
|
widgetType: WidgetType;
|
|
15
15
|
elevatedAccess?: ElevatedAccess;
|
|
@@ -27,5 +27,6 @@ declare const useElevatedAccessToken: () => {
|
|
|
27
27
|
elevatedAccess: ElevatedAccess | undefined;
|
|
28
28
|
setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;
|
|
29
29
|
};
|
|
30
|
+
declare const useApiReady: () => boolean;
|
|
30
31
|
|
|
31
|
-
export { ApiProvider, type AuthToken, type WidgetType, useApi, useElevatedAccessToken };
|
|
32
|
+
export { ApiProvider, type AuthToken, type WidgetType, useApi, useApiReady, useElevatedAccessToken };
|