@workos-inc/widgets 1.20.2-next.1792700156145 → 1.20.2
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 +4 -10
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs +2 -1
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-domain-verification.client.cjs +3 -2
- package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-sso-connection.client.cjs +2 -1
- package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -1
- package/dist/cjs/api/api-provider.cjs +23 -1
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts.map +1 -1
- package/dist/cjs/api/claims.cjs.map +1 -1
- package/dist/cjs/api/claims.d.cts +2 -1
- package/dist/cjs/api/claims.d.cts.map +1 -1
- package/dist/cjs/api/client-graphql/client.cjs +3 -2
- package/dist/cjs/api/client-graphql/client.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/hooks.cjs +3 -20
- package/dist/cjs/api/client-graphql/hooks.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/hooks.d.cts +3 -12
- package/dist/cjs/api/client-graphql/hooks.d.cts.map +1 -1
- package/dist/cjs/api/client-graphql/query-keys.cjs +25 -0
- package/dist/cjs/api/client-graphql/query-keys.cjs.map +1 -0
- package/dist/cjs/api/client-graphql/query-keys.d.cts +16 -0
- package/dist/cjs/api/client-graphql/query-keys.d.cts.map +1 -0
- package/dist/cjs/components/copy-text.cjs +1 -1
- package/dist/cjs/components/copy-text.cjs.map +1 -1
- package/dist/cjs/components/form.cjs +9 -13
- package/dist/cjs/components/form.cjs.map +1 -1
- package/dist/cjs/components/form.d.cts.map +1 -1
- package/dist/cjs/components/otp-input.cjs +1 -0
- package/dist/cjs/components/otp-input.cjs.map +1 -1
- package/dist/cjs/directory-sync.client.cjs +2 -1
- package/dist/cjs/directory-sync.client.cjs.map +1 -1
- package/dist/cjs/lib/api/api-key.cjs +4 -3
- package/dist/cjs/lib/api/api-key.cjs.map +1 -1
- package/dist/cjs/lib/api/me.cjs +2 -1
- package/dist/cjs/lib/api/me.cjs.map +1 -1
- package/dist/cjs/lib/api/pipes.cjs +7 -6
- package/dist/cjs/lib/api/pipes.cjs.map +1 -1
- package/dist/cjs/lib/api/user-api-key.cjs +3 -2
- package/dist/cjs/lib/api/user-api-key.cjs.map +1 -1
- package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -1
- package/dist/cjs/lib/i18n/intl-context.d.cts +1 -0
- package/dist/cjs/lib/i18n/intl-context.d.cts.map +1 -1
- package/dist/cjs/lib/i18n/use-translation.cjs +2 -2
- package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -1
- package/dist/cjs/lib/use-composed-event-handlers.cjs +15 -0
- package/dist/cjs/lib/use-composed-event-handlers.cjs.map +1 -0
- package/dist/cjs/lib/use-composed-event-handlers.d.cts +6 -0
- package/dist/cjs/lib/use-composed-event-handlers.d.cts.map +1 -0
- package/dist/cjs/lib/use-debounce.cjs +124 -116
- package/dist/cjs/lib/use-debounce.cjs.map +1 -1
- package/dist/cjs/lib/use-debounce.d.cts +53 -48
- package/dist/cjs/lib/use-debounce.d.cts.map +1 -1
- package/dist/cjs/lib/use-widgets-invalidator.cjs +3 -3
- package/dist/cjs/lib/use-widgets-invalidator.cjs.map +1 -1
- package/dist/cjs/lib/use-widgets-invalidator.d.cts.map +1 -1
- package/dist/cjs/lib/utils.cjs +0 -7
- package/dist/cjs/lib/utils.cjs.map +1 -1
- package/dist/cjs/lib/utils.d.cts +0 -3
- package/dist/cjs/lib/utils.d.cts.map +1 -1
- package/dist/cjs/organization-switcher.client.cjs +2 -1
- package/dist/cjs/organization-switcher.client.cjs.map +1 -1
- package/dist/cjs/pipes-admin.client.cjs +2 -1
- package/dist/cjs/pipes-admin.client.cjs.map +1 -1
- package/dist/cjs/pipes.client.cjs +2 -1
- package/dist/cjs/pipes.client.cjs.map +1 -1
- package/dist/cjs/user-security.client.cjs +2 -1
- package/dist/cjs/user-security.client.cjs.map +1 -1
- package/dist/cjs/user-sessions.client.cjs +2 -1
- package/dist/cjs/user-sessions.client.cjs.map +1 -1
- package/dist/cjs/widgets/api-keys/api-keys-search.cjs +1 -1
- package/dist/cjs/widgets/api-keys/api-keys-search.cjs.map +1 -1
- package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs +1 -1
- package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs.map +1 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs +19 -5
- package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs.map +1 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts +2 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts.map +1 -1
- package/dist/cjs/widgets/pipes/pipes.cjs +3 -2
- package/dist/cjs/widgets/pipes/pipes.cjs.map +1 -1
- package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs +2 -1
- package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/user-sessions/logout-dialog.cjs +2 -1
- package/dist/cjs/widgets/user-sessions/logout-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/invite-user-dialog.cjs +5 -6
- package/dist/cjs/widgets/users-management/invite-user-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-management-utils.cjs +4 -3
- package/dist/cjs/widgets/users-management/users-management-utils.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-management.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-search.cjs +1 -1
- package/dist/cjs/widgets/users-management/users-search.cjs.map +1 -1
- package/dist/esm/admin-portal-audit-log-streaming.client.js +2 -1
- package/dist/esm/admin-portal-audit-log-streaming.client.js.map +1 -1
- package/dist/esm/admin-portal-domain-verification.client.js +2 -1
- package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
- package/dist/esm/admin-portal-sso-connection.client.js +2 -1
- package/dist/esm/admin-portal-sso-connection.client.js.map +1 -1
- package/dist/esm/api/api-provider.d.ts.map +1 -1
- package/dist/esm/api/api-provider.js +23 -1
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/claims.d.ts +2 -1
- package/dist/esm/api/claims.d.ts.map +1 -1
- package/dist/esm/api/claims.js.map +1 -1
- package/dist/esm/api/client-graphql/client.js +3 -2
- package/dist/esm/api/client-graphql/client.js.map +1 -1
- package/dist/esm/api/client-graphql/hooks.d.ts +3 -12
- package/dist/esm/api/client-graphql/hooks.d.ts.map +1 -1
- package/dist/esm/api/client-graphql/hooks.js +1 -18
- package/dist/esm/api/client-graphql/hooks.js.map +1 -1
- package/dist/esm/api/client-graphql/query-keys.d.ts +16 -0
- package/dist/esm/api/client-graphql/query-keys.d.ts.map +1 -0
- package/dist/esm/api/client-graphql/query-keys.js +23 -0
- package/dist/esm/api/client-graphql/query-keys.js.map +1 -0
- package/dist/esm/components/copy-text.js +1 -1
- package/dist/esm/components/copy-text.js.map +1 -1
- package/dist/esm/components/form.d.ts.map +1 -1
- package/dist/esm/components/form.js +9 -13
- package/dist/esm/components/form.js.map +1 -1
- package/dist/esm/components/otp-input.js +1 -0
- package/dist/esm/components/otp-input.js.map +1 -1
- package/dist/esm/directory-sync.client.js +2 -1
- package/dist/esm/directory-sync.client.js.map +1 -1
- package/dist/esm/lib/api/api-key.js +2 -1
- package/dist/esm/lib/api/api-key.js.map +1 -1
- package/dist/esm/lib/api/me.js +2 -1
- package/dist/esm/lib/api/me.js.map +1 -1
- package/dist/esm/lib/api/pipes.js +2 -1
- package/dist/esm/lib/api/pipes.js.map +1 -1
- package/dist/esm/lib/api/user-api-key.js +2 -1
- package/dist/esm/lib/api/user-api-key.js.map +1 -1
- package/dist/esm/lib/i18n/intl-context.d.ts +1 -0
- package/dist/esm/lib/i18n/intl-context.d.ts.map +1 -1
- package/dist/esm/lib/i18n/intl-context.js.map +1 -1
- package/dist/esm/lib/i18n/use-translation.js +2 -2
- package/dist/esm/lib/i18n/use-translation.js.map +1 -1
- package/dist/esm/lib/use-composed-event-handlers.d.ts +6 -0
- package/dist/esm/lib/use-composed-event-handlers.d.ts.map +1 -0
- package/dist/esm/lib/use-composed-event-handlers.js +12 -0
- package/dist/esm/lib/use-composed-event-handlers.js.map +1 -0
- package/dist/esm/lib/use-debounce.d.ts +53 -48
- package/dist/esm/lib/use-debounce.d.ts.map +1 -1
- package/dist/esm/lib/use-debounce.js +124 -116
- package/dist/esm/lib/use-debounce.js.map +1 -1
- package/dist/esm/lib/use-widgets-invalidator.d.ts.map +1 -1
- package/dist/esm/lib/use-widgets-invalidator.js +2 -2
- package/dist/esm/lib/use-widgets-invalidator.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +0 -3
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +1 -7
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/organization-switcher.client.js +2 -1
- package/dist/esm/organization-switcher.client.js.map +1 -1
- package/dist/esm/pipes-admin.client.js +2 -1
- package/dist/esm/pipes-admin.client.js.map +1 -1
- package/dist/esm/pipes.client.js +2 -1
- package/dist/esm/pipes.client.js.map +1 -1
- package/dist/esm/user-security.client.js +2 -1
- package/dist/esm/user-security.client.js.map +1 -1
- package/dist/esm/user-sessions.client.js +2 -1
- package/dist/esm/user-sessions.client.js.map +1 -1
- package/dist/esm/widgets/api-keys/api-keys-search.js +1 -1
- package/dist/esm/widgets/api-keys/api-keys-search.js.map +1 -1
- package/dist/esm/widgets/api-keys/user-api-keys-search.js +1 -1
- package/dist/esm/widgets/api-keys/user-api-keys-search.js.map +1 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts +2 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts.map +1 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.js +19 -5
- package/dist/esm/widgets/organization-switcher/organization-switcher.js.map +1 -1
- package/dist/esm/widgets/pipes/pipes.js +2 -1
- package/dist/esm/widgets/pipes/pipes.js.map +1 -1
- package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js +2 -1
- package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js.map +1 -1
- package/dist/esm/widgets/user-sessions/logout-dialog.js +2 -1
- package/dist/esm/widgets/user-sessions/logout-dialog.js.map +1 -1
- package/dist/esm/widgets/users-management/invite-user-dialog.js +5 -6
- package/dist/esm/widgets/users-management/invite-user-dialog.js.map +1 -1
- package/dist/esm/widgets/users-management/users-management-utils.js +2 -1
- package/dist/esm/widgets/users-management/users-management-utils.js.map +1 -1
- package/dist/esm/widgets/users-management/users-management.js.map +1 -1
- package/dist/esm/widgets/users-management/users-search.js +1 -1
- package/dist/esm/widgets/users-management/users-search.js.map +1 -1
- package/package.json +1 -1
- package/src/api/api-provider.tsx +39 -1
- package/src/api/claims.ts +2 -1
- package/src/api/client-graphql/client.ts +8 -2
- package/src/api/client-graphql/hooks.ts +8 -27
- package/src/api/client-graphql/query-keys.ts +29 -0
- package/src/components/copy-text.tsx +1 -1
- package/src/components/form.tsx +33 -29
- package/src/components/otp-input.tsx +2 -0
- package/src/lib/i18n/intl-context.tsx +4 -0
- package/src/lib/i18n/use-translation.ts +1 -4
- package/src/lib/use-composed-event-handlers.ts +25 -0
- package/src/lib/use-debounce.ts +289 -237
- package/src/lib/use-widgets-invalidator.ts +0 -4
- package/src/lib/utils.ts +0 -12
- package/src/widgets/api-keys/api-keys-search.tsx +6 -3
- package/src/widgets/api-keys/user-api-keys-search.tsx +6 -3
- package/src/widgets/organization-switcher/organization-switcher.tsx +32 -8
- package/src/widgets/users-management/invite-user-dialog.tsx +9 -11
- package/src/widgets/users-management/users-management.tsx +1 -1
- package/src/widgets/users-management/users-search.tsx +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.20.2
|
|
3
|
+
## 1.20.2
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
7
|
- Correctly handle invalid date strings from the server.
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
8
|
+
- Preserve MFA enrollment progress when elevated access token expires mid-flow.
|
|
9
|
+
- Show a translatable "No organizations found" message in Organization Switcher when the user belongs to no organizations.
|
|
11
10
|
- Updated Widget translation file references.
|
|
12
|
-
|
|
13
11
|
- Honor `patternFlags` when validating configuration fields in `PipesAdmin`, so uppercase Snowflake account identifiers are accepted.
|
|
14
|
-
|
|
15
12
|
- Fixed edge-case bugs with React's concurrent rendering
|
|
16
|
-
|
|
17
|
-
- Memoize i18n translate function
|
|
18
|
-
|
|
19
|
-
- Update internal GraphQL API calls
|
|
13
|
+
- Refresh widgets when a string `authToken` changes to a different session, user or organization so that switching organizations no longer leaves stale data.
|
|
20
14
|
|
|
21
15
|
## 1.20.1
|
|
22
16
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
4
4
|
const require_lib_widgets_context = require("./lib/widgets-context.cjs");
|
|
5
|
+
const require_api_client_graphql_query_keys = require("./api/client-graphql/query-keys.cjs");
|
|
5
6
|
const require_api_api_provider = require("./api/api-provider.cjs");
|
|
6
7
|
const require_api_client_graphql_hooks = require("./api/client-graphql/hooks.cjs");
|
|
7
8
|
const require_components_error_boundary = require("./components/error-boundary.cjs");
|
|
@@ -34,7 +35,7 @@ const AdminPortalAuditLogStreamingImpl = (props) => {
|
|
|
34
35
|
});
|
|
35
36
|
const adminPortalLink = mutation.data?.createAdminPortalLink.link ?? null;
|
|
36
37
|
const query = require_api_client_graphql_hooks.useClientGraphqlQuery({
|
|
37
|
-
queryKey:
|
|
38
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("AuditLogStream"),
|
|
38
39
|
queryFn: (sdk) => sdk.AuditLogStream()
|
|
39
40
|
});
|
|
40
41
|
const initConfig = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-portal-audit-log-streaming.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalAuditLogStreamingError","ApiProvider","useClientGraphqlMutation","useClientGraphqlQuery","clientGraphqlQueryKey","AdminPortalAuditLogStreamingLoading","AdminPortalAuditLogStreamingPresentational","AdminPortalAuditLogStreamingButton"],"sources":["../../src/admin-portal-audit-log-streaming.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type { AdminPortalLinkIntent } from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalAuditLogStreamingButton,\n AdminPortalAuditLogStreamingError,\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nimport type { AdminPortalAuditLogStreamingStatusProps } from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\n\ninterface AdminPortalAuditLogStreamingProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalAuditLogStreaming: React.FC<\n AdminPortalAuditLogStreamingProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-audit-log-streaming\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalAuditLogStreamingImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalAuditLogStreamingImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalAuditLogStreamingImpl: React.FC<\n AdminPortalAuditLogStreamingImplProps\n> = (props) => {\n const { mutate: generateAdminPortalLink, ...mutation } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n window.open(\n data.createAdminPortalLink.link,\n \"_blank\",\n \"noopener,noreferrer\",\n );\n },\n });\n\n const adminPortalLink = mutation.data?.createAdminPortalLink.link ?? null;\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"AuditLogStream\"),\n queryFn: (sdk) => sdk.AuditLogStream(),\n });\n\n const initConfig = () => {\n generateAdminPortalLink(\"LogStreams\");\n };\n\n if (query.isLoading) {\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalAuditLogStreamingError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const configuredStream = query.data.auditLogStream;\n\n if (!configuredStream) {\n return (\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const statusProps: AdminPortalAuditLogStreamingStatusProps = (() => {\n switch (configuredStream.state) {\n case \"Inactive\":\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n case \"Active\":\n return {\n connectionStatus: \"Active\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Error\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Invalid\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n default:\n // Fallback\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n }\n })();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...props} />\n )}\n >\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n {...statusProps}\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n};\nexport {\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreamingError,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport {\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n AdminPortalAuditLogStreamingButton,\n type AdminPortalAuditLogStreamingStatusProps,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport type { AdminPortalAuditLogStreamingProps };\nexport { AdminPortalAuditLogStreaming };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-portal-audit-log-streaming.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalAuditLogStreamingError","ApiProvider","useClientGraphqlMutation","useClientGraphqlQuery","clientGraphqlQueryKey","AdminPortalAuditLogStreamingLoading","AdminPortalAuditLogStreamingPresentational","AdminPortalAuditLogStreamingButton"],"sources":["../../src/admin-portal-audit-log-streaming.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type { AdminPortalLinkIntent } from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalAuditLogStreamingButton,\n AdminPortalAuditLogStreamingError,\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nimport type { AdminPortalAuditLogStreamingStatusProps } from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\n\ninterface AdminPortalAuditLogStreamingProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalAuditLogStreaming: React.FC<\n AdminPortalAuditLogStreamingProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-audit-log-streaming\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalAuditLogStreamingImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalAuditLogStreamingImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalAuditLogStreamingImpl: React.FC<\n AdminPortalAuditLogStreamingImplProps\n> = (props) => {\n const { mutate: generateAdminPortalLink, ...mutation } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n window.open(\n data.createAdminPortalLink.link,\n \"_blank\",\n \"noopener,noreferrer\",\n );\n },\n });\n\n const adminPortalLink = mutation.data?.createAdminPortalLink.link ?? null;\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"AuditLogStream\"),\n queryFn: (sdk) => sdk.AuditLogStream(),\n });\n\n const initConfig = () => {\n generateAdminPortalLink(\"LogStreams\");\n };\n\n if (query.isLoading) {\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalAuditLogStreamingError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const configuredStream = query.data.auditLogStream;\n\n if (!configuredStream) {\n return (\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const statusProps: AdminPortalAuditLogStreamingStatusProps = (() => {\n switch (configuredStream.state) {\n case \"Inactive\":\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n case \"Active\":\n return {\n connectionStatus: \"Active\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Error\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Invalid\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n default:\n // Fallback\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n }\n })();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...props} />\n )}\n >\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n {...statusProps}\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n};\nexport {\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreamingError,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport {\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n AdminPortalAuditLogStreamingButton,\n type AdminPortalAuditLogStreamingStatusProps,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport type { AdminPortalAuditLogStreamingProps };\nexport { AdminPortalAuditLogStreaming };\n"],"mappings":";;;;;;;;;;;;;AA0BA,MAAM,gCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAUA,4BAAAA,gBAAgB;CAChC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kCAAAA,eAAD;EACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,mCAAD;GAA0C;GAAO,GAAI;EAAW,CAAA;EAGlE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kCAAD,EAAkC,GAAI,SAAW,CAAA;EACtC,CAAA;CACA,CAAA;AAEnB;AAIA,MAAM,oCAED,UAAU;CACb,MAAM,EAAE,QAAQ,yBAAyB,GAAG,aAC1CC,iCAAAA,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,OAAO,KACL,KAAK,sBAAsB,MAC3B,UACA,qBACF;EACF;CACF,CAAC;CAEH,MAAM,kBAAkB,SAAS,MAAM,sBAAsB,QAAQ;CAErE,MAAM,QAAQC,iCAAAA,sBAAsB;EAClC,UAAUC,sCAAAA,sBAAsB,gBAAgB;EAChD,UAAU,QAAQ,IAAI,eAAe;CACvC,CAAC;CAED,MAAM,mBAAmB;EACvB,wBAAwB,YAAY;CACtC;CAEA,IAAI,MAAM,WACR,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,qCAAD,EAAqC,GAAI,MAAQ,CAAA;CAG1D,IAAI,MAAM,SACR,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACL,kFAAAA,mCAAD;EAAmC,OAAO,MAAM;EAAO,GAAI;CAAQ,CAAA;CAG5E,IAAI,MAAM,MAAM;EACd,MAAM,mBAAmB,MAAM,KAAK;EAEpC,IAAI,CAAC,kBACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACM,kFAAAA,8BAAD;GACE,GAAI;GACJ,kBAAiB;GACjB,uBACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,oCAAD;IACE,WAAW,SAAS;IACpB,MAAM;IACM;GACb,CAAA;EAEJ,CAAA;EAIL,MAAM,qBAA8D;GAClE,QAAQ,iBAAiB,OAAzB;IACE,KAAK,YACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;IACF,KAAK,UACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,SACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,WACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,SAEE,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;GACJ;EACF,EAAA,CAAG;EAEH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACR,kCAAAA,eAAD;GACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,mCAAD;IAA0C;IAAO,GAAI;GAAQ,CAAA;GAG/D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,kFAAAA,8BAAD;IACE,GAAI;IACJ,GAAI;IACJ,uBACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,oCAAD;KACE,WAAW,SAAS;KACpB,MAAM;KACM;IACb,CAAA;GAEJ,CAAA;EACY,CAAA;CAEnB;CAEA,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACF,kFAAAA,qCAAD,EAAqC,GAAI,MAAQ,CAAA;AAC1D"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
4
4
|
const require_lib_widgets_context = require("./lib/widgets-context.cjs");
|
|
5
|
+
const require_api_client_graphql_query_keys = require("./api/client-graphql/query-keys.cjs");
|
|
5
6
|
const require_api_api_provider = require("./api/api-provider.cjs");
|
|
6
7
|
const require_api_client_graphql_hooks = require("./api/client-graphql/hooks.cjs");
|
|
7
8
|
const require_components_error_boundary = require("./components/error-boundary.cjs");
|
|
@@ -46,11 +47,11 @@ const AdminPortalDomainVerificationImpl = (props) => {
|
|
|
46
47
|
const isApiReady = require_api_api_provider.useApiReady();
|
|
47
48
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
48
49
|
const { data: organizationDomains, isLoading, error } = require_api_client_graphql_hooks.useClientGraphqlQuery({
|
|
49
|
-
queryKey:
|
|
50
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationDomains"),
|
|
50
51
|
queryFn: listAllOrganizationDomains
|
|
51
52
|
});
|
|
52
53
|
const invalidateDomains = () => {
|
|
53
|
-
queryClient.invalidateQueries({ queryKey:
|
|
54
|
+
queryClient.invalidateQueries({ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationDomains") });
|
|
54
55
|
};
|
|
55
56
|
const { mutate: generateAdminPortalLink, isPending } = require_api_client_graphql_hooks.useClientGraphqlMutation({
|
|
56
57
|
mutationFn: (sdk, intent) => sdk.CreateAdminPortalLink({ intent }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-portal-domain-verification.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalDomainVerificationError","ApiProvider","useApiReady","useQueryClient","useClientGraphqlQuery","clientGraphqlQueryKey","useClientGraphqlMutation","AdminPortalDomainVerificationLoading","AdminPortalDomainVerificationPresentational"],"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider, useApiReady } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n OrganizationDomainFieldsFragment,\n Sdk,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\nimport type {\n AdminPortalDomainVerificationErrorProps,\n AdminPortalDomainVerificationLoadingProps,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\n\nconst DOMAINS_PAGE_SIZE = 100;\n\nasync function listAllOrganizationDomains(\n sdk: Sdk,\n): Promise<OrganizationDomainFieldsFragment[]> {\n const domains: OrganizationDomainFieldsFragment[] = [];\n let after: string | null = null;\n do {\n const { organizationDomains } = await sdk.ListOrganizationDomains({\n after,\n limit: DOMAINS_PAGE_SIZE,\n order: \"Asc\",\n });\n domains.push(...organizationDomains.data);\n after = organizationDomains.listMetadata.after ?? null;\n } while (after !== null);\n return domains;\n}\n\ninterface AdminPortalDomainVerificationProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalDomainVerificationImplProps extends Omit<\n AdminPortalDomainVerificationProps,\n \"authToken\"\n> {}\n\nconst AdminPortalDomainVerificationImpl: React.FC<\n AdminPortalDomainVerificationImplProps\n> = (props) => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n queryFn: listAllOrganizationDomains,\n });\n\n const invalidateDomains = () => {\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n });\n };\n\n const { mutate: generateAdminPortalLink, isPending } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const { mutate: deleteDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.DeleteOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const { mutate: reverifyDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.ReverifyOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink(\"DomainVerification\");\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 {...props} />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} {...props} />;\n }\n\n const domains = organizationDomains || [];\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...props} />\n )}\n >\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n {...props}\n />\n </ErrorBoundary>\n );\n};\n\nexport type {\n AdminPortalDomainVerificationProps,\n AdminPortalDomainVerificationLoadingProps,\n AdminPortalDomainVerificationErrorProps,\n};\nexport {\n AdminPortalDomainVerification,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerificationError,\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-portal-domain-verification.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalDomainVerificationError","ApiProvider","useApiReady","useQueryClient","useClientGraphqlQuery","clientGraphqlQueryKey","useClientGraphqlMutation","AdminPortalDomainVerificationLoading","AdminPortalDomainVerificationPresentational"],"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider, useApiReady } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n OrganizationDomainFieldsFragment,\n Sdk,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\nimport type {\n AdminPortalDomainVerificationErrorProps,\n AdminPortalDomainVerificationLoadingProps,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\n\nconst DOMAINS_PAGE_SIZE = 100;\n\nasync function listAllOrganizationDomains(\n sdk: Sdk,\n): Promise<OrganizationDomainFieldsFragment[]> {\n const domains: OrganizationDomainFieldsFragment[] = [];\n let after: string | null = null;\n do {\n const { organizationDomains } = await sdk.ListOrganizationDomains({\n after,\n limit: DOMAINS_PAGE_SIZE,\n order: \"Asc\",\n });\n domains.push(...organizationDomains.data);\n after = organizationDomains.listMetadata.after ?? null;\n } while (after !== null);\n return domains;\n}\n\ninterface AdminPortalDomainVerificationProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalDomainVerificationImplProps extends Omit<\n AdminPortalDomainVerificationProps,\n \"authToken\"\n> {}\n\nconst AdminPortalDomainVerificationImpl: React.FC<\n AdminPortalDomainVerificationImplProps\n> = (props) => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n queryFn: listAllOrganizationDomains,\n });\n\n const invalidateDomains = () => {\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n });\n };\n\n const { mutate: generateAdminPortalLink, isPending } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const { mutate: deleteDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.DeleteOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const { mutate: reverifyDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.ReverifyOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink(\"DomainVerification\");\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 {...props} />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} {...props} />;\n }\n\n const domains = organizationDomains || [];\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...props} />\n )}\n >\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n {...props}\n />\n </ErrorBoundary>\n );\n};\n\nexport type {\n AdminPortalDomainVerificationProps,\n AdminPortalDomainVerificationLoadingProps,\n AdminPortalDomainVerificationErrorProps,\n};\nexport {\n AdminPortalDomainVerification,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerificationError,\n};\n"],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,oBAAoB;AAE1B,eAAe,2BACb,KAC6C;CAC7C,MAAM,UAA8C,CAAC;CACrD,IAAI,QAAuB;CAC3B,GAAG;EACD,MAAM,EAAE,wBAAwB,MAAM,IAAI,wBAAwB;GAChE;GACA,OAAO;GACP,OAAO;EACT,CAAC;EACD,QAAQ,KAAK,GAAG,oBAAoB,IAAI;EACxC,QAAQ,oBAAoB,aAAa,SAAS;CACpD,SAAS,UAAU;CACnB,OAAO;AACT;AAMA,MAAM,iCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAUA,4BAAAA,gBAAgB;CAEhC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kCAAAA,eAAD;EACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,oCAAD;GAA2C;GAAO,GAAI;EAAW,CAAA;EAGnE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,mCAAD,EAAmC,GAAI,SAAW,CAAA;EACvC,CAAA;CACA,CAAA;AAEnB;AAOA,MAAM,qCAED,UAAU;CACb,MAAM,aAAaC,yBAAAA,YAAY;CAC/B,MAAM,eAAA,GAAcC,sBAAAA,eAAAA,CAAe;CACnC,MAAM,EACJ,MAAM,qBACN,WACA,UACEC,iCAAAA,sBAAsB;EACxB,UAAUC,sCAAAA,sBAAsB,yBAAyB;EACzD,SAAS;CACX,CAAC;CAED,MAAM,0BAA0B;EAC9B,YAAY,kBAAkB,EAC5B,UAAUA,sCAAAA,sBAAsB,yBAAyB,EAC3D,CAAC;CACH;CAEA,MAAM,EAAE,QAAQ,yBAAyB,cACvCC,iCAAAA,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,kBAAA,eAAe,KAAK,sBAAsB,MAAM;IAC9C,QAAQ;IACR,KAAK;GACP,CAAC;EACH;CACF,CAAC;CAEH,MAAM,EAAE,QAAQ,iBAAiBA,iCAAAA,yBAAyB;EACxD,aAAa,KAAK,OAAe,IAAI,yBAAyB,EAAE,GAAG,CAAC;EACpE,WAAW;CACb,CAAC;CAED,MAAM,EAAE,QAAQ,mBAAmBA,iCAAAA,yBAAyB;EAC1D,aAAa,KAAK,OAAe,IAAI,2BAA2B,EAAE,GAAG,CAAC;EACtE,WAAW;CACb,CAAC;CAED,MAAM,wBAAwB;EAC5B,wBAAwB,oBAAoB;CAC9C;CAEA,MAAM,sBAAsB,aAAqB;EAC/C,aAAa,QAAQ;CACvB;CAEA,MAAM,wBAAwB,aAAqB;EACjD,eAAe,QAAQ;CACzB;CAEA,IAAI,CAAC,cAAc,WACjB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,sCAAD,EAAsC,GAAI,MAAQ,CAAA;CAG3D,IAAI,OACF,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACP,kFAAAA,oCAAD;EAA2C;EAAO,GAAI;CAAQ,CAAA;CAGvE,MAAM,UAAU,uBAAuB,CAAC;CAExC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,kCAAAA,eAAD;EACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,kFAAAA,oCAAD;GAA2C;GAAO,GAAI;EAAQ,CAAA;EAGhE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,kFAAAA,+BAAD;GACE,qBAAqB;GACrB,aAAa;GACb,gBAAgB;GAChB,kBAAkB;GACP;GACX,GAAI;EACL,CAAA;CACY,CAAA;AAEnB"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
4
4
|
const require_lib_widgets_context = require("./lib/widgets-context.cjs");
|
|
5
|
+
const require_api_client_graphql_query_keys = require("./api/client-graphql/query-keys.cjs");
|
|
5
6
|
const require_api_api_provider = require("./api/api-provider.cjs");
|
|
6
7
|
const require_api_client_graphql_hooks = require("./api/client-graphql/hooks.cjs");
|
|
7
8
|
const require_components_error_boundary = require("./components/error-boundary.cjs");
|
|
@@ -38,7 +39,7 @@ const AdminPortalSsoConnectionImpl = (props) => {
|
|
|
38
39
|
}
|
|
39
40
|
});
|
|
40
41
|
const query = require_api_client_graphql_hooks.useClientGraphqlQuery({
|
|
41
|
-
queryKey:
|
|
42
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListSsoConnections"),
|
|
42
43
|
queryFn: (sdk) => sdk.ListSsoConnections(),
|
|
43
44
|
select: (data) => data.ssoConnections
|
|
44
45
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-portal-sso-connection.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalSsoConnectionError","ApiProvider","useClientGraphqlMutation","useClientGraphqlQuery","clientGraphqlQueryKey","AdminPortalSsoConnectionLoading","AdminPortalSsoConnectionPresentational","AdminPortalOpenButton","useNow"],"sources":["../../src/admin-portal-sso-connection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n ConnectionFieldsFragment,\n ConnectionType,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { IdentityProvider } from \"./lib/identity-providers.js\";\nimport { useNow } from \"./lib/use-now.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\nimport type {\n AdminPortalSsoConnectionErrorProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionStatusProps,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.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\ninterface AdminPortalSsoConnectionImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionImpl: React.FC<\n AdminPortalSsoConnectionImplProps\n> = (props) => {\n const {\n mutate: generateAdminPortalLink,\n isPending: isGeneratingAdminPortalLink,\n } = useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n queryFn: (sdk) => sdk.ListSsoConnections(),\n select: (data) => data.ssoConnections,\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 initConfig = () => generateAdminPortalLink(\"Sso\");\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 lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionReady\n {...props}\n connection={connection}\n isGeneratingAdminPortalLink={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n </ErrorBoundary>\n );\n }\n};\n\ninterface AdminPortalSsoConnectionReadyProps extends WidgetRootDomProps {\n connection: ConnectionFieldsFragment;\n isGeneratingAdminPortalLink: boolean;\n initConfig: () => void;\n}\n\nconst AdminPortalSsoConnectionReady: React.FC<\n AdminPortalSsoConnectionReadyProps\n> = ({ connection, isGeneratingAdminPortalLink, initConfig, ...props }) => {\n const currentDate = useNow();\n const connectionState = getConnectionState(connection, currentDate);\n const statusProps: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection.type);\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 connectionState satisfies never;\n throw new TypeError(`Unreachable code: ${connectionState}`);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <AdminPortalSsoConnectionPresentational\n {...props}\n {...statusProps}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\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: ConnectionFieldsFragment,\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 millisecondsUntilExpiry =\n expiryDate.getTime() - currentDate.getTime();\n\n // This certificate is the longest-lived one the server still treats as\n // unexpired. Once `notAfter` passes, the cached query has not yet moved\n // it to `latestExpiredCertificate`, so derive Expired locally.\n if (millisecondsUntilExpiry < 0) {\n return { status: \"Expired\", expiryDate };\n }\n\n const daysUntilExpiry = millisecondsUntilExpiry / (1000 * 60 * 60 * 24);\n if (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 connection.state satisfies never;\n throw new TypeError(`Unreachable code: ${connection.state}`);\n }\n}\n\nfunction getIdentityProvider(connectionType: ConnectionType): IdentityProvider {\n switch (connectionType) {\n case \"ADFSSAML\":\n case \"EntraIdOIDC\":\n case \"MicrosoftOAuth\":\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 case \"GoogleOAuth\":\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 case \"SalesforceOAuth\":\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 case \"AppleOAuth\":\n return \"apple\";\n case \"BitbucketOAuth\":\n return \"bitbucket\";\n case \"DiscordOAuth\":\n return \"discord\";\n case \"GithubOAuth\":\n return \"github\";\n case \"GitLabOAuth\":\n return \"gitlab\";\n case \"IntuitOAuth\":\n return \"intuit\";\n case \"LinkedInOAuth\":\n return \"linkedin\";\n case \"SlackOAuth\":\n return \"slack\";\n case \"VercelOAuth\":\n case \"VercelMarketplaceOAuth\":\n return \"vercel\";\n case \"XeroOAuth\":\n return \"xero\";\n case \"GrokOAuth\":\n case \"XOAuth\":\n case \"MagicLink\":\n return \"workos\";\n default:\n connectionType satisfies never;\n throw new TypeError(`Unreachable code: ${connectionType}`);\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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"}
|
|
1
|
+
{"version":3,"file":"admin-portal-sso-connection.client.cjs","names":["useWorkOsApiUrl","ErrorBoundary","AdminPortalSsoConnectionError","ApiProvider","useClientGraphqlMutation","useClientGraphqlQuery","clientGraphqlQueryKey","AdminPortalSsoConnectionLoading","AdminPortalSsoConnectionPresentational","AdminPortalOpenButton","useNow"],"sources":["../../src/admin-portal-sso-connection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n ConnectionFieldsFragment,\n ConnectionType,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { IdentityProvider } from \"./lib/identity-providers.js\";\nimport { useNow } from \"./lib/use-now.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\nimport type {\n AdminPortalSsoConnectionErrorProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionStatusProps,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.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\ninterface AdminPortalSsoConnectionImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionImpl: React.FC<\n AdminPortalSsoConnectionImplProps\n> = (props) => {\n const {\n mutate: generateAdminPortalLink,\n isPending: isGeneratingAdminPortalLink,\n } = useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n queryFn: (sdk) => sdk.ListSsoConnections(),\n select: (data) => data.ssoConnections,\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 initConfig = () => generateAdminPortalLink(\"Sso\");\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 lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionReady\n {...props}\n connection={connection}\n isGeneratingAdminPortalLink={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n </ErrorBoundary>\n );\n }\n};\n\ninterface AdminPortalSsoConnectionReadyProps extends WidgetRootDomProps {\n connection: ConnectionFieldsFragment;\n isGeneratingAdminPortalLink: boolean;\n initConfig: () => void;\n}\n\nconst AdminPortalSsoConnectionReady: React.FC<\n AdminPortalSsoConnectionReadyProps\n> = ({ connection, isGeneratingAdminPortalLink, initConfig, ...props }) => {\n const currentDate = useNow();\n const connectionState = getConnectionState(connection, currentDate);\n const statusProps: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection.type);\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 connectionState satisfies never;\n throw new TypeError(`Unreachable code: ${connectionState}`);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <AdminPortalSsoConnectionPresentational\n {...props}\n {...statusProps}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\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: ConnectionFieldsFragment,\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 millisecondsUntilExpiry =\n expiryDate.getTime() - currentDate.getTime();\n\n // This certificate is the longest-lived one the server still treats as\n // unexpired. Once `notAfter` passes, the cached query has not yet moved\n // it to `latestExpiredCertificate`, so derive Expired locally.\n if (millisecondsUntilExpiry < 0) {\n return { status: \"Expired\", expiryDate };\n }\n\n const daysUntilExpiry = millisecondsUntilExpiry / (1000 * 60 * 60 * 24);\n if (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 connection.state satisfies never;\n throw new TypeError(`Unreachable code: ${connection.state}`);\n }\n}\n\nfunction getIdentityProvider(connectionType: ConnectionType): IdentityProvider {\n switch (connectionType) {\n case \"ADFSSAML\":\n case \"EntraIdOIDC\":\n case \"MicrosoftOAuth\":\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 case \"GoogleOAuth\":\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 case \"SalesforceOAuth\":\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 case \"AppleOAuth\":\n return \"apple\";\n case \"BitbucketOAuth\":\n return \"bitbucket\";\n case \"DiscordOAuth\":\n return \"discord\";\n case \"GithubOAuth\":\n return \"github\";\n case \"GitLabOAuth\":\n return \"gitlab\";\n case \"IntuitOAuth\":\n return \"intuit\";\n case \"LinkedInOAuth\":\n return \"linkedin\";\n case \"SlackOAuth\":\n return \"slack\";\n case \"VercelOAuth\":\n case \"VercelMarketplaceOAuth\":\n return \"vercel\";\n case \"XeroOAuth\":\n return \"xero\";\n case \"GrokOAuth\":\n case \"XOAuth\":\n case \"MagicLink\":\n return \"workos\";\n default:\n connectionType satisfies never;\n throw new TypeError(`Unreachable code: ${connectionType}`);\n }\n}\n\nexport type {\n AdminPortalSsoConnectionProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionErrorProps,\n};\nexport {\n AdminPortalSsoConnection,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnectionError,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAqCA,MAAM,4BAAqE,EACzE,WACA,GAAG,eACC;CACJ,MAAM,UAAUA,4BAAAA,gBAAgB;CAChC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kCAAAA,eAAD;EACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,+BAAD;GAAsC;GAAO,GAAI;EAAW,CAAA;EAG9D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,8BAAD,EAA8B,GAAI,SAAW,CAAA;EAClC,CAAA;CACA,CAAA;AAEnB;AAIA,MAAM,gCAED,UAAU;CACb,MAAM,EACJ,QAAQ,yBACR,WAAW,gCACTC,iCAAAA,yBAAyB;EAC3B,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,kBAAA,eAAe,KAAK,sBAAsB,MAAM;IAC9C,QAAQ;IACR,KAAK;GACP,CAAC;EACH;CACF,CAAC;CAED,MAAM,QAAQC,iCAAAA,sBAAsB;EAClC,UAAUC,sCAAAA,sBAAsB,oBAAoB;EACpD,UAAU,QAAQ,IAAI,mBAAmB;EACzC,SAAS,SAAS,KAAK;CACzB,CAAC;CAED,IAAI,MAAM,WACR,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,iCAAD,EAAiC,GAAI,MAAQ,CAAA;CAGtD,IAAI,MAAM,SACR,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACL,wEAAAA,+BAAD;EAA+B,OAAO,MAAM;EAAO,GAAI;CAAQ,CAAA;CAGxE,IAAI,MAAM,MAAM;EACd,MAAM,mBAAmB,wBAAwB,KAAK;EACtD,MAAM,aAAa,MAAM,KAAK;EAC9B,IAAI,CAAC,YACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,kCAAAA,eAAD;GACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,+BAAD;IAAsC;IAAO,GAAI;GAAQ,CAAA;GAG3D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,wEAAAA,0BAAD;IACE,GAAI;IACJ,kBAAiB;IACjB,aAAa;IACb,uBACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,uBAAD;KACE,WAAW;KACC;IACb,CAAA;GAEJ,CAAA;EACY,CAAA;EAInB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACR,kCAAAA,eAAD;GACE,iBAAiB,EAAE,YACjB,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,+BAAD;IAAsC;IAAO,GAAI;GAAQ,CAAA;GAG3D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,+BAAD;IACE,GAAI;IACQ;IACiB;IACjB;GACb,CAAA;EACY,CAAA;CAEnB;AACF;AAQA,MAAM,iCAED,EAAE,YAAY,6BAA6B,YAAY,GAAG,YAAY;CAEzE,MAAM,kBAAkB,mBAAmB,YADvBQ,oBAAAA,OACmC,CAAW;CAClE,MAAM,qBAA0D;EAC9D,MAAM,mBAAmB,gBAAgB;EACzC,IAAI,qBAAqB,iBACvB,OAAO,EACL,kBAAkB,gBACpB;EAGF,MAAM,mBAAmB,oBAAoB,WAAW,IAAI;EAC5D,QAAQ,kBAAR;GACE,KAAK,UACH,OAAO;IACL;IACA;GACF;GACF,KAAK,YACH,OAAO;IACL;IACA;GACF;GACF,KAAK;GACL,KAAK,YACH,OAAO;IACL;IACA,YAAY,gBAAgB;IAC5B;GACF;GACF,SAEE,MAAM,IAAI,UAAU,qBAAqB,iBAAiB;EAC9D;CACF,EAAA,CAAG;CAEH,MAAM,cAAc,WAAW,cAC3B,IAAI,KAAK,WAAW,YAAY,SAAS,IACzC;CAEJ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACF,wEAAAA,0BAAD;EACE,GAAI;EACJ,GAAI;EACS;EACb,uBACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,wEAAAA,uBAAD;GACE,WAAW;GACC;EACb,CAAA;CAEJ,CAAA;AAEL;AAaA,SAAS,mBACP,YACA,aACiB;CACjB,QAAQ,WAAW,OAAnB;EACE,KAAK;EACL,KAAK;EACL,KAAK,YAAY;GACf,MAAM,eAAe,EAAE,QAAQ,SAAS;GACxC,IAAI,WAAW,gBAAgB,QAC7B,OAAO;GAGT,IAAI,WAAW,0BACb,OAAO;IACL,QAAQ;IACR,YAAY,WAAW,yBAAyB,WAC5C,IAAI,KAAK,WAAW,yBAAyB,QAAQ,IACrD;GACN;GAGF,MAAM,aAAa,WAAW,2BAA2B;GACzD,IAAI,eAAe,QAAQ,cAAc,MACvC,OAAO;GAGT,MAAM,aAAa,IAAI,KAAK,UAAU;GACtC,MAAM,0BACJ,WAAW,QAAQ,IAAI,YAAY,QAAQ;GAK7C,IAAI,0BAA0B,GAC5B,OAAO;IAAE,QAAQ;IAAW;GAAW;GAGzC,MAAM,kBAAkB,0BAA2B;GACnD,IAAI,mBAAmB,IACrB,OAAO;IAAE,QAAQ;IAAY;IAAiB;GAAW;GAG3D,OAAO;EACT;EACA,KAAK,YACH,OAAO,EAAE,QAAQ,WAAW;EAE9B;GACE,WAAW;GACX,MAAM,IAAI,UAAU,qBAAqB,WAAW,OAAO;CAC/D;AACF;AAEA,SAAS,oBAAoB,gBAAkD;CAC7E,QAAQ,gBAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,kBACH,OAAO;EACT,KAAK;EACL,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK,YACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,eACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK,mBACH,OAAO;EACT,KAAK;EACL,KAAK,kBACH,OAAO;EACT,KAAK,qBACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,0BACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO;EACT,SAEE,MAAM,IAAI,UAAU,qBAAqB,gBAAgB;CAC7D;AACF"}
|
|
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
3
3
|
const require_lib_use_is_hydrated = require("../lib/use-is-hydrated.cjs");
|
|
4
4
|
const require_api_claims = require("./claims.cjs");
|
|
5
|
+
const require_api_client_graphql_query_keys = require("./client-graphql/query-keys.cjs");
|
|
5
6
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
6
7
|
let react = require("react");
|
|
7
8
|
react = require_runtime.__toESM(react, 1);
|
|
@@ -14,6 +15,7 @@ const ApiContext = react.createContext(void 0);
|
|
|
14
15
|
ApiContext.displayName = "ApiContext";
|
|
15
16
|
const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
|
|
16
17
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
18
|
+
const queryKey = authTokenQueryKey(widgetType);
|
|
17
19
|
const authTokenQuery = (0, _tanstack_react_query.useQuery)({
|
|
18
20
|
initialData: () => {
|
|
19
21
|
if (typeof authToken !== "string") return;
|
|
@@ -33,8 +35,25 @@ const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
|
|
|
33
35
|
exp: claims.exp
|
|
34
36
|
};
|
|
35
37
|
},
|
|
36
|
-
queryKey
|
|
38
|
+
queryKey
|
|
37
39
|
});
|
|
40
|
+
react.useEffect(() => {
|
|
41
|
+
if (typeof authToken !== "string") return;
|
|
42
|
+
const cached = queryClient.getQueryData(queryKey);
|
|
43
|
+
if (cached?.authToken === authToken) return;
|
|
44
|
+
queryClient.cancelQueries({ queryKey });
|
|
45
|
+
const claims = require_api_claims.getClaims(authToken);
|
|
46
|
+
queryClient.setQueryData(queryKey, {
|
|
47
|
+
authToken,
|
|
48
|
+
permissions: claims.permissions,
|
|
49
|
+
exp: claims.exp
|
|
50
|
+
});
|
|
51
|
+
if (cached && !isSameSubject(require_api_claims.getClaims(cached.authToken), claims)) queryClient.invalidateQueries({ predicate: (query) => require_api_client_graphql_query_keys.isClientGraphqlQueryKey(query.queryKey) });
|
|
52
|
+
}, [
|
|
53
|
+
authToken,
|
|
54
|
+
queryClient,
|
|
55
|
+
queryKey
|
|
56
|
+
]);
|
|
38
57
|
const exp = authTokenQuery.data?.exp;
|
|
39
58
|
react.useEffect(() => {
|
|
40
59
|
if (!exp) return;
|
|
@@ -83,6 +102,9 @@ const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
|
|
|
83
102
|
children
|
|
84
103
|
});
|
|
85
104
|
};
|
|
105
|
+
function isSameSubject(a, b) {
|
|
106
|
+
return a.sid === b.sid && a.sub === b.sub && a.org_id === b.org_id;
|
|
107
|
+
}
|
|
86
108
|
const useApi = () => {
|
|
87
109
|
const context = react.useContext(ApiContext);
|
|
88
110
|
if (context === void 0) throw new Error("useApi must be used within an ApiProvider");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-provider.cjs","names":["React","useQueryClient","useQuery","getClaims","useIsHydrated"],"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./claims.js\";\n\ntype WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"user-api-keys\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"pipes-admin\"\n | \"directory-sync\";\n\ntype AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiContextValue {\n authToken: string | undefined;\n permissions: string[] | undefined;\n exp: number | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\ninterface AuthTokenQueryData {\n authToken: string;\n permissions: string[] | undefined;\n exp: number | undefined;\n}\n\nconst authTokenQueryKey = (widgetType: WidgetType) =>\n [\"authToken\", widgetType] as const;\n\n// Refetch this many ms before the JWT expires so data queries always see a\n// fresh token.\nconst TOKEN_REFRESH_BUFFER_MS = 30_000;\n\n// Cap setTimeout delays at ~24 days to stay well below the 32-bit signed int\n// limit (~24.8 days), which some runtimes silently coerce to 1ms.\nconst MAX_TIMEOUT_MS = 2_147_483_000;\n\nconst ApiContext = React.createContext<ApiContextValue | undefined>(undefined);\nApiContext.displayName = \"ApiContext\";\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nconst ApiProvider: React.FC<ApiProviderProps> = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}) => {\n const queryClient = useQueryClient();\n const authTokenQuery = useQuery<AuthTokenQueryData>({\n initialData: () => {\n if (typeof authToken !== \"string\") {\n return undefined;\n }\n\n const claims = getClaims(authToken);\n return {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n const claims = getClaims(resolvedToken);\n\n return {\n authToken: resolvedToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryKey:
|
|
1
|
+
{"version":3,"file":"api-provider.cjs","names":["React","useQueryClient","useQuery","getClaims","isClientGraphqlQueryKey","useIsHydrated"],"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./claims.js\";\nimport type { Claims } from \"./claims.js\";\nimport { isClientGraphqlQueryKey } from \"./client-graphql/query-keys.js\";\n\ntype WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"user-api-keys\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"pipes-admin\"\n | \"directory-sync\";\n\ntype AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiContextValue {\n authToken: string | undefined;\n permissions: string[] | undefined;\n exp: number | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\ninterface AuthTokenQueryData {\n authToken: string;\n permissions: string[] | undefined;\n exp: number | undefined;\n}\n\nconst authTokenQueryKey = (widgetType: WidgetType) =>\n [\"authToken\", widgetType] as const;\n\n// Refetch this many ms before the JWT expires so data queries always see a\n// fresh token.\nconst TOKEN_REFRESH_BUFFER_MS = 30_000;\n\n// Cap setTimeout delays at ~24 days to stay well below the 32-bit signed int\n// limit (~24.8 days), which some runtimes silently coerce to 1ms.\nconst MAX_TIMEOUT_MS = 2_147_483_000;\n\nconst ApiContext = React.createContext<ApiContextValue | undefined>(undefined);\nApiContext.displayName = \"ApiContext\";\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nconst ApiProvider: React.FC<ApiProviderProps> = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}) => {\n const queryClient = useQueryClient();\n const queryKey = authTokenQueryKey(widgetType);\n const authTokenQuery = useQuery<AuthTokenQueryData>({\n initialData: () => {\n if (typeof authToken !== \"string\") {\n return undefined;\n }\n\n const claims = getClaims(authToken);\n return {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n const claims = getClaims(resolvedToken);\n\n return {\n authToken: resolvedToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryKey,\n });\n\n // `initialData` only seeds the cache on first mount, so a new string token\n // has to be written to the cache explicitly. A token for a different session,\n // user or organization (e.g. after switching organizations) also invalidates\n // data fetched with the previous token.\n React.useEffect(() => {\n if (typeof authToken !== \"string\") {\n return;\n }\n\n const cached = queryClient.getQueryData<AuthTokenQueryData>(queryKey);\n if (cached?.authToken === authToken) {\n return;\n }\n\n // Keep an in-flight fetch holding the previous token from overwriting the\n // new one.\n void queryClient.cancelQueries({ queryKey });\n const claims = getClaims(authToken);\n queryClient.setQueryData<AuthTokenQueryData>(queryKey, {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n });\n\n if (cached && !isSameSubject(getClaims(cached.authToken), claims)) {\n void queryClient.invalidateQueries({\n predicate: (query) => isClientGraphqlQueryKey(query.queryKey),\n });\n }\n }, [authToken, queryClient, queryKey]);\n\n // Keep the token \"fresh\" until ~30s before it expires, so window-focus\n // re-fetches re-mint before data queries use a stale Bearer.\n //\n // TODO(v2): prefer the function-form `staleTime` on `useQuery` above once we\n // can bump the `@tanstack/react-query` peer dep to ^5.44.0 (the version that\n // introduced it). That lets react-query own the freshness window and avoids\n // the extra timer + window-focus nonsense this effect introduces.\n const exp = authTokenQuery.data?.exp;\n React.useEffect(() => {\n if (!exp) {\n return;\n }\n\n const delay = Math.min(\n MAX_TIMEOUT_MS,\n exp * 1000 - Date.now() - TOKEN_REFRESH_BUFFER_MS,\n );\n if (delay <= 0) {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n return;\n }\n const timeout = window.setTimeout(() => {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n }, delay);\n return () => window.clearTimeout(timeout);\n }, [exp, queryClient, widgetType]);\n\n const [elevatedAccess, setElevatedAccess] = React.useState<ElevatedAccess>();\n const elevatedAccessTimeout = React.useRef<number | undefined>(undefined);\n\n // This effect manages the expiration of elevated access tokens\n // When an elevated access token is present, it checks every 30 seconds if the token has expired\n // If the token has expired (current time > expiration time), it clears the elevated access\n React.useEffect(() => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n\n if (elevatedAccess) {\n elevatedAccessTimeout.current = window.setInterval(() => {\n const now = new Date();\n const expiresAtDate = new Date(elevatedAccess.expiresAt);\n\n // Reset the elevated access if it has expired\n if (now > expiresAtDate) {\n setElevatedAccess(undefined);\n }\n }, 30_000); // every 30 seconds\n }\n\n return () => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n };\n }, [elevatedAccess]);\n\n const value = React.useMemo(\n () => ({\n authToken: authTokenQuery.data?.authToken,\n permissions: authTokenQuery.data?.permissions,\n exp: authTokenQuery.data?.exp,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n }),\n [\n authTokenQuery.data,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n ],\n );\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n};\n\nfunction isSameSubject(a: Claims, b: Claims) {\n return a.sid === b.sid && a.sub === b.sub && a.org_id === b.org_id;\n}\n\nconst useApi = () => {\n const context = React.useContext(ApiContext);\n\n if (context === undefined) {\n throw new Error(\"useApi must be used within an ApiProvider\");\n }\n\n return context;\n};\n\nconst useElevatedAccessToken = () => {\n const { elevatedAccess, setElevatedAccess } = useApi();\n\n return { elevatedAccess, setElevatedAccess };\n};\n\nconst useApiReady = () => {\n const { authToken } = useApi();\n const isHydrated = useIsHydrated();\n\n return isHydrated && authToken !== undefined;\n};\nexport type { WidgetType, AuthToken, AuthTokenQueryData };\nexport {\n authTokenQueryKey,\n ApiProvider,\n useApi,\n useElevatedAccessToken,\n useApiReady,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-provider.d.cts","names":[],"sources":["../../../src/api/api-provider.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"api-provider.d.cts","names":[],"sources":["../../../src/api/api-provider.tsx"],"mappings":";;KAOK;KAeA,4BAA4B;UAEvB;EACR;EACA;;UAGQ;EACR;EACA;EACA;EACA;EACA,YAAY;EACZ,iBAAiB;EACjB,oBAAoB,iBAAiB;;UAG7B;EACR;EACA;EACA;;cAGI,oBAAiB,YAAgB,sCACzB;UAaJ;EACR,WAAW;EACX;EACA,UAAU,MAAM;EAChB,YAAY;;cAGR,aAAa,MAAM,GAAG;cAyJtB,cAAM;cAUN;kBAAA;EAjMiC,oBAAA,iBAAA;;cAuMjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claims.cjs","names":[],"sources":["../../../src/api/claims.ts"],"sourcesContent":["interface Claims {\n sid?: string;\n sub?: string;\n sub_type?: string;\n sub_profile?: string;\n auth_time?: number;\n permissions?: string[];\n exp?: number;\n}\n\nexport function getAuthenticatedUserId(claims: Claims): string | undefined {\n const isUserSession =\n (claims.sub_profile === undefined || claims.sub_profile === \"user\") &&\n (claims.sub_type === \"authkit\" ||\n (claims.sub_type === undefined &&\n !!claims.sid &&\n typeof claims.auth_time === \"number\"));\n\n return isUserSession && claims.sub?.startsWith(\"user_\")\n ? claims.sub\n : undefined;\n}\n\nexport function getClaims(accessToken: string): Claims {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"claims.cjs","names":[],"sources":["../../../src/api/claims.ts"],"sourcesContent":["export interface Claims {\n sid?: string;\n sub?: string;\n sub_type?: string;\n sub_profile?: string;\n org_id?: string;\n auth_time?: number;\n permissions?: string[];\n exp?: number;\n}\n\nexport function getAuthenticatedUserId(claims: Claims): string | undefined {\n const isUserSession =\n (claims.sub_profile === undefined || claims.sub_profile === \"user\") &&\n (claims.sub_type === \"authkit\" ||\n (claims.sub_type === undefined &&\n !!claims.sid &&\n typeof claims.auth_time === \"number\"));\n\n return isUserSession && claims.sub?.startsWith(\"user_\")\n ? claims.sub\n : undefined;\n}\n\nexport function getClaims(accessToken: string): Claims {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n}\n"],"mappings":";;AAWA,SAAgB,uBAAuB,QAAoC;CAQzE,QANG,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,YAC3D,OAAO,aAAa,aAClB,OAAO,aAAa,UACnB,CAAC,CAAC,OAAO,OACT,OAAO,OAAO,cAAc,aAEV,OAAO,KAAK,WAAW,OAAO,IAClD,OAAO,MACP;AACN;AAEA,SAAgB,UAAU,aAA6B;CACrD,OAAO,KAAK,MAAM,KAAK,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claims.d.cts","names":[],"sources":["../../../src/api/claims.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"claims.d.cts","names":[],"sources":["../../../src/api/claims.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;wBAGc,uBAAuB,QAAQ;wBAa/B,UAAU,sBAAsB"}
|
|
@@ -100,8 +100,9 @@ function createClientSdk(client, args) {
|
|
|
100
100
|
const { authToken, widgetType, queryClient } = args;
|
|
101
101
|
return require_api_client_graphql_generated.getSdk(client, async (action, _operationName, operationType, _variables) => {
|
|
102
102
|
const queryType = operationType === "mutation" ? "mutation" : "query";
|
|
103
|
+
const token = queryClient.getQueryData(require_api_api_provider.authTokenQueryKey(widgetType))?.authToken ?? authToken;
|
|
103
104
|
try {
|
|
104
|
-
return await action(buildHeaders(
|
|
105
|
+
return await action(buildHeaders(token, widgetType));
|
|
105
106
|
} catch (error) {
|
|
106
107
|
let finalError = error;
|
|
107
108
|
if (error instanceof graphql_request.ClientError && isAuthError(error)) {
|
|
@@ -114,7 +115,7 @@ function createClientSdk(client, args) {
|
|
|
114
115
|
refetchError
|
|
115
116
|
} });
|
|
116
117
|
}
|
|
117
|
-
if (freshToken && freshToken !==
|
|
118
|
+
if (freshToken && freshToken !== token) try {
|
|
118
119
|
return await action(buildHeaders(freshToken, widgetType));
|
|
119
120
|
} catch (retryError) {
|
|
120
121
|
finalError = retryError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.cjs","names":["ClientError","ExpiredTokenError","IncorrectPermissionsError","ApiError","FetchError","useApi","useQueryClient","React","CLIENT_API_GRAPHQL_PATH","GraphQLClient","getSdk","authTokenQueryKey"],"sources":["../../../../src/api/client-graphql/client.ts"],"sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ClientError, GraphQLClient } from \"graphql-request\";\nimport * as React from \"react\";\nimport {\n ExpiredTokenError,\n IncorrectPermissionsError,\n} from \"../../lib/errors.js\";\nimport type { AuthTokenQueryData, WidgetType } from \"../api-provider.js\";\nimport { authTokenQueryKey, useApi } from \"../api-provider.js\";\nimport { WIDGETS_API_VERSION } from \"../constants.js\";\nimport { ApiError, FetchError } from \"../errors.js\";\nimport { CLIENT_API_GRAPHQL_PATH } from \"./constants.js\";\nimport type { Sdk } from \"./generated.js\";\nimport { getSdk } from \"./generated.js\";\n\ntype QueryType = \"query\" | \"mutation\";\n\n/**\n * A GraphQL request failed because the request was unauthenticated or the token\n * no longer carries the required permissions.\n *\n * Both surface as an HTTP 200 whose `errors[].extensions.code` is\n * `\"UNAUTHENTICATED\"` (token rejected by the auth guard) or `\"FORBIDDEN\"`\n * (permission denied). The HTTP-status check is only a safety net for\n * transport-level rejections (proxies, gateways) that never reach GraphQL.\n */\nfunction isAuthError(error: ClientError): boolean {\n const status = error.response.status;\n if (status === 401 || status === 403) {\n return true;\n }\n\n return (error.response.errors ?? []).some((graphQlError) => {\n const code = graphQlError.extensions?.code;\n return code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\";\n });\n}\n\n/**\n * The Client API returns GraphQL-level errors (validation, not-found, etc.) as\n * an HTTP 200 with an `errors` array. Surfacing that raw `200` on an `ApiError`\n * is misleading for downstream consumers and telemetry, so normalize any\n * non-error HTTP status to a 500.\n */\nfunction normalizeErrorStatus(status: number): number {\n return status >= 400 ? status : 500;\n}\n\n/**\n * Translate a graphql-request failure into the same error classes the REST\n * Widgets client throws, so presentational components and error boundaries can\n * handle both transports uniformly.\n */\nfunction toWidgetError(\n error: unknown,\n queryType: QueryType,\n isExpiredToken: boolean,\n): Error {\n if (error instanceof ClientError) {\n if (isAuthError(error)) {\n const context = { status: error.response.status, queryType } as const;\n return isExpiredToken\n ? new ExpiredTokenError({ context })\n : new IncorrectPermissionsError({ context });\n }\n\n const firstError = error.response.errors?.[0];\n return new ApiError({\n message: firstError?.message ?? error.message,\n status: normalizeErrorStatus(error.response.status),\n queryType,\n context: { errors: error.response.errors },\n });\n }\n\n return new FetchError({\n message: error instanceof Error ? error.message : \"GraphQL request failed\",\n queryType,\n context: { error },\n });\n}\n\n/**\n * Returns a typed SDK for the WorkOS Client GraphQL API, wired up to the same\n * `ApiProvider` auth plumbing the REST Widgets client uses:\n *\n * - Sends the current bearer token plus the widget-type / version headers.\n * - On an auth failure, re-mints the token via the shared `authToken` query and\n * retries the operation once (mirrors the REST client's 403 retry).\n * - Maps GraphQL/network failures onto the widget error classes.\n *\n * Elevated-access tokens are intentionally not attached here; the Client API\n * takes them as mutation input fields, so call sites read them from\n * `useElevatedAccessToken` and pass them through the relevant inputs.\n */\nexport function useClientGraphql(): Sdk {\n const { authToken, baseUrl, widgetType } = useApi();\n const queryClient = useQueryClient();\n\n return React.useMemo(() => {\n const endpoint = new URL(baseUrl);\n endpoint.pathname = CLIENT_API_GRAPHQL_PATH;\n const client = new GraphQLClient(endpoint.toString());\n return createClientSdk(client, { authToken, widgetType, queryClient });\n }, [authToken, baseUrl, widgetType, queryClient]);\n}\n\nfunction createClientSdk(\n client: GraphQLClient,\n args: {\n authToken: string | undefined;\n widgetType: WidgetType;\n queryClient: QueryClient;\n },\n) {\n const { authToken, widgetType, queryClient } = args;\n return getSdk(\n client,\n async (action, _operationName, operationType, _variables) => {\n const queryType: QueryType =\n operationType === \"mutation\" ? \"mutation\" : \"query\";\n\n try {\n return await action(buildHeaders(
|
|
1
|
+
{"version":3,"file":"client.cjs","names":["ClientError","ExpiredTokenError","IncorrectPermissionsError","ApiError","FetchError","useApi","useQueryClient","React","CLIENT_API_GRAPHQL_PATH","GraphQLClient","getSdk","authTokenQueryKey"],"sources":["../../../../src/api/client-graphql/client.ts"],"sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ClientError, GraphQLClient } from \"graphql-request\";\nimport * as React from \"react\";\nimport {\n ExpiredTokenError,\n IncorrectPermissionsError,\n} from \"../../lib/errors.js\";\nimport type { AuthTokenQueryData, WidgetType } from \"../api-provider.js\";\nimport { authTokenQueryKey, useApi } from \"../api-provider.js\";\nimport { WIDGETS_API_VERSION } from \"../constants.js\";\nimport { ApiError, FetchError } from \"../errors.js\";\nimport { CLIENT_API_GRAPHQL_PATH } from \"./constants.js\";\nimport type { Sdk } from \"./generated.js\";\nimport { getSdk } from \"./generated.js\";\n\ntype QueryType = \"query\" | \"mutation\";\n\n/**\n * A GraphQL request failed because the request was unauthenticated or the token\n * no longer carries the required permissions.\n *\n * Both surface as an HTTP 200 whose `errors[].extensions.code` is\n * `\"UNAUTHENTICATED\"` (token rejected by the auth guard) or `\"FORBIDDEN\"`\n * (permission denied). The HTTP-status check is only a safety net for\n * transport-level rejections (proxies, gateways) that never reach GraphQL.\n */\nfunction isAuthError(error: ClientError): boolean {\n const status = error.response.status;\n if (status === 401 || status === 403) {\n return true;\n }\n\n return (error.response.errors ?? []).some((graphQlError) => {\n const code = graphQlError.extensions?.code;\n return code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\";\n });\n}\n\n/**\n * The Client API returns GraphQL-level errors (validation, not-found, etc.) as\n * an HTTP 200 with an `errors` array. Surfacing that raw `200` on an `ApiError`\n * is misleading for downstream consumers and telemetry, so normalize any\n * non-error HTTP status to a 500.\n */\nfunction normalizeErrorStatus(status: number): number {\n return status >= 400 ? status : 500;\n}\n\n/**\n * Translate a graphql-request failure into the same error classes the REST\n * Widgets client throws, so presentational components and error boundaries can\n * handle both transports uniformly.\n */\nfunction toWidgetError(\n error: unknown,\n queryType: QueryType,\n isExpiredToken: boolean,\n): Error {\n if (error instanceof ClientError) {\n if (isAuthError(error)) {\n const context = { status: error.response.status, queryType } as const;\n return isExpiredToken\n ? new ExpiredTokenError({ context })\n : new IncorrectPermissionsError({ context });\n }\n\n const firstError = error.response.errors?.[0];\n return new ApiError({\n message: firstError?.message ?? error.message,\n status: normalizeErrorStatus(error.response.status),\n queryType,\n context: { errors: error.response.errors },\n });\n }\n\n return new FetchError({\n message: error instanceof Error ? error.message : \"GraphQL request failed\",\n queryType,\n context: { error },\n });\n}\n\n/**\n * Returns a typed SDK for the WorkOS Client GraphQL API, wired up to the same\n * `ApiProvider` auth plumbing the REST Widgets client uses:\n *\n * - Sends the current bearer token plus the widget-type / version headers.\n * - On an auth failure, re-mints the token via the shared `authToken` query and\n * retries the operation once (mirrors the REST client's 403 retry).\n * - Maps GraphQL/network failures onto the widget error classes.\n *\n * Elevated-access tokens are intentionally not attached here; the Client API\n * takes them as mutation input fields, so call sites read them from\n * `useElevatedAccessToken` and pass them through the relevant inputs.\n */\nexport function useClientGraphql(): Sdk {\n const { authToken, baseUrl, widgetType } = useApi();\n const queryClient = useQueryClient();\n\n return React.useMemo(() => {\n const endpoint = new URL(baseUrl);\n endpoint.pathname = CLIENT_API_GRAPHQL_PATH;\n const client = new GraphQLClient(endpoint.toString());\n return createClientSdk(client, { authToken, widgetType, queryClient });\n }, [authToken, baseUrl, widgetType, queryClient]);\n}\n\nfunction createClientSdk(\n client: GraphQLClient,\n args: {\n authToken: string | undefined;\n widgetType: WidgetType;\n queryClient: QueryClient;\n },\n) {\n const { authToken, widgetType, queryClient } = args;\n return getSdk(\n client,\n async (action, _operationName, operationType, _variables) => {\n const queryType: QueryType =\n operationType === \"mutation\" ? \"mutation\" : \"query\";\n const queryData = queryClient.getQueryData<AuthTokenQueryData>(\n authTokenQueryKey(widgetType),\n );\n // Read the cached token at request time: the rendered `authToken` may lag\n // behind the cache until React re-renders after a token refetch.\n const token = queryData?.authToken ?? authToken;\n\n try {\n return await action(buildHeaders(token, widgetType));\n } catch (error) {\n let finalError: unknown = error;\n if (error instanceof ClientError && isAuthError(error)) {\n let freshToken: string | undefined;\n try {\n freshToken = await refetchToken(queryClient, widgetType);\n } catch (refetchError) {\n throw new ExpiredTokenError({\n context: { queryType, refetchError },\n });\n }\n\n if (freshToken && freshToken !== token) {\n try {\n return await action(buildHeaders(freshToken, widgetType));\n } catch (retryError) {\n finalError = retryError;\n }\n }\n }\n\n throw toWidgetError(\n finalError,\n queryType,\n isTokenExpired(queryClient, widgetType),\n );\n }\n },\n );\n}\n\nfunction buildHeaders(\n token: string | undefined,\n widgetType: WidgetType,\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"WorkOS-Widgets-Version\": WIDGETS_API_VERSION,\n \"WorkOS-Widgets-Type\": widgetType,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n\nasync function refetchToken(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): Promise<string | undefined> {\n const tokenQueryKey = authTokenQueryKey(widgetType);\n await queryClient.refetchQueries({ queryKey: tokenQueryKey });\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(tokenQueryKey);\n return refreshed?.authToken;\n}\n\nfunction isTokenExpired(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): boolean {\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(\n authTokenQueryKey(widgetType),\n );\n const exp = refreshed?.exp;\n return exp !== undefined && exp * 1000 <= Date.now();\n}\n"],"mappings":"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"}
|
|
@@ -1,26 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_api_client_graphql_query_keys = require("./query-keys.cjs");
|
|
2
3
|
const require_api_api_provider = require("../api-provider.cjs");
|
|
3
4
|
const require_api_client_graphql_client = require("./client.cjs");
|
|
4
5
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
5
6
|
//#region src/api/client-graphql/hooks.ts
|
|
6
|
-
const CLIENT_GRAPHQL_KEY_PREFIX = "client-graphql";
|
|
7
|
-
function isClientGraphqlQueryKey(queryKey) {
|
|
8
|
-
return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* React Query key for a Client GraphQL operation. Omit `variables` to address
|
|
12
|
-
* every cached page/variant of an operation, e.g. when invalidating after a
|
|
13
|
-
* mutation:
|
|
14
|
-
*
|
|
15
|
-
* queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
|
|
16
|
-
*/
|
|
17
|
-
function clientGraphqlQueryKey(operation, variables) {
|
|
18
|
-
return variables === void 0 ? [CLIENT_GRAPHQL_KEY_PREFIX, operation] : [
|
|
19
|
-
CLIENT_GRAPHQL_KEY_PREFIX,
|
|
20
|
-
operation,
|
|
21
|
-
variables
|
|
22
|
-
];
|
|
23
|
-
}
|
|
24
7
|
/**
|
|
25
8
|
* Runs a Client GraphQL query through React Query. The query is held until
|
|
26
9
|
* `ApiProvider` has resolved an auth token (`useApiReady`), mirroring the
|
|
@@ -56,8 +39,8 @@ function useClientGraphqlMutation({ mutationFn, ...options }) {
|
|
|
56
39
|
});
|
|
57
40
|
}
|
|
58
41
|
//#endregion
|
|
59
|
-
exports.clientGraphqlQueryKey = clientGraphqlQueryKey;
|
|
60
|
-
exports.isClientGraphqlQueryKey = isClientGraphqlQueryKey;
|
|
42
|
+
exports.clientGraphqlQueryKey = require_api_client_graphql_query_keys.clientGraphqlQueryKey;
|
|
43
|
+
exports.isClientGraphqlQueryKey = require_api_client_graphql_query_keys.isClientGraphqlQueryKey;
|
|
61
44
|
exports.useClientGraphqlMutation = useClientGraphqlMutation;
|
|
62
45
|
exports.useClientGraphqlQuery = useClientGraphqlQuery;
|
|
63
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.cjs","names":["useClientGraphql","useApiReady","useQuery","useMutation"],"sources":["../../../../src/api/client-graphql/hooks.ts"],"sourcesContent":["import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport type {\n
|
|
1
|
+
{"version":3,"file":"hooks.cjs","names":["useClientGraphql","useApiReady","useQuery","useMutation"],"sources":["../../../../src/api/client-graphql/hooks.ts"],"sourcesContent":["import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport type {\n UseMutationOptions,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { useApiReady } from \"../api-provider.js\";\nimport { useClientGraphql } from \"./client.js\";\nimport type { Sdk } from \"./generated.js\";\n\nexport {\n clientGraphqlQueryKey,\n isClientGraphqlQueryKey,\n} from \"./query-keys.js\";\nexport type {\n ClientGraphqlOperation,\n ClientGraphqlVariables,\n} from \"./query-keys.js\";\n\ntype ClientGraphqlQueryOptions<TResult, TData> = Omit<\n UseQueryOptions<TResult, Error, TData>,\n \"queryFn\"\n> & {\n queryFn: (sdk: Sdk) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL query through React Query. The query is held until\n * `ApiProvider` has resolved an auth token (`useApiReady`), mirroring the\n * generated REST hooks.\n *\n * useClientGraphqlQuery({\n * queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n * queryFn: (sdk) => sdk.ListSsoConnections(),\n * });\n */\nexport function useClientGraphqlQuery<TResult, TData = TResult>({\n queryFn,\n enabled = true,\n ...options\n}: ClientGraphqlQueryOptions<TResult, TData>) {\n const sdk = useClientGraphql();\n const isApiReady = useApiReady();\n\n return useQuery<TResult, Error, TData>({\n ...options,\n queryFn: () => queryFn(sdk),\n enabled: isApiReady && enabled,\n });\n}\n\ntype ClientGraphqlMutationOptions<TResult, TVariables, TContext> = Omit<\n UseMutationOptions<TResult, Error, TVariables, TContext>,\n \"mutationFn\"\n> & {\n mutationFn: (sdk: Sdk, variables: TVariables) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL mutation through React Query. Invalidate the affected\n * queries in `onSuccess` using `clientGraphqlQueryKey`.\n *\n * useClientGraphqlMutation({\n * mutationFn: (sdk, input: RevokeSessionInput) => sdk.RevokeSession({ input }),\n * });\n */\nexport function useClientGraphqlMutation<\n TResult,\n TVariables = void,\n TContext = unknown,\n>({\n mutationFn,\n ...options\n}: ClientGraphqlMutationOptions<TResult, TVariables, TContext>) {\n const sdk = useClientGraphql();\n\n return useMutation<TResult, Error, TVariables, TContext>({\n ...options,\n mutationFn: (variables) => mutationFn(sdk, variables),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmCA,SAAgB,sBAAgD,EAC9D,SACA,UAAU,MACV,GAAG,WACyC;CAC5C,MAAM,MAAMA,kCAAAA,iBAAiB;CAC7B,MAAM,aAAaC,yBAAAA,YAAY;CAE/B,QAAA,GAAOC,sBAAAA,SAAAA,CAAgC;EACrC,GAAG;EACH,eAAe,QAAQ,GAAG;EAC1B,SAAS,cAAc;CACzB,CAAC;AACH;;;;;;;;;AAiBA,SAAgB,yBAId,EACA,YACA,GAAG,WAC2D;CAC9D,MAAM,MAAMF,kCAAAA,iBAAiB;CAE7B,QAAA,GAAOG,sBAAAA,YAAAA,CAAkD;EACvD,GAAG;EACH,aAAa,cAAc,WAAW,KAAK,SAAS;CACtD,CAAC;AACH"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import { Sdk } from "./generated.cjs";
|
|
2
|
-
import {
|
|
2
|
+
import { ClientGraphqlOperation, ClientGraphqlVariables, clientGraphqlQueryKey, isClientGraphqlQueryKey } from "./query-keys.cjs";
|
|
3
|
+
import { UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
3
4
|
//#region src/api/client-graphql/hooks.d.ts
|
|
4
|
-
export type ClientGraphqlOperation = keyof Sdk;
|
|
5
|
-
export type ClientGraphqlVariables<K extends ClientGraphqlOperation> = Parameters<Sdk[K]>[0];
|
|
6
|
-
export declare function isClientGraphqlQueryKey(queryKey: QueryKey): boolean;
|
|
7
|
-
/**
|
|
8
|
-
* React Query key for a Client GraphQL operation. Omit `variables` to address
|
|
9
|
-
* every cached page/variant of an operation, e.g. when invalidating after a
|
|
10
|
-
* mutation:
|
|
11
|
-
*
|
|
12
|
-
* queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
|
|
13
|
-
*/
|
|
14
|
-
export declare function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(operation: K, variables?: ClientGraphqlVariables<K>): QueryKey;
|
|
15
5
|
type ClientGraphqlQueryOptions<TResult, TData> = Omit<UseQueryOptions<TResult, Error, TData>, "queryFn"> & {
|
|
16
6
|
queryFn: (sdk: Sdk) => Promise<TResult>;
|
|
17
7
|
};
|
|
@@ -39,4 +29,5 @@ type ClientGraphqlMutationOptions<TResult, TVariables, TContext> = Omit<UseMutat
|
|
|
39
29
|
*/
|
|
40
30
|
export declare function useClientGraphqlMutation<TResult, TVariables = void, TContext = unknown>({ mutationFn, ...options }: ClientGraphqlMutationOptions<TResult, TVariables, TContext>): import("@tanstack/react-query").UseMutationResult<TResult, Error, TVariables, TContext>;
|
|
41
31
|
//#endregion
|
|
32
|
+
export { type ClientGraphqlOperation, type ClientGraphqlVariables, clientGraphqlQueryKey, isClientGraphqlQueryKey };
|
|
42
33
|
//# sourceMappingURL=hooks.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.cts","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.d.cts","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"mappings":";;;;KAkBK,0BAA0B,SAAS,SAAS,KAC/C,gBAAgB,SAAS,OAAO;EAGhC,UAAU,KAAK,QAAQ,QAAQ;;;;;;;;;;;;wBAajB,sBAAsB,SAAS,QAAQ,WACrD,SACA,YACG,WACF,0BAA0B,SAAS,yCAAM,eAAA,OAAA;KAWvC,6BAA6B,SAAS,YAAY,YAAY,KACjE,mBAAmB,SAAS,OAAO,YAAY;EAG/C,aAAa,KAAK,KAAK,WAAW,eAAe,QAAQ;;;;;;;;;;wBAW3C,yBACd,SACA,mBACA,sBAEA,eACG,WACF,6BAA6B,SAAS,YAAY,4CAAS,kBAAA,SAAA,OAAA,YAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/api/client-graphql/query-keys.ts
|
|
3
|
+
const CLIENT_GRAPHQL_KEY_PREFIX = "client-graphql";
|
|
4
|
+
function isClientGraphqlQueryKey(queryKey) {
|
|
5
|
+
return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* React Query key for a Client GraphQL operation. Omit `variables` to address
|
|
9
|
+
* every cached page/variant of an operation, e.g. when invalidating after a
|
|
10
|
+
* mutation:
|
|
11
|
+
*
|
|
12
|
+
* queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
|
|
13
|
+
*/
|
|
14
|
+
function clientGraphqlQueryKey(operation, variables) {
|
|
15
|
+
return variables === void 0 ? [CLIENT_GRAPHQL_KEY_PREFIX, operation] : [
|
|
16
|
+
CLIENT_GRAPHQL_KEY_PREFIX,
|
|
17
|
+
operation,
|
|
18
|
+
variables
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.clientGraphqlQueryKey = clientGraphqlQueryKey;
|
|
23
|
+
exports.isClientGraphqlQueryKey = isClientGraphqlQueryKey;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=query-keys.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-keys.cjs","names":[],"sources":["../../../../src/api/client-graphql/query-keys.ts"],"sourcesContent":["import type { QueryKey } from \"@tanstack/react-query\";\nimport type { Sdk } from \"./generated.js\";\n\nexport type ClientGraphqlOperation = keyof Sdk;\n\nexport type ClientGraphqlVariables<K extends ClientGraphqlOperation> =\n Parameters<Sdk[K]>[0];\n\nconst CLIENT_GRAPHQL_KEY_PREFIX = \"client-graphql\";\n\nexport function isClientGraphqlQueryKey(queryKey: QueryKey): boolean {\n return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;\n}\n\n/**\n * React Query key for a Client GraphQL operation. Omit `variables` to address\n * every cached page/variant of an operation, e.g. when invalidating after a\n * mutation:\n *\n * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey(\"Sessions\") });\n */\nexport function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(\n operation: K,\n variables?: ClientGraphqlVariables<K>,\n): QueryKey {\n return variables === undefined\n ? [CLIENT_GRAPHQL_KEY_PREFIX, operation]\n : [CLIENT_GRAPHQL_KEY_PREFIX, operation, variables];\n}\n"],"mappings":";;AAQA,MAAM,4BAA4B;AAElC,SAAgB,wBAAwB,UAA6B;CACnE,OAAO,SAAS,OAAO;AACzB;;;;;;;;AASA,SAAgB,sBACd,WACA,WACU;CACV,OAAO,cAAc,SACjB,CAAC,2BAA2B,SAAS,IACrC;EAAC;EAA2B;EAAW;CAAS;AACtD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Sdk } from "./generated.cjs";
|
|
2
|
+
import { QueryKey } from "@tanstack/react-query";
|
|
3
|
+
//#region src/api/client-graphql/query-keys.d.ts
|
|
4
|
+
export type ClientGraphqlOperation = keyof Sdk;
|
|
5
|
+
export type ClientGraphqlVariables<K extends ClientGraphqlOperation> = Parameters<Sdk[K]>[0];
|
|
6
|
+
export declare function isClientGraphqlQueryKey(queryKey: QueryKey): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* React Query key for a Client GraphQL operation. Omit `variables` to address
|
|
9
|
+
* every cached page/variant of an operation, e.g. when invalidating after a
|
|
10
|
+
* mutation:
|
|
11
|
+
*
|
|
12
|
+
* queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
|
|
13
|
+
*/
|
|
14
|
+
export declare function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(operation: K, variables?: ClientGraphqlVariables<K>): QueryKey;
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=query-keys.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-keys.d.cts","names":[],"sources":["../../../../src/api/client-graphql/query-keys.ts"],"mappings":";;;YAGY,+BAA+B;YAE/B,uBAAuB,UAAU,0BAC3C,WAAW,IAAI;wBAID,wBAAwB,UAAU;;;;;;;;wBAWlC,sBAAsB,UAAU,wBAC9C,WAAW,GACX,YAAY,uBAAuB,KAClC"}
|