@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.
Files changed (94) hide show
  1. package/CHANGELOG.md +19 -8
  2. package/dist/cjs/admin-portal-domain-verification.client.cjs +2 -3
  3. package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
  4. package/dist/cjs/admin-portal-sso-connection-client.cjs +3 -4
  5. package/dist/cjs/admin-portal-sso-connection-client.cjs.map +1 -1
  6. package/dist/cjs/api/api-provider.cjs +27 -19
  7. package/dist/cjs/api/api-provider.cjs.map +1 -1
  8. package/dist/cjs/api/api-provider.d.cts +4 -3
  9. package/dist/cjs/api/utils.cjs +10 -0
  10. package/dist/cjs/api/utils.cjs.map +1 -1
  11. package/dist/cjs/api/utils.d.cts +7 -2
  12. package/dist/cjs/api/widgets-api-client.cjs +11 -5
  13. package/dist/cjs/api/widgets-api-client.cjs.map +1 -1
  14. package/dist/cjs/api-keys-client.cjs +3 -8
  15. package/dist/cjs/api-keys-client.cjs.map +1 -1
  16. package/dist/cjs/lib/add-mfa-dialog.cjs +1 -1
  17. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  18. package/dist/cjs/lib/admin-portal-domain-verification.cjs +25 -18
  19. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  20. package/dist/cjs/lib/admin-portal-sso-connection.cjs +5 -27
  21. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  22. package/dist/cjs/lib/card-list.cjs.map +1 -0
  23. package/dist/cjs/lib/errors.cjs +1 -1
  24. package/dist/cjs/lib/errors.cjs.map +1 -1
  25. package/dist/cjs/lib/generic-error.cjs +27 -38
  26. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  27. package/dist/cjs/lib/generic-error.d.cts +5 -1
  28. package/dist/cjs/lib/use-permissions.cjs +7 -14
  29. package/dist/cjs/lib/use-permissions.cjs.map +1 -1
  30. package/dist/cjs/lib/use-permissions.d.cts +1 -1
  31. package/dist/cjs/lib/user-security.cjs +1 -1
  32. package/dist/cjs/lib/user-security.cjs.map +1 -1
  33. package/dist/cjs/lib/user-sessions.cjs +1 -1
  34. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  35. package/dist/cjs/organization-switcher.client.cjs +2 -4
  36. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  37. package/dist/cjs/user-profile.client.cjs +2 -6
  38. package/dist/cjs/user-profile.client.cjs.map +1 -1
  39. package/dist/cjs/user-security.client.cjs +5 -4
  40. package/dist/cjs/user-security.client.cjs.map +1 -1
  41. package/dist/cjs/user-sessions.client.cjs +8 -12
  42. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  43. package/dist/cjs/users-management.client.cjs +3 -9
  44. package/dist/cjs/users-management.client.cjs.map +1 -1
  45. package/dist/esm/admin-portal-domain-verification.client.js +3 -4
  46. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  47. package/dist/esm/admin-portal-sso-connection-client.js +4 -5
  48. package/dist/esm/admin-portal-sso-connection-client.js.map +1 -1
  49. package/dist/esm/api/api-provider.d.ts +4 -3
  50. package/dist/esm/api/api-provider.js +26 -19
  51. package/dist/esm/api/api-provider.js.map +1 -1
  52. package/dist/esm/api/utils.d.ts +7 -2
  53. package/dist/esm/api/utils.js +9 -0
  54. package/dist/esm/api/utils.js.map +1 -1
  55. package/dist/esm/api/widgets-api-client.js +11 -5
  56. package/dist/esm/api/widgets-api-client.js.map +1 -1
  57. package/dist/esm/api-keys-client.js +4 -9
  58. package/dist/esm/api-keys-client.js.map +1 -1
  59. package/dist/esm/lib/add-mfa-dialog.js +1 -1
  60. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  61. package/dist/esm/lib/admin-portal-domain-verification.js +25 -18
  62. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  63. package/dist/esm/lib/admin-portal-sso-connection.js +5 -27
  64. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  65. package/dist/esm/lib/card-list.js.map +1 -0
  66. package/dist/esm/lib/errors.js +1 -1
  67. package/dist/esm/lib/errors.js.map +1 -1
  68. package/dist/esm/lib/generic-error.d.ts +5 -1
  69. package/dist/esm/lib/generic-error.js +27 -40
  70. package/dist/esm/lib/generic-error.js.map +1 -1
  71. package/dist/esm/lib/use-permissions.d.ts +1 -1
  72. package/dist/esm/lib/use-permissions.js +8 -15
  73. package/dist/esm/lib/use-permissions.js.map +1 -1
  74. package/dist/esm/lib/user-security.js +1 -1
  75. package/dist/esm/lib/user-security.js.map +1 -1
  76. package/dist/esm/lib/user-sessions.js +1 -1
  77. package/dist/esm/lib/user-sessions.js.map +1 -1
  78. package/dist/esm/organization-switcher.client.js +3 -5
  79. package/dist/esm/organization-switcher.client.js.map +1 -1
  80. package/dist/esm/user-profile.client.js +3 -7
  81. package/dist/esm/user-profile.client.js.map +1 -1
  82. package/dist/esm/user-security.client.js +6 -5
  83. package/dist/esm/user-security.client.js.map +1 -1
  84. package/dist/esm/user-sessions.client.js +10 -14
  85. package/dist/esm/user-sessions.client.js.map +1 -1
  86. package/dist/esm/users-management.client.js +4 -10
  87. package/dist/esm/users-management.client.js.map +1 -1
  88. package/package.json +4 -1
  89. package/dist/cjs/card-list.cjs.map +0 -1
  90. package/dist/esm/card-list.js.map +0 -1
  91. /package/dist/cjs/{card-list.cjs → lib/card-list.cjs} +0 -0
  92. /package/dist/cjs/{card-list.d.cts → lib/card-list.d.cts} +0 -0
  93. /package/dist/esm/{card-list.d.ts → lib/card-list.d.ts} +0 -0
  94. /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 User Management widget
6
- - Export prop types and loading components for all widgets
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 domain verification widget
25
+ - Create new `AdminPortalDomainVerification` Widget
15
26
  - Handle user location showing as undefined
16
- - Add SSO Widget
17
- - Handle incorrect widget permissions
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` widget to control how long organization names get truncated when there is limited space
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 widget type header to API requests
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 User Profile Widget
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 isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
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 (!isHydrated || isLoading) {
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 { useIsHydrated } from \"./lib/use-is-hydrated.js\";\nimport { ApiProvider, AuthToken } 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 isHydrated = useIsHydrated();\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 (!isHydrated || 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;AAoCM;AAjCN,8CAIO;AACP,6BAA8B;AAC9B,0BAAuC;AACvC,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,sCAAc;AACjC,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"]}
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 isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
57
+ const isApiReady = (0, import_api_provider.useApiReady)();
59
58
  const [currentDate, setCurrentDate] = React.useState(
60
- () => isHydrated ? /* @__PURE__ */ new Date() : null
59
+ () => isApiReady ? /* @__PURE__ */ new Date() : null
61
60
  );
62
- if (isHydrated && currentDate === null) {
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCM;AAlCN,YAAuB;AACvB,yCAMO;AACP,6BAA8B;AAC9B,0BAAuC;AACvC,sBAIO;AACP,6BAAgC;AAChC,4BAA8B;AAC9B,mBAA4B;AAOrB,MAAM,2BAET,CAAC,EAAE,UAAU,MAAM;AACrB,QAAM,cAAU,wCAAgB;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,uBAAoB;AAAA;AAAA,EACvB;AAEJ;AAIA,MAAM,sBAAsB,MAAM;AAChC,QAAM,iBAAa,sCAAc;AACjC,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM;AAAA,IAAsB,MAChE,aAAa,oBAAI,KAAK,IAAI;AAAA,EAC5B;AACA,MAAI,cAAc,gBAAgB,MAAM;AACtC,mBAAe,oBAAI,KAAK,CAAC;AAAA,EAC3B;AAEA,QAAM,EAAE,QAAQ,yBAAyB,GAAG,SAAS,QACnD,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,kBAAkB,SAAS,MAAM,QAAQ;AAE/C,QAAM,YAAQ,uCAAsB;AAEpC,QAAM,aAAa,MAAM;AACvB,4BAAwB;AAAA,MACtB,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,WAAW;AACnB,WAAO,4CAAC,sEAAgC;AAAA,EAC1C;AAEA,MAAI,MAAM,SAAS;AACjB,WAAO,4CAAC,oEAA8B,OAAO,MAAM,OAAO;AAAA,EAC5D;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,aAAa,MAAM,KAAK,CAAC;AAC/B,QAAI,CAAC,YAAY;AACf,aACE;AAAA,QAAC,mCAAAA;AAAA,QAAA;AAAA,UACC,kBAAiB;AAAA,UACjB;AAAA,UACA,aAAa;AAAA,UACb,uBACE;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,SAAS;AAAA,cACpB,MAAM;AAAA,cACN;AAAA;AAAA,UACF;AAAA;AAAA,MAEJ;AAAA,IAEJ;AAEA,UAAM,kBAAkB,mBAAmB,YAAY,WAAW;AAClE,UAAM,SAA8C,MAAM;AACxD,YAAM,mBAAmB,gBAAgB;AACzC,UAAI,CAAC,cAAc,qBAAqB,iBAAiB;AACvD,eAAO;AAAA,UACL,kBAAkB;AAAA,QACpB;AAAA,MACF;AAEA,YAAM,mBAAmB,oBAAoB,UAAU;AACvD,cAAQ,kBAAkB;AAAA,QACxB,KAAK;AACH,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA,YACL;AAAA,YACA,YAAY,gBAAgB;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AACE,qBAAO,0BAAY,eAAe;AAAA,MACtC;AAAA,IACF,GAAG;AAEH,UAAM,cAAc,WAAW,cAC3B,IAAI,KAAK,WAAW,YAAY,SAAS,IACzC;AAEJ,WACE,4CAAC,uCAAc,mBAAmB,kEAChC;AAAA,MAAC,mCAAAA;AAAA,MAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA,uBACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,SAAS;AAAA,YACpB,MAAM;AAAA,YACN;AAAA;AAAA,QACF;AAAA;AAAA,IAEJ,GACF;AAAA,EAEJ;AACF;AAaA,SAAS,mBACP,YACA,aACiB;AACjB,UAAQ,WAAW,OAAO;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,YAAY;AACf,YAAM,eAAe,EAAE,QAAQ,SAAS;AACxC,UAAI,WAAW,gBAAgB,QAAQ;AACrC,eAAO;AAAA,MACT;AAEA,UAAI,WAAW,0BAA0B;AACvC,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY,WAAW,yBAAyB,WAC5C,IAAI,KAAK,WAAW,yBAAyB,QAAQ,IACrD;AAAA,QACN;AAAA,MACF;AAEA,YAAM,aAAa,WAAW,2BAA2B;AACzD,UAAI,eAAe,QAAQ,cAAc,MAAM;AAC7C,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,IAAI,KAAK,UAAU;AACtC,YAAM,mBAAmB,MAAM;AAC7B,cAAM,OAAO,WAAW,QAAQ,IAAI,YAAY,QAAQ;AACxD,YAAI,OAAO,GAAG;AACZ,iBAAO;AAAA,QACT;AAEA,eAAO,QAAQ,MAAO,KAAK,KAAK;AAAA,MAClC,GAAG;AAEH,UAAI,oBAAoB,MAAM,mBAAmB,IAAI;AACnD,eAAO,EAAE,QAAQ,YAAY,iBAAiB,WAAW;AAAA,MAC3D;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,YAAY;AACf,aAAO,EAAE,QAAQ,WAAW;AAAA,IAC9B;AAAA,IACA;AACE,iBAAO,0BAAY,UAAU;AAAA,EACjC;AACF;AAEA,SAAS,oBAAoB,YAA6C;AACxE,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,iBAAO,0BAAY,UAAU;AAAA,EACjC;AACF;","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 authTokenPromiseOrString = typeof authToken === "string" ? authToken : authToken();
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: authTokenPromiseOrString,
70
- authTokenQueryKey: getAuthTokenQueryKey(authTokenPromiseOrString),
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
- authTokenPromiseOrString,
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 PromiseKey = /* @__PURE__ */ new WeakMap();
98
- function getAuthTokenQueryKey(authTokenPromiseOrString) {
99
- if (typeof authTokenPromiseOrString === "string") {
100
- return authTokenPromiseOrString;
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: Promise<string> | string;\n authTokenQueryKey: string;\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 authTokenPromiseOrString =\n typeof authToken === \"string\" ? authToken : authToken();\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: authTokenPromiseOrString,\n authTokenQueryKey: getAuthTokenQueryKey(authTokenPromiseOrString),\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n }),\n [\n authTokenPromiseOrString,\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\n// Map promises to a UUID that they can be identified by\nconst PromiseKey = new WeakMap<Promise<string>, string>();\n/*\n *\n * @param getAccessToken - Async function that returns a promise that resolves to a string\n * @returns a resolved string or null from the access token promise\n */\nfunction getAuthTokenQueryKey(\n authTokenPromiseOrString: Promise<string> | string,\n): string {\n // Need to go by equality of the promise to avoid scenarios where\n // 1. The promise is the same, but the function changes\n // 2. The function is the same, but the promise is different ⚠️\n //\n // This does have the unfortunate side effect where if the function result\n // isn't memoized somehow, then it will invalidate the query on every render.\n // This doesn't occur with the current use case of getAccessToken from\n // useAuth, but could in a custom implementation.\n //\n // Other things I explored:\n // 1. Removing promise api, and force user to resolve the promise\n // themselves. The user can already do this with the string API, so\n // it's not necessary, and they could run into issues 1, or 2 if\n // implemented wrong.\n // 2. Memoizing the function - this results in issue 2, where the function\n // is static, but the promise changes. I believe this actually is the\n // case with useAuth since it only sets the client once on initialization,\n // and binds the function to the client after that promise resolves.\n\n if (typeof authTokenPromiseOrString === \"string\") {\n return authTokenPromiseOrString;\n }\n\n const authTokenPromise = authTokenPromiseOrString;\n\n // Cannot memoize on the function because it could remain the same while\n // returning a different promise (and useAuth behaves this way).\n\n const promiseKey = PromiseKey.get(authTokenPromise);\n\n // Side effect, but we we're using a weak map, so it should be pretty safe\n if (!promiseKey) {\n const newPromiseKey = `${Math.random()}`;\n PromiseKey.set(authTokenPromise, newPromiseKey);\n return newPromiseKey;\n } else {\n return promiseKey;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6FS;AA7FT,YAAuB;AA4BvB,MAAM,aAAa,MAAM,cAAqC,MAAS;AAShE,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,2BACJ,OAAO,cAAc,WAAW,YAAY,UAAU;AACxD,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;AAAA,MACX,mBAAmB,qBAAqB,wBAAwB;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;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;AAGA,MAAM,aAAa,oBAAI,QAAiC;AAMxD,SAAS,qBACP,0BACQ;AAoBR,MAAI,OAAO,6BAA6B,UAAU;AAChD,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB;AAKzB,QAAM,aAAa,WAAW,IAAI,gBAAgB;AAGlD,MAAI,CAAC,YAAY;AACf,UAAM,gBAAgB,GAAG,KAAK,OAAO,CAAC;AACtC,eAAW,IAAI,kBAAkB,aAAa;AAC9C,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;","names":[]}
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: Promise<string> | string;
12
- authTokenQueryKey: string;
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 };
@@ -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: string): HeadersInit {\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"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAoC;AAE7B,SAAS,eAAe,WAAgC;AAC7D,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;","names":[]}
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":[]}
@@ -1,4 +1,4 @@
1
- declare function getAuthHeaders(authToken: string): HeadersInit;
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)(await Promise.resolve(authToken)),
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
- throw new import_errors.ApiError({
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 { authTokenQueryKey, baseUrl } = (0, import_api_provider.useApi)();
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
- { authTokenQueryKey, baseUrl }
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(await Promise.resolve(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\n throw new ApiError({\n message,\n status,\n queryType: method.toLowerCase() === \"get\" ? \"query\" : \"mutation\",\n });\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 { authTokenQueryKey, 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 { authTokenQueryKey, 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;AAW5C,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,MAAM,QAAQ,QAAQ,SAAS,CAAC;AAAA,MAClD,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;AAE7D,YAAM,IAAI,uBAAS;AAAA,QACjB;AAAA,QACA;AAAA,QACA,WAAW,OAAO,YAAY,MAAM,QAAQ,UAAU;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAMO,MAAM,4BAA4B,CAIvC,iBACG;AACH,QAAM,EAAE,mBAAmB,QAAQ,QAAI,4BAAO;AAC9C,QAAM,WAAW;AAAA;AAAA,IAEf,GAAG,aAAa;AAAA,IAChB,EAAE,mBAAmB,QAAQ;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
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 isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
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
- "widgets:api-keys:manage",
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, useApi } from \"./api/api-provider.js\";\nimport { ApiKeysTable } from \"./lib/api-keys/api-keys-table.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { useIsHydrated } from \"./lib/use-is-hydrated.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 isHydrated = useIsHydrated();\n const apiKeys = useApiKeys();\n const context = useApi();\n const { state } = useApiKeysContext();\n useListOrganizationApiKeyPermissions({ limit: 100 });\n const permissionsQuery = usePermissions(\n \"widgets:api-keys:manage\",\n context.authToken,\n );\n\n if (!isHydrated || 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;AAqCQ;AApCR,0BAA+C;AAC/C,4BAA6B;AAC7B,6BAAgC;AAChC,6BAA8B;AAC9B,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,sCAAc;AACjC,QAAM,cAAU,2BAAW;AAC3B,QAAM,cAAU,4BAAO;AACvB,QAAM,EAAE,MAAM,QAAI,2CAAkB;AACpC,4DAAqC,EAAE,OAAO,IAAI,CAAC;AACnD,QAAM,uBAAmB;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,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":[]}
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
- import_themes.Dialog.Content,
296
+ import_elements.DialogContent,
297
297
  {
298
298
  maxWidth: "90vw",
299
299
  size: { initial: "3", sm: "4" },