@workos-inc/widgets 1.5.0 → 1.6.0

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 (224) hide show
  1. package/CHANGELOG.md +30 -8
  2. package/dist/cjs/admin-portal-domain-verification.client.cjs +34 -20
  3. package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
  4. package/dist/cjs/admin-portal-domain-verification.client.d.cts +3 -2
  5. package/dist/cjs/{admin-portal-sso-connection-client.cjs → admin-portal-sso-connection.client.cjs} +61 -35
  6. package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -0
  7. package/dist/cjs/admin-portal-sso-connection.client.d.cts +16 -0
  8. package/dist/cjs/api/api-provider.cjs +27 -19
  9. package/dist/cjs/api/api-provider.cjs.map +1 -1
  10. package/dist/cjs/api/api-provider.d.cts +5 -4
  11. package/dist/cjs/api/endpoint.cjs +62 -2
  12. package/dist/cjs/api/endpoint.cjs.map +1 -1
  13. package/dist/cjs/api/endpoint.d.cts +62 -1
  14. package/dist/cjs/api/utils.cjs +10 -0
  15. package/dist/cjs/api/utils.cjs.map +1 -1
  16. package/dist/cjs/api/utils.d.cts +7 -2
  17. package/dist/cjs/api/widgets-api-client.cjs +11 -5
  18. package/dist/cjs/api/widgets-api-client.cjs.map +1 -1
  19. package/dist/cjs/{api-keys-client.cjs → api-keys.client.cjs} +45 -33
  20. package/dist/cjs/api-keys.client.cjs.map +1 -0
  21. package/dist/cjs/api-keys.client.d.cts +15 -0
  22. package/dist/cjs/index.cjs +9 -2
  23. package/dist/cjs/index.cjs.map +1 -1
  24. package/dist/cjs/index.d.cts +6 -2
  25. package/dist/cjs/lib/add-mfa-dialog.cjs +1 -1
  26. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  27. package/dist/cjs/lib/admin-portal-domain-verification.cjs +18 -12
  28. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  29. package/dist/cjs/lib/admin-portal-domain-verification.d.cts +10 -6
  30. package/dist/cjs/lib/admin-portal-sso-connection.cjs +84 -106
  31. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  32. package/dist/cjs/lib/admin-portal-sso-connection.d.cts +13 -6
  33. package/dist/cjs/lib/api-keys/api-keys.cjs +70 -66
  34. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  35. package/dist/cjs/lib/api-keys/api-keys.d.cts +16 -8
  36. package/dist/cjs/lib/card-list.cjs.map +1 -0
  37. package/dist/cjs/lib/constants.cjs +5 -2
  38. package/dist/cjs/lib/constants.cjs.map +1 -1
  39. package/dist/cjs/lib/constants.d.cts +2 -1
  40. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  41. package/dist/cjs/lib/empty-state.cjs +24 -8
  42. package/dist/cjs/lib/empty-state.cjs.map +1 -1
  43. package/dist/cjs/lib/empty-state.d.cts +6 -2
  44. package/dist/cjs/lib/errors.cjs +1 -1
  45. package/dist/cjs/lib/errors.cjs.map +1 -1
  46. package/dist/cjs/lib/generic-error.cjs +56 -58
  47. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  48. package/dist/cjs/lib/generic-error.d.cts +10 -3
  49. package/dist/cjs/lib/identity-providers.cjs +2 -1
  50. package/dist/cjs/lib/identity-providers.cjs.map +1 -1
  51. package/dist/cjs/lib/identity-providers.d.cts +2 -2
  52. package/dist/cjs/lib/oauth-icons.cjs +12 -7
  53. package/dist/cjs/lib/oauth-icons.cjs.map +1 -1
  54. package/dist/cjs/lib/oauth-icons.d.cts +7 -3
  55. package/dist/cjs/lib/organization-switcher.cjs +62 -9
  56. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  57. package/dist/cjs/lib/organization-switcher.d.cts +12 -9
  58. package/dist/cjs/lib/otp-input.cjs +1 -1
  59. package/dist/cjs/lib/otp-input.cjs.map +1 -1
  60. package/dist/cjs/lib/pipes.cjs +343 -0
  61. package/dist/cjs/lib/pipes.cjs.map +1 -0
  62. package/dist/cjs/lib/pipes.d.cts +19 -0
  63. package/dist/cjs/lib/provider-icon.cjs +0 -6
  64. package/dist/cjs/lib/provider-icon.cjs.map +1 -1
  65. package/dist/cjs/lib/provider-icon.d.cts +4 -1
  66. package/dist/cjs/lib/save-button.cjs.map +1 -1
  67. package/dist/cjs/lib/use-permissions.cjs +7 -14
  68. package/dist/cjs/lib/use-permissions.cjs.map +1 -1
  69. package/dist/cjs/lib/use-permissions.d.cts +1 -1
  70. package/dist/cjs/lib/user-profile.cjs +77 -83
  71. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  72. package/dist/cjs/lib/user-profile.d.cts +11 -7
  73. package/dist/cjs/lib/user-security.cjs +31 -25
  74. package/dist/cjs/lib/user-security.cjs.map +1 -1
  75. package/dist/cjs/lib/user-security.d.cts +10 -7
  76. package/dist/cjs/lib/user-sessions.cjs +20 -10
  77. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  78. package/dist/cjs/lib/user-sessions.d.cts +10 -6
  79. package/dist/cjs/lib/users-management.cjs +224 -216
  80. package/dist/cjs/lib/users-management.cjs.map +1 -1
  81. package/dist/cjs/lib/users-management.d.cts +10 -7
  82. package/dist/cjs/lib/utils.cjs +43 -0
  83. package/dist/cjs/lib/utils.cjs.map +1 -1
  84. package/dist/cjs/lib/utils.d.cts +29 -2
  85. package/dist/cjs/organization-switcher.client.cjs +47 -20
  86. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  87. package/dist/cjs/organization-switcher.client.d.cts +2 -1
  88. package/dist/cjs/pipes.client.cjs +64 -0
  89. package/dist/cjs/pipes.client.cjs.map +1 -0
  90. package/dist/cjs/pipes.client.d.cts +15 -0
  91. package/dist/cjs/user-profile.client.cjs +29 -16
  92. package/dist/cjs/user-profile.client.cjs.map +1 -1
  93. package/dist/cjs/user-profile.client.d.cts +4 -3
  94. package/dist/cjs/user-security.client.cjs +32 -14
  95. package/dist/cjs/user-security.client.cjs.map +1 -1
  96. package/dist/cjs/user-security.client.d.cts +3 -2
  97. package/dist/cjs/user-sessions.client.cjs +42 -28
  98. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  99. package/dist/cjs/user-sessions.client.d.cts +4 -2
  100. package/dist/cjs/users-management.client.cjs +38 -27
  101. package/dist/cjs/users-management.client.cjs.map +1 -1
  102. package/dist/cjs/users-management.client.d.cts +3 -2
  103. package/dist/cjs/workos-widgets.client.cjs +7 -12
  104. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  105. package/dist/css/lib/provider-icon.css +16 -11
  106. package/dist/esm/admin-portal-domain-verification.client.d.ts +3 -2
  107. package/dist/esm/admin-portal-domain-verification.client.js +34 -21
  108. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  109. package/dist/esm/admin-portal-sso-connection.client.d.ts +16 -0
  110. package/dist/esm/{admin-portal-sso-connection-client.js → admin-portal-sso-connection.client.js} +61 -36
  111. package/dist/esm/admin-portal-sso-connection.client.js.map +1 -0
  112. package/dist/esm/api/api-provider.d.ts +5 -4
  113. package/dist/esm/api/api-provider.js +26 -19
  114. package/dist/esm/api/api-provider.js.map +1 -1
  115. package/dist/esm/api/endpoint.d.ts +62 -1
  116. package/dist/esm/api/endpoint.js +56 -2
  117. package/dist/esm/api/endpoint.js.map +1 -1
  118. package/dist/esm/api/utils.d.ts +7 -2
  119. package/dist/esm/api/utils.js +9 -0
  120. package/dist/esm/api/utils.js.map +1 -1
  121. package/dist/esm/api/widgets-api-client.js +11 -5
  122. package/dist/esm/api/widgets-api-client.js.map +1 -1
  123. package/dist/esm/api-keys.client.d.ts +15 -0
  124. package/dist/esm/api-keys.client.js +75 -0
  125. package/dist/esm/api-keys.client.js.map +1 -0
  126. package/dist/esm/index.d.ts +6 -2
  127. package/dist/esm/index.js +9 -2
  128. package/dist/esm/index.js.map +1 -1
  129. package/dist/esm/lib/add-mfa-dialog.js +1 -1
  130. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  131. package/dist/esm/lib/admin-portal-domain-verification.d.ts +10 -6
  132. package/dist/esm/lib/admin-portal-domain-verification.js +18 -12
  133. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  134. package/dist/esm/lib/admin-portal-sso-connection.d.ts +13 -6
  135. package/dist/esm/lib/admin-portal-sso-connection.js +88 -107
  136. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  137. package/dist/esm/lib/api-keys/api-keys.d.ts +16 -8
  138. package/dist/esm/lib/api-keys/api-keys.js +69 -54
  139. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  140. package/dist/esm/lib/card-list.js.map +1 -0
  141. package/dist/esm/lib/constants.d.ts +2 -1
  142. package/dist/esm/lib/constants.js +3 -1
  143. package/dist/esm/lib/constants.js.map +1 -1
  144. package/dist/esm/lib/elevated-access.js.map +1 -1
  145. package/dist/esm/lib/empty-state.d.ts +6 -2
  146. package/dist/esm/lib/empty-state.js +24 -8
  147. package/dist/esm/lib/empty-state.js.map +1 -1
  148. package/dist/esm/lib/errors.js +1 -1
  149. package/dist/esm/lib/errors.js.map +1 -1
  150. package/dist/esm/lib/generic-error.d.ts +10 -3
  151. package/dist/esm/lib/generic-error.js +56 -60
  152. package/dist/esm/lib/generic-error.js.map +1 -1
  153. package/dist/esm/lib/identity-providers.d.ts +2 -2
  154. package/dist/esm/lib/identity-providers.js +2 -1
  155. package/dist/esm/lib/identity-providers.js.map +1 -1
  156. package/dist/esm/lib/oauth-icons.d.ts +7 -3
  157. package/dist/esm/lib/oauth-icons.js +11 -6
  158. package/dist/esm/lib/oauth-icons.js.map +1 -1
  159. package/dist/esm/lib/organization-switcher.d.ts +12 -9
  160. package/dist/esm/lib/organization-switcher.js +54 -9
  161. package/dist/esm/lib/organization-switcher.js.map +1 -1
  162. package/dist/esm/lib/otp-input.js +1 -1
  163. package/dist/esm/lib/otp-input.js.map +1 -1
  164. package/dist/esm/lib/pipes.d.ts +19 -0
  165. package/dist/esm/lib/pipes.js +334 -0
  166. package/dist/esm/lib/pipes.js.map +1 -0
  167. package/dist/esm/lib/provider-icon.d.ts +4 -1
  168. package/dist/esm/lib/provider-icon.js +0 -8
  169. package/dist/esm/lib/provider-icon.js.map +1 -1
  170. package/dist/esm/lib/save-button.js.map +1 -1
  171. package/dist/esm/lib/use-permissions.d.ts +1 -1
  172. package/dist/esm/lib/use-permissions.js +8 -15
  173. package/dist/esm/lib/use-permissions.js.map +1 -1
  174. package/dist/esm/lib/user-profile.d.ts +11 -7
  175. package/dist/esm/lib/user-profile.js +82 -75
  176. package/dist/esm/lib/user-profile.js.map +1 -1
  177. package/dist/esm/lib/user-security.d.ts +10 -7
  178. package/dist/esm/lib/user-security.js +35 -26
  179. package/dist/esm/lib/user-security.js.map +1 -1
  180. package/dist/esm/lib/user-sessions.d.ts +10 -6
  181. package/dist/esm/lib/user-sessions.js +21 -10
  182. package/dist/esm/lib/user-sessions.js.map +1 -1
  183. package/dist/esm/lib/users-management.d.ts +10 -7
  184. package/dist/esm/lib/users-management.js +230 -217
  185. package/dist/esm/lib/users-management.js.map +1 -1
  186. package/dist/esm/lib/utils.d.ts +29 -2
  187. package/dist/esm/lib/utils.js +46 -1
  188. package/dist/esm/lib/utils.js.map +1 -1
  189. package/dist/esm/organization-switcher.client.d.ts +2 -1
  190. package/dist/esm/organization-switcher.client.js +47 -21
  191. package/dist/esm/organization-switcher.client.js.map +1 -1
  192. package/dist/esm/pipes.client.d.ts +15 -0
  193. package/dist/esm/pipes.client.js +42 -0
  194. package/dist/esm/pipes.client.js.map +1 -0
  195. package/dist/esm/user-profile.client.d.ts +4 -3
  196. package/dist/esm/user-profile.client.js +29 -17
  197. package/dist/esm/user-profile.client.js.map +1 -1
  198. package/dist/esm/user-security.client.d.ts +3 -2
  199. package/dist/esm/user-security.client.js +32 -15
  200. package/dist/esm/user-security.client.js.map +1 -1
  201. package/dist/esm/user-sessions.client.d.ts +4 -2
  202. package/dist/esm/user-sessions.client.js +43 -30
  203. package/dist/esm/user-sessions.client.js.map +1 -1
  204. package/dist/esm/users-management.client.d.ts +3 -2
  205. package/dist/esm/users-management.client.js +38 -28
  206. package/dist/esm/users-management.client.js.map +1 -1
  207. package/dist/esm/workos-widgets.client.js +7 -12
  208. package/dist/esm/workos-widgets.client.js.map +1 -1
  209. package/package.json +20 -10
  210. package/dist/cjs/admin-portal-sso-connection-client.cjs.map +0 -1
  211. package/dist/cjs/admin-portal-sso-connection-client.d.cts +0 -12
  212. package/dist/cjs/api-keys-client.cjs.map +0 -1
  213. package/dist/cjs/api-keys-client.d.cts +0 -10
  214. package/dist/cjs/card-list.cjs.map +0 -1
  215. package/dist/esm/admin-portal-sso-connection-client.d.ts +0 -12
  216. package/dist/esm/admin-portal-sso-connection-client.js.map +0 -1
  217. package/dist/esm/api-keys-client.d.ts +0 -10
  218. package/dist/esm/api-keys-client.js +0 -65
  219. package/dist/esm/api-keys-client.js.map +0 -1
  220. package/dist/esm/card-list.js.map +0 -1
  221. /package/dist/cjs/{card-list.cjs → lib/card-list.cjs} +0 -0
  222. /package/dist/cjs/{card-list.d.cts → lib/card-list.d.cts} +0 -0
  223. /package/dist/esm/{card-list.d.ts → lib/card-list.d.ts} +0 -0
  224. /package/dist/esm/{card-list.js → lib/card-list.js} +0 -0
@@ -1,6 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { IdentityProvider } from './identity-providers.cjs';
4
+ import { WidgetRootDomProps } from './utils.cjs';
5
+ import '../api/endpoint.cjs';
6
+ import '@tanstack/react-query';
7
+ import '../api/widgets-api-client.cjs';
4
8
 
5
9
  interface NotConfiguredProps {
6
10
  connectionStatus: "NotConfigured";
@@ -23,20 +27,23 @@ interface RequiresActionProps {
23
27
  expiryDate: Date | null;
24
28
  }
25
29
  type AdminPortalSsoConnectionStatusProps = NotConfiguredProps | InactiveProps | ActiveProps | RequiresActionProps;
26
- type AdminPortalSsoConnectionProps = AdminPortalSsoConnectionStatusProps & {
30
+ type AdminPortalSsoConnectionProps = WidgetRootDomProps & AdminPortalSsoConnectionStatusProps & {
27
31
  currentDate: Date | null;
28
32
  lastSession: Date | null;
29
33
  adminPortalOpenButton: React.ReactNode;
30
34
  };
31
- declare const AdminPortalSsoConnection: ({ currentDate, connectionStatus, identityProvider, expiryDate, lastSession, adminPortalOpenButton, }: AdminPortalSsoConnectionProps) => react_jsx_runtime.JSX.Element;
35
+ declare const AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps>;
32
36
  declare function AdminPortalOpenButton({ isPending, href, initConfig, }: {
33
37
  isPending: boolean;
34
38
  href: string | null;
35
39
  initConfig: () => void;
36
40
  }): react_jsx_runtime.JSX.Element;
37
- declare const AdminPortalSsoConnectionLoading: React.FC;
38
- declare function AdminPortalSsoConnectionError({ error }: {
41
+ interface AdminPortalSsoConnectionLoadingProps extends WidgetRootDomProps {
42
+ }
43
+ declare const AdminPortalSsoConnectionLoading: React.FC<AdminPortalSsoConnectionLoadingProps>;
44
+ interface AdminPortalSsoConnectionErrorProps extends WidgetRootDomProps {
39
45
  error: unknown;
40
- }): react_jsx_runtime.JSX.Element;
46
+ }
47
+ declare const AdminPortalSsoConnectionError: React.FC<AdminPortalSsoConnectionErrorProps>;
41
48
 
42
- export { AdminPortalOpenButton, AdminPortalSsoConnection, AdminPortalSsoConnectionError, AdminPortalSsoConnectionLoading, type AdminPortalSsoConnectionProps, type AdminPortalSsoConnectionStatusProps };
49
+ export { AdminPortalOpenButton, AdminPortalSsoConnection, AdminPortalSsoConnectionError, type AdminPortalSsoConnectionErrorProps, AdminPortalSsoConnectionLoading, type AdminPortalSsoConnectionLoadingProps, type AdminPortalSsoConnectionProps, type AdminPortalSsoConnectionStatusProps };
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,21 +15,12 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
  var api_keys_exports = {};
30
20
  __export(api_keys_exports, {
31
- ApiKeysEmptyState: () => ApiKeysEmptyState,
21
+ ApiKeys: () => ApiKeys,
32
22
  ApiKeysError: () => ApiKeysError,
33
- ApiKeysLoading: () => ApiKeysLoading,
34
- ApiKeysRoot: () => ApiKeysRoot
23
+ ApiKeysLoading: () => ApiKeysLoading
35
24
  });
36
25
  module.exports = __toCommonJS(api_keys_exports);
37
26
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -42,70 +31,85 @@ var import_empty_state = require("../empty-state.js");
42
31
  var import_react_icons = require("@radix-ui/react-icons");
43
32
  var import_skeleton_table = require("./skeleton-table.js");
44
33
  var import_create_api_key = require("./create-api-key.js");
45
- var import_clsx = __toESM(require("clsx"), 1);
46
- function ApiKeysError({ error }) {
47
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_generic_error.GenericError, { error });
48
- }
49
- function ApiKeysEmptyState() {
50
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51
- import_empty_state.EmptyState,
34
+ var import_utils = require("../utils.js");
35
+ var import_api_keys_search_provider = require("./api-keys-search-provider.js");
36
+ var import_api_keys_table = require("./api-keys-table.js");
37
+ const ApiKeys = ({
38
+ apiKeys,
39
+ searchQuery,
40
+ ...domProps
41
+ }) => {
42
+ return apiKeys.data.length === 0 && !searchQuery ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ApiKeysEmptyState, { ...getWidgetRootDomProps("resolved", domProps) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_keys_search_provider.ApiKeysSearchProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
43
+ import_api_keys_table.ApiKeysTable,
52
44
  {
53
- heading: "No API keys yet",
54
- message: "Generate an API key to authenticate and interact with our API.",
55
- action: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_api_key.CreateApiKeyButton, {})
45
+ apiKeys,
46
+ ...getWidgetRootDomProps("resolved", domProps)
56
47
  }
57
- );
58
- }
59
- function ApiKeysLoading() {
60
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "between", align: "center", children: [
62
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
- import_elements.TextField,
64
- {
65
- name: "api-keys-widget-search",
66
- style: { width: "390px" },
67
- placeholder: "Search by name",
68
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextFieldSlot, { side: "left", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.MagnifyingGlassIcon, { "aria-hidden": "true", height: "16", width: "16" }) })
69
- }
70
- ) }),
71
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Button, { children: "Create API key" }) })
72
- ] }),
73
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
- import_skeleton_table.SkeletonTable,
75
- {
76
- numRows: 5,
77
- columns: [
78
- { children: "Name", width: "25%" },
79
- { children: "Secret key", width: "25%" },
80
- { children: "Last used", width: "25%" },
81
- { children: "Created", width: "25%" }
82
- ]
83
- }
84
- )
85
- ] });
86
- }
87
- function ApiKeysRoot({
88
- className,
89
- children,
90
- ...props
91
- }) {
92
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
48
+ ) });
49
+ };
50
+ const ApiKeysLoading = (props) => {
51
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
93
52
  import_themes.Flex,
94
53
  {
95
- className: (0, import_clsx.default)("woswidgets-widget", className),
96
- "data-woswidgets-widget-id": "api-keys",
97
54
  direction: "column",
55
+ align: "stretch",
98
56
  gap: "3",
99
- ...props,
100
- children
57
+ ...getWidgetRootDomProps("loading", props),
58
+ children: [
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "between", align: "center", children: [
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
+ import_elements.TextField,
62
+ {
63
+ name: "api-keys-widget-search",
64
+ style: { width: "390px" },
65
+ placeholder: "Search by name",
66
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextFieldSlot, { side: "left", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.MagnifyingGlassIcon, { "aria-hidden": "true", height: "16", width: "16" }) })
67
+ }
68
+ ) }),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Button, { children: "Create API key" }) })
70
+ ] }),
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
72
+ import_skeleton_table.SkeletonTable,
73
+ {
74
+ numRows: 5,
75
+ columns: [
76
+ { children: "Name", width: "25%" },
77
+ { children: "Secret key", width: "25%" },
78
+ { children: "Last used", width: "25%" },
79
+ { children: "Created", width: "25%" }
80
+ ]
81
+ }
82
+ )
83
+ ]
101
84
  }
102
85
  );
86
+ };
87
+ const ApiKeysError = ({ error, ...domProps }) => {
88
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_generic_error.GenericError, { error, ...getWidgetRootDomProps("error", domProps) });
89
+ };
90
+ function ApiKeysEmptyState(props) {
91
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
92
+ import_empty_state.EmptyState,
93
+ {
94
+ heading: "No API keys yet",
95
+ message: "Generate an API key to authenticate and interact with our API.",
96
+ action: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_api_key.CreateApiKeyButton, {}),
97
+ ...props
98
+ }
99
+ );
100
+ }
101
+ function getWidgetRootDomProps(state, domProps) {
102
+ return (0, import_utils.getDomProps)({
103
+ ...domProps,
104
+ isWidgetRoot: true,
105
+ widgetId: "api-keys",
106
+ widgetState: state
107
+ });
103
108
  }
104
109
  // Annotate the CommonJS export names for ESM import in node:
105
110
  0 && (module.exports = {
106
- ApiKeysEmptyState,
111
+ ApiKeys,
107
112
  ApiKeysError,
108
- ApiKeysLoading,
109
- ApiKeysRoot
113
+ ApiKeysLoading
110
114
  });
111
115
  //# sourceMappingURL=api-keys.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/api-keys.tsx"],"sourcesContent":["import { Button, Flex, Skeleton } from \"@radix-ui/themes\";\nimport { TextField, TextFieldSlot } from \"../elements.js\";\nimport { GenericError } from \"../generic-error.js\";\nimport { EmptyState } from \"../empty-state.js\";\nimport { MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport { SkeletonTable } from \"./skeleton-table.js\";\nimport { CreateApiKeyButton } from \"./create-api-key.js\";\nimport clsx from \"clsx\";\n\nexport function ApiKeysError({ error }: { error: unknown }) {\n return <GenericError error={error} />;\n}\n\nexport function ApiKeysEmptyState() {\n return (\n <EmptyState\n heading=\"No API keys yet\"\n message=\"Generate an API key to authenticate and interact with our API.\"\n action={<CreateApiKeyButton />}\n />\n );\n}\n\nexport function ApiKeysLoading() {\n return (\n <>\n <Flex justify=\"between\" align=\"center\">\n <Skeleton>\n <TextField\n name=\"api-keys-widget-search\"\n style={{ width: \"390px\" }}\n placeholder=\"Search by name\"\n >\n <TextFieldSlot side=\"left\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n </Skeleton>\n <Skeleton>\n <Button>Create API key</Button>\n </Skeleton>\n </Flex>\n <SkeletonTable\n numRows={5}\n columns={[\n { children: \"Name\", width: \"25%\" },\n { children: \"Secret key\", width: \"25%\" },\n { children: \"Last used\", width: \"25%\" },\n { children: \"Created\", width: \"25%\" },\n ]}\n />\n </>\n );\n}\n\nexport function ApiKeysRoot({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof Flex>) {\n return (\n <Flex\n className={clsx(\"woswidgets-widget\", className)}\n data-woswidgets-widget-id=\"api-keys\"\n direction=\"column\"\n gap=\"3\"\n {...props}\n >\n {children}\n </Flex>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUS;AAVT,oBAAuC;AACvC,sBAAyC;AACzC,2BAA6B;AAC7B,yBAA2B;AAC3B,yBAAoC;AACpC,4BAA8B;AAC9B,4BAAmC;AACnC,kBAAiB;AAEV,SAAS,aAAa,EAAE,MAAM,GAAuB;AAC1D,SAAO,4CAAC,qCAAa,OAAc;AACrC;AAEO,SAAS,oBAAoB;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,QAAQ,4CAAC,4CAAmB;AAAA;AAAA,EAC9B;AAEJ;AAEO,SAAS,iBAAiB;AAC/B,SACE,4EACE;AAAA,iDAAC,sBAAK,SAAQ,WAAU,OAAM,UAC5B;AAAA,kDAAC,0BACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,EAAE,OAAO,QAAQ;AAAA,UACxB,aAAY;AAAA,UAEZ,sDAAC,iCAAc,MAAK,QAClB,sDAAC,0CAAoB,eAAY,QAAO,QAAO,MAAK,OAAM,MAAK,GACjE;AAAA;AAAA,MACF,GACF;AAAA,MACA,4CAAC,0BACC,sDAAC,wBAAO,4BAAc,GACxB;AAAA,OACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,UAAU,QAAQ,OAAO,MAAM;AAAA,UACjC,EAAE,UAAU,cAAc,OAAO,MAAM;AAAA,UACvC,EAAE,UAAU,aAAa,OAAO,MAAM;AAAA,UACtC,EAAE,UAAU,WAAW,OAAO,MAAM;AAAA,QACtC;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsC;AACpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,YAAAA,SAAK,qBAAqB,SAAS;AAAA,MAC9C,6BAA0B;AAAA,MAC1B,WAAU;AAAA,MACV,KAAI;AAAA,MACH,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":["clsx"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/api-keys.tsx"],"sourcesContent":["import { Button, Flex, Skeleton } from \"@radix-ui/themes\";\nimport { TextField, TextFieldSlot } from \"../elements.js\";\nimport { GenericError } from \"../generic-error.js\";\nimport { EmptyState } from \"../empty-state.js\";\nimport { MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport { SkeletonTable } from \"./skeleton-table.js\";\nimport { CreateApiKeyButton } from \"./create-api-key.js\";\nimport { getDomProps, WidgetRootDomProps, WidgetRootState } from \"../utils.js\";\nimport { ListOrganizationApiKeysResponse } from \"../../api/endpoint.js\";\nimport { ApiKeysSearchProvider } from \"./api-keys-search-provider.js\";\nimport { ApiKeysTable } from \"./api-keys-table.js\";\n\ninterface ApiKeysProps extends WidgetRootDomProps {\n apiKeys: ListOrganizationApiKeysResponse;\n searchQuery: string | null;\n}\n\nconst ApiKeys: React.FC<ApiKeysProps> = ({\n apiKeys,\n searchQuery,\n ...domProps\n}) => {\n return apiKeys.data.length === 0 && !searchQuery ? (\n <ApiKeysEmptyState {...getWidgetRootDomProps(\"resolved\", domProps)} />\n ) : (\n <ApiKeysSearchProvider>\n <ApiKeysTable\n apiKeys={apiKeys}\n {...getWidgetRootDomProps(\"resolved\", domProps)}\n />\n </ApiKeysSearchProvider>\n );\n};\n\ninterface ApiKeysLoadingProps extends WidgetRootDomProps {}\n\nconst ApiKeysLoading: React.FC<ApiKeysLoadingProps> = (props) => {\n return (\n <Flex\n direction=\"column\"\n align=\"stretch\"\n gap=\"3\"\n {...getWidgetRootDomProps(\"loading\", props)}\n >\n <Flex justify=\"between\" align=\"center\">\n <Skeleton>\n <TextField\n name=\"api-keys-widget-search\"\n style={{ width: \"390px\" }}\n placeholder=\"Search by name\"\n >\n <TextFieldSlot side=\"left\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n </Skeleton>\n <Skeleton>\n <Button>Create API key</Button>\n </Skeleton>\n </Flex>\n <SkeletonTable\n numRows={5}\n columns={[\n { children: \"Name\", width: \"25%\" },\n { children: \"Secret key\", width: \"25%\" },\n { children: \"Last used\", width: \"25%\" },\n { children: \"Created\", width: \"25%\" },\n ]}\n />\n </Flex>\n );\n};\n\ninterface ApiKeysErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst ApiKeysError: React.FC<ApiKeysErrorProps> = ({ error, ...domProps }) => {\n return (\n <GenericError error={error} {...getWidgetRootDomProps(\"error\", domProps)} />\n );\n};\n\nfunction ApiKeysEmptyState(props: WidgetRootDomProps) {\n return (\n <EmptyState\n heading=\"No API keys yet\"\n message=\"Generate an API key to authenticate and interact with our API.\"\n action={<CreateApiKeyButton />}\n {...props}\n />\n );\n}\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"api-keys\",\n widgetState: state,\n });\n}\n\nexport type { ApiKeysProps, ApiKeysLoadingProps, ApiKeysErrorProps };\nexport { ApiKeys, ApiKeysLoading, ApiKeysError };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBI;AAvBJ,oBAAuC;AACvC,sBAAyC;AACzC,2BAA6B;AAC7B,yBAA2B;AAC3B,yBAAoC;AACpC,4BAA8B;AAC9B,4BAAmC;AACnC,mBAAiE;AAEjE,sCAAsC;AACtC,4BAA6B;AAO7B,MAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SAAO,QAAQ,KAAK,WAAW,KAAK,CAAC,cACnC,4CAAC,qBAAmB,GAAG,sBAAsB,YAAY,QAAQ,GAAG,IAEpE,4CAAC,yDACC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACC,GAAG,sBAAsB,YAAY,QAAQ;AAAA;AAAA,EAChD,GACF;AAEJ;AAIA,MAAM,iBAAgD,CAAC,UAAU;AAC/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MACN,KAAI;AAAA,MACH,GAAG,sBAAsB,WAAW,KAAK;AAAA,MAE1C;AAAA,qDAAC,sBAAK,SAAQ,WAAU,OAAM,UAC5B;AAAA,sDAAC,0BACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO,EAAE,OAAO,QAAQ;AAAA,cACxB,aAAY;AAAA,cAEZ,sDAAC,iCAAc,MAAK,QAClB,sDAAC,0CAAoB,eAAY,QAAO,QAAO,MAAK,OAAM,MAAK,GACjE;AAAA;AAAA,UACF,GACF;AAAA,UACA,4CAAC,0BACC,sDAAC,wBAAO,4BAAc,GACxB;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS;AAAA,cACP,EAAE,UAAU,QAAQ,OAAO,MAAM;AAAA,cACjC,EAAE,UAAU,cAAc,OAAO,MAAM;AAAA,cACvC,EAAE,UAAU,aAAa,OAAO,MAAM;AAAA,cACtC,EAAE,UAAU,WAAW,OAAO,MAAM;AAAA,YACtC;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAMA,MAAM,eAA4C,CAAC,EAAE,OAAO,GAAG,SAAS,MAAM;AAC5E,SACE,4CAAC,qCAAa,OAAe,GAAG,sBAAsB,SAAS,QAAQ,GAAG;AAE9E;AAEA,SAAS,kBAAkB,OAA2B;AACpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,QAAQ,4CAAC,4CAAmB;AAAA,MAC3B,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,sBACP,OACA,UACA;AACA,aAAO,0BAAY;AAAA,IACjB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACH;","names":[]}
@@ -1,11 +1,19 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { Flex } from '@radix-ui/themes';
1
+ import { WidgetRootDomProps } from '../utils.cjs';
2
+ import { ListOrganizationApiKeysResponse } from '../../api/endpoint.cjs';
3
+ import '@tanstack/react-query';
4
+ import '../../api/widgets-api-client.cjs';
3
5
 
4
- declare function ApiKeysError({ error }: {
6
+ interface ApiKeysProps extends WidgetRootDomProps {
7
+ apiKeys: ListOrganizationApiKeysResponse;
8
+ searchQuery: string | null;
9
+ }
10
+ declare const ApiKeys: React.FC<ApiKeysProps>;
11
+ interface ApiKeysLoadingProps extends WidgetRootDomProps {
12
+ }
13
+ declare const ApiKeysLoading: React.FC<ApiKeysLoadingProps>;
14
+ interface ApiKeysErrorProps extends WidgetRootDomProps {
5
15
  error: unknown;
6
- }): react_jsx_runtime.JSX.Element;
7
- declare function ApiKeysEmptyState(): react_jsx_runtime.JSX.Element;
8
- declare function ApiKeysLoading(): react_jsx_runtime.JSX.Element;
9
- declare function ApiKeysRoot({ className, children, ...props }: React.ComponentProps<typeof Flex>): react_jsx_runtime.JSX.Element;
16
+ }
17
+ declare const ApiKeysError: React.FC<ApiKeysErrorProps>;
10
18
 
11
- export { ApiKeysEmptyState, ApiKeysError, ApiKeysLoading, ApiKeysRoot };
19
+ export { ApiKeys, ApiKeysError, type ApiKeysErrorProps, ApiKeysLoading, type ApiKeysLoadingProps, type ApiKeysProps };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/card-list.tsx"],"sourcesContent":["import { Box, Card, CardProps, Inset } from \"@radix-ui/themes\";\n\nexport function Root({ children, ...props }: CardProps) {\n return (\n <Card size=\"2\" {...props} className=\"woswidgets-card-list\">\n <Inset side=\"all\" clip=\"padding-box\">\n {children}\n </Inset>\n </Card>\n );\n}\n\nexport function Item({ children }: { children: React.ReactNode }) {\n return (\n <Inset\n side=\"x\"\n px=\"current\"\n className=\"woswidgets-card-list-item\"\n clip=\"padding-box\"\n >\n <Box px=\"4\" py=\"4\">\n {children}\n </Box>\n </Inset>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKM;AALN,oBAA4C;AAErC,SAAS,KAAK,EAAE,UAAU,GAAG,MAAM,GAAc;AACtD,SACE,4CAAC,sBAAK,MAAK,KAAK,GAAG,OAAO,WAAU,wBAClC,sDAAC,uBAAM,MAAK,OAAM,MAAK,eACpB,UACH,GACF;AAEJ;AAEO,SAAS,KAAK,EAAE,SAAS,GAAkC;AAChE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,IAAG;AAAA,MACH,WAAU;AAAA,MACV,MAAK;AAAA,MAEL,sDAAC,qBAAI,IAAG,KAAI,IAAG,KACZ,UACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -20,16 +20,19 @@ var constants_exports = {};
20
20
  __export(constants_exports, {
21
21
  USER_ROW_LIMIT: () => USER_ROW_LIMIT,
22
22
  WIDGETS_API_VERSION: () => WIDGETS_API_VERSION,
23
- WIDGETS_CLASS_NAMESPACE: () => WIDGETS_CLASS_NAMESPACE
23
+ WIDGETS_CLASS_NAMESPACE: () => WIDGETS_CLASS_NAMESPACE,
24
+ WIDGETS_DATA_ATTRIBUTE_NAMESPACE: () => WIDGETS_DATA_ATTRIBUTE_NAMESPACE
24
25
  });
25
26
  module.exports = __toCommonJS(constants_exports);
26
27
  const USER_ROW_LIMIT = 10;
27
28
  const WIDGETS_API_VERSION = "1";
28
29
  const WIDGETS_CLASS_NAMESPACE = "woswidgets";
30
+ const WIDGETS_DATA_ATTRIBUTE_NAMESPACE = "woswidgets";
29
31
  // Annotate the CommonJS export names for ESM import in node:
30
32
  0 && (module.exports = {
31
33
  USER_ROW_LIMIT,
32
34
  WIDGETS_API_VERSION,
33
- WIDGETS_CLASS_NAMESPACE
35
+ WIDGETS_CLASS_NAMESPACE,
36
+ WIDGETS_DATA_ATTRIBUTE_NAMESPACE
34
37
  });
35
38
  //# sourceMappingURL=constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/constants.ts"],"sourcesContent":["export const USER_ROW_LIMIT = 10;\nexport const WIDGETS_API_VERSION = \"1\";\nexport const WIDGETS_CLASS_NAMESPACE = \"woswidgets\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,0BAA0B;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/constants.ts"],"sourcesContent":["export const USER_ROW_LIMIT = 10;\nexport const WIDGETS_API_VERSION = \"1\";\nexport const WIDGETS_CLASS_NAMESPACE = \"woswidgets\";\nexport const WIDGETS_DATA_ATTRIBUTE_NAMESPACE = \"woswidgets\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,0BAA0B;AAChC,MAAM,mCAAmC;","names":[]}
@@ -1,5 +1,6 @@
1
1
  declare const USER_ROW_LIMIT = 10;
2
2
  declare const WIDGETS_API_VERSION = "1";
3
3
  declare const WIDGETS_CLASS_NAMESPACE = "woswidgets";
4
+ declare const WIDGETS_DATA_ATTRIBUTE_NAMESPACE = "woswidgets";
4
5
 
5
- export { USER_ROW_LIMIT, WIDGETS_API_VERSION, WIDGETS_CLASS_NAMESPACE };
6
+ export { USER_ROW_LIMIT, WIDGETS_API_VERSION, WIDGETS_CLASS_NAMESPACE, WIDGETS_DATA_ATTRIBUTE_NAMESPACE };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"@radix-ui/react-form\";\nimport { AlertDialog, Callout, Dialog, Flex, Text } from \"@radix-ui/themes\";\nimport { useMe, useSendVerification, useVerify } from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { PrimaryButton, SecondaryButton } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: () => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={() => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.();\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useSendVerification({\n mutation: { onSuccess: (data) => onSuccess(data.authenticationChallenge) },\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired\n ? \"Your verification token has expired\"\n : \"Verify your identity\"}\n </Title>\n\n <Description color=\"gray\" mb=\"5\">\n To continue, we need to confirm your identity. We'll send a temporary\n verification code to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n .\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <SecondaryButton type=\"button\" disabled={sendVerification.isPending}>\n Cancel\n </SecondaryButton>\n </Close>\n <PrimaryButton type=\"submit\" loading={sendVerification.isPending}>\n Send verification code\n </PrimaryButton>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: () => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useVerify();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n data: {\n code,\n authenticationChallengeId,\n },\n });\n\n const in10Seconds = new Date(Date.now() + 5 * 1000);\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n // expiresAt: newAuthState.expiresAt,\n expiresAt: in10Seconds.toISOString(),\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess();\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>Verify your identity</Title>\n\n <Description color=\"gray\">\n A verification code was sent to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n . Please enter it below.\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <SecondaryButton type=\"button\">Cancel</SecondaryButton>\n </Close>\n\n <PrimaryButton type=\"submit\" loading={isSubmitting}>\n Confirm\n </PrimaryButton>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"@radix-ui/react-form\";\nimport { AlertDialog, Callout, Dialog, Flex, Text } from \"@radix-ui/themes\";\nimport { useMe, useSendVerification, useVerify } from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { PrimaryButton, SecondaryButton } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: () => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n // FIXME: This should be refactored\n // eslint-disable-next-line react-hooks/refs\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={() => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.();\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useSendVerification({\n mutation: { onSuccess: (data) => onSuccess(data.authenticationChallenge) },\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired\n ? \"Your verification token has expired\"\n : \"Verify your identity\"}\n </Title>\n\n <Description color=\"gray\" mb=\"5\">\n To continue, we need to confirm your identity. We'll send a temporary\n verification code to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n .\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <SecondaryButton type=\"button\" disabled={sendVerification.isPending}>\n Cancel\n </SecondaryButton>\n </Close>\n <PrimaryButton type=\"submit\" loading={sendVerification.isPending}>\n Send verification code\n </PrimaryButton>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: () => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useVerify();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n data: {\n code,\n authenticationChallengeId,\n },\n });\n\n const in10Seconds = new Date(Date.now() + 5 * 1000);\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n // expiresAt: newAuthState.expiresAt,\n expiresAt: in10Seconds.toISOString(),\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess();\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>Verify your identity</Title>\n\n <Description color=\"gray\">\n A verification code was sent to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n . Please enter it below.\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <SecondaryButton type=\"button\">Cancel</SecondaryButton>\n </Close>\n\n <PrimaryButton type=\"submit\" loading={isSubmitting}>\n Confirm\n </PrimaryButton>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n"],"mappings":"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","names":[]}
@@ -23,14 +23,30 @@ __export(empty_state_exports, {
23
23
  module.exports = __toCommonJS(empty_state_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_themes = require("@radix-ui/themes");
26
- function EmptyState({ heading, message, action }) {
27
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { p: "6", gap: "4", justify: "center", align: "center", direction: "column", children: [
28
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", maxWidth: "420px", children: [
29
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children: heading }),
30
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "p", align: "center", wrap: "balance", color: "gray", children: message })
31
- ] }),
32
- action
33
- ] });
26
+ function EmptyState({
27
+ heading,
28
+ message,
29
+ action,
30
+ ...domProps
31
+ }) {
32
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
33
+ import_themes.Flex,
34
+ {
35
+ p: "6",
36
+ gap: "4",
37
+ justify: "center",
38
+ align: "center",
39
+ direction: "column",
40
+ ...domProps,
41
+ children: [
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", maxWidth: "420px", children: [
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children: heading }),
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "p", align: "center", wrap: "balance", color: "gray", children: message })
45
+ ] }),
46
+ action
47
+ ]
48
+ }
49
+ );
34
50
  }
35
51
  // Annotate the CommonJS export names for ESM import in node:
36
52
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/empty-state.tsx"],"sourcesContent":["import { Flex, Heading, Text } from \"@radix-ui/themes\";\n\ninterface EmptyStateProps {\n heading: string;\n message: string;\n action?: React.ReactNode;\n}\n\nexport function EmptyState({ heading, message, action }: EmptyStateProps) {\n return (\n <Flex p=\"6\" gap=\"4\" justify=\"center\" align=\"center\" direction=\"column\">\n <Flex direction=\"column\" gap=\"1\" maxWidth=\"420px\">\n <Heading size=\"5\" align=\"center\" mb=\"1\" wrap=\"balance\" as=\"h3\">\n {heading}\n </Heading>\n\n <Text as=\"p\" align=\"center\" wrap=\"balance\" color=\"gray\">\n {message}\n </Text>\n </Flex>\n\n {action}\n </Flex>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWM;AAXN,oBAAoC;AAQ7B,SAAS,WAAW,EAAE,SAAS,SAAS,OAAO,GAAoB;AACxE,SACE,6CAAC,sBAAK,GAAE,KAAI,KAAI,KAAI,SAAQ,UAAS,OAAM,UAAS,WAAU,UAC5D;AAAA,iDAAC,sBAAK,WAAU,UAAS,KAAI,KAAI,UAAS,SACxC;AAAA,kDAAC,yBAAQ,MAAK,KAAI,OAAM,UAAS,IAAG,KAAI,MAAK,WAAU,IAAG,MACvD,mBACH;AAAA,MAEA,4CAAC,sBAAK,IAAG,KAAI,OAAM,UAAS,MAAK,WAAU,OAAM,QAC9C,mBACH;AAAA,OACF;AAAA,IAEC;AAAA,KACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/empty-state.tsx"],"sourcesContent":["import { Flex, Heading, Text } from \"@radix-ui/themes\";\nimport { WidgetRootDomProps } from \"./utils.js\";\n\ninterface EmptyStateProps extends WidgetRootDomProps {\n heading: string;\n message: string;\n action?: React.ReactNode;\n}\n\nexport function EmptyState({\n heading,\n message,\n action,\n ...domProps\n}: EmptyStateProps) {\n return (\n <Flex\n p=\"6\"\n gap=\"4\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n {...domProps}\n >\n <Flex direction=\"column\" gap=\"1\" maxWidth=\"420px\">\n <Heading size=\"5\" align=\"center\" mb=\"1\" wrap=\"balance\" as=\"h3\">\n {heading}\n </Heading>\n\n <Text as=\"p\" align=\"center\" wrap=\"balance\" color=\"gray\">\n {message}\n </Text>\n </Flex>\n\n {action}\n </Flex>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAxBN,oBAAoC;AAS7B,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,KAAI;AAAA,MACJ,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAU;AAAA,MACT,GAAG;AAAA,MAEJ;AAAA,qDAAC,sBAAK,WAAU,UAAS,KAAI,KAAI,UAAS,SACxC;AAAA,sDAAC,yBAAQ,MAAK,KAAI,OAAM,UAAS,IAAG,KAAI,MAAK,WAAU,IAAG,MACvD,mBACH;AAAA,UAEA,4CAAC,sBAAK,IAAG,KAAI,OAAM,UAAS,MAAK,WAAU,OAAM,QAC9C,mBACH;AAAA,WACF;AAAA,QAEC;AAAA;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -1,10 +1,14 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { WidgetRootDomProps } from './utils.cjs';
3
+ import '../api/endpoint.cjs';
4
+ import '@tanstack/react-query';
5
+ import '../api/widgets-api-client.cjs';
2
6
 
3
- interface EmptyStateProps {
7
+ interface EmptyStateProps extends WidgetRootDomProps {
4
8
  heading: string;
5
9
  message: string;
6
10
  action?: React.ReactNode;
7
11
  }
8
- declare function EmptyState({ heading, message, action }: EmptyStateProps): react_jsx_runtime.JSX.Element;
12
+ declare function EmptyState({ heading, message, action, ...domProps }: EmptyStateProps): react_jsx_runtime.JSX.Element;
9
13
 
10
14
  export { EmptyState };
@@ -52,7 +52,7 @@ class NoAuthTokenError extends Error {
52
52
  class IncorrectPermissionsError extends Error {
53
53
  constructor(args) {
54
54
  super("Incorrect permissions");
55
- this.name = "NoPermissionError";
55
+ this.name = "IncorrectPermissionsError";
56
56
  this.context = args?.context;
57
57
  }
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/errors.ts"],"sourcesContent":["type QueryType = \"query\" | \"mutation\";\ntype RecordType = \"users\" | \"roles\";\n\nexport class FetchError extends Error {\n queryType: QueryType;\n recordType: RecordType;\n context: unknown;\n constructor(args: {\n message: string;\n queryType: QueryType;\n recordType: RecordType;\n context?: unknown;\n }) {\n super(args.message);\n this.name = \"FetchError\";\n this.queryType = args.queryType;\n this.recordType = args.recordType;\n this.context = args.context;\n }\n}\n\nexport class ApiError extends Error {\n status: number;\n queryType: QueryType;\n recordType: RecordType;\n context: unknown;\n constructor(args: {\n message: string;\n queryType: QueryType;\n recordType: RecordType;\n status: number;\n context?: unknown;\n }) {\n super(args.message);\n this.name = \"ApiError\";\n this.status = args.status;\n this.queryType = args.queryType;\n this.recordType = args.recordType;\n }\n}\n\nexport class NoAuthTokenError extends Error {\n context: unknown;\n constructor(args?: { context?: unknown }) {\n super(\"No auth token provided\");\n this.name = \"NoAuthTokenError\";\n this.context = args?.context;\n }\n}\n\nexport class IncorrectPermissionsError extends Error {\n context: unknown;\n constructor(args?: { context?: unknown }) {\n super(\"Incorrect permissions\");\n this.name = \"NoPermissionError\";\n this.context = args?.context;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,mBAAmB,MAAM;AAAA,EAIpC,YAAY,MAKT;AACD,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,YAAY,KAAK;AACtB,SAAK,aAAa,KAAK;AACvB,SAAK,UAAU,KAAK;AAAA,EACtB;AACF;AAEO,MAAM,iBAAiB,MAAM;AAAA,EAKlC,YAAY,MAMT;AACD,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,SAAK,aAAa,KAAK;AAAA,EACzB;AACF;AAEO,MAAM,yBAAyB,MAAM;AAAA,EAE1C,YAAY,MAA8B;AACxC,UAAM,wBAAwB;AAC9B,SAAK,OAAO;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;AAEO,MAAM,kCAAkC,MAAM;AAAA,EAEnD,YAAY,MAA8B;AACxC,UAAM,uBAAuB;AAC7B,SAAK,OAAO;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/errors.ts"],"sourcesContent":["type QueryType = \"query\" | \"mutation\";\ntype RecordType = \"users\" | \"roles\";\n\nexport class FetchError extends Error {\n queryType: QueryType;\n recordType: RecordType;\n context: unknown;\n constructor(args: {\n message: string;\n queryType: QueryType;\n recordType: RecordType;\n context?: unknown;\n }) {\n super(args.message);\n this.name = \"FetchError\";\n this.queryType = args.queryType;\n this.recordType = args.recordType;\n this.context = args.context;\n }\n}\n\nexport class ApiError extends Error {\n status: number;\n queryType: QueryType;\n recordType: RecordType;\n context: unknown;\n constructor(args: {\n message: string;\n queryType: QueryType;\n recordType: RecordType;\n status: number;\n context?: unknown;\n }) {\n super(args.message);\n this.name = \"ApiError\";\n this.status = args.status;\n this.queryType = args.queryType;\n this.recordType = args.recordType;\n }\n}\n\nexport class NoAuthTokenError extends Error {\n context: unknown;\n constructor(args?: { context?: unknown }) {\n super(\"No auth token provided\");\n this.name = \"NoAuthTokenError\";\n this.context = args?.context;\n }\n}\n\nexport class IncorrectPermissionsError extends Error {\n context: unknown;\n constructor(args?: { context?: unknown }) {\n super(\"Incorrect permissions\");\n this.name = \"IncorrectPermissionsError\";\n this.context = args?.context;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,mBAAmB,MAAM;AAAA,EAIpC,YAAY,MAKT;AACD,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,YAAY,KAAK;AACtB,SAAK,aAAa,KAAK;AACvB,SAAK,UAAU,KAAK;AAAA,EACtB;AACF;AAEO,MAAM,iBAAiB,MAAM;AAAA,EAKlC,YAAY,MAMT;AACD,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,SAAK,aAAa,KAAK;AAAA,EACzB;AACF;AAEO,MAAM,yBAAyB,MAAM;AAAA,EAE1C,YAAY,MAA8B;AACxC,UAAM,wBAAwB;AAC9B,SAAK,OAAO;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;AAEO,MAAM,kCAAkC,MAAM;AAAA,EAEnD,YAAY,MAA8B;AACxC,UAAM,uBAAuB;AAC7B,SAAK,OAAO;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;","names":[]}
@@ -28,7 +28,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var generic_error_exports = {};
30
30
  __export(generic_error_exports, {
31
- GenericError: () => GenericError
31
+ GenericError: () => GenericError,
32
+ getErrorMessage: () => getErrorMessage
32
33
  });
33
34
  module.exports = __toCommonJS(generic_error_exports);
34
35
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -36,74 +37,71 @@ var React = __toESM(require("react"), 1);
36
37
  var import_themes = require("@radix-ui/themes");
37
38
  var import_errors = require("./errors.js");
38
39
  var import_react_icons = require("@radix-ui/react-icons");
39
- function GenericError({ error }) {
40
+ function GenericError({ error, ...domProps }) {
40
41
  React.useEffect(() => {
41
42
  console.error(error);
42
43
  }, [error]);
43
- const render = (heading, message) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { p: "6", justify: "center", align: "center", direction: "column", children: [
44
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
45
- import_themes.Flex,
46
- {
47
- align: "center",
48
- justify: "center",
49
- width: "32px",
50
- height: "32px",
51
- mb: "2",
52
- style: {
53
- borderRadius: "9999px",
54
- backgroundColor: "var(--red-a4)",
55
- color: "var(--red-a11)"
56
- },
57
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.Cross2Icon, { width: "24px", height: "24px" })
58
- }
59
- ),
60
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", maxWidth: "420px", children: [
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children: heading }),
62
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "p", align: "center", wrap: "balance", color: "gray", children: message })
63
- ] })
64
- ] });
44
+ const { heading, message } = getErrorMessage(error);
45
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
46
+ import_themes.Flex,
47
+ {
48
+ p: "6",
49
+ justify: "center",
50
+ align: "center",
51
+ direction: "column",
52
+ ...domProps,
53
+ children: [
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
55
+ import_themes.Flex,
56
+ {
57
+ align: "center",
58
+ justify: "center",
59
+ width: "32px",
60
+ height: "32px",
61
+ mb: "2",
62
+ style: {
63
+ borderRadius: "9999px",
64
+ backgroundColor: "var(--red-a4)",
65
+ color: "var(--red-a11)"
66
+ },
67
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.Cross2Icon, { width: "24px", height: "24px" })
68
+ }
69
+ ),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", maxWidth: "420px", children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children: heading }),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "p", align: "center", wrap: "balance", color: "gray", children: message })
73
+ ] })
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ function getErrorMessage(error) {
65
79
  if (error instanceof import_errors.FetchError) {
66
- return render(
67
- "Error fetching data",
68
- "An error occurred. You may need to configure CORS in the WorkOS Dashboard. Contact your organization admin for support."
69
- );
80
+ return {
81
+ heading: "Error fetching data",
82
+ message: "An error occurred. You may need to configure CORS in the WorkOS Dashboard."
83
+ };
70
84
  }
71
85
  if (error instanceof import_errors.NoAuthTokenError) {
72
- return render(
73
- "Error fetching data",
74
- "Authorization error. You likely forgot to provide an authorization token to the Users Management Widget."
75
- );
76
- }
77
- if (error instanceof import_errors.ApiError && error.status === 404) {
78
- return render(
79
- "Error fetching data",
80
- "Authorization error. Contact your organization admin for support."
81
- );
86
+ return {
87
+ heading: "Authorization error",
88
+ message: "You likely forgot to provide an authorization token to the widget."
89
+ };
82
90
  }
83
91
  if (error instanceof import_errors.IncorrectPermissionsError) {
84
- return render(
85
- "Error fetching data",
86
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
87
- "Incorrect permissions.",
88
- " ",
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
- import_themes.Link,
91
- {
92
- href: "https://workos.com/docs/user-management/widgets/user-management",
93
- target: "_blank",
94
- children: "Check that the correct permissions have been assigned."
95
- }
96
- )
97
- ] })
98
- );
92
+ return {
93
+ heading: "Incorrect permissions",
94
+ message: "Check that the correct permissions have been assigned."
95
+ };
99
96
  }
100
- return render(
101
- "Error fetching data",
102
- "An unknown error occurred. If the problem continues, contact the site owner."
103
- );
97
+ return {
98
+ heading: "Error fetching data",
99
+ message: "An unexpected error occurred. Check your network connection or try refreshing the page."
100
+ };
104
101
  }
105
102
  // Annotate the CommonJS export names for ESM import in node:
106
103
  0 && (module.exports = {
107
- GenericError
104
+ GenericError,
105
+ getErrorMessage
108
106
  });
109
107
  //# sourceMappingURL=generic-error.cjs.map