@workos-inc/widgets 1.5.1 → 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 (192) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/admin-portal-domain-verification.client.cjs +32 -17
  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} +58 -31
  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 +1 -1
  9. package/dist/cjs/api/api-provider.cjs.map +1 -1
  10. package/dist/cjs/api/api-provider.d.cts +1 -1
  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-keys-client.cjs → api-keys.client.cjs} +42 -25
  15. package/dist/cjs/api-keys.client.cjs.map +1 -0
  16. package/dist/cjs/api-keys.client.d.cts +15 -0
  17. package/dist/cjs/index.cjs +9 -2
  18. package/dist/cjs/index.cjs.map +1 -1
  19. package/dist/cjs/index.d.cts +6 -2
  20. package/dist/cjs/lib/admin-portal-domain-verification.cjs +33 -34
  21. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  22. package/dist/cjs/lib/admin-portal-domain-verification.d.cts +10 -6
  23. package/dist/cjs/lib/admin-portal-sso-connection.cjs +79 -79
  24. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  25. package/dist/cjs/lib/admin-portal-sso-connection.d.cts +13 -6
  26. package/dist/cjs/lib/api-keys/api-keys.cjs +70 -66
  27. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  28. package/dist/cjs/lib/api-keys/api-keys.d.cts +16 -8
  29. package/dist/cjs/lib/constants.cjs +5 -2
  30. package/dist/cjs/lib/constants.cjs.map +1 -1
  31. package/dist/cjs/lib/constants.d.cts +2 -1
  32. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  33. package/dist/cjs/lib/empty-state.cjs +24 -8
  34. package/dist/cjs/lib/empty-state.cjs.map +1 -1
  35. package/dist/cjs/lib/empty-state.d.cts +6 -2
  36. package/dist/cjs/lib/generic-error.cjs +33 -24
  37. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  38. package/dist/cjs/lib/generic-error.d.cts +5 -2
  39. package/dist/cjs/lib/identity-providers.cjs +2 -1
  40. package/dist/cjs/lib/identity-providers.cjs.map +1 -1
  41. package/dist/cjs/lib/identity-providers.d.cts +2 -2
  42. package/dist/cjs/lib/oauth-icons.cjs +12 -7
  43. package/dist/cjs/lib/oauth-icons.cjs.map +1 -1
  44. package/dist/cjs/lib/oauth-icons.d.cts +7 -3
  45. package/dist/cjs/lib/organization-switcher.cjs +62 -9
  46. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  47. package/dist/cjs/lib/organization-switcher.d.cts +12 -9
  48. package/dist/cjs/lib/otp-input.cjs +1 -1
  49. package/dist/cjs/lib/otp-input.cjs.map +1 -1
  50. package/dist/cjs/lib/pipes.cjs +343 -0
  51. package/dist/cjs/lib/pipes.cjs.map +1 -0
  52. package/dist/cjs/lib/pipes.d.cts +19 -0
  53. package/dist/cjs/lib/provider-icon.cjs +0 -6
  54. package/dist/cjs/lib/provider-icon.cjs.map +1 -1
  55. package/dist/cjs/lib/provider-icon.d.cts +4 -1
  56. package/dist/cjs/lib/save-button.cjs.map +1 -1
  57. package/dist/cjs/lib/user-profile.cjs +77 -83
  58. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  59. package/dist/cjs/lib/user-profile.d.cts +11 -7
  60. package/dist/cjs/lib/user-security.cjs +30 -24
  61. package/dist/cjs/lib/user-security.cjs.map +1 -1
  62. package/dist/cjs/lib/user-security.d.cts +10 -7
  63. package/dist/cjs/lib/user-sessions.cjs +19 -9
  64. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  65. package/dist/cjs/lib/user-sessions.d.cts +10 -6
  66. package/dist/cjs/lib/users-management.cjs +224 -216
  67. package/dist/cjs/lib/users-management.cjs.map +1 -1
  68. package/dist/cjs/lib/users-management.d.cts +10 -7
  69. package/dist/cjs/lib/utils.cjs +43 -0
  70. package/dist/cjs/lib/utils.cjs.map +1 -1
  71. package/dist/cjs/lib/utils.d.cts +29 -2
  72. package/dist/cjs/organization-switcher.client.cjs +45 -16
  73. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  74. package/dist/cjs/organization-switcher.client.d.cts +2 -1
  75. package/dist/cjs/pipes.client.cjs +64 -0
  76. package/dist/cjs/pipes.client.cjs.map +1 -0
  77. package/dist/cjs/pipes.client.d.cts +15 -0
  78. package/dist/cjs/user-profile.client.cjs +27 -10
  79. package/dist/cjs/user-profile.client.cjs.map +1 -1
  80. package/dist/cjs/user-profile.client.d.cts +4 -3
  81. package/dist/cjs/user-security.client.cjs +27 -10
  82. package/dist/cjs/user-security.client.cjs.map +1 -1
  83. package/dist/cjs/user-security.client.d.cts +3 -2
  84. package/dist/cjs/user-sessions.client.cjs +34 -16
  85. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  86. package/dist/cjs/user-sessions.client.d.cts +4 -2
  87. package/dist/cjs/users-management.client.cjs +35 -18
  88. package/dist/cjs/users-management.client.cjs.map +1 -1
  89. package/dist/cjs/users-management.client.d.cts +3 -2
  90. package/dist/cjs/workos-widgets.client.cjs +7 -12
  91. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  92. package/dist/css/lib/provider-icon.css +16 -11
  93. package/dist/esm/admin-portal-domain-verification.client.d.ts +3 -2
  94. package/dist/esm/admin-portal-domain-verification.client.js +31 -17
  95. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  96. package/dist/esm/admin-portal-sso-connection.client.d.ts +16 -0
  97. package/dist/esm/{admin-portal-sso-connection-client.js → admin-portal-sso-connection.client.js} +57 -31
  98. package/dist/esm/admin-portal-sso-connection.client.js.map +1 -0
  99. package/dist/esm/api/api-provider.d.ts +1 -1
  100. package/dist/esm/api/api-provider.js +1 -1
  101. package/dist/esm/api/api-provider.js.map +1 -1
  102. package/dist/esm/api/endpoint.d.ts +62 -1
  103. package/dist/esm/api/endpoint.js +56 -2
  104. package/dist/esm/api/endpoint.js.map +1 -1
  105. package/dist/esm/api-keys.client.d.ts +15 -0
  106. package/dist/esm/api-keys.client.js +75 -0
  107. package/dist/esm/api-keys.client.js.map +1 -0
  108. package/dist/esm/index.d.ts +6 -2
  109. package/dist/esm/index.js +9 -2
  110. package/dist/esm/index.js.map +1 -1
  111. package/dist/esm/lib/admin-portal-domain-verification.d.ts +10 -6
  112. package/dist/esm/lib/admin-portal-domain-verification.js +33 -34
  113. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  114. package/dist/esm/lib/admin-portal-sso-connection.d.ts +13 -6
  115. package/dist/esm/lib/admin-portal-sso-connection.js +83 -80
  116. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  117. package/dist/esm/lib/api-keys/api-keys.d.ts +16 -8
  118. package/dist/esm/lib/api-keys/api-keys.js +69 -54
  119. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  120. package/dist/esm/lib/constants.d.ts +2 -1
  121. package/dist/esm/lib/constants.js +3 -1
  122. package/dist/esm/lib/constants.js.map +1 -1
  123. package/dist/esm/lib/elevated-access.js.map +1 -1
  124. package/dist/esm/lib/empty-state.d.ts +6 -2
  125. package/dist/esm/lib/empty-state.js +24 -8
  126. package/dist/esm/lib/empty-state.js.map +1 -1
  127. package/dist/esm/lib/generic-error.d.ts +5 -2
  128. package/dist/esm/lib/generic-error.js +33 -24
  129. package/dist/esm/lib/generic-error.js.map +1 -1
  130. package/dist/esm/lib/identity-providers.d.ts +2 -2
  131. package/dist/esm/lib/identity-providers.js +2 -1
  132. package/dist/esm/lib/identity-providers.js.map +1 -1
  133. package/dist/esm/lib/oauth-icons.d.ts +7 -3
  134. package/dist/esm/lib/oauth-icons.js +11 -6
  135. package/dist/esm/lib/oauth-icons.js.map +1 -1
  136. package/dist/esm/lib/organization-switcher.d.ts +12 -9
  137. package/dist/esm/lib/organization-switcher.js +54 -9
  138. package/dist/esm/lib/organization-switcher.js.map +1 -1
  139. package/dist/esm/lib/otp-input.js +1 -1
  140. package/dist/esm/lib/otp-input.js.map +1 -1
  141. package/dist/esm/lib/pipes.d.ts +19 -0
  142. package/dist/esm/lib/pipes.js +334 -0
  143. package/dist/esm/lib/pipes.js.map +1 -0
  144. package/dist/esm/lib/provider-icon.d.ts +4 -1
  145. package/dist/esm/lib/provider-icon.js +0 -8
  146. package/dist/esm/lib/provider-icon.js.map +1 -1
  147. package/dist/esm/lib/save-button.js.map +1 -1
  148. package/dist/esm/lib/user-profile.d.ts +11 -7
  149. package/dist/esm/lib/user-profile.js +82 -75
  150. package/dist/esm/lib/user-profile.js.map +1 -1
  151. package/dist/esm/lib/user-security.d.ts +10 -7
  152. package/dist/esm/lib/user-security.js +34 -25
  153. package/dist/esm/lib/user-security.js.map +1 -1
  154. package/dist/esm/lib/user-sessions.d.ts +10 -6
  155. package/dist/esm/lib/user-sessions.js +20 -9
  156. package/dist/esm/lib/user-sessions.js.map +1 -1
  157. package/dist/esm/lib/users-management.d.ts +10 -7
  158. package/dist/esm/lib/users-management.js +230 -217
  159. package/dist/esm/lib/users-management.js.map +1 -1
  160. package/dist/esm/lib/utils.d.ts +29 -2
  161. package/dist/esm/lib/utils.js +46 -1
  162. package/dist/esm/lib/utils.js.map +1 -1
  163. package/dist/esm/organization-switcher.client.d.ts +2 -1
  164. package/dist/esm/organization-switcher.client.js +44 -16
  165. package/dist/esm/organization-switcher.client.js.map +1 -1
  166. package/dist/esm/pipes.client.d.ts +15 -0
  167. package/dist/esm/pipes.client.js +42 -0
  168. package/dist/esm/pipes.client.js.map +1 -0
  169. package/dist/esm/user-profile.client.d.ts +4 -3
  170. package/dist/esm/user-profile.client.js +26 -10
  171. package/dist/esm/user-profile.client.js.map +1 -1
  172. package/dist/esm/user-security.client.d.ts +3 -2
  173. package/dist/esm/user-security.client.js +26 -10
  174. package/dist/esm/user-security.client.js.map +1 -1
  175. package/dist/esm/user-sessions.client.d.ts +4 -2
  176. package/dist/esm/user-sessions.client.js +33 -16
  177. package/dist/esm/user-sessions.client.js.map +1 -1
  178. package/dist/esm/users-management.client.d.ts +3 -2
  179. package/dist/esm/users-management.client.js +34 -18
  180. package/dist/esm/users-management.client.js.map +1 -1
  181. package/dist/esm/workos-widgets.client.js +7 -12
  182. package/dist/esm/workos-widgets.client.js.map +1 -1
  183. package/package.json +17 -10
  184. package/dist/cjs/admin-portal-sso-connection-client.cjs.map +0 -1
  185. package/dist/cjs/admin-portal-sso-connection-client.d.cts +0 -12
  186. package/dist/cjs/api-keys-client.cjs.map +0 -1
  187. package/dist/cjs/api-keys-client.d.cts +0 -10
  188. package/dist/esm/admin-portal-sso-connection-client.d.ts +0 -12
  189. package/dist/esm/admin-portal-sso-connection-client.js.map +0 -1
  190. package/dist/esm/api-keys-client.d.ts +0 -10
  191. package/dist/esm/api-keys-client.js +0 -60
  192. package/dist/esm/api-keys-client.js.map +0 -1
@@ -10,83 +10,80 @@ import {
10
10
  Strong,
11
11
  Text
12
12
  } from "@radix-ui/themes";
13
- import clsx from "clsx";
14
13
  import { Avatar, SecondaryButton, Skeleton } from "./elements.js";
15
14
  import { EditUserProfileDialog } from "./edit-user-profile-dialog.js";
16
- import { getBestName } from "./utils.js";
17
- import { getOAuthIcon, getOAuthName } from "./oauth-icons.js";
15
+ import {
16
+ getBestName,
17
+ getDomProps
18
+ } from "./utils.js";
19
+ import { OAuthIcon, getOAuthName } from "./oauth-icons.js";
18
20
  import { GenericError } from "./generic-error.js";
19
- const UserProfile = ({ userData: user }) => {
20
- const oauthAccounts = Object.entries(user.oauthProfiles || {});
21
- return /* @__PURE__ */ jsx(
22
- Card,
23
- {
24
- className: clsx("woswidgets-widget"),
25
- "data-woswidgets-widget-id": "user-profile",
26
- size: "2",
27
- children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
28
- user.profilePictureUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
29
- /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
30
- /* @__PURE__ */ jsx(DataList.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Profile picture" }) }),
31
- /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(
32
- Avatar,
21
+ const UserProfile = ({
22
+ userData: user,
23
+ ...domProps
24
+ }) => {
25
+ const oauthAccounts = user.oauthProfiles ? Object.entries(user.oauthProfiles) : [];
26
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("resolved", domProps), children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
27
+ user.profilePictureUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
28
+ /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
29
+ /* @__PURE__ */ jsx(DataList.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Profile picture" }) }),
30
+ /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(
31
+ Avatar,
32
+ {
33
+ size: "2",
34
+ fallback: /* @__PURE__ */ jsx(FallbackUserIcon, {}),
35
+ src: user.profilePictureUrl
36
+ }
37
+ ) })
38
+ ] }),
39
+ /* @__PURE__ */ jsx(ListSeparator, {})
40
+ ] }),
41
+ /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
42
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Full name" }) }),
43
+ /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsxs(
44
+ Flex,
45
+ {
46
+ align: "center",
47
+ justify: "between",
48
+ width: "100%",
49
+ minHeight: "var(--space-6)",
50
+ children: [
51
+ /* @__PURE__ */ jsx(Text, { size: "2", children: getBestName(user) || /* @__PURE__ */ jsx(
52
+ Text,
33
53
  {
34
- size: "2",
35
- fallback: /* @__PURE__ */ jsx(FallbackUserIcon, {}),
36
- src: user.profilePictureUrl
54
+ color: "gray",
55
+ style: { color: "var(--gray-10)", cursor: "default" },
56
+ children: "Not set"
37
57
  }
38
- ) })
39
- ] }),
40
- /* @__PURE__ */ jsx(ListSeparator, {})
41
- ] }),
42
- /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
43
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Full name" }) }),
44
- /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsxs(
45
- Flex,
46
- {
47
- align: "center",
48
- justify: "between",
49
- width: "100%",
50
- minHeight: "var(--space-6)",
51
- children: [
52
- /* @__PURE__ */ jsx(Text, { size: "2", children: getBestName(user) || /* @__PURE__ */ jsx(
53
- Text,
54
- {
55
- color: "gray",
56
- style: { color: "var(--gray-10)", cursor: "default" },
57
- children: "Not set"
58
- }
59
- ) }),
60
- /* @__PURE__ */ jsx(EditUserProfileDialog, { user, children: /* @__PURE__ */ jsx(SecondaryButton, { children: "Edit" }) })
61
- ]
62
- }
63
- ) })
64
- ] }),
65
- /* @__PURE__ */ jsx(ListSeparator, {}),
66
- /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
67
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Email address" }) }),
68
- /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ jsx(Text, { size: "2", children: user.email }) }) })
69
- ] }),
70
- oauthAccounts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
71
- /* @__PURE__ */ jsx(ListSeparator, {}),
72
- /* @__PURE__ */ jsxs(DataList.Item, { children: [
73
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Connected accounts" }) }),
74
- /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "2", children: oauthAccounts.map(([account, data]) => /* @__PURE__ */ jsx(
75
- OAuthAccount,
76
- {
77
- account,
78
- email: data?.email
79
- },
80
- account
81
- )) }) })
82
- ] })
83
- ] })
58
+ ) }),
59
+ /* @__PURE__ */ jsx(EditUserProfileDialog, { user, children: /* @__PURE__ */ jsx(SecondaryButton, { children: "Edit" }) })
60
+ ]
61
+ }
62
+ ) })
63
+ ] }),
64
+ /* @__PURE__ */ jsx(ListSeparator, {}),
65
+ /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
66
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Email address" }) }),
67
+ /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ jsx(Text, { size: "2", children: user.email }) }) })
68
+ ] }),
69
+ oauthAccounts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
70
+ /* @__PURE__ */ jsx(ListSeparator, {}),
71
+ /* @__PURE__ */ jsxs(DataList.Item, { children: [
72
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Connected accounts" }) }),
73
+ /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "2", children: oauthAccounts.map(([account, data]) => /* @__PURE__ */ jsx(
74
+ OAuthAccount,
75
+ {
76
+ account,
77
+ email: data?.email
78
+ },
79
+ account
80
+ )) }) })
84
81
  ] })
85
- }
86
- );
82
+ ] })
83
+ ] }) });
87
84
  };
88
- const UserProfileLoading = () => {
89
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
85
+ const UserProfileLoading = (props) => {
86
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("loading", props), children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
90
87
  /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
91
88
  /* @__PURE__ */ jsx(DataList.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(Skeleton, { children: "Full name" }) }) }),
92
89
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(
@@ -107,18 +104,20 @@ const UserProfileLoading = () => {
107
104
  ] })
108
105
  ] }) });
109
106
  };
110
- function UserProfileError({ error }) {
111
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsx(GenericError, { error }) });
112
- }
107
+ const UserProfileError = ({
108
+ error,
109
+ ...domProps
110
+ }) => {
111
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("error", domProps), children: /* @__PURE__ */ jsx(GenericError, { error }) });
112
+ };
113
113
  const ListSeparator = () => /* @__PURE__ */ jsx(Box, { asChild: true, gridColumn: "span 2", children: /* @__PURE__ */ jsx(Inset, { side: "x", children: /* @__PURE__ */ jsx(Separator, { size: "4" }) }) });
114
114
  const OAuthAccount = ({
115
115
  account,
116
116
  email
117
117
  }) => {
118
- const Icon = getOAuthIcon(account);
119
118
  const name = getOAuthName(account);
120
119
  return /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "1", children: [
121
- /* @__PURE__ */ jsx(Icon, {}),
120
+ /* @__PURE__ */ jsx(OAuthIcon, { account }),
122
121
  /* @__PURE__ */ jsx(Text, { size: "2", ml: "1", children: name }),
123
122
  email && /* @__PURE__ */ jsxs(Box, { display: { initial: "none", sm: "contents" }, children: [
124
123
  /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: "\u2219" }),
@@ -140,6 +139,14 @@ const FallbackUserIcon = () => /* @__PURE__ */ jsxs(
140
139
  ]
141
140
  }
142
141
  );
142
+ function getWidgetRootDomProps(state, domProps) {
143
+ return getDomProps({
144
+ ...domProps,
145
+ isWidgetRoot: true,
146
+ widgetId: "user-profile",
147
+ widgetState: state
148
+ });
149
+ }
143
150
  export {
144
151
  UserProfile,
145
152
  UserProfileError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/user-profile.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Box,\n Card,\n DataList,\n Flex,\n Inset,\n Separator,\n Strong,\n Text,\n} from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { Avatar, SecondaryButton, Skeleton } from \"./elements.js\";\nimport { Me } from \"../api/endpoint.js\";\nimport { EditUserProfileDialog } from \"./edit-user-profile-dialog.js\";\nimport { getBestName } from \"./utils.js\";\nimport { getOAuthIcon, getOAuthName } from \"./oauth-icons.js\";\nimport { GenericError } from \"./generic-error.js\";\n\ninterface UserProfileProps {\n userData: Me;\n}\n\nexport const UserProfile = ({ userData: user }: UserProfileProps) => {\n const oauthAccounts = Object.entries(user.oauthProfiles || {});\n\n return (\n <Card\n className={clsx(\"woswidgets-widget\")}\n data-woswidgets-widget-id=\"user-profile\"\n size=\"2\"\n >\n <DataList.Root>\n {user.profilePictureUrl && (\n <>\n <DataList.Item align=\"center\">\n <DataList.Label minWidth=\"220px\" highContrast>\n <Strong>Profile picture</Strong>\n </DataList.Label>\n <DataList.Value>\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl}\n />\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n </>\n )}\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>Full name</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex\n align=\"center\"\n justify=\"between\"\n width=\"100%\"\n minHeight=\"var(--space-6)\"\n >\n <Text size=\"2\">\n {getBestName(user) || (\n <Text\n color=\"gray\"\n style={{ color: \"var(--gray-10)\", cursor: \"default\" }}\n >\n Not set\n </Text>\n )}\n </Text>\n\n <EditUserProfileDialog user={user}>\n <SecondaryButton>Edit</SecondaryButton>\n </EditUserProfileDialog>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>Email address</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">{user.email}</Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n {oauthAccounts.length > 0 && (\n <>\n <ListSeparator />\n\n <DataList.Item>\n <DataList.Label highContrast>\n <Strong>Connected accounts</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex direction=\"column\" gap=\"2\">\n {oauthAccounts.map(([account, data]) => (\n <OAuthAccount\n key={account}\n account={account}\n email={data?.email}\n />\n ))}\n </Flex>\n </DataList.Value>\n </DataList.Item>\n </>\n )}\n </DataList.Root>\n </Card>\n );\n};\n\nexport const UserProfileLoading: React.FC = () => {\n return (\n <Card size=\"2\">\n <DataList.Root>\n <DataList.Item align=\"center\">\n <DataList.Label minWidth=\"220px\" highContrast>\n <Strong>\n <Skeleton>Full name</Skeleton>\n </Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex\n align=\"center\"\n justify=\"between\"\n width=\"100%\"\n minHeight=\"var(--space-6)\"\n >\n <Text size=\"2\">\n <Skeleton>Full name</Skeleton>\n </Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>\n <Skeleton>Email address</Skeleton>\n </Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">\n <Skeleton>Email address</Skeleton>\n </Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n </DataList.Root>\n </Card>\n );\n};\n\nexport function UserProfileError({ error }: { error: unknown }) {\n return (\n <Card size=\"2\">\n <GenericError error={error} />\n </Card>\n );\n}\n\nconst ListSeparator = () => (\n <Box asChild gridColumn=\"span 2\">\n <Inset side=\"x\">\n <Separator size=\"4\" />\n </Inset>\n </Box>\n);\n\nconst OAuthAccount = ({\n account,\n email,\n}: {\n account: string;\n email?: string | null;\n}) => {\n const Icon = getOAuthIcon(account);\n const name = getOAuthName(account);\n\n return (\n <Flex align=\"center\" gap=\"1\">\n <Icon />\n\n <Text size=\"2\" ml=\"1\">\n {name}\n </Text>\n\n {email && (\n <Box display={{ initial: \"none\", sm: \"contents\" }}>\n <Text size=\"2\" color=\"gray\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n {email}\n </Text>\n </Box>\n )}\n </Flex>\n );\n};\n\nconst FallbackUserIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n >\n <title>User icon</title>\n <path d=\"M229.19,213c-15.81-27.32-40.63-46.49-69.47-54.62a70,70,0,1,0-63.44,0C67.44,166.5,42.62,185.67,26.81,213a6,6,0,1,0,10.38,6C56.4,185.81,90.34,166,128,166s71.6,19.81,90.81,53a6,6,0,1,0,10.38-6ZM70,96a58,58,0,1,1,58,58A58.07,58.07,0,0,1,70,96Z\" />\n </svg>\n);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/user-profile.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Box,\n Card,\n DataList,\n Flex,\n Inset,\n Separator,\n Strong,\n Text,\n} from \"@radix-ui/themes\";\nimport { Avatar, SecondaryButton, Skeleton } from \"./elements.js\";\nimport { Me, OAuthProfile, MeOauthProfiles } from \"../api/endpoint.js\";\nimport { EditUserProfileDialog } from \"./edit-user-profile-dialog.js\";\nimport {\n getBestName,\n getDomProps,\n type WidgetRootState,\n type WidgetRootDomProps,\n} from \"./utils.js\";\nimport { OAuthIcon, getOAuthName, type OAuthAccount } from \"./oauth-icons.js\";\nimport { GenericError } from \"./generic-error.js\";\n\ninterface UserProfileProps extends WidgetRootDomProps {\n userData: Me;\n}\n\nconst UserProfile: React.FC<UserProfileProps> = ({\n userData: user,\n ...domProps\n}) => {\n const oauthAccounts = user.oauthProfiles\n ? (Object.entries(user.oauthProfiles) as [\n keyof Exclude<MeOauthProfiles, null>,\n OAuthProfile,\n ][])\n : [];\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"resolved\", domProps)}>\n <DataList.Root>\n {user.profilePictureUrl && (\n <>\n <DataList.Item align=\"center\">\n <DataList.Label minWidth=\"220px\" highContrast>\n <Strong>Profile picture</Strong>\n </DataList.Label>\n <DataList.Value>\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl}\n />\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n </>\n )}\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>Full name</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex\n align=\"center\"\n justify=\"between\"\n width=\"100%\"\n minHeight=\"var(--space-6)\"\n >\n <Text size=\"2\">\n {getBestName(user) || (\n <Text\n color=\"gray\"\n style={{ color: \"var(--gray-10)\", cursor: \"default\" }}\n >\n Not set\n </Text>\n )}\n </Text>\n\n <EditUserProfileDialog user={user}>\n <SecondaryButton>Edit</SecondaryButton>\n </EditUserProfileDialog>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>Email address</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">{user.email}</Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n {oauthAccounts.length > 0 && (\n <>\n <ListSeparator />\n\n <DataList.Item>\n <DataList.Label highContrast>\n <Strong>Connected accounts</Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex direction=\"column\" gap=\"2\">\n {oauthAccounts.map(([account, data]) => (\n <OAuthAccount\n key={account}\n account={account}\n email={data?.email}\n />\n ))}\n </Flex>\n </DataList.Value>\n </DataList.Item>\n </>\n )}\n </DataList.Root>\n </Card>\n );\n};\n\ninterface UserProfileLoadingProps extends WidgetRootDomProps {}\n\nconst UserProfileLoading: React.FC<UserProfileLoadingProps> = (props) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n <DataList.Root>\n <DataList.Item align=\"center\">\n <DataList.Label minWidth=\"220px\" highContrast>\n <Strong>\n <Skeleton>Full name</Skeleton>\n </Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex\n align=\"center\"\n justify=\"between\"\n width=\"100%\"\n minHeight=\"var(--space-6)\"\n >\n <Text size=\"2\">\n <Skeleton>Full name</Skeleton>\n </Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n\n <ListSeparator />\n\n <DataList.Item align=\"center\">\n <DataList.Label highContrast>\n <Strong>\n <Skeleton>Email address</Skeleton>\n </Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">\n <Skeleton>Email address</Skeleton>\n </Text>\n </Flex>\n </DataList.Value>\n </DataList.Item>\n </DataList.Root>\n </Card>\n );\n};\n\ninterface UserProfileErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst UserProfileError: React.FC<UserProfileErrorProps> = ({\n error,\n ...domProps\n}) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <GenericError error={error} />\n </Card>\n );\n};\n\nconst ListSeparator = () => (\n <Box asChild gridColumn=\"span 2\">\n <Inset side=\"x\">\n <Separator size=\"4\" />\n </Inset>\n </Box>\n);\n\nconst OAuthAccount = ({\n account,\n email,\n}: {\n account: OAuthAccount;\n email?: string | null;\n}) => {\n const name = getOAuthName(account);\n return (\n <Flex align=\"center\" gap=\"1\">\n <OAuthIcon account={account} />\n <Text size=\"2\" ml=\"1\">\n {name}\n </Text>\n {email && (\n <Box display={{ initial: \"none\", sm: \"contents\" }}>\n <Text size=\"2\" color=\"gray\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n {email}\n </Text>\n </Box>\n )}\n </Flex>\n );\n};\n\nconst FallbackUserIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n >\n <title>User icon</title>\n <path d=\"M229.19,213c-15.81-27.32-40.63-46.49-69.47-54.62a70,70,0,1,0-63.44,0C67.44,166.5,42.62,185.67,26.81,213a6,6,0,1,0,10.38,6C56.4,185.81,90.34,166,128,166s71.6,19.81,90.81,53a6,6,0,1,0,10.38-6ZM70,96a58,58,0,1,1,58,58A58.07,58.07,0,0,1,70,96Z\" />\n </svg>\n);\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"user-profile\",\n widgetState: state,\n });\n}\n\nexport type {\n UserProfileProps,\n UserProfileLoadingProps,\n UserProfileErrorProps,\n};\nexport { UserProfile, UserProfileLoading, UserProfileError };\n"],"mappings":"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","names":[]}
@@ -1,15 +1,18 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import { AuthenticationInformationResponseData } from '../api/endpoint.js';
2
+ import { WidgetRootDomProps } from './utils.js';
3
3
  import '@tanstack/react-query';
4
4
  import '../api/widgets-api-client.js';
5
5
 
6
- interface UserSecurityProps {
6
+ interface UserSecurityProps extends WidgetRootDomProps {
7
7
  settings: AuthenticationInformationResponseData;
8
8
  }
9
- declare const UserSecurity: ({ settings }: UserSecurityProps) => react_jsx_runtime.JSX.Element;
10
- declare function UserSecurityError({ error }: {
9
+ declare const UserSecurity: React.FC<UserSecurityProps>;
10
+ interface UserSecurityErrorProps extends WidgetRootDomProps {
11
11
  error: unknown;
12
- }): react_jsx_runtime.JSX.Element;
13
- declare const UserSecurityLoading: React.FC;
12
+ }
13
+ declare const UserSecurityError: React.FC<UserSecurityErrorProps>;
14
+ interface UserSecurityLoadingProps extends WidgetRootDomProps {
15
+ }
16
+ declare const UserSecurityLoading: React.FC<UserSecurityLoadingProps>;
14
17
 
15
- export { UserSecurity, UserSecurityError, UserSecurityLoading };
18
+ export { UserSecurity, UserSecurityError, type UserSecurityErrorProps, UserSecurityLoading, type UserSecurityLoadingProps, type UserSecurityProps };
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Card, Flex, Grid, Text } from "@radix-ui/themes";
4
- import clsx from "clsx";
5
4
  import { SecondaryButton, Skeleton } from "./elements.js";
6
5
  import { IconPanel } from "./icon-panel.js";
7
6
  import { ButtonIcon, LockClosedIcon } from "@radix-ui/react-icons";
@@ -11,33 +10,35 @@ import { AddMfaDialog } from "./add-mfa-dialog.js";
11
10
  import { ResetMfaDialog } from "./reset-mfa-dialog.js";
12
11
  import * as CardList from "./card-list.js";
13
12
  import { GenericError } from "./generic-error.js";
14
- import { getComparativeReadableDate } from "./utils.js";
15
- const UserSecurity = ({ settings }) => {
13
+ import {
14
+ getComparativeReadableDate,
15
+ getDomProps
16
+ } from "./utils.js";
17
+ const UserSecurity = ({
18
+ settings,
19
+ ...domProps
20
+ }) => {
16
21
  const passwordSettings = settings.verificationMethods.Password;
17
22
  const mfaSettings = settings.verificationMethods.Mfa;
18
- return /* @__PURE__ */ jsxs(
19
- CardList.Root,
20
- {
21
- className: clsx("woswidgets-widget"),
22
- "data-woswidgets-widget-id": "user-security",
23
- children: [
24
- passwordSettings && /* @__PURE__ */ jsx(CardList.Item, { children: /* @__PURE__ */ jsx(PasswordSettings, { settings: passwordSettings }) }),
25
- mfaSettings && /* @__PURE__ */ jsx(CardList.Item, { children: /* @__PURE__ */ jsx(
26
- MfaSettings,
27
- {
28
- settings: mfaSettings,
29
- isPasswordSet: !!passwordSettings?.isSetUp
30
- }
31
- ) })
32
- ]
33
- }
34
- );
23
+ return /* @__PURE__ */ jsxs(CardList.Root, { ...getWidgetRootDomProps("resolved", domProps), children: [
24
+ passwordSettings && /* @__PURE__ */ jsx(CardList.Item, { children: /* @__PURE__ */ jsx(PasswordSettings, { settings: passwordSettings }) }),
25
+ mfaSettings && /* @__PURE__ */ jsx(CardList.Item, { children: /* @__PURE__ */ jsx(
26
+ MfaSettings,
27
+ {
28
+ settings: mfaSettings,
29
+ isPasswordSet: !!passwordSettings?.isSetUp
30
+ }
31
+ ) })
32
+ ] });
35
33
  };
36
- function UserSecurityError({ error }) {
37
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsx(GenericError, { error }) });
38
- }
39
- const UserSecurityLoading = () => {
40
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsxs(Grid, { columns: "auto 1fr auto", align: "center", gap: "4", children: [
34
+ const UserSecurityError = ({
35
+ error,
36
+ ...domProps
37
+ }) => {
38
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("error", domProps), children: /* @__PURE__ */ jsx(GenericError, { error }) });
39
+ };
40
+ const UserSecurityLoading = (props) => {
41
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("loading", props), children: /* @__PURE__ */ jsxs(Grid, { columns: "auto 1fr auto", align: "center", gap: "4", children: [
41
42
  /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(IconPanel, {}) }),
42
43
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
43
44
  /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(Skeleton, { children: "Password" }) }),
@@ -91,6 +92,14 @@ function MfaSettings({
91
92
  settings.isSetUp ? /* @__PURE__ */ jsx(ResetMfaDialog, { isPasswordSet, children: /* @__PURE__ */ jsx(SecondaryButton, { children: "Disable" }) }) : /* @__PURE__ */ jsx(AddMfaDialog, { children: /* @__PURE__ */ jsx(SecondaryButton, { children: "Set up authenticator app" }) })
92
93
  ] });
93
94
  }
95
+ function getWidgetRootDomProps(state, domProps) {
96
+ return getDomProps({
97
+ ...domProps,
98
+ isWidgetRoot: true,
99
+ widgetId: "user-security",
100
+ widgetState: state
101
+ });
102
+ }
94
103
  export {
95
104
  UserSecurity,
96
105
  UserSecurityError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/user-security.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card, Flex, Grid, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { SecondaryButton, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { ButtonIcon, LockClosedIcon } from \"@radix-ui/react-icons\";\nimport { SetPasswordDialog } from \"./set-password-dialog.js\";\nimport { ChangePasswordDialog } from \"./change-password-dialog.js\";\nimport { AddMfaDialog } from \"./add-mfa-dialog.js\";\nimport type {\n AuthenticationInformationResponseData as AuthenticationSettings,\n AuthenticationInformationResponseDataVerificationMethodsPassword as PasswordVerificationMethod,\n AuthenticationInformationResponseDataVerificationMethodsMfa as MfaVerificationMethod,\n} from \"../api/endpoint.js\";\nimport { ResetMfaDialog } from \"./reset-mfa-dialog.js\";\nimport * as CardList from \"./card-list.js\";\nimport { GenericError } from \"./generic-error.js\";\nimport { getComparativeReadableDate } from \"./utils.js\";\n\ninterface UserSecurityProps {\n settings: AuthenticationSettings;\n}\n\nexport const UserSecurity = ({ settings }: UserSecurityProps) => {\n const passwordSettings = settings.verificationMethods.Password;\n const mfaSettings = settings.verificationMethods.Mfa;\n\n return (\n <CardList.Root\n className={clsx(\"woswidgets-widget\")}\n data-woswidgets-widget-id=\"user-security\"\n >\n {passwordSettings && (\n <CardList.Item>\n <PasswordSettings settings={passwordSettings} />\n </CardList.Item>\n )}\n\n {mfaSettings && (\n <CardList.Item>\n <MfaSettings\n settings={mfaSettings}\n isPasswordSet={!!passwordSettings?.isSetUp}\n />\n </CardList.Item>\n )}\n </CardList.Root>\n );\n};\n\nexport function UserSecurityError({ error }: { error: unknown }) {\n return (\n <Card size=\"2\">\n <GenericError error={error} />\n </Card>\n );\n}\n\nexport const UserSecurityLoading: React.FC = () => {\n return (\n <Card size=\"2\">\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>Password</Skeleton>\n </Text>\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Skeleton>Set a password to access your account</Skeleton>\n </Text>\n </Flex>\n\n <ChangePasswordDialog>\n <Skeleton>\n <SecondaryButton>Change</SecondaryButton>\n </Skeleton>\n </ChangePasswordDialog>\n </Grid>\n </Card>\n );\n};\n\nfunction PasswordSettings({\n settings,\n}: {\n settings: NonNullable<PasswordVerificationMethod>;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <LockClosedIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Password\n </Text>\n\n {settings.isSetUp ? (\n settings.lastUsed && (\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n )\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Set a password to access your account\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ChangePasswordDialog>\n <SecondaryButton>Change</SecondaryButton>\n </ChangePasswordDialog>\n ) : (\n <SetPasswordDialog>\n <SecondaryButton>Set a password</SecondaryButton>\n </SetPasswordDialog>\n )}\n </Grid>\n );\n}\n\nfunction MfaSettings({\n settings,\n isPasswordSet,\n}: {\n settings: NonNullable<MfaVerificationMethod>;\n isPasswordSet: boolean;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <ButtonIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Multi-factor authentication\n </Text>\n\n {settings.isSetUp ? (\n <Text size=\"2\">\n Authenticator app\n {settings.lastUsed && (\n <>\n <Text size=\"2\" color=\"gray\" mx=\"1\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n </>\n )}\n </Text>\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Secure your account with an extra verification step\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ResetMfaDialog isPasswordSet={isPasswordSet}>\n <SecondaryButton>Disable</SecondaryButton>\n </ResetMfaDialog>\n ) : (\n <AddMfaDialog>\n <SecondaryButton>Set up authenticator app</SecondaryButton>\n </AddMfaDialog>\n )}\n </Grid>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/user-security.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card, Flex, Grid, Text } from \"@radix-ui/themes\";\nimport { SecondaryButton, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { ButtonIcon, LockClosedIcon } from \"@radix-ui/react-icons\";\nimport { SetPasswordDialog } from \"./set-password-dialog.js\";\nimport { ChangePasswordDialog } from \"./change-password-dialog.js\";\nimport { AddMfaDialog } from \"./add-mfa-dialog.js\";\nimport type {\n AuthenticationInformationResponseData as AuthenticationSettings,\n AuthenticationInformationResponseDataVerificationMethodsPassword as PasswordVerificationMethod,\n AuthenticationInformationResponseDataVerificationMethodsMfa as MfaVerificationMethod,\n} from \"../api/endpoint.js\";\nimport { ResetMfaDialog } from \"./reset-mfa-dialog.js\";\nimport * as CardList from \"./card-list.js\";\nimport { GenericError } from \"./generic-error.js\";\nimport {\n getComparativeReadableDate,\n getDomProps,\n type WidgetRootDomProps,\n type WidgetRootState,\n} from \"./utils.js\";\n\ninterface UserSecurityProps extends WidgetRootDomProps {\n settings: AuthenticationSettings;\n}\n\nconst UserSecurity: React.FC<UserSecurityProps> = ({\n settings,\n ...domProps\n}) => {\n const passwordSettings = settings.verificationMethods.Password;\n const mfaSettings = settings.verificationMethods.Mfa;\n return (\n <CardList.Root {...getWidgetRootDomProps(\"resolved\", domProps)}>\n {passwordSettings && (\n <CardList.Item>\n <PasswordSettings settings={passwordSettings} />\n </CardList.Item>\n )}\n {mfaSettings && (\n <CardList.Item>\n <MfaSettings\n settings={mfaSettings}\n isPasswordSet={!!passwordSettings?.isSetUp}\n />\n </CardList.Item>\n )}\n </CardList.Root>\n );\n};\n\ninterface UserSecurityErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst UserSecurityError: React.FC<UserSecurityErrorProps> = ({\n error,\n ...domProps\n}) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <GenericError error={error} />\n </Card>\n );\n};\n\ninterface UserSecurityLoadingProps extends WidgetRootDomProps {}\n\nconst UserSecurityLoading: React.FC<UserSecurityLoadingProps> = (props) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>Password</Skeleton>\n </Text>\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Skeleton>Set a password to access your account</Skeleton>\n </Text>\n </Flex>\n\n <ChangePasswordDialog>\n <Skeleton>\n <SecondaryButton>Change</SecondaryButton>\n </Skeleton>\n </ChangePasswordDialog>\n </Grid>\n </Card>\n );\n};\n\nfunction PasswordSettings({\n settings,\n}: {\n settings: NonNullable<PasswordVerificationMethod>;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <LockClosedIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Password\n </Text>\n\n {settings.isSetUp ? (\n settings.lastUsed && (\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n )\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Set a password to access your account\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ChangePasswordDialog>\n <SecondaryButton>Change</SecondaryButton>\n </ChangePasswordDialog>\n ) : (\n <SetPasswordDialog>\n <SecondaryButton>Set a password</SecondaryButton>\n </SetPasswordDialog>\n )}\n </Grid>\n );\n}\n\nfunction MfaSettings({\n settings,\n isPasswordSet,\n}: {\n settings: NonNullable<MfaVerificationMethod>;\n isPasswordSet: boolean;\n}) {\n return (\n <Grid columns=\"auto 1fr auto\" align=\"center\" gap=\"4\">\n <IconPanel>\n <ButtonIcon />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n Multi-factor authentication\n </Text>\n\n {settings.isSetUp ? (\n <Text size=\"2\">\n Authenticator app\n {settings.lastUsed && (\n <>\n <Text size=\"2\" color=\"gray\" mx=\"1\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last used{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n )}\n </Text>\n </>\n )}\n </Text>\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n Secure your account with an extra verification step\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ResetMfaDialog isPasswordSet={isPasswordSet}>\n <SecondaryButton>Disable</SecondaryButton>\n </ResetMfaDialog>\n ) : (\n <AddMfaDialog>\n <SecondaryButton>Set up authenticator app</SecondaryButton>\n </AddMfaDialog>\n )}\n </Grid>\n );\n}\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"user-security\",\n widgetState: state,\n });\n}\n\nexport type {\n UserSecurityProps,\n UserSecurityLoadingProps,\n UserSecurityErrorProps,\n};\nexport { UserSecurity, UserSecurityLoading, UserSecurityError };\n"],"mappings":"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","names":[]}
@@ -1,16 +1,20 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { WidgetRootDomProps } from './utils.js';
2
3
  import { ActiveSession } from '../api/endpoint.js';
3
4
  import '@tanstack/react-query';
4
5
  import '../api/widgets-api-client.js';
5
6
 
6
- interface UserSessionsProps {
7
+ interface UserSessionsProps extends WidgetRootDomProps {
7
8
  sessionsData: ActiveSession[];
8
9
  currentSessionId: string;
9
10
  }
10
- declare const UserSessions: ({ sessionsData: sessions, currentSessionId, }: UserSessionsProps) => react_jsx_runtime.JSX.Element;
11
- declare const UserSessionsLoading: React.FC;
12
- declare function UserSessionsError({ error }: {
11
+ declare const UserSessions: ({ sessionsData: sessions, currentSessionId, ...domProps }: UserSessionsProps) => react_jsx_runtime.JSX.Element;
12
+ interface UserSessionsLoadingProps extends WidgetRootDomProps {
13
+ }
14
+ declare const UserSessionsLoading: React.FC<UserSessionsLoadingProps>;
15
+ interface UserSessionsErrorProps extends WidgetRootDomProps {
13
16
  error: unknown;
14
- }): react_jsx_runtime.JSX.Element;
17
+ }
18
+ declare const UserSessionsError: React.FC<UserSessionsErrorProps>;
15
19
 
16
- export { UserSessions, UserSessionsError, UserSessionsLoading };
20
+ export { UserSessions, UserSessionsError, type UserSessionsErrorProps, UserSessionsLoading, type UserSessionsLoadingProps };
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Box, Button, Card, Flex, Text } from "@radix-ui/themes";
4
- import clsx from "clsx";
5
4
  import { Badge, SecondaryButton, Skeleton } from "./elements.js";
6
5
  import {
7
6
  getComparativeReadableDate,
7
+ getDomProps,
8
8
  getUserLocation,
9
9
  parseUserAgent
10
10
  } from "./utils.js";
@@ -17,7 +17,8 @@ import { GenericError } from "./generic-error.js";
17
17
  import { LaptopIcon, MobileIcon } from "@radix-ui/react-icons";
18
18
  const UserSessions = ({
19
19
  sessionsData: sessions,
20
- currentSessionId
20
+ currentSessionId,
21
+ ...domProps
21
22
  }) => {
22
23
  const currentSession = sessions.find(
23
24
  (session) => session.id === currentSessionId
@@ -33,8 +34,7 @@ const UserSessions = ({
33
34
  {
34
35
  direction: "column",
35
36
  gap: "4",
36
- className: clsx("woswidgets-widget"),
37
- "data-woswidgets-widget-id": "user-sessions",
37
+ ...getWidgetRootDomProps("resolved", domProps),
38
38
  children: [
39
39
  /* @__PURE__ */ jsxs(CardList.Root, { children: [
40
40
  currentSession && /* @__PURE__ */ jsx(CardList.Item, { children: /* @__PURE__ */ jsx(UserSession, { session: currentSession, isCurrentSession: true }) }),
@@ -84,8 +84,8 @@ const UserSessions = ({
84
84
  }
85
85
  );
86
86
  };
87
- const UserSessionsLoading = () => {
88
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsxs(Flex, { gap: "4", align: "center", children: [
87
+ const UserSessionsLoading = (props) => {
88
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("loading", props), children: /* @__PURE__ */ jsxs(Flex, { gap: "4", align: "center", children: [
89
89
  /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(IconPanel, {}) }),
90
90
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
91
91
  /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(Skeleton, { children: "The location" }) }),
@@ -93,9 +93,12 @@ const UserSessionsLoading = () => {
93
93
  ] })
94
94
  ] }) });
95
95
  };
96
- function UserSessionsError({ error }) {
97
- return /* @__PURE__ */ jsx(Card, { size: "2", children: /* @__PURE__ */ jsx(GenericError, { error }) });
98
- }
96
+ const UserSessionsError = ({
97
+ error,
98
+ ...domProps
99
+ }) => {
100
+ return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("error", domProps), children: /* @__PURE__ */ jsx(GenericError, { error }) });
101
+ };
99
102
  const UserSession = ({
100
103
  session,
101
104
  isCurrentSession = false,
@@ -138,6 +141,14 @@ const UserSession = ({
138
141
  ) })
139
142
  ] });
140
143
  };
144
+ function getWidgetRootDomProps(state, domProps) {
145
+ return getDomProps({
146
+ ...domProps,
147
+ isWidgetRoot: true,
148
+ widgetId: "user-sessions",
149
+ widgetState: state
150
+ });
151
+ }
141
152
  export {
142
153
  UserSessions,
143
154
  UserSessionsError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/user-sessions.tsx"],"sourcesContent":["\"use client\";\n\nimport { Box, Button, Card, Flex, Text } from \"@radix-ui/themes\";\nimport clsx from \"clsx\";\nimport { Badge, SecondaryButton, Skeleton } from \"./elements.js\";\nimport {\n getComparativeReadableDate,\n getUserLocation,\n parseUserAgent,\n} from \"./utils.js\";\nimport { LogoutDialog } from \"./logout-dialog.js\";\nimport { LogoutAllSessionsDialog } from \"./logout-all-sessions-dialog.js\";\nimport { ActiveSession } from \"../api/endpoint.js\";\nimport * as CardList from \"./card-list.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { useState } from \"react\";\nimport { GenericError } from \"./generic-error.js\";\nimport { LaptopIcon, MobileIcon } from \"@radix-ui/react-icons\";\n\ninterface UserSessionsProps {\n sessionsData: ActiveSession[];\n currentSessionId: string;\n}\n\nexport const UserSessions = ({\n sessionsData: sessions,\n currentSessionId,\n}: UserSessionsProps) => {\n const currentSession = sessions.find(\n (session) => session.id === currentSessionId,\n );\n const otherSessions = sessions.filter(\n (session) => session.id !== currentSessionId,\n );\n const [openLogoutDialog, setOpenLogoutDialog] = useState(false);\n const [sessionToSignOut, setSessionToSignOut] =\n useState<ActiveSession | null>(null);\n const [openLogoutAllSessionsDialog, setOpenLogoutAllSessionsDialog] =\n useState(false);\n\n return (\n <Flex\n direction=\"column\"\n gap=\"4\"\n className={clsx(\"woswidgets-widget\")}\n data-woswidgets-widget-id=\"user-sessions\"\n >\n <CardList.Root>\n {currentSession && (\n <CardList.Item>\n <UserSession session={currentSession} isCurrentSession />\n </CardList.Item>\n )}\n\n {otherSessions.map((session) => (\n <CardList.Item key={session.id}>\n <UserSession\n session={session}\n onSignOut={() => {\n setSessionToSignOut(session);\n setOpenLogoutDialog(true);\n }}\n />\n </CardList.Item>\n ))}\n </CardList.Root>\n\n {sessions.length > 1 && (\n <Card size=\"2\">\n <Flex gap=\"2\" justify=\"between\" align=\"center\">\n <Box>\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\">\n Sign out of all other devices\n </Text>\n <Text size=\"2\" color=\"gray\" as=\"p\">\n Remove access from all devices except this one\n </Text>\n </Box>\n\n <SecondaryButton\n onClick={() => {\n setOpenLogoutAllSessionsDialog(true);\n }}\n >\n Sign out\n </SecondaryButton>\n </Flex>\n </Card>\n )}\n\n {sessionToSignOut && (\n <LogoutDialog\n session={sessionToSignOut}\n open={openLogoutDialog}\n onOpenChange={setOpenLogoutDialog}\n />\n )}\n\n <LogoutAllSessionsDialog\n currentSessionId={currentSessionId}\n open={openLogoutAllSessionsDialog}\n onOpenChange={setOpenLogoutAllSessionsDialog}\n />\n </Flex>\n );\n};\n\nexport const UserSessionsLoading: React.FC = () => {\n return (\n <Card size=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>The location</Skeleton>\n </Text>\n\n <Text size=\"2\" color=\"gray\" as=\"p\">\n <Skeleton>The location</Skeleton>\n </Text>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\nexport function UserSessionsError({ error }: { error: unknown }) {\n return (\n <Card size=\"2\">\n <GenericError error={error} />\n </Card>\n );\n}\n\ninterface UserSessionProps {\n session: ActiveSession;\n isCurrentSession?: boolean;\n onSignOut?: (session: ActiveSession) => void;\n}\n\nconst UserSession = ({\n session,\n isCurrentSession = false,\n onSignOut,\n}: UserSessionProps) => {\n const userAgent = parseUserAgent(session.userAgent);\n const userLocation = getUserLocation(\n session.currentLocation,\n session.ipAddress,\n );\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel>\n {userAgent.isMobile ? <MobileIcon /> : <LaptopIcon />}\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n {userAgent.pretty}\n </Text>\n\n <Flex gap=\"1\" align=\"center\">\n <Text size=\"2\" color=\"gray\" as=\"p\">\n {userLocation}\n </Text>\n\n {isCurrentSession && <Badge ml=\"2\">This device</Badge>}\n\n {!isCurrentSession && session.lastActivityAt && (\n <>\n <Text size=\"2\" color=\"gray\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last seen{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(session.lastActivityAt),\n )}\n </Text>\n </>\n )}\n </Flex>\n </Flex>\n\n {!isCurrentSession && (\n <Flex ml=\"auto\" mr=\"2\">\n <Button\n variant=\"ghost\"\n onClick={() => {\n onSignOut?.(session);\n }}\n >\n Sign out\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/user-sessions.tsx"],"sourcesContent":["\"use client\";\n\nimport { Box, Button, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { Badge, SecondaryButton, Skeleton } from \"./elements.js\";\nimport {\n getComparativeReadableDate,\n getDomProps,\n getUserLocation,\n parseUserAgent,\n type WidgetRootDomProps,\n type WidgetRootState,\n} from \"./utils.js\";\nimport { LogoutDialog } from \"./logout-dialog.js\";\nimport { LogoutAllSessionsDialog } from \"./logout-all-sessions-dialog.js\";\nimport { ActiveSession } from \"../api/endpoint.js\";\nimport * as CardList from \"./card-list.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { useState } from \"react\";\nimport { GenericError } from \"./generic-error.js\";\nimport { LaptopIcon, MobileIcon } from \"@radix-ui/react-icons\";\n\ninterface UserSessionsProps extends WidgetRootDomProps {\n sessionsData: ActiveSession[];\n currentSessionId: string;\n}\n\nconst UserSessions = ({\n sessionsData: sessions,\n currentSessionId,\n ...domProps\n}: UserSessionsProps) => {\n const currentSession = sessions.find(\n (session) => session.id === currentSessionId,\n );\n const otherSessions = sessions.filter(\n (session) => session.id !== currentSessionId,\n );\n const [openLogoutDialog, setOpenLogoutDialog] = useState(false);\n const [sessionToSignOut, setSessionToSignOut] =\n useState<ActiveSession | null>(null);\n const [openLogoutAllSessionsDialog, setOpenLogoutAllSessionsDialog] =\n useState(false);\n\n return (\n <Flex\n direction=\"column\"\n gap=\"4\"\n {...getWidgetRootDomProps(\"resolved\", domProps)}\n >\n <CardList.Root>\n {currentSession && (\n <CardList.Item>\n <UserSession session={currentSession} isCurrentSession />\n </CardList.Item>\n )}\n\n {otherSessions.map((session) => (\n <CardList.Item key={session.id}>\n <UserSession\n session={session}\n onSignOut={() => {\n setSessionToSignOut(session);\n setOpenLogoutDialog(true);\n }}\n />\n </CardList.Item>\n ))}\n </CardList.Root>\n\n {sessions.length > 1 && (\n <Card size=\"2\">\n <Flex gap=\"2\" justify=\"between\" align=\"center\">\n <Box>\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\">\n Sign out of all other devices\n </Text>\n <Text size=\"2\" color=\"gray\" as=\"p\">\n Remove access from all devices except this one\n </Text>\n </Box>\n\n <SecondaryButton\n onClick={() => {\n setOpenLogoutAllSessionsDialog(true);\n }}\n >\n Sign out\n </SecondaryButton>\n </Flex>\n </Card>\n )}\n\n {sessionToSignOut && (\n <LogoutDialog\n session={sessionToSignOut}\n open={openLogoutDialog}\n onOpenChange={setOpenLogoutDialog}\n />\n )}\n\n <LogoutAllSessionsDialog\n currentSessionId={currentSessionId}\n open={openLogoutAllSessionsDialog}\n onOpenChange={setOpenLogoutAllSessionsDialog}\n />\n </Flex>\n );\n};\n\ninterface UserSessionsLoadingProps extends WidgetRootDomProps {}\n\nconst UserSessionsLoading: React.FC<UserSessionsLoadingProps> = (props) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel />\n </Skeleton>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n <Skeleton>The location</Skeleton>\n </Text>\n\n <Text size=\"2\" color=\"gray\" as=\"p\">\n <Skeleton>The location</Skeleton>\n </Text>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\ninterface UserSessionsErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst UserSessionsError: React.FC<UserSessionsErrorProps> = ({\n error,\n ...domProps\n}) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <GenericError error={error} />\n </Card>\n );\n};\n\ninterface UserSessionProps {\n session: ActiveSession;\n isCurrentSession?: boolean;\n onSignOut?: (session: ActiveSession) => void;\n}\n\nconst UserSession = ({\n session,\n isCurrentSession = false,\n onSignOut,\n}: UserSessionProps) => {\n const userAgent = parseUserAgent(session.userAgent);\n const userLocation = getUserLocation(\n session.currentLocation,\n session.ipAddress,\n );\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel>\n {userAgent.isMobile ? <MobileIcon /> : <LaptopIcon />}\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\" mb=\"-2px\">\n {userAgent.pretty}\n </Text>\n\n <Flex gap=\"1\" align=\"center\">\n <Text size=\"2\" color=\"gray\" as=\"p\">\n {userLocation}\n </Text>\n\n {isCurrentSession && <Badge ml=\"2\">This device</Badge>}\n\n {!isCurrentSession && session.lastActivityAt && (\n <>\n <Text size=\"2\" color=\"gray\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n Last seen{\" \"}\n {getComparativeReadableDate(\n new Date(),\n new Date(session.lastActivityAt),\n )}\n </Text>\n </>\n )}\n </Flex>\n </Flex>\n\n {!isCurrentSession && (\n <Flex ml=\"auto\" mr=\"2\">\n <Button\n variant=\"ghost\"\n onClick={() => {\n onSignOut?.(session);\n }}\n >\n Sign out\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"user-sessions\",\n widgetState: state,\n });\n}\n\nexport type { UserSessionsLoadingProps, UserSessionsErrorProps };\nexport { UserSessions, UserSessionsLoading, UserSessionsError };\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
2
+ import { WidgetRootDomProps } from './utils.js';
3
3
  import { MemberRole, MembersQueryResult } from '../api/endpoint.js';
4
4
  import '@tanstack/react-query';
5
5
  import '../api/widgets-api-client.js';
6
6
 
7
- interface UsersManagementProps {
7
+ interface UsersManagementProps extends WidgetRootDomProps {
8
8
  rolesData: {
9
9
  roles: MemberRole[];
10
10
  multipleRolesEnabled: boolean;
@@ -13,10 +13,13 @@ interface UsersManagementProps {
13
13
  disableRolesFilter?: boolean;
14
14
  isPending: boolean;
15
15
  }
16
- declare const UsersManagement: ({ userData, rolesData, isPending, disableRolesFilter, }: UsersManagementProps) => react_jsx_runtime.JSX.Element;
17
- declare const UsersManagementLoading: React.FC;
18
- declare function UsersManagementError({ error }: {
16
+ declare const UsersManagement: React.FC<UsersManagementProps>;
17
+ interface UsersManagementLoadingProps extends WidgetRootDomProps {
18
+ }
19
+ declare const UsersManagementLoading: React.FC<UsersManagementLoadingProps>;
20
+ interface UsersManagementErrorProps extends WidgetRootDomProps {
19
21
  error: unknown;
20
- }): react_jsx_runtime.JSX.Element;
22
+ }
23
+ declare const UsersManagementError: React.FC<UsersManagementErrorProps>;
21
24
 
22
- export { UsersManagement, UsersManagementError, UsersManagementLoading };
25
+ export { UsersManagement, UsersManagementError, type UsersManagementErrorProps, UsersManagementLoading, type UsersManagementLoadingProps };