@workos-inc/widgets 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -8
- package/dist/cjs/admin-portal-domain-verification.client.cjs +2 -3
- package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-sso-connection-client.cjs +3 -4
- package/dist/cjs/admin-portal-sso-connection-client.cjs.map +1 -1
- package/dist/cjs/api/api-provider.cjs +27 -19
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts +4 -3
- package/dist/cjs/api/utils.cjs +10 -0
- package/dist/cjs/api/utils.cjs.map +1 -1
- package/dist/cjs/api/utils.d.cts +7 -2
- package/dist/cjs/api/widgets-api-client.cjs +11 -5
- package/dist/cjs/api/widgets-api-client.cjs.map +1 -1
- package/dist/cjs/api-keys-client.cjs +3 -8
- package/dist/cjs/api-keys-client.cjs.map +1 -1
- package/dist/cjs/lib/add-mfa-dialog.cjs +1 -1
- package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-domain-verification.cjs +25 -18
- package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-sso-connection.cjs +5 -27
- package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
- package/dist/cjs/lib/card-list.cjs.map +1 -0
- package/dist/cjs/lib/errors.cjs +1 -1
- package/dist/cjs/lib/errors.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.cjs +27 -38
- package/dist/cjs/lib/generic-error.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.d.cts +5 -1
- package/dist/cjs/lib/use-permissions.cjs +7 -14
- package/dist/cjs/lib/use-permissions.cjs.map +1 -1
- package/dist/cjs/lib/use-permissions.d.cts +1 -1
- package/dist/cjs/lib/user-security.cjs +1 -1
- package/dist/cjs/lib/user-security.cjs.map +1 -1
- package/dist/cjs/lib/user-sessions.cjs +1 -1
- package/dist/cjs/lib/user-sessions.cjs.map +1 -1
- package/dist/cjs/organization-switcher.client.cjs +2 -4
- package/dist/cjs/organization-switcher.client.cjs.map +1 -1
- package/dist/cjs/user-profile.client.cjs +2 -6
- package/dist/cjs/user-profile.client.cjs.map +1 -1
- package/dist/cjs/user-security.client.cjs +5 -4
- package/dist/cjs/user-security.client.cjs.map +1 -1
- package/dist/cjs/user-sessions.client.cjs +8 -12
- package/dist/cjs/user-sessions.client.cjs.map +1 -1
- package/dist/cjs/users-management.client.cjs +3 -9
- package/dist/cjs/users-management.client.cjs.map +1 -1
- package/dist/esm/admin-portal-domain-verification.client.js +3 -4
- package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
- package/dist/esm/admin-portal-sso-connection-client.js +4 -5
- package/dist/esm/admin-portal-sso-connection-client.js.map +1 -1
- package/dist/esm/api/api-provider.d.ts +4 -3
- package/dist/esm/api/api-provider.js +26 -19
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/utils.d.ts +7 -2
- package/dist/esm/api/utils.js +9 -0
- package/dist/esm/api/utils.js.map +1 -1
- package/dist/esm/api/widgets-api-client.js +11 -5
- package/dist/esm/api/widgets-api-client.js.map +1 -1
- package/dist/esm/api-keys-client.js +4 -9
- package/dist/esm/api-keys-client.js.map +1 -1
- package/dist/esm/lib/add-mfa-dialog.js +1 -1
- package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/admin-portal-domain-verification.js +25 -18
- package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
- package/dist/esm/lib/admin-portal-sso-connection.js +5 -27
- package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
- package/dist/esm/lib/card-list.js.map +1 -0
- package/dist/esm/lib/errors.js +1 -1
- package/dist/esm/lib/errors.js.map +1 -1
- package/dist/esm/lib/generic-error.d.ts +5 -1
- package/dist/esm/lib/generic-error.js +27 -40
- package/dist/esm/lib/generic-error.js.map +1 -1
- package/dist/esm/lib/use-permissions.d.ts +1 -1
- package/dist/esm/lib/use-permissions.js +8 -15
- package/dist/esm/lib/use-permissions.js.map +1 -1
- package/dist/esm/lib/user-security.js +1 -1
- package/dist/esm/lib/user-security.js.map +1 -1
- package/dist/esm/lib/user-sessions.js +1 -1
- package/dist/esm/lib/user-sessions.js.map +1 -1
- package/dist/esm/organization-switcher.client.js +3 -5
- package/dist/esm/organization-switcher.client.js.map +1 -1
- package/dist/esm/user-profile.client.js +3 -7
- package/dist/esm/user-profile.client.js.map +1 -1
- package/dist/esm/user-security.client.js +6 -5
- package/dist/esm/user-security.client.js.map +1 -1
- package/dist/esm/user-sessions.client.js +10 -14
- package/dist/esm/user-sessions.client.js.map +1 -1
- package/dist/esm/users-management.client.js +4 -10
- package/dist/esm/users-management.client.js.map +1 -1
- package/package.json +4 -1
- package/dist/cjs/card-list.cjs.map +0 -1
- package/dist/esm/card-list.js.map +0 -1
- /package/dist/cjs/{card-list.cjs → lib/card-list.cjs} +0 -0
- /package/dist/cjs/{card-list.d.cts → lib/card-list.d.cts} +0 -0
- /package/dist/esm/{card-list.d.ts → lib/card-list.d.ts} +0 -0
- /package/dist/esm/{card-list.js → lib/card-list.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.5.1
|
|
4
|
+
|
|
5
|
+
- Throw an `IncorrectPermissionsError` when a fetch returns a 403, consolidate error messages
|
|
6
|
+
- Add `data-woswidgets-widget-id` to `AdminPortalDomainVerification` empty state
|
|
7
|
+
- Resolve access token during requests to fix caching issues
|
|
8
|
+
|
|
9
|
+
## 1.5.0
|
|
10
|
+
|
|
11
|
+
- Release `ApiKeys` Widget
|
|
12
|
+
- Add missing identity provider icons
|
|
13
|
+
|
|
3
14
|
## 1.4.0
|
|
4
15
|
|
|
5
|
-
- Add support for publishing multiple roles in the
|
|
6
|
-
- Export prop types and loading components for all
|
|
16
|
+
- Add support for publishing multiple roles in the `UsersManagement` Widget
|
|
17
|
+
- Export prop types and loading components for all Widgets
|
|
7
18
|
|
|
8
19
|
## 1.3.1
|
|
9
20
|
|
|
@@ -11,10 +22,10 @@
|
|
|
11
22
|
|
|
12
23
|
## 1.3.0
|
|
13
24
|
|
|
14
|
-
- Create new
|
|
25
|
+
- Create new `AdminPortalDomainVerification` Widget
|
|
15
26
|
- Handle user location showing as undefined
|
|
16
|
-
- Add
|
|
17
|
-
- Handle incorrect
|
|
27
|
+
- Add `AdminPortalSsoConnection` Widget
|
|
28
|
+
- Handle incorrect Widget permissions
|
|
18
29
|
|
|
19
30
|
## 1.2.1
|
|
20
31
|
|
|
@@ -22,7 +33,7 @@
|
|
|
22
33
|
|
|
23
34
|
## 1.2.0
|
|
24
35
|
|
|
25
|
-
- Added `truncateBehavior` prop to the `OrganizationSwitcher`
|
|
36
|
+
- Added `truncateBehavior` prop to the `OrganizationSwitcher` Widget to control how long organization names get truncated when there is limited space
|
|
26
37
|
- Added `queryClient` prop to the root `WorkOsWidgets` component to allow users to provide their own Query Client
|
|
27
38
|
|
|
28
39
|
## 1.1.5
|
|
@@ -31,10 +42,10 @@ Internal changes to the publishing workflow. No user-facing changes included in
|
|
|
31
42
|
|
|
32
43
|
## 1.1.4
|
|
33
44
|
|
|
34
|
-
- Add
|
|
45
|
+
- Add Widget type header to API requests
|
|
35
46
|
- Pin third-party actions to currently used SHA
|
|
36
47
|
|
|
37
48
|
## 1.1.2
|
|
38
49
|
|
|
39
50
|
- Fix broken imports
|
|
40
|
-
- Fix skeleton layout in
|
|
51
|
+
- Fix skeleton layout in `UserProfile` Widget
|
|
@@ -25,7 +25,6 @@ __export(admin_portal_domain_verification_client_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(admin_portal_domain_verification_client_exports);
|
|
26
26
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
27
|
var import_admin_portal_domain_verification = require("./lib/admin-portal-domain-verification.js");
|
|
28
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
29
28
|
var import_api_provider = require("./api/api-provider.js");
|
|
30
29
|
var import_endpoint = require("./api/endpoint.js");
|
|
31
30
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
@@ -44,7 +43,7 @@ const AdminPortalDomainVerification = ({ authToken }) => {
|
|
|
44
43
|
);
|
|
45
44
|
};
|
|
46
45
|
const AdminPortalDomainVerificationContent = () => {
|
|
47
|
-
const
|
|
46
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
48
47
|
const queryClient = (0, import_react_query.useQueryClient)();
|
|
49
48
|
const {
|
|
50
49
|
data: organizationDomains,
|
|
@@ -89,7 +88,7 @@ const AdminPortalDomainVerificationContent = () => {
|
|
|
89
88
|
const handleReverifyDomain = (domainId) => {
|
|
90
89
|
reverifyDomain({ domainId });
|
|
91
90
|
};
|
|
92
|
-
if (!
|
|
91
|
+
if (!isApiReady || isLoading) {
|
|
93
92
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_admin_portal_domain_verification.AdminPortalDomainVerificationLoading, {});
|
|
94
93
|
}
|
|
95
94
|
if (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./lib/admin-portal-domain-verification.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./lib/admin-portal-domain-verification.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport {\n useGenerateAdminPortalLink,\n useListOrganizationDomains,\n getListOrganizationDomainsQueryKey,\n useDeleteOrganizationDomain,\n useReverifyOrganizationDomain,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nexport interface AdminPortalDomainVerificationProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalDomainVerificationLoading };\n\nconst AdminPortalDomainVerificationContent = () => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useListOrganizationDomains();\n\n const { mutate: generateAdminPortalLink, isPending } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const { mutate: deleteDomain } = useDeleteOrganizationDomain({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationDomainsQueryKey(),\n });\n },\n },\n });\n\n const { mutate: reverifyDomain } = useReverifyOrganizationDomain({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationDomainsQueryKey(),\n });\n },\n },\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink({\n params: {\n intent: \"domain_verification\",\n },\n });\n };\n\n const handleDeleteDomain = (domainId: string) => {\n deleteDomain({ domainId });\n };\n\n const handleReverifyDomain = (domainId: string) => {\n reverifyDomain({ domainId });\n };\n\n if (!isApiReady || isLoading) {\n return <AdminPortalDomainVerificationLoading />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} />;\n }\n\n const domains = organizationDomains?.data || [];\n\n return (\n <ErrorBoundary FallbackComponent={AdminPortalDomainVerificationError}>\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCM;AAhCN,8CAIO;AACP,0BAAoD;AACpD,sBAMO;AACP,6BAAgC;AAChC,4BAA8B;AAC9B,yBAA+B;AAMxB,MAAM,gCAET,CAAC,EAAE,UAAU,MAAM;AACrB,QAAM,cAAU,wCAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,wCAAqC;AAAA;AAAA,EACxC;AAEJ;AAIA,MAAM,uCAAuC,MAAM;AACjD,QAAM,iBAAa,iCAAY;AAC/B,QAAM,kBAAc,mCAAe;AACnC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,QAAI,4CAA2B;AAE/B,QAAM,EAAE,QAAQ,yBAAyB,UAAU,QACjD,4CAA2B;AAAA,IACzB,UAAU;AAAA,MACR,WAAW,CAAC,SAAS;AACnB,eAAO,KAAK,KAAK,MAAM,UAAU,qBAAqB;AAAA,MACxD;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QAAM,EAAE,QAAQ,aAAa,QAAI,6CAA4B;AAAA,IAC3D,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,EAAE,QAAQ,eAAe,QAAI,+CAA8B;AAAA,IAC/D,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,MAAM;AAC5B,4BAAwB;AAAA,MACtB,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,aAAqB;AAC/C,iBAAa,EAAE,SAAS,CAAC;AAAA,EAC3B;AAEA,QAAM,uBAAuB,CAAC,aAAqB;AACjD,mBAAe,EAAE,SAAS,CAAC;AAAA,EAC7B;AAEA,MAAI,CAAC,cAAc,WAAW;AAC5B,WAAO,4CAAC,gFAAqC;AAAA,EAC/C;AAEA,MAAI,OAAO;AACT,WAAO,4CAAC,8EAAmC,OAAc;AAAA,EAC3D;AAEA,QAAM,UAAU,qBAAqB,QAAQ,CAAC;AAE9C,SACE,4CAAC,uCAAc,mBAAmB,4EAChC;AAAA,IAAC,wCAAAA;AAAA,IAAA;AAAA,MACC,qBAAqB;AAAA,MACrB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB;AAAA;AAAA,EACF,GACF;AAEJ;","names":["AdminPortalDomainVerificationPresentational"]}
|
|
@@ -36,7 +36,6 @@ module.exports = __toCommonJS(admin_portal_sso_connection_client_exports);
|
|
|
36
36
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
37
37
|
var React = __toESM(require("react"), 1);
|
|
38
38
|
var import_admin_portal_sso_connection = require("./lib/admin-portal-sso-connection.js");
|
|
39
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
40
39
|
var import_api_provider = require("./api/api-provider.js");
|
|
41
40
|
var import_endpoint = require("./api/endpoint.js");
|
|
42
41
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
@@ -55,11 +54,11 @@ const AdminPortalSsoConnection = ({ authToken }) => {
|
|
|
55
54
|
);
|
|
56
55
|
};
|
|
57
56
|
const SingleSignOnContent = () => {
|
|
58
|
-
const
|
|
57
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
59
58
|
const [currentDate, setCurrentDate] = React.useState(
|
|
60
|
-
() =>
|
|
59
|
+
() => isApiReady ? /* @__PURE__ */ new Date() : null
|
|
61
60
|
);
|
|
62
|
-
if (
|
|
61
|
+
if (isApiReady && currentDate === null) {
|
|
63
62
|
setCurrentDate(/* @__PURE__ */ new Date());
|
|
64
63
|
}
|
|
65
64
|
const { mutate: generateAdminPortalLink, ...mutation } = (0, import_endpoint.useGenerateAdminPortalLink)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin-portal-sso-connection-client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n type AdminPortalSsoConnectionStatusProps,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport { useIsHydrated } from \"./lib/use-is-hydrated.js\";\nimport { ApiProvider, AuthToken } from \"./api/api-provider.js\";\nimport {\n type SsoConnection,\n useGenerateAdminPortalLink,\n useListSsoConnections,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { unreachable } from \"./lib/utils.js\";\nimport { IdentityProvider } from \"./lib/identity-providers.js\";\n\nexport interface AdminPortalSsoConnectionProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalSsoConnection: React.FC<\n AdminPortalSsoConnectionProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <SingleSignOnContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalSsoConnectionLoading };\n\nconst SingleSignOnContent = () => {\n const isHydrated = useIsHydrated();\n const [currentDate, setCurrentDate] = React.useState<Date | null>(() =>\n isHydrated ? new Date() : null,\n );\n if (isHydrated && currentDate === null) {\n setCurrentDate(new Date());\n }\n\n const { mutate: generateAdminPortalLink, ...mutation } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const adminPortalLink = mutation.data?.link ?? null;\n\n const query = useListSsoConnections();\n\n const initConfig = () => {\n generateAdminPortalLink({\n params: {\n intent: \"sso\",\n },\n });\n };\n\n if (query.isLoading) {\n return <AdminPortalSsoConnectionLoading />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} />;\n }\n\n if (query.data) {\n const connection = query.data[0];\n if (!connection) {\n return (\n <AdminPortalSsoConnectionPresentational\n connectionStatus=\"NotConfigured\"\n currentDate={currentDate}\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const connectionState = getConnectionState(connection, currentDate);\n const props: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (!connection || connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection);\n switch (connectionStatus) {\n case \"Active\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Inactive\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Expired\":\n case \"Expiring\":\n return {\n connectionStatus,\n expiryDate: connectionState.expiryDate,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n default:\n return unreachable(connectionState);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <ErrorBoundary FallbackComponent={AdminPortalSsoConnectionError}>\n <AdminPortalSsoConnectionPresentational\n {...props}\n currentDate={currentDate}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n};\n\ntype ConnectionState =\n | { status: \"NotConfigured\" }\n | { status: \"Active\" }\n | { status: \"Inactive\" }\n | {\n status: \"Expiring\";\n daysUntilExpiry: number | null;\n expiryDate: Date | null;\n }\n | { status: \"Expired\"; expiryDate: Date | null };\n\nfunction getConnectionState(\n connection: SsoConnection,\n currentDate: Date | null,\n): ConnectionState {\n switch (connection.state) {\n case \"Active\":\n case \"Validating\":\n case \"Deleting\": {\n const activeStatus = { status: \"Active\" } satisfies ConnectionState;\n if (connection.providerTag !== \"Saml\") {\n return activeStatus;\n }\n\n if (connection.latestExpiredCertificate) {\n return {\n status: \"Expired\",\n expiryDate: connection.latestExpiredCertificate.notAfter\n ? new Date(connection.latestExpiredCertificate.notAfter)\n : null,\n };\n }\n\n const expiryTime = connection.latestExpiringCertificate?.notAfter;\n if (currentDate == null || expiryTime == null) {\n return activeStatus;\n }\n\n const expiryDate = new Date(expiryTime);\n const daysUntilExpiry = (() => {\n const diff = expiryDate.getTime() - currentDate.getTime();\n if (diff < 0) {\n return -1;\n }\n\n return diff / (1000 * 60 * 60 * 24);\n })();\n\n if (daysUntilExpiry !== -1 && daysUntilExpiry <= 30) {\n return { status: \"Expiring\", daysUntilExpiry, expiryDate };\n }\n\n return activeStatus;\n }\n case \"Inactive\": {\n return { status: \"Inactive\" };\n }\n default:\n return unreachable(connection);\n }\n}\n\nfunction getIdentityProvider(connection: SsoConnection): IdentityProvider {\n switch (connection.type) {\n case \"AdfsSaml\":\n case \"EntraIdOidc\":\n return \"microsoft\";\n case \"Auth0Migration\":\n case \"Auth0Saml\":\n return \"auth0\";\n case \"AzureSaml\":\n return \"azure\";\n case \"CasSaml\":\n return \"cas\";\n case \"ClassLinkSaml\":\n return \"classlink\";\n case \"CloudflareSaml\":\n return \"cloudflare\";\n case \"CyberArkSaml\":\n return \"cyberark\";\n case \"DuoSaml\":\n return \"duo\";\n case \"GenericSaml\":\n return \"generic-saml\";\n case \"GoogleSaml\":\n case \"GoogleOidc\":\n return \"google\";\n case \"JumpCloudSaml\":\n return \"jumpcloud\";\n case \"KeycloakSaml\":\n return \"keycloak\";\n case \"LastPassSaml\":\n return \"lastpass\";\n case \"MiniOrangeSaml\":\n return \"miniorange\";\n case \"NetIqSaml\":\n return \"net-iq\";\n case \"OktaOidc\":\n case \"OktaSaml\":\n return \"okta\";\n case \"OneLoginSaml\":\n return \"onelogin\";\n case \"OracleSaml\":\n return \"oracle\";\n case \"PingFederateSaml\":\n case \"PingOneSaml\":\n return \"ping-identity\";\n case \"RipplingSaml\":\n return \"rippling\";\n case \"SalesforceSaml\":\n return \"salesforce\";\n case \"ShibbolethGenericSaml\":\n case \"ShibbolethSaml\":\n return \"shibboleth\";\n case \"SimpleSamlPhpSaml\":\n return \"simple-saml-php\";\n case \"TestIdp\":\n return \"test-idp\";\n case \"VmWareSaml\":\n return \"vmware\";\n case \"AdpOidc\":\n return \"adp\";\n case \"GenericOidc\":\n return \"generic-oidc\";\n case \"LoginGovOidc\":\n return \"login-gov\";\n default:\n return unreachable(connection);\n }\n}\n"],"mappings":"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","names":["AdminPortalSsoConnectionPresentational"]}
|
|
1
|
+
{"version":3,"sources":["../../src/admin-portal-sso-connection-client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n type AdminPortalSsoConnectionStatusProps,\n} from \"./lib/admin-portal-sso-connection.js\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport {\n type SsoConnection,\n useGenerateAdminPortalLink,\n useListSsoConnections,\n} from \"./api/endpoint.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { unreachable } from \"./lib/utils.js\";\nimport { IdentityProvider } from \"./lib/identity-providers.js\";\n\nexport interface AdminPortalSsoConnectionProps {\n authToken: AuthToken;\n}\n\nexport const AdminPortalSsoConnection: React.FC<\n AdminPortalSsoConnectionProps\n> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <SingleSignOnContent />\n </ApiProvider>\n );\n};\n\nexport { AdminPortalSsoConnectionLoading };\n\nconst SingleSignOnContent = () => {\n const isApiReady = useApiReady();\n const [currentDate, setCurrentDate] = React.useState<Date | null>(() =>\n isApiReady ? new Date() : null,\n );\n if (isApiReady && currentDate === null) {\n setCurrentDate(new Date());\n }\n\n const { mutate: generateAdminPortalLink, ...mutation } =\n useGenerateAdminPortalLink({\n mutation: {\n onSuccess: (data) => {\n window.open(data.link, \"_blank\", \"noopener,noreferrer\");\n },\n },\n });\n\n const adminPortalLink = mutation.data?.link ?? null;\n\n const query = useListSsoConnections();\n\n const initConfig = () => {\n generateAdminPortalLink({\n params: {\n intent: \"sso\",\n },\n });\n };\n\n if (query.isLoading) {\n return <AdminPortalSsoConnectionLoading />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} />;\n }\n\n if (query.data) {\n const connection = query.data[0];\n if (!connection) {\n return (\n <AdminPortalSsoConnectionPresentational\n connectionStatus=\"NotConfigured\"\n currentDate={currentDate}\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const connectionState = getConnectionState(connection, currentDate);\n const props: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (!connection || connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection);\n switch (connectionStatus) {\n case \"Active\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Inactive\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Expired\":\n case \"Expiring\":\n return {\n connectionStatus,\n expiryDate: connectionState.expiryDate,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n default:\n return unreachable(connectionState);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <ErrorBoundary FallbackComponent={AdminPortalSsoConnectionError}>\n <AdminPortalSsoConnectionPresentational\n {...props}\n currentDate={currentDate}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n};\n\ntype ConnectionState =\n | { status: \"NotConfigured\" }\n | { status: \"Active\" }\n | { status: \"Inactive\" }\n | {\n status: \"Expiring\";\n daysUntilExpiry: number | null;\n expiryDate: Date | null;\n }\n | { status: \"Expired\"; expiryDate: Date | null };\n\nfunction getConnectionState(\n connection: SsoConnection,\n currentDate: Date | null,\n): ConnectionState {\n switch (connection.state) {\n case \"Active\":\n case \"Validating\":\n case \"Deleting\": {\n const activeStatus = { status: \"Active\" } satisfies ConnectionState;\n if (connection.providerTag !== \"Saml\") {\n return activeStatus;\n }\n\n if (connection.latestExpiredCertificate) {\n return {\n status: \"Expired\",\n expiryDate: connection.latestExpiredCertificate.notAfter\n ? new Date(connection.latestExpiredCertificate.notAfter)\n : null,\n };\n }\n\n const expiryTime = connection.latestExpiringCertificate?.notAfter;\n if (currentDate == null || expiryTime == null) {\n return activeStatus;\n }\n\n const expiryDate = new Date(expiryTime);\n const daysUntilExpiry = (() => {\n const diff = expiryDate.getTime() - currentDate.getTime();\n if (diff < 0) {\n return -1;\n }\n\n return diff / (1000 * 60 * 60 * 24);\n })();\n\n if (daysUntilExpiry !== -1 && daysUntilExpiry <= 30) {\n return { status: \"Expiring\", daysUntilExpiry, expiryDate };\n }\n\n return activeStatus;\n }\n case \"Inactive\": {\n return { status: \"Inactive\" };\n }\n default:\n return unreachable(connection);\n }\n}\n\nfunction getIdentityProvider(connection: SsoConnection): IdentityProvider {\n switch (connection.type) {\n case \"AdfsSaml\":\n case \"EntraIdOidc\":\n return \"microsoft\";\n case \"Auth0Migration\":\n case \"Auth0Saml\":\n return \"auth0\";\n case \"AzureSaml\":\n return \"azure\";\n case \"CasSaml\":\n return \"cas\";\n case \"ClassLinkSaml\":\n return \"classlink\";\n case \"CloudflareSaml\":\n return \"cloudflare\";\n case \"CyberArkSaml\":\n return \"cyberark\";\n case \"DuoSaml\":\n return \"duo\";\n case \"GenericSaml\":\n return \"generic-saml\";\n case \"GoogleSaml\":\n case \"GoogleOidc\":\n return \"google\";\n case \"JumpCloudSaml\":\n return \"jumpcloud\";\n case \"KeycloakSaml\":\n return \"keycloak\";\n case \"LastPassSaml\":\n return \"lastpass\";\n case \"MiniOrangeSaml\":\n return \"miniorange\";\n case \"NetIqSaml\":\n return \"net-iq\";\n case \"OktaOidc\":\n case \"OktaSaml\":\n return \"okta\";\n case \"OneLoginSaml\":\n return \"onelogin\";\n case \"OracleSaml\":\n return \"oracle\";\n case \"PingFederateSaml\":\n case \"PingOneSaml\":\n return \"ping-identity\";\n case \"RipplingSaml\":\n return \"rippling\";\n case \"SalesforceSaml\":\n return \"salesforce\";\n case \"ShibbolethGenericSaml\":\n case \"ShibbolethSaml\":\n return \"shibboleth\";\n case \"SimpleSamlPhpSaml\":\n return \"simple-saml-php\";\n case \"TestIdp\":\n return \"test-idp\";\n case \"VmWareSaml\":\n return \"vmware\";\n case \"AdpOidc\":\n return \"adp\";\n case \"GenericOidc\":\n return \"generic-oidc\";\n case \"LoginGovOidc\":\n return \"login-gov\";\n default:\n return unreachable(connection);\n }\n}\n"],"mappings":"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","names":["AdminPortalSsoConnectionPresentational"]}
|
|
@@ -30,11 +30,15 @@ var api_provider_exports = {};
|
|
|
30
30
|
__export(api_provider_exports, {
|
|
31
31
|
ApiProvider: () => ApiProvider,
|
|
32
32
|
useApi: () => useApi,
|
|
33
|
+
useApiReady: () => useApiReady,
|
|
33
34
|
useElevatedAccessToken: () => useElevatedAccessToken
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(api_provider_exports);
|
|
36
37
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
38
|
+
var import_react_query = require("@tanstack/react-query");
|
|
37
39
|
var React = __toESM(require("react"), 1);
|
|
40
|
+
var import_use_is_hydrated = require("../lib/use-is-hydrated.js");
|
|
41
|
+
var import_utils = require("./utils.js");
|
|
38
42
|
const ApiContext = React.createContext(void 0);
|
|
39
43
|
const ApiProvider = ({
|
|
40
44
|
authToken,
|
|
@@ -42,7 +46,20 @@ const ApiProvider = ({
|
|
|
42
46
|
children,
|
|
43
47
|
widgetType
|
|
44
48
|
}) => {
|
|
45
|
-
const
|
|
49
|
+
const authTokenQuery = (0, import_react_query.useQuery)({
|
|
50
|
+
initialData: typeof authToken === "string" ? {
|
|
51
|
+
authToken,
|
|
52
|
+
permissions: (0, import_utils.getClaims)(authToken).permissions
|
|
53
|
+
} : void 0,
|
|
54
|
+
queryFn: async () => {
|
|
55
|
+
const resolvedToken = typeof authToken === "string" ? authToken : await authToken();
|
|
56
|
+
return {
|
|
57
|
+
authToken: resolvedToken,
|
|
58
|
+
permissions: (0, import_utils.getClaims)(resolvedToken).permissions
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
queryKey: ["authToken"]
|
|
62
|
+
});
|
|
46
63
|
const [elevatedAccess, setElevatedAccess] = React.useState();
|
|
47
64
|
const elevatedAccessTimeout = React.useRef(void 0);
|
|
48
65
|
React.useEffect(() => {
|
|
@@ -66,15 +83,15 @@ const ApiProvider = ({
|
|
|
66
83
|
}, [elevatedAccess]);
|
|
67
84
|
const value = React.useMemo(
|
|
68
85
|
() => ({
|
|
69
|
-
authToken:
|
|
70
|
-
|
|
86
|
+
authToken: authTokenQuery.data?.authToken,
|
|
87
|
+
permissions: authTokenQuery.data?.permissions,
|
|
71
88
|
baseUrl,
|
|
72
89
|
elevatedAccess,
|
|
73
90
|
setElevatedAccess,
|
|
74
91
|
widgetType
|
|
75
92
|
}),
|
|
76
93
|
[
|
|
77
|
-
|
|
94
|
+
authTokenQuery.data,
|
|
78
95
|
baseUrl,
|
|
79
96
|
elevatedAccess,
|
|
80
97
|
setElevatedAccess,
|
|
@@ -94,25 +111,16 @@ const useElevatedAccessToken = () => {
|
|
|
94
111
|
const { elevatedAccess, setElevatedAccess } = useApi();
|
|
95
112
|
return { elevatedAccess, setElevatedAccess };
|
|
96
113
|
};
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const authTokenPromise = authTokenPromiseOrString;
|
|
103
|
-
const promiseKey = PromiseKey.get(authTokenPromise);
|
|
104
|
-
if (!promiseKey) {
|
|
105
|
-
const newPromiseKey = `${Math.random()}`;
|
|
106
|
-
PromiseKey.set(authTokenPromise, newPromiseKey);
|
|
107
|
-
return newPromiseKey;
|
|
108
|
-
} else {
|
|
109
|
-
return promiseKey;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
114
|
+
const useApiReady = () => {
|
|
115
|
+
const { authToken } = useApi();
|
|
116
|
+
const isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
|
|
117
|
+
return isHydrated && authToken !== void 0;
|
|
118
|
+
};
|
|
112
119
|
// Annotate the CommonJS export names for ESM import in node:
|
|
113
120
|
0 && (module.exports = {
|
|
114
121
|
ApiProvider,
|
|
115
122
|
useApi,
|
|
123
|
+
useApiReady,
|
|
116
124
|
useElevatedAccessToken
|
|
117
125
|
});
|
|
118
126
|
//# sourceMappingURL=api-provider.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import * as React from \"react\";\n\nexport type WidgetType =\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\";\n\nexport type AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiConfig {\n authToken:
|
|
1
|
+
{"version":3,"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./utils.js\";\n\nexport type WidgetType =\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\";\n\nexport type AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiConfig {\n authToken: string | undefined;\n permissions: string[] | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\nconst ApiContext = React.createContext<ApiConfig | undefined>(undefined);\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nexport const ApiProvider = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}: ApiProviderProps) => {\n const authTokenQuery = useQuery({\n initialData:\n typeof authToken === \"string\"\n ? {\n authToken,\n permissions: getClaims(authToken).permissions,\n }\n : undefined,\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n\n return {\n authToken: resolvedToken,\n permissions: getClaims(resolvedToken).permissions,\n };\n },\n queryKey: [\"authToken\"],\n });\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 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\nexport const 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\nexport const useElevatedAccessToken = () => {\n const { elevatedAccess, setElevatedAccess } = useApi();\n\n return { elevatedAccess, setElevatedAccess };\n};\n\nexport const useApiReady = () => {\n const { authToken } = useApi();\n const isHydrated = useIsHydrated();\n\n return isHydrated && authToken !== undefined;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkHS;AAlHT,yBAAyB;AACzB,YAAuB;AACvB,6BAA8B;AAC9B,mBAA0B;AA4B1B,MAAM,aAAa,MAAM,cAAqC,MAAS;AAShE,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,qBAAiB,6BAAS;AAAA,IAC9B,aACE,OAAO,cAAc,WACjB;AAAA,MACE;AAAA,MACA,iBAAa,wBAAU,SAAS,EAAE;AAAA,IACpC,IACA;AAAA,IACN,SAAS,YAAY;AACnB,YAAM,gBACJ,OAAO,cAAc,WAAW,YAAY,MAAM,UAAU;AAE9D,aAAO;AAAA,QACL,WAAW;AAAA,QACX,iBAAa,wBAAU,aAAa,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB,CAAC;AAED,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAyB;AAC3E,QAAM,wBAAwB,MAAM,OAA2B,MAAS;AAKxE,QAAM,UAAU,MAAM;AACpB,QAAI,sBAAsB,SAAS;AACjC,aAAO,cAAc,sBAAsB,OAAO;AAAA,IACpD;AAEA,QAAI,gBAAgB;AAClB,4BAAsB,UAAU,OAAO,YAAY,MAAM;AACvD,cAAM,MAAM,oBAAI,KAAK;AACrB,cAAM,gBAAgB,IAAI,KAAK,eAAe,SAAS;AAGvD,YAAI,MAAM,eAAe;AACvB,4BAAkB,MAAS;AAAA,QAC7B;AAAA,MACF,GAAG,GAAM;AAAA,IACX;AAEA,WAAO,MAAM;AACX,UAAI,sBAAsB,SAAS;AACjC,eAAO,cAAc,sBAAsB,OAAO;AAAA,MACpD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL,WAAW,eAAe,MAAM;AAAA,MAChC,aAAa,eAAe,MAAM;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,4CAAC,WAAW,UAAX,EAAoB,OAAe,UAAS;AACtD;AAEO,MAAM,SAAS,MAAM;AAC1B,QAAM,UAAU,MAAM,WAAW,UAAU;AAE3C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO;AACT;AAEO,MAAM,yBAAyB,MAAM;AAC1C,QAAM,EAAE,gBAAgB,kBAAkB,IAAI,OAAO;AAErD,SAAO,EAAE,gBAAgB,kBAAkB;AAC7C;AAEO,MAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,UAAU,IAAI,OAAO;AAC7B,QAAM,iBAAa,sCAAc;AAEjC,SAAO,cAAc,cAAc;AACrC;","names":[]}
|
|
@@ -8,8 +8,8 @@ interface ElevatedAccess {
|
|
|
8
8
|
expiresAt: string;
|
|
9
9
|
}
|
|
10
10
|
interface ApiConfig {
|
|
11
|
-
authToken:
|
|
12
|
-
|
|
11
|
+
authToken: string | undefined;
|
|
12
|
+
permissions: string[] | undefined;
|
|
13
13
|
baseUrl: string;
|
|
14
14
|
widgetType: WidgetType;
|
|
15
15
|
elevatedAccess?: ElevatedAccess;
|
|
@@ -27,5 +27,6 @@ declare const useElevatedAccessToken: () => {
|
|
|
27
27
|
elevatedAccess: ElevatedAccess | undefined;
|
|
28
28
|
setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;
|
|
29
29
|
};
|
|
30
|
+
declare const useApiReady: () => boolean;
|
|
30
31
|
|
|
31
|
-
export { ApiProvider, type AuthToken, type WidgetType, useApi, useElevatedAccessToken };
|
|
32
|
+
export { ApiProvider, type AuthToken, type WidgetType, useApi, useApiReady, useElevatedAccessToken };
|
package/dist/cjs/api/utils.cjs
CHANGED
|
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var utils_exports = {};
|
|
20
20
|
__export(utils_exports, {
|
|
21
21
|
getAuthHeaders: () => getAuthHeaders,
|
|
22
|
+
getClaims: () => getClaims,
|
|
22
23
|
isErrorLike: () => isErrorLike,
|
|
23
24
|
isObjectLike: () => isObjectLike,
|
|
24
25
|
parseErrorResponse: () => parseErrorResponse
|
|
@@ -26,6 +27,11 @@ __export(utils_exports, {
|
|
|
26
27
|
module.exports = __toCommonJS(utils_exports);
|
|
27
28
|
var import_constants = require("./constants.js");
|
|
28
29
|
function getAuthHeaders(authToken) {
|
|
30
|
+
if (!authToken) {
|
|
31
|
+
return {
|
|
32
|
+
"WorkOS-Widgets-Version": import_constants.WIDGETS_API_VERSION
|
|
33
|
+
};
|
|
34
|
+
}
|
|
29
35
|
return {
|
|
30
36
|
Authorization: `Bearer ${authToken}`,
|
|
31
37
|
"WorkOS-Widgets-Version": import_constants.WIDGETS_API_VERSION
|
|
@@ -58,9 +64,13 @@ async function parseErrorResponse(response) {
|
|
|
58
64
|
};
|
|
59
65
|
}
|
|
60
66
|
}
|
|
67
|
+
function getClaims(accessToken) {
|
|
68
|
+
return JSON.parse(atob(accessToken.split(".")[1]));
|
|
69
|
+
}
|
|
61
70
|
// Annotate the CommonJS export names for ESM import in node:
|
|
62
71
|
0 && (module.exports = {
|
|
63
72
|
getAuthHeaders,
|
|
73
|
+
getClaims,
|
|
64
74
|
isErrorLike,
|
|
65
75
|
isObjectLike,
|
|
66
76
|
parseErrorResponse
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/utils.ts"],"sourcesContent":["import { WIDGETS_API_VERSION } from \"./constants.js\";\n\nexport function getAuthHeaders(authToken
|
|
1
|
+
{"version":3,"sources":["../../../src/api/utils.ts"],"sourcesContent":["import { WIDGETS_API_VERSION } from \"./constants.js\";\n\nexport function getAuthHeaders(authToken?: string): HeadersInit {\n if (!authToken) {\n return {\n \"WorkOS-Widgets-Version\": WIDGETS_API_VERSION,\n };\n }\n\n return {\n Authorization: `Bearer ${authToken}`,\n \"WorkOS-Widgets-Version\": WIDGETS_API_VERSION,\n };\n}\n\nexport function isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function isErrorLike(\n value: unknown,\n): value is Record<string, unknown> & { message: string } {\n return isObjectLike(value) && typeof value.message === \"string\";\n}\n\nexport async function parseErrorResponse(\n response: Response,\n): Promise<{ message: string; status: number }> {\n try {\n const json = await response.json();\n if (!isObjectLike(json) || typeof json.message !== \"string\") {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n return {\n ...json,\n status: response.status,\n message: json.message || response.statusText,\n };\n } catch {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n}\n\ntype Claims = {\n sid: string;\n permissions?: string[];\n};\n\nexport function getClaims(accessToken: string): Claims {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAoC;AAE7B,SAAS,eAAe,WAAiC;AAC9D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,0BAA0B;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe,UAAU,SAAS;AAAA,IAClC,0BAA0B;AAAA,EAC5B;AACF;AAEO,SAAS,aAAa,OAAkD;AAC7E,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEO,SAAS,YACd,OACwD;AACxD,SAAO,aAAa,KAAK,KAAK,OAAO,MAAM,YAAY;AACzD;AAEA,eAAsB,mBACpB,UAC8C;AAC9C,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,aAAa,IAAI,KAAK,OAAO,KAAK,YAAY,UAAU;AAC3D,aAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,SAAS,SAAS;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,SAAS;AAAA,MACjB,SAAS,KAAK,WAAW,SAAS;AAAA,IACpC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB;AAAA,EACF;AACF;AAOO,SAAS,UAAU,aAA6B;AACrD,SAAO,KAAK,MAAM,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACnD;","names":[]}
|
package/dist/cjs/api/utils.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare function getAuthHeaders(authToken
|
|
1
|
+
declare function getAuthHeaders(authToken?: string): HeadersInit;
|
|
2
2
|
declare function isObjectLike(value: unknown): value is Record<string, unknown>;
|
|
3
3
|
declare function isErrorLike(value: unknown): value is Record<string, unknown> & {
|
|
4
4
|
message: string;
|
|
@@ -7,5 +7,10 @@ declare function parseErrorResponse(response: Response): Promise<{
|
|
|
7
7
|
message: string;
|
|
8
8
|
status: number;
|
|
9
9
|
}>;
|
|
10
|
+
type Claims = {
|
|
11
|
+
sid: string;
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
};
|
|
14
|
+
declare function getClaims(accessToken: string): Claims;
|
|
10
15
|
|
|
11
|
-
export { getAuthHeaders, isErrorLike, isObjectLike, parseErrorResponse };
|
|
16
|
+
export { getAuthHeaders, getClaims, isErrorLike, isObjectLike, parseErrorResponse };
|
|
@@ -25,6 +25,7 @@ module.exports = __toCommonJS(widgets_api_client_exports);
|
|
|
25
25
|
var import_api_provider = require("./api-provider.js");
|
|
26
26
|
var import_errors = require("./errors.js");
|
|
27
27
|
var import_utils = require("./utils.js");
|
|
28
|
+
var import_errors2 = require("../lib/errors.js");
|
|
28
29
|
const useWidgetsApiClient = () => {
|
|
29
30
|
const { authToken, baseUrl, elevatedAccess, widgetType } = (0, import_api_provider.useApi)();
|
|
30
31
|
return async ({ url: pathname, method, params, data }) => {
|
|
@@ -38,7 +39,7 @@ const useWidgetsApiClient = () => {
|
|
|
38
39
|
}
|
|
39
40
|
const queryType = method.toLowerCase() === "get" ? "query" : "mutation";
|
|
40
41
|
const headers = {
|
|
41
|
-
...(0, import_utils.getAuthHeaders)(
|
|
42
|
+
...(0, import_utils.getAuthHeaders)(authToken),
|
|
42
43
|
...elevatedAccess && queryType === "mutation" ? { "x-elevated-access-token": elevatedAccess.token } : {},
|
|
43
44
|
"WorkOS-Widgets-Type": widgetType,
|
|
44
45
|
"Content-Type": "application/json"
|
|
@@ -57,21 +58,26 @@ const useWidgetsApiClient = () => {
|
|
|
57
58
|
});
|
|
58
59
|
if (!response.ok) {
|
|
59
60
|
const { message, status } = await (0, import_utils.parseErrorResponse)(response);
|
|
60
|
-
|
|
61
|
+
const ctx = {
|
|
61
62
|
message,
|
|
62
63
|
status,
|
|
63
64
|
queryType: method.toLowerCase() === "get" ? "query" : "mutation"
|
|
64
|
-
}
|
|
65
|
+
};
|
|
66
|
+
if (status === 403) {
|
|
67
|
+
throw new import_errors2.IncorrectPermissionsError({ context: ctx });
|
|
68
|
+
}
|
|
69
|
+
throw new import_errors.ApiError(ctx);
|
|
65
70
|
}
|
|
66
71
|
return response.json();
|
|
67
72
|
};
|
|
68
73
|
};
|
|
69
74
|
const useWidgetsApiQueryOptions = (queryOptions) => {
|
|
70
|
-
const {
|
|
75
|
+
const { permissions, baseUrl } = (0, import_api_provider.useApi)();
|
|
71
76
|
const queryKey = [
|
|
72
77
|
// initial query key needs to go first to allow invalidation of the query name to work
|
|
73
78
|
...queryOptions.queryKey,
|
|
74
|
-
|
|
79
|
+
permissions,
|
|
80
|
+
baseUrl
|
|
75
81
|
];
|
|
76
82
|
return {
|
|
77
83
|
...queryOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/widgets-api-client.ts"],"sourcesContent":["import { QueryKey } from \"@tanstack/react-query\";\nimport { useApi } from \"./api-provider.js\";\nimport { ApiError, FetchError } from \"./errors.js\";\nimport { getAuthHeaders, parseErrorResponse } from \"./utils.js\";\n\ntype WidgetsApiClient<T> = (data: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n params?: Record<string, any>;\n headers?: Record<string, any>;\n data?: BodyType<unknown>;\n signal?: AbortSignal;\n}) => Promise<T>;\n\nexport const useWidgetsApiClient = <T>(): WidgetsApiClient<T> => {\n const { authToken, baseUrl, elevatedAccess, widgetType } = useApi();\n\n return async ({ url: pathname, method, params, data }) => {\n const url = new URL(baseUrl);\n url.pathname = pathname;\n\n if (params) {\n const cleanParams = Object.fromEntries(\n Object.entries(params).filter(([_, value]) => value !== undefined),\n );\n url.search = new URLSearchParams(cleanParams).toString();\n }\n\n const queryType = method.toLowerCase() === \"get\" ? \"query\" : \"mutation\";\n const headers = {\n ...getAuthHeaders(
|
|
1
|
+
{"version":3,"sources":["../../../src/api/widgets-api-client.ts"],"sourcesContent":["import { QueryKey } from \"@tanstack/react-query\";\nimport { useApi } from \"./api-provider.js\";\nimport { ApiError, FetchError } from \"./errors.js\";\nimport { getAuthHeaders, parseErrorResponse } from \"./utils.js\";\nimport { IncorrectPermissionsError } from \"../lib/errors.js\";\n\ntype WidgetsApiClient<T> = (data: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n params?: Record<string, any>;\n headers?: Record<string, any>;\n data?: BodyType<unknown>;\n signal?: AbortSignal;\n}) => Promise<T>;\n\nexport const useWidgetsApiClient = <T>(): WidgetsApiClient<T> => {\n const { authToken, baseUrl, elevatedAccess, widgetType } = useApi();\n\n return async ({ url: pathname, method, params, data }) => {\n const url = new URL(baseUrl);\n url.pathname = pathname;\n\n if (params) {\n const cleanParams = Object.fromEntries(\n Object.entries(params).filter(([_, value]) => value !== undefined),\n );\n url.search = new URLSearchParams(cleanParams).toString();\n }\n\n const queryType = method.toLowerCase() === \"get\" ? \"query\" : \"mutation\";\n const headers = {\n ...getAuthHeaders(authToken),\n ...(elevatedAccess && queryType === \"mutation\"\n ? { \"x-elevated-access-token\": elevatedAccess.token }\n : {}),\n \"WorkOS-Widgets-Type\": widgetType,\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(url, {\n method,\n cache: \"no-store\",\n headers,\n ...(data ? { body: JSON.stringify(data) } : {}),\n }).catch((error) => {\n throw new FetchError({\n message: `Failed to ${method} ${url.toString()}`,\n queryType,\n context: { error },\n });\n });\n\n if (!response.ok) {\n const { message, status } = await parseErrorResponse(response);\n const ctx = {\n message,\n status,\n queryType: method.toLowerCase() === \"get\" ? \"query\" : \"mutation\",\n } as const;\n\n if (status === 403) {\n throw new IncorrectPermissionsError({ context: ctx });\n }\n\n throw new ApiError(ctx);\n }\n\n return response.json();\n };\n};\n\nexport type ErrorType<ErrorData> = ErrorData;\n\nexport type BodyType<BodyData> = BodyData & { headers?: any };\n\nexport const useWidgetsApiQueryOptions = <\n QueryOptions extends { queryKey: QK },\n QK extends QueryKey,\n>(\n queryOptions: QueryOptions,\n) => {\n const { permissions, baseUrl } = useApi();\n const queryKey = [\n // initial query key needs to go first to allow invalidation of the query name to work\n ...queryOptions.queryKey,\n permissions,\n baseUrl,\n ] as unknown as QK;\n\n return {\n ...queryOptions,\n queryKey: queryKey as QK,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAuB;AACvB,oBAAqC;AACrC,mBAAmD;AACnD,IAAAA,iBAA0C;AAWnC,MAAM,sBAAsB,MAA8B;AAC/D,QAAM,EAAE,WAAW,SAAS,gBAAgB,WAAW,QAAI,4BAAO;AAElE,SAAO,OAAO,EAAE,KAAK,UAAU,QAAQ,QAAQ,KAAK,MAAM;AACxD,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,QAAI,WAAW;AAEf,QAAI,QAAQ;AACV,YAAM,cAAc,OAAO;AAAA,QACzB,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,UAAU,MAAS;AAAA,MACnE;AACA,UAAI,SAAS,IAAI,gBAAgB,WAAW,EAAE,SAAS;AAAA,IACzD;AAEA,UAAM,YAAY,OAAO,YAAY,MAAM,QAAQ,UAAU;AAC7D,UAAM,UAAU;AAAA,MACd,OAAG,6BAAe,SAAS;AAAA,MAC3B,GAAI,kBAAkB,cAAc,aAChC,EAAE,2BAA2B,eAAe,MAAM,IAClD,CAAC;AAAA,MACL,uBAAuB;AAAA,MACvB,gBAAgB;AAAA,IAClB;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,IAC/C,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,YAAM,IAAI,yBAAW;AAAA,QACnB,SAAS,aAAa,MAAM,IAAI,IAAI,SAAS,CAAC;AAAA,QAC9C;AAAA,QACA,SAAS,EAAE,MAAM;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,EAAE,SAAS,OAAO,IAAI,UAAM,iCAAmB,QAAQ;AAC7D,YAAM,MAAM;AAAA,QACV;AAAA,QACA;AAAA,QACA,WAAW,OAAO,YAAY,MAAM,QAAQ,UAAU;AAAA,MACxD;AAEA,UAAI,WAAW,KAAK;AAClB,cAAM,IAAI,yCAA0B,EAAE,SAAS,IAAI,CAAC;AAAA,MACtD;AAEA,YAAM,IAAI,uBAAS,GAAG;AAAA,IACxB;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAMO,MAAM,4BAA4B,CAIvC,iBACG;AACH,QAAM,EAAE,aAAa,QAAQ,QAAI,4BAAO;AACxC,QAAM,WAAW;AAAA;AAAA,IAEf,GAAG,aAAa;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":["import_errors"]}
|
|
@@ -26,7 +26,6 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
26
26
|
var import_api_provider = require("./api/api-provider.js");
|
|
27
27
|
var import_api_keys_table = require("./lib/api-keys/api-keys-table.js");
|
|
28
28
|
var import_widgets_context = require("./lib/widgets-context.js");
|
|
29
|
-
var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
|
|
30
29
|
var import_api_keys = require("./lib/api-keys/api-keys.js");
|
|
31
30
|
var import_endpoint = require("./api/endpoint.js");
|
|
32
31
|
var import_generic_error = require("./lib/generic-error.js");
|
|
@@ -52,16 +51,12 @@ const ApiKeys = ({ authToken }) => {
|
|
|
52
51
|
) });
|
|
53
52
|
};
|
|
54
53
|
const ApiKeysContent = () => {
|
|
55
|
-
const
|
|
54
|
+
const isApiReady = (0, import_api_provider.useApiReady)();
|
|
56
55
|
const apiKeys = (0, import_api_key.useApiKeys)();
|
|
57
|
-
const context = (0, import_api_provider.useApi)();
|
|
58
56
|
const { state } = (0, import_api_keys_context.useApiKeysContext)();
|
|
59
57
|
(0, import_endpoint.useListOrganizationApiKeyPermissions)({ limit: 100 });
|
|
60
|
-
const permissionsQuery = (0, import_use_permissions.usePermissions)(
|
|
61
|
-
|
|
62
|
-
context.authToken
|
|
63
|
-
);
|
|
64
|
-
if (!isHydrated || apiKeys.isLoading || permissionsQuery.isLoading) {
|
|
58
|
+
const permissionsQuery = (0, import_use_permissions.usePermissions)("widgets:api-keys:manage");
|
|
59
|
+
if (!isApiReady || apiKeys.isLoading || permissionsQuery.isLoading) {
|
|
65
60
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_keys.ApiKeysLoading, {});
|
|
66
61
|
}
|
|
67
62
|
if (permissionsQuery.isError || apiKeys.isError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api-keys-client.tsx"],"sourcesContent":["\"use client\";\nimport { ApiProvider, AuthToken,
|
|
1
|
+
{"version":3,"sources":["../../src/api-keys-client.tsx"],"sourcesContent":["\"use client\";\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { ApiKeysTable } from \"./lib/api-keys/api-keys-table.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n ApiKeysEmptyState,\n ApiKeysLoading,\n ApiKeysRoot,\n} from \"./lib/api-keys/api-keys.js\";\nimport { useListOrganizationApiKeyPermissions } from \"./api/endpoint.js\";\nimport * as React from \"react\";\nimport { GenericError } from \"./lib/generic-error.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { usePermissions } from \"./lib/use-permissions.js\";\nimport {\n ApiKeysContextProvider,\n useApiKeysContext,\n} from \"./lib/api-keys/api-keys-context.js\";\nimport { useApiKeys } from \"./lib/api/api-key.js\";\nimport { ApiKeysSearchProvider } from \"./lib/api-keys/api-keys-search-provider.js\";\nimport { CreateApiKeyDialog } from \"./lib/api-keys/create-api-key.js\";\n\nexport interface ApiKeysProps {\n authToken: AuthToken;\n}\n\nexport const ApiKeys: React.FC<ApiKeysProps> = ({ authToken }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary FallbackComponent={GenericError}>\n <ApiProvider\n widgetType=\"api-keys\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <ApiKeysContextProvider>\n <CreateApiKeyDialog />\n <ApiKeysRoot>\n <ApiKeysContent />\n </ApiKeysRoot>\n </ApiKeysContextProvider>\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\nconst ApiKeysContent = () => {\n const isApiReady = useApiReady();\n const apiKeys = useApiKeys();\n const { state } = useApiKeysContext();\n useListOrganizationApiKeyPermissions({ limit: 100 });\n const permissionsQuery = usePermissions(\"widgets:api-keys:manage\");\n\n if (!isApiReady || apiKeys.isLoading || permissionsQuery.isLoading) {\n return <ApiKeysLoading />;\n }\n\n if (permissionsQuery.isError || apiKeys.isError) {\n return <GenericError error={permissionsQuery.error || apiKeys.error} />;\n }\n\n if (apiKeys.isSuccess) {\n if (apiKeys.data.data.length === 0 && !state.searchQuery) {\n return <ApiKeysEmptyState />;\n }\n\n return (\n <ApiKeysSearchProvider>\n <ApiKeysTable apiKeys={apiKeys.data} />\n </ApiKeysSearchProvider>\n );\n }\n\n return <GenericError error={apiKeys.error} />;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCQ;AAnCR,0BAAoD;AACpD,4BAA6B;AAC7B,6BAAgC;AAChC,sBAIO;AACP,sBAAqD;AAErD,2BAA6B;AAC7B,4BAA8B;AAC9B,6BAA+B;AAC/B,8BAGO;AACP,qBAA2B;AAC3B,sCAAsC;AACtC,4BAAmC;AAM5B,MAAM,UAAkC,CAAC,EAAE,UAAU,MAAM;AAChE,QAAM,cAAU,wCAAgB;AAEhC,SACE,4CAAC,uCAAc,mBAAmB,mCAChC;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,uDAAC,kDACC;AAAA,oDAAC,4CAAmB;AAAA,QACpB,4CAAC,+BACC,sDAAC,kBAAe,GAClB;AAAA,SACF;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,MAAM,iBAAiB,MAAM;AAC3B,QAAM,iBAAa,iCAAY;AAC/B,QAAM,cAAU,2BAAW;AAC3B,QAAM,EAAE,MAAM,QAAI,2CAAkB;AACpC,4DAAqC,EAAE,OAAO,IAAI,CAAC;AACnD,QAAM,uBAAmB,uCAAe,yBAAyB;AAEjE,MAAI,CAAC,cAAc,QAAQ,aAAa,iBAAiB,WAAW;AAClE,WAAO,4CAAC,kCAAe;AAAA,EACzB;AAEA,MAAI,iBAAiB,WAAW,QAAQ,SAAS;AAC/C,WAAO,4CAAC,qCAAa,OAAO,iBAAiB,SAAS,QAAQ,OAAO;AAAA,EACvE;AAEA,MAAI,QAAQ,WAAW;AACrB,QAAI,QAAQ,KAAK,KAAK,WAAW,KAAK,CAAC,MAAM,aAAa;AACxD,aAAO,4CAAC,qCAAkB;AAAA,IAC5B;AAEA,WACE,4CAAC,yDACC,sDAAC,sCAAa,SAAS,QAAQ,MAAM,GACvC;AAAA,EAEJ;AAEA,SAAO,4CAAC,qCAAa,OAAO,QAAQ,OAAO;AAC7C;","names":[]}
|
|
@@ -293,7 +293,7 @@ function SecretDialog({ children, setupKey }) {
|
|
|
293
293
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Dialog.Root, { children: [
|
|
294
294
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Dialog.Trigger, { children }),
|
|
295
295
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
296
|
-
|
|
296
|
+
import_elements.DialogContent,
|
|
297
297
|
{
|
|
298
298
|
maxWidth: "90vw",
|
|
299
299
|
size: { initial: "3", sm: "4" },
|