@workos-inc/widgets 1.7.2 → 1.8.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 (214) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cjs/api/endpoint.cjs +1 -0
  3. package/dist/cjs/api/endpoint.cjs.map +1 -1
  4. package/dist/cjs/api/endpoint.d.cts +1 -0
  5. package/dist/cjs/index.cjs +5 -2
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.cts +1 -0
  8. package/dist/cjs/lib/add-mfa-dialog.cjs +133 -61
  9. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  10. package/dist/cjs/lib/admin-portal-domain-verification.cjs +41 -5
  11. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  12. package/dist/cjs/lib/admin-portal-sso-connection.cjs +121 -44
  13. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  14. package/dist/cjs/lib/api-keys/api-key-details-card.cjs +25 -3
  15. package/dist/cjs/lib/api-keys/api-key-details-card.cjs.map +1 -1
  16. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +25 -3
  17. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
  18. package/dist/cjs/lib/api-keys/api-keys-search.cjs +13 -4
  19. package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
  20. package/dist/cjs/lib/api-keys/api-keys-table.cjs +94 -12
  21. package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
  22. package/dist/cjs/lib/api-keys/api-keys.cjs +16 -2
  23. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  24. package/dist/cjs/lib/api-keys/create-api-key.cjs +172 -20
  25. package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
  26. package/dist/cjs/lib/api-keys/relative-time.cjs +12 -2
  27. package/dist/cjs/lib/api-keys/relative-time.cjs.map +1 -1
  28. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +49 -7
  29. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
  30. package/dist/cjs/lib/change-password-dialog.cjs +122 -16
  31. package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
  32. package/dist/cjs/lib/copy-button.cjs +14 -2
  33. package/dist/cjs/lib/copy-button.cjs.map +1 -1
  34. package/dist/cjs/lib/copy-button.d.cts +2 -1
  35. package/dist/cjs/lib/delete-domain-dialog.cjs +52 -19
  36. package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
  37. package/dist/cjs/lib/delete-user-dialog.cjs +46 -11
  38. package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
  39. package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
  40. package/dist/cjs/lib/domain-actions.cjs +51 -7
  41. package/dist/cjs/lib/domain-actions.cjs.map +1 -1
  42. package/dist/cjs/lib/domain-item.cjs +42 -8
  43. package/dist/cjs/lib/domain-item.cjs.map +1 -1
  44. package/dist/cjs/lib/edit-user-profile-dialog.cjs +62 -11
  45. package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
  46. package/dist/cjs/lib/edit-user-role-dialog.cjs +90 -17
  47. package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
  48. package/dist/cjs/lib/elements.cjs +14 -3
  49. package/dist/cjs/lib/elements.cjs.map +1 -1
  50. package/dist/cjs/lib/elements.d.cts +5 -2
  51. package/dist/cjs/lib/elevated-access.cjs +78 -18
  52. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  53. package/dist/cjs/lib/generic-error.cjs +53 -11
  54. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  55. package/dist/cjs/lib/generic-error.d.cts +5 -1
  56. package/dist/cjs/lib/i18n/intl-context.cjs +47 -0
  57. package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -0
  58. package/dist/cjs/lib/i18n/intl-context.d.cts +29 -0
  59. package/dist/cjs/lib/i18n/translation.cjs +67 -0
  60. package/dist/cjs/lib/i18n/translation.cjs.map +1 -0
  61. package/dist/cjs/lib/i18n/translation.d.cts +16 -0
  62. package/dist/cjs/lib/i18n/use-locale.cjs +33 -0
  63. package/dist/cjs/lib/i18n/use-locale.cjs.map +1 -0
  64. package/dist/cjs/lib/i18n/use-locale.d.cts +7 -0
  65. package/dist/cjs/lib/i18n/use-translation.cjs +47 -0
  66. package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -0
  67. package/dist/cjs/lib/i18n/use-translation.d.cts +15 -0
  68. package/dist/cjs/lib/identity-providers.d.cts +1 -1
  69. package/dist/cjs/lib/invite-user-dialog.cjs +69 -14
  70. package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
  71. package/dist/cjs/lib/logout-all-sessions-dialog.cjs +33 -4
  72. package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
  73. package/dist/cjs/lib/logout-dialog.cjs +34 -10
  74. package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
  75. package/dist/cjs/lib/organization-switcher.cjs +12 -2
  76. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  77. package/dist/cjs/lib/pipes.cjs +175 -36
  78. package/dist/cjs/lib/pipes.cjs.map +1 -1
  79. package/dist/cjs/lib/resend-invite-dialog.cjs +67 -17
  80. package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
  81. package/dist/cjs/lib/reset-mfa-dialog.cjs +50 -7
  82. package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
  83. package/dist/cjs/lib/revoke-invite-dialog.cjs +42 -10
  84. package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
  85. package/dist/cjs/lib/save-button.cjs +9 -1
  86. package/dist/cjs/lib/save-button.cjs.map +1 -1
  87. package/dist/cjs/lib/set-password-dialog.cjs +101 -13
  88. package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
  89. package/dist/cjs/lib/user-actions-dropdown.cjs +54 -6
  90. package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
  91. package/dist/cjs/lib/user-profile.cjs +81 -10
  92. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  93. package/dist/cjs/lib/user-security.cjs +127 -25
  94. package/dist/cjs/lib/user-security.cjs.map +1 -1
  95. package/dist/cjs/lib/user-sessions.cjs +74 -15
  96. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  97. package/dist/cjs/lib/users-management.cjs +265 -49
  98. package/dist/cjs/lib/users-management.cjs.map +1 -1
  99. package/dist/cjs/lib/users-search.cjs +18 -4
  100. package/dist/cjs/lib/users-search.cjs.map +1 -1
  101. package/dist/cjs/lib/utils.cjs +10 -7
  102. package/dist/cjs/lib/utils.cjs.map +1 -1
  103. package/dist/cjs/lib/utils.d.cts +2 -1
  104. package/dist/cjs/lib/view-dns-record-dialog.cjs +89 -18
  105. package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
  106. package/dist/cjs/workos-widgets.client.cjs +2 -2
  107. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  108. package/dist/esm/api/endpoint.d.ts +1 -0
  109. package/dist/esm/api/endpoint.js +1 -0
  110. package/dist/esm/api/endpoint.js.map +1 -1
  111. package/dist/esm/index.d.ts +1 -0
  112. package/dist/esm/index.js +3 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/lib/add-mfa-dialog.js +133 -61
  115. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  116. package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
  117. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  118. package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
  119. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  120. package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
  121. package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
  122. package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
  123. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  124. package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
  125. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  126. package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
  127. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  128. package/dist/esm/lib/api-keys/api-keys.js +16 -2
  129. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  130. package/dist/esm/lib/api-keys/create-api-key.js +172 -20
  131. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  132. package/dist/esm/lib/api-keys/relative-time.js +12 -2
  133. package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
  134. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
  135. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  136. package/dist/esm/lib/change-password-dialog.js +122 -16
  137. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  138. package/dist/esm/lib/copy-button.d.ts +2 -1
  139. package/dist/esm/lib/copy-button.js +14 -2
  140. package/dist/esm/lib/copy-button.js.map +1 -1
  141. package/dist/esm/lib/delete-domain-dialog.js +52 -19
  142. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  143. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  144. package/dist/esm/lib/delete-user-dialog.js +36 -11
  145. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  146. package/dist/esm/lib/domain-actions.js +41 -7
  147. package/dist/esm/lib/domain-actions.js.map +1 -1
  148. package/dist/esm/lib/domain-item.js +42 -8
  149. package/dist/esm/lib/domain-item.js.map +1 -1
  150. package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
  151. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  152. package/dist/esm/lib/edit-user-role-dialog.js +90 -17
  153. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  154. package/dist/esm/lib/elements.d.ts +5 -2
  155. package/dist/esm/lib/elements.js +14 -3
  156. package/dist/esm/lib/elements.js.map +1 -1
  157. package/dist/esm/lib/elevated-access.js +78 -18
  158. package/dist/esm/lib/elevated-access.js.map +1 -1
  159. package/dist/esm/lib/generic-error.d.ts +5 -1
  160. package/dist/esm/lib/generic-error.js +53 -11
  161. package/dist/esm/lib/generic-error.js.map +1 -1
  162. package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
  163. package/dist/esm/lib/i18n/intl-context.js +12 -0
  164. package/dist/esm/lib/i18n/intl-context.js.map +1 -0
  165. package/dist/esm/lib/i18n/translation.d.ts +16 -0
  166. package/dist/esm/lib/i18n/translation.js +45 -0
  167. package/dist/esm/lib/i18n/translation.js.map +1 -0
  168. package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
  169. package/dist/esm/lib/i18n/use-locale.js +9 -0
  170. package/dist/esm/lib/i18n/use-locale.js.map +1 -0
  171. package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
  172. package/dist/esm/lib/i18n/use-translation.js +23 -0
  173. package/dist/esm/lib/i18n/use-translation.js.map +1 -0
  174. package/dist/esm/lib/identity-providers.d.ts +1 -1
  175. package/dist/esm/lib/invite-user-dialog.js +70 -15
  176. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  177. package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
  178. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  179. package/dist/esm/lib/logout-dialog.js +34 -10
  180. package/dist/esm/lib/logout-dialog.js.map +1 -1
  181. package/dist/esm/lib/organization-switcher.js +12 -2
  182. package/dist/esm/lib/organization-switcher.js.map +1 -1
  183. package/dist/esm/lib/pipes.js +175 -36
  184. package/dist/esm/lib/pipes.js.map +1 -1
  185. package/dist/esm/lib/resend-invite-dialog.js +67 -17
  186. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  187. package/dist/esm/lib/reset-mfa-dialog.js +50 -7
  188. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  189. package/dist/esm/lib/revoke-invite-dialog.js +42 -10
  190. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  191. package/dist/esm/lib/save-button.js +9 -1
  192. package/dist/esm/lib/save-button.js.map +1 -1
  193. package/dist/esm/lib/set-password-dialog.js +101 -13
  194. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  195. package/dist/esm/lib/user-actions-dropdown.js +54 -6
  196. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  197. package/dist/esm/lib/user-profile.js +81 -10
  198. package/dist/esm/lib/user-profile.js.map +1 -1
  199. package/dist/esm/lib/user-security.js +127 -25
  200. package/dist/esm/lib/user-security.js.map +1 -1
  201. package/dist/esm/lib/user-sessions.js +74 -15
  202. package/dist/esm/lib/user-sessions.js.map +1 -1
  203. package/dist/esm/lib/users-management.js +266 -51
  204. package/dist/esm/lib/users-management.js.map +1 -1
  205. package/dist/esm/lib/users-search.js +18 -4
  206. package/dist/esm/lib/users-search.js.map +1 -1
  207. package/dist/esm/lib/utils.d.ts +2 -1
  208. package/dist/esm/lib/utils.js +10 -7
  209. package/dist/esm/lib/utils.js.map +1 -1
  210. package/dist/esm/lib/view-dns-record-dialog.js +89 -18
  211. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  212. package/dist/esm/workos-widgets.client.js +2 -2
  213. package/dist/esm/workos-widgets.client.js.map +1 -1
  214. package/package.json +11 -2
@@ -7,10 +7,13 @@ import { EditUserRoleDialog } from "./edit-user-role-dialog.js";
7
7
  import { DropdownMenu } from "./elements.js";
8
8
  import { ResendInviteDialog } from "./resend-invite-dialog.js";
9
9
  import { RevokeInviteDialog } from "./revoke-invite-dialog.js";
10
+ import { Translation } from "./i18n/translation.js";
11
+ import { useTranslation } from "./i18n/use-translation.js";
10
12
  const UserActionsDropdown = ({
11
13
  user,
12
14
  children
13
15
  }) => {
16
+ const translate = useTranslation();
14
17
  const rolesAndConfigQuery = useRolesAndConfig({
15
18
  query: {
16
19
  initialData: { roles: [], multipleRolesEnabled: false }
@@ -33,8 +36,26 @@ const UserActionsDropdown = ({
33
36
  {
34
37
  onSelect: () => setOpenDialog("edit-role"),
35
38
  disabled: rolesAndConfigQuery.isLoading || rolesAndConfigQuery.isSuccess && roles.length <= 1,
36
- title: rolesAndConfigQuery.isSuccess && roles.length <= 1 ? "You cannot update the role for this user as there is only one role available." : void 0,
37
- children: `Edit role${isMultipleRolesEnabled ? "s" : ""}`
39
+ title: rolesAndConfigQuery.isSuccess && roles.length <= 1 ? translate({
40
+ defaultMessage: "You cannot update the role for this user as there is only one role available.",
41
+ id: "rzvafM",
42
+ description: "Tooltip explaining why role editing is disabled"
43
+ }) : void 0,
44
+ children: isMultipleRolesEnabled ? /* @__PURE__ */ jsx(
45
+ Translation,
46
+ {
47
+ defaultMessage: "Edit roles",
48
+ id: "yjbD6m",
49
+ description: "Menu option to edit user roles (plural)"
50
+ }
51
+ ) : /* @__PURE__ */ jsx(
52
+ Translation,
53
+ {
54
+ defaultMessage: "Edit role",
55
+ id: "NJqcnW",
56
+ description: "Menu option to edit user role (singular)"
57
+ }
58
+ )
38
59
  },
39
60
  "edit-role"
40
61
  )
@@ -46,7 +67,14 @@ const UserActionsDropdown = ({
46
67
  DropdownMenu.Item,
47
68
  {
48
69
  onSelect: () => setOpenDialog("resend-invite"),
49
- children: "Resend invitation"
70
+ children: /* @__PURE__ */ jsx(
71
+ Translation,
72
+ {
73
+ defaultMessage: "Resend invitation",
74
+ id: "1fzoWe",
75
+ description: "Menu option to resend user invitation"
76
+ }
77
+ )
50
78
  },
51
79
  "resend-invite"
52
80
  )
@@ -59,7 +87,14 @@ const UserActionsDropdown = ({
59
87
  {
60
88
  variant: "destructive",
61
89
  onSelect: () => setOpenDialog("revoke-invite"),
62
- children: "Revoke invitation"
90
+ children: /* @__PURE__ */ jsx(
91
+ Translation,
92
+ {
93
+ defaultMessage: "Revoke invitation",
94
+ id: "0Ie4dM",
95
+ description: "Menu option to revoke user invitation"
96
+ }
97
+ )
63
98
  },
64
99
  "revoke-invite"
65
100
  )
@@ -72,7 +107,14 @@ const UserActionsDropdown = ({
72
107
  {
73
108
  variant: "destructive",
74
109
  onSelect: () => setOpenDialog("revoke-membership"),
75
- children: "Remove user"
110
+ children: /* @__PURE__ */ jsx(
111
+ Translation,
112
+ {
113
+ defaultMessage: "Remove user",
114
+ id: "qGSR1P",
115
+ description: "Menu option to remove user from organization"
116
+ }
117
+ )
76
118
  },
77
119
  "revoke-membership"
78
120
  )
@@ -82,7 +124,13 @@ const UserActionsDropdown = ({
82
124
  actions: actions2,
83
125
  items: items2
84
126
  };
85
- }, [rolesAndConfigQuery, user.actions, isMultipleRolesEnabled, roles]);
127
+ }, [
128
+ rolesAndConfigQuery,
129
+ user.actions,
130
+ isMultipleRolesEnabled,
131
+ roles,
132
+ translate
133
+ ]);
86
134
  if (user.isLoggedInUser || items.length === 0) {
87
135
  return null;
88
136
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/user-actions-dropdown.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Member, useRolesAndConfig } from \"../api/endpoint.js\";\nimport { DeleteUserDialog } from \"./delete-user-dialog.js\";\nimport { EditUserRoleDialog } from \"./edit-user-role-dialog.js\";\nimport { DropdownMenu } from \"./elements.js\";\nimport { ResendInviteDialog } from \"./resend-invite-dialog.js\";\nimport { RevokeInviteDialog } from \"./revoke-invite-dialog.js\";\n\ninterface UserActionsDropdownProps {\n user: Member;\n children: React.ReactNode;\n}\n\ntype UserActionDialog =\n | \"revoke-membership\"\n | \"revoke-invite\"\n | \"resend-invite\"\n | \"edit-role\";\n\nexport const UserActionsDropdown = ({\n user,\n children,\n}: UserActionsDropdownProps) => {\n const rolesAndConfigQuery = useRolesAndConfig({\n query: {\n initialData: { roles: [], multipleRolesEnabled: false },\n },\n });\n const { roles, multipleRolesEnabled: isMultipleRolesEnabled } =\n rolesAndConfigQuery.data;\n const [openDialog, setOpenDialog] = React.useState<UserActionDialog | null>(\n null,\n );\n\n /**\n * Assigns a key for each dialog based on its open state to ensure its\n * internal state is cleared when it is closed.\n */\n function getDialogKey(dialog: UserActionDialog) {\n return `${dialog}-${openDialog === dialog}-${user.id}`;\n }\n\n const { actions, items } = React.useMemo(() => {\n const actions = new Set(user.actions);\n const items: React.ReactElement[] = [];\n if (actions.has(\"edit-role\")) {\n items.push(\n <DropdownMenu.Item\n key=\"edit-role\"\n onSelect={() => setOpenDialog(\"edit-role\")}\n disabled={\n rolesAndConfigQuery.isLoading ||\n (rolesAndConfigQuery.isSuccess && roles.length <= 1)\n }\n title={\n rolesAndConfigQuery.isSuccess && roles.length <= 1\n ? \"You cannot update the role for this user as there is only one role available.\"\n : undefined\n }\n >\n {`Edit role${isMultipleRolesEnabled ? \"s\" : \"\"}`}\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"resend-invite\")) {\n items.push(\n <DropdownMenu.Item\n key=\"resend-invite\"\n onSelect={() => setOpenDialog(\"resend-invite\")}\n >\n Resend invitation\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"revoke-invite\")) {\n items.push(\n <DropdownMenu.Item\n variant=\"destructive\"\n key=\"revoke-invite\"\n onSelect={() => setOpenDialog(\"revoke-invite\")}\n >\n Revoke invitation\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"revoke-membership\")) {\n items.push(\n <DropdownMenu.Item\n variant=\"destructive\"\n key=\"revoke-membership\"\n onSelect={() => setOpenDialog(\"revoke-membership\")}\n >\n Remove user\n </DropdownMenu.Item>,\n );\n }\n return {\n actions,\n items,\n };\n }, [rolesAndConfigQuery, user.actions, isMultipleRolesEnabled, roles]);\n\n if (user.isLoggedInUser || items.length === 0) {\n return null;\n }\n\n return (\n <>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>{children}</DropdownMenu.Trigger>\n <DropdownMenu.Content size=\"2\" align=\"end\">\n {items}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n {actions.has(\"edit-role\") && (\n <EditUserRoleDialog\n key={getDialogKey(\"edit-role\")}\n user={user}\n open={openDialog === \"edit-role\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"revoke-membership\") && (\n <DeleteUserDialog\n key={getDialogKey(\"revoke-membership\")}\n user={user}\n open={openDialog === \"revoke-membership\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"revoke-invite\") && (\n <RevokeInviteDialog\n key={getDialogKey(\"revoke-invite\")}\n user={user}\n open={openDialog === \"revoke-invite\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"resend-invite\") && (\n <ResendInviteDialog\n key={getDialogKey(\"resend-invite\")}\n user={user}\n open={openDialog === \"resend-invite\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n </>\n );\n};\n"],"mappings":"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","names":["actions","items"]}
1
+ {"version":3,"sources":["../../../src/lib/user-actions-dropdown.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Member, useRolesAndConfig } from \"../api/endpoint.js\";\nimport { DeleteUserDialog } from \"./delete-user-dialog.js\";\nimport { EditUserRoleDialog } from \"./edit-user-role-dialog.js\";\nimport { DropdownMenu } from \"./elements.js\";\nimport { ResendInviteDialog } from \"./resend-invite-dialog.js\";\nimport { RevokeInviteDialog } from \"./revoke-invite-dialog.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface UserActionsDropdownProps {\n user: Member;\n children: React.ReactNode;\n}\n\ntype UserActionDialog =\n | \"revoke-membership\"\n | \"revoke-invite\"\n | \"resend-invite\"\n | \"edit-role\";\n\nexport const UserActionsDropdown = ({\n user,\n children,\n}: UserActionsDropdownProps) => {\n const translate = useTranslation();\n const rolesAndConfigQuery = useRolesAndConfig({\n query: {\n initialData: { roles: [], multipleRolesEnabled: false },\n },\n });\n const { roles, multipleRolesEnabled: isMultipleRolesEnabled } =\n rolesAndConfigQuery.data;\n const [openDialog, setOpenDialog] = React.useState<UserActionDialog | null>(\n null,\n );\n\n /**\n * Assigns a key for each dialog based on its open state to ensure its\n * internal state is cleared when it is closed.\n */\n function getDialogKey(dialog: UserActionDialog) {\n return `${dialog}-${openDialog === dialog}-${user.id}`;\n }\n\n const { actions, items } = React.useMemo(() => {\n const actions = new Set(user.actions);\n const items: React.ReactElement[] = [];\n if (actions.has(\"edit-role\")) {\n items.push(\n <DropdownMenu.Item\n key=\"edit-role\"\n onSelect={() => setOpenDialog(\"edit-role\")}\n disabled={\n rolesAndConfigQuery.isLoading ||\n (rolesAndConfigQuery.isSuccess && roles.length <= 1)\n }\n title={\n rolesAndConfigQuery.isSuccess && roles.length <= 1\n ? translate({\n defaultMessage:\n \"You cannot update the role for this user as there is only one role available.\",\n id: \"rzvafM\",\n description:\n \"Tooltip explaining why role editing is disabled\",\n })\n : undefined\n }\n >\n {isMultipleRolesEnabled ? (\n <Translation\n defaultMessage=\"Edit roles\"\n id=\"yjbD6m\"\n description=\"Menu option to edit user roles (plural)\"\n />\n ) : (\n <Translation\n defaultMessage=\"Edit role\"\n id=\"NJqcnW\"\n description=\"Menu option to edit user role (singular)\"\n />\n )}\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"resend-invite\")) {\n items.push(\n <DropdownMenu.Item\n key=\"resend-invite\"\n onSelect={() => setOpenDialog(\"resend-invite\")}\n >\n <Translation\n defaultMessage=\"Resend invitation\"\n id=\"1fzoWe\"\n description=\"Menu option to resend user invitation\"\n />\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"revoke-invite\")) {\n items.push(\n <DropdownMenu.Item\n variant=\"destructive\"\n key=\"revoke-invite\"\n onSelect={() => setOpenDialog(\"revoke-invite\")}\n >\n <Translation\n defaultMessage=\"Revoke invitation\"\n id=\"0Ie4dM\"\n description=\"Menu option to revoke user invitation\"\n />\n </DropdownMenu.Item>,\n );\n }\n if (actions.has(\"revoke-membership\")) {\n items.push(\n <DropdownMenu.Item\n variant=\"destructive\"\n key=\"revoke-membership\"\n onSelect={() => setOpenDialog(\"revoke-membership\")}\n >\n <Translation\n defaultMessage=\"Remove user\"\n id=\"qGSR1P\"\n description=\"Menu option to remove user from organization\"\n />\n </DropdownMenu.Item>,\n );\n }\n return {\n actions,\n items,\n };\n }, [\n rolesAndConfigQuery,\n user.actions,\n isMultipleRolesEnabled,\n roles,\n translate,\n ]);\n\n if (user.isLoggedInUser || items.length === 0) {\n return null;\n }\n\n return (\n <>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>{children}</DropdownMenu.Trigger>\n <DropdownMenu.Content size=\"2\" align=\"end\">\n {items}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n {actions.has(\"edit-role\") && (\n <EditUserRoleDialog\n key={getDialogKey(\"edit-role\")}\n user={user}\n open={openDialog === \"edit-role\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"revoke-membership\") && (\n <DeleteUserDialog\n key={getDialogKey(\"revoke-membership\")}\n user={user}\n open={openDialog === \"revoke-membership\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"revoke-invite\") && (\n <RevokeInviteDialog\n key={getDialogKey(\"revoke-invite\")}\n user={user}\n open={openDialog === \"revoke-invite\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n\n {actions.has(\"resend-invite\") && (\n <ResendInviteDialog\n key={getDialogKey(\"resend-invite\")}\n user={user}\n open={openDialog === \"resend-invite\"}\n onOpenChange={(open) => !open && setOpenDialog(null)}\n />\n )}\n </>\n );\n};\n"],"mappings":"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","names":["actions","items"]}
@@ -18,6 +18,7 @@ import {
18
18
  } from "./utils.js";
19
19
  import { OAuthIcon, getOAuthName } from "./oauth-icons.js";
20
20
  import { GenericError } from "./generic-error.js";
21
+ import { Translation } from "./i18n/translation.js";
21
22
  const UserProfile = ({
22
23
  userData: user,
23
24
  ...domProps
@@ -26,7 +27,14 @@ const UserProfile = ({
26
27
  return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("resolved", domProps), children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
27
28
  user.profilePictureUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
28
29
  /* @__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.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(
31
+ Translation,
32
+ {
33
+ defaultMessage: "Profile picture",
34
+ description: "Label for the user's avatar",
35
+ id: "RvLqCQ"
36
+ }
37
+ ) }) }),
30
38
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(
31
39
  Avatar,
32
40
  {
@@ -39,7 +47,14 @@ const UserProfile = ({
39
47
  /* @__PURE__ */ jsx(ListSeparator, {})
40
48
  ] }),
41
49
  /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
42
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Full name" }) }),
50
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(
51
+ Translation,
52
+ {
53
+ defaultMessage: "Full name",
54
+ id: "kkBScm",
55
+ description: "Label for user's full name field"
56
+ }
57
+ ) }) }),
43
58
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsxs(
44
59
  Flex,
45
60
  {
@@ -53,23 +68,51 @@ const UserProfile = ({
53
68
  {
54
69
  color: "gray",
55
70
  style: { color: "var(--gray-10)", cursor: "default" },
56
- children: "Not set"
71
+ children: /* @__PURE__ */ jsx(
72
+ Translation,
73
+ {
74
+ defaultMessage: "Not set",
75
+ id: "i4vzAY",
76
+ description: "Placeholder text when user's name is not set"
77
+ }
78
+ )
57
79
  }
58
80
  ) }),
59
- /* @__PURE__ */ jsx(EditUserProfileDialog, { user, children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Edit" }) })
81
+ /* @__PURE__ */ jsx(EditUserProfileDialog, { user, children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
82
+ Translation,
83
+ {
84
+ defaultMessage: "Edit",
85
+ id: "5bhXUz",
86
+ description: "Button text to edit user profile"
87
+ }
88
+ ) }) })
60
89
  ]
61
90
  }
62
91
  ) })
63
92
  ] }),
64
93
  /* @__PURE__ */ jsx(ListSeparator, {}),
65
94
  /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
66
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Email address" }) }),
95
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(
96
+ Translation,
97
+ {
98
+ defaultMessage: "Email address",
99
+ id: "nLk5pa",
100
+ description: "Label for user's email address field"
101
+ }
102
+ ) }) }),
67
103
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ jsx(Text, { size: "2", children: user.email }) }) })
68
104
  ] }),
69
105
  oauthAccounts.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
70
106
  /* @__PURE__ */ jsx(ListSeparator, {}),
71
107
  /* @__PURE__ */ jsxs(DataList.Item, { children: [
72
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: "Connected accounts" }) }),
108
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(
109
+ Translation,
110
+ {
111
+ defaultMessage: "Connected accounts",
112
+ id: "AW/A69",
113
+ description: "Label for user's connected OAuth accounts"
114
+ }
115
+ ) }) }),
73
116
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "2", children: oauthAccounts.map(([account, data]) => /* @__PURE__ */ jsx(
74
117
  OAuthAccount,
75
118
  {
@@ -85,7 +128,14 @@ const UserProfile = ({
85
128
  const UserProfileLoading = (props) => {
86
129
  return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("loading", props), children: /* @__PURE__ */ jsxs(DataList.Root, { children: [
87
130
  /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
88
- /* @__PURE__ */ jsx(DataList.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(Skeleton, { children: "Full name" }) }) }),
131
+ /* @__PURE__ */ jsx(DataList.Label, { minWidth: "220px", highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
132
+ Translation,
133
+ {
134
+ defaultMessage: "Full name",
135
+ id: "nc7fru",
136
+ description: "Loading placeholder for full name label"
137
+ }
138
+ ) }) }) }),
89
139
  /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(
90
140
  Flex,
91
141
  {
@@ -93,14 +143,35 @@ const UserProfileLoading = (props) => {
93
143
  justify: "between",
94
144
  width: "100%",
95
145
  minHeight: "var(--space-6)",
96
- children: /* @__PURE__ */ jsx(Text, { size: "2", children: /* @__PURE__ */ jsx(Skeleton, { children: "Full name" }) })
146
+ children: /* @__PURE__ */ jsx(Text, { size: "2", children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
147
+ Translation,
148
+ {
149
+ defaultMessage: "Full name",
150
+ id: "6GcWa2",
151
+ description: "Loading placeholder for full name value"
152
+ }
153
+ ) }) })
97
154
  }
98
155
  ) })
99
156
  ] }),
100
157
  /* @__PURE__ */ jsx(ListSeparator, {}),
101
158
  /* @__PURE__ */ jsxs(DataList.Item, { align: "center", children: [
102
- /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(Skeleton, { children: "Email address" }) }) }),
103
- /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ jsx(Text, { size: "2", children: /* @__PURE__ */ jsx(Skeleton, { children: "Email address" }) }) }) })
159
+ /* @__PURE__ */ jsx(DataList.Label, { highContrast: true, children: /* @__PURE__ */ jsx(Strong, { children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
160
+ Translation,
161
+ {
162
+ defaultMessage: "Email address",
163
+ id: "gjqw+H",
164
+ description: "Loading placeholder for email address label"
165
+ }
166
+ ) }) }) }),
167
+ /* @__PURE__ */ jsx(DataList.Value, { children: /* @__PURE__ */ jsx(Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ jsx(Text, { size: "2", children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
168
+ Translation,
169
+ {
170
+ defaultMessage: "Email address",
171
+ id: "75F+g5",
172
+ description: "Loading placeholder for email address value"
173
+ }
174
+ ) }) }) }) })
104
175
  ] })
105
176
  ] }) });
106
177
  };
@@ -1 +1 @@
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, Button, 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 <Button variant=\"secondary\">Edit</Button>\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":";AA2CU,mBAGM,KAFJ,YADF;AAxCV;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,QAAQ,QAAQ,gBAAgB;AAEzC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,WAAW,oBAAuC;AAC3D,SAAS,oBAAoB;AAM7B,MAAM,cAA0C,CAAC;AAAA,EAC/C,UAAU;AAAA,EACV,GAAG;AACL,MAAM;AACJ,QAAM,gBAAgB,KAAK,gBACtB,OAAO,QAAQ,KAAK,aAAa,IAIlC,CAAC;AACL,SACE,oBAAC,QAAK,MAAK,KAAK,GAAG,sBAAsB,YAAY,QAAQ,GAC3D,+BAAC,SAAS,MAAT,EACE;AAAA,SAAK,qBACJ,iCACE;AAAA,2BAAC,SAAS,MAAT,EAAc,OAAM,UACnB;AAAA,4BAAC,SAAS,OAAT,EAAe,UAAS,SAAQ,cAAY,MAC3C,8BAAC,UAAO,6BAAe,GACzB;AAAA,QACA,oBAAC,SAAS,OAAT,EACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,oBAAC,oBAAiB;AAAA,YAC5B,KAAK,KAAK;AAAA;AAAA,QACZ,GACF;AAAA,SACF;AAAA,MAEA,oBAAC,iBAAc;AAAA,OACjB;AAAA,IAGF,qBAAC,SAAS,MAAT,EAAc,OAAM,UACnB;AAAA,0BAAC,SAAS,OAAT,EAAe,cAAY,MAC1B,8BAAC,UAAO,uBAAS,GACnB;AAAA,MACA,oBAAC,SAAS,OAAT,EACC;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,WAAU;AAAA,UAEV;AAAA,gCAAC,QAAK,MAAK,KACR,sBAAY,IAAI,KACf;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,EAAE,OAAO,kBAAkB,QAAQ,UAAU;AAAA,gBACrD;AAAA;AAAA,YAED,GAEJ;AAAA,YAEA,oBAAC,yBAAsB,MACrB,8BAAC,UAAO,SAAQ,aAAY,kBAAI,GAClC;AAAA;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,IAEA,oBAAC,iBAAc;AAAA,IAEf,qBAAC,SAAS,MAAT,EAAc,OAAM,UACnB;AAAA,0BAAC,SAAS,OAAT,EAAe,cAAY,MAC1B,8BAAC,UAAO,2BAAa,GACvB;AAAA,MACA,oBAAC,SAAS,OAAT,EACC,8BAAC,QAAK,OAAM,UAAS,WAAU,kBAC7B,8BAAC,QAAK,MAAK,KAAK,eAAK,OAAM,GAC7B,GACF;AAAA,OACF;AAAA,IAEC,cAAc,SAAS,KACtB,iCACE;AAAA,0BAAC,iBAAc;AAAA,MAEf,qBAAC,SAAS,MAAT,EACC;AAAA,4BAAC,SAAS,OAAT,EAAe,cAAY,MAC1B,8BAAC,UAAO,gCAAkB,GAC5B;AAAA,QACA,oBAAC,SAAS,OAAT,EACC,8BAAC,QAAK,WAAU,UAAS,KAAI,KAC1B,wBAAc,IAAI,CAAC,CAAC,SAAS,IAAI,MAChC;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,OAAO,MAAM;AAAA;AAAA,UAFR;AAAA,QAGP,CACD,GACH,GACF;AAAA,SACF;AAAA,OACF;AAAA,KAEJ,GACF;AAEJ;AAIA,MAAM,qBAAwD,CAAC,UAAU;AACvE,SACE,oBAAC,QAAK,MAAK,KAAK,GAAG,sBAAsB,WAAW,KAAK,GACvD,+BAAC,SAAS,MAAT,EACC;AAAA,yBAAC,SAAS,MAAT,EAAc,OAAM,UACnB;AAAA,0BAAC,SAAS,OAAT,EAAe,UAAS,SAAQ,cAAY,MAC3C,8BAAC,UACC,8BAAC,YAAS,uBAAS,GACrB,GACF;AAAA,MACA,oBAAC,SAAS,OAAT,EACC;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,WAAU;AAAA,UAEV,8BAAC,QAAK,MAAK,KACT,8BAAC,YAAS,uBAAS,GACrB;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,IAEA,oBAAC,iBAAc;AAAA,IAEf,qBAAC,SAAS,MAAT,EAAc,OAAM,UACnB;AAAA,0BAAC,SAAS,OAAT,EAAe,cAAY,MAC1B,8BAAC,UACC,8BAAC,YAAS,2BAAa,GACzB,GACF;AAAA,MACA,oBAAC,SAAS,OAAT,EACC,8BAAC,QAAK,OAAM,UAAS,WAAU,kBAC7B,8BAAC,QAAK,MAAK,KACT,8BAAC,YAAS,2BAAa,GACzB,GACF,GACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAMA,MAAM,mBAAoD,CAAC;AAAA,EACzD;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,oBAAC,QAAK,MAAK,KAAK,GAAG,sBAAsB,SAAS,QAAQ,GACxD,8BAAC,gBAAa,OAAc,GAC9B;AAEJ;AAEA,MAAM,gBAAgB,MACpB,oBAAC,OAAI,SAAO,MAAC,YAAW,UACtB,8BAAC,SAAM,MAAK,KACV,8BAAC,aAAU,MAAK,KAAI,GACtB,GACF;AAGF,MAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,OAAO,aAAa,OAAO;AACjC,SACE,qBAAC,QAAK,OAAM,UAAS,KAAI,KACvB;AAAA,wBAAC,aAAU,SAAkB;AAAA,IAC7B,oBAAC,QAAK,MAAK,KAAI,IAAG,KACf,gBACH;AAAA,IACC,SACC,qBAAC,OAAI,SAAS,EAAE,SAAS,QAAQ,IAAI,WAAW,GAC9C;AAAA,0BAAC,QAAK,MAAK,KAAI,OAAM,QAAO,oBAE5B;AAAA,MACA,oBAAC,QAAK,MAAK,KAAI,OAAM,QAClB,iBACH;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,MAAM,mBAAmB,MACvB;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,MAAK;AAAA,IACL,SAAQ;AAAA,IAER;AAAA,0BAAC,WAAM,uBAAS;AAAA,MAChB,oBAAC,UAAK,GAAE,mPAAkP;AAAA;AAAA;AAC5P;AAGF,SAAS,sBACP,OACA,UACA;AACA,SAAO,YAAY;AAAA,IACjB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACH;","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, Button, 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\";\nimport { Translation } from \"./i18n/translation.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>\n <Translation\n defaultMessage=\"Profile picture\"\n description=\"Label for the user's avatar\"\n id=\"RvLqCQ\"\n />\n </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>\n <Translation\n defaultMessage=\"Full name\"\n id=\"kkBScm\"\n description=\"Label for user's full name field\"\n />\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 {getBestName(user) || (\n <Text\n color=\"gray\"\n style={{ color: \"var(--gray-10)\", cursor: \"default\" }}\n >\n <Translation\n defaultMessage=\"Not set\"\n id=\"i4vzAY\"\n description=\"Placeholder text when user's name is not set\"\n />\n </Text>\n )}\n </Text>\n\n <EditUserProfileDialog user={user}>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Edit\"\n id=\"5bhXUz\"\n description=\"Button text to edit user profile\"\n />\n </Button>\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>\n <Translation\n defaultMessage=\"Email address\"\n id=\"nLk5pa\"\n description=\"Label for user's email address field\"\n />\n </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>\n <Translation\n defaultMessage=\"Connected accounts\"\n id=\"AW/A69\"\n description=\"Label for user's connected OAuth accounts\"\n />\n </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>\n <Translation\n defaultMessage=\"Full name\"\n id=\"nc7fru\"\n description=\"Loading placeholder for full name label\"\n />\n </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>\n <Translation\n defaultMessage=\"Full name\"\n id=\"6GcWa2\"\n description=\"Loading placeholder for full name value\"\n />\n </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>\n <Translation\n defaultMessage=\"Email address\"\n id=\"gjqw+H\"\n description=\"Loading placeholder for email address label\"\n />\n </Skeleton>\n </Strong>\n </DataList.Label>\n <DataList.Value>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">\n <Skeleton>\n <Translation\n defaultMessage=\"Email address\"\n id=\"75F+g5\"\n description=\"Loading placeholder for email address value\"\n />\n </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 {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\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 {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\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":[]}
@@ -14,6 +14,8 @@ import {
14
14
  getComparativeReadableDate,
15
15
  getDomProps
16
16
  } from "./utils.js";
17
+ import { Translation } from "./i18n/translation.js";
18
+ import { useLocale } from "./i18n/use-locale.js";
17
19
  const UserSecurity = ({
18
20
  settings,
19
21
  ...domProps
@@ -41,55 +43,155 @@ const UserSecurityLoading = (props) => {
41
43
  return /* @__PURE__ */ jsx(Card, { size: "2", ...getWidgetRootDomProps("loading", props), children: /* @__PURE__ */ jsxs(Grid, { columns: "auto 1fr auto", align: "center", gap: "4", children: [
42
44
  /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(IconPanel, {}) }),
43
45
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
44
- /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(Skeleton, { children: "Password" }) }),
45
- /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: /* @__PURE__ */ jsx(Skeleton, { children: "Set a password to access your account" }) })
46
+ /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
47
+ Translation,
48
+ {
49
+ defaultMessage: "Password",
50
+ id: "z19aZa",
51
+ description: "Label for password security settings section"
52
+ }
53
+ ) }) }),
54
+ /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(
55
+ Translation,
56
+ {
57
+ defaultMessage: "Set a password to access your account",
58
+ id: "leodiT",
59
+ description: "Description for setting up a password"
60
+ }
61
+ ) }) })
46
62
  ] }),
47
- /* @__PURE__ */ jsx(ChangePasswordDialog, { children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Change" }) }) })
63
+ /* @__PURE__ */ jsx(ChangePasswordDialog, { children: /* @__PURE__ */ jsx(Skeleton, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
64
+ Translation,
65
+ {
66
+ defaultMessage: "Change",
67
+ id: "/ZV6cj",
68
+ description: "Button label to change password"
69
+ }
70
+ ) }) }) })
48
71
  ] }) });
49
72
  };
50
73
  function PasswordSettings({
51
74
  settings
52
75
  }) {
76
+ const locale = useLocale();
53
77
  return /* @__PURE__ */ jsxs(Grid, { columns: "auto 1fr auto", align: "center", gap: "4", children: [
54
78
  /* @__PURE__ */ jsx(IconPanel, { children: /* @__PURE__ */ jsx(LockClosedIcon, {}) }),
55
79
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
56
- /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: "Password" }),
57
- settings.isSetUp ? settings.lastUsed && /* @__PURE__ */ jsxs(Text, { size: "2", color: "gray", children: [
58
- "Last used",
59
- " ",
60
- getComparativeReadableDate(
61
- /* @__PURE__ */ new Date(),
62
- new Date(settings.lastUsed)
63
- )
64
- ] }) : /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: "Set a password to access your account" })
80
+ /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(
81
+ Translation,
82
+ {
83
+ defaultMessage: "Password",
84
+ id: "z19aZa",
85
+ description: "Label for password security settings section"
86
+ }
87
+ ) }),
88
+ settings.isSetUp ? settings.lastUsed && /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: /* @__PURE__ */ jsx(
89
+ Translation,
90
+ {
91
+ defaultMessage: "Last used {time}",
92
+ id: "Jqn+r+",
93
+ description: "Label indicating when password was last used with time",
94
+ values: {
95
+ time: getComparativeReadableDate(
96
+ /* @__PURE__ */ new Date(),
97
+ new Date(settings.lastUsed),
98
+ { locale }
99
+ )
100
+ }
101
+ }
102
+ ) }) : /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: /* @__PURE__ */ jsx(
103
+ Translation,
104
+ {
105
+ defaultMessage: "Set a password to access your account",
106
+ id: "leodiT",
107
+ description: "Description for setting up a password"
108
+ }
109
+ ) })
65
110
  ] }),
66
- settings.isSetUp ? /* @__PURE__ */ jsx(ChangePasswordDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Change" }) }) : /* @__PURE__ */ jsx(SetPasswordDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Set a password" }) })
111
+ settings.isSetUp ? /* @__PURE__ */ jsx(ChangePasswordDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
112
+ Translation,
113
+ {
114
+ defaultMessage: "Change",
115
+ id: "/ZV6cj",
116
+ description: "Button label to change password"
117
+ }
118
+ ) }) }) : /* @__PURE__ */ jsx(SetPasswordDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
119
+ Translation,
120
+ {
121
+ defaultMessage: "Set a password",
122
+ id: "zokPvK",
123
+ description: "Button label to set a new password"
124
+ }
125
+ ) }) })
67
126
  ] });
68
127
  }
69
128
  function MfaSettings({
70
129
  settings,
71
130
  isPasswordSet
72
131
  }) {
132
+ const locale = useLocale();
73
133
  return /* @__PURE__ */ jsxs(Grid, { columns: "auto 1fr auto", align: "center", gap: "4", children: [
74
134
  /* @__PURE__ */ jsx(IconPanel, { children: /* @__PURE__ */ jsx(ButtonIcon, {}) }),
75
135
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
76
- /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: "Multi-factor authentication" }),
136
+ /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", mb: "-2px", children: /* @__PURE__ */ jsx(
137
+ Translation,
138
+ {
139
+ defaultMessage: "Multi-factor authentication",
140
+ id: "f3uhhm",
141
+ description: "Label for multi-factor authentication settings section"
142
+ }
143
+ ) }),
77
144
  settings.isSetUp ? /* @__PURE__ */ jsxs(Text, { size: "2", children: [
78
- "Authenticator app",
145
+ /* @__PURE__ */ jsx(
146
+ Translation,
147
+ {
148
+ defaultMessage: "Authenticator app",
149
+ id: "0p/a72",
150
+ description: "Label indicating MFA is set up with an authenticator app"
151
+ }
152
+ ),
79
153
  settings.lastUsed && /* @__PURE__ */ jsxs(Fragment, { children: [
80
154
  /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", mx: "1", children: "\u2219" }),
81
- /* @__PURE__ */ jsxs(Text, { size: "2", color: "gray", children: [
82
- "Last used",
83
- " ",
84
- getComparativeReadableDate(
85
- /* @__PURE__ */ new Date(),
86
- new Date(settings.lastUsed)
87
- )
88
- ] })
155
+ /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: /* @__PURE__ */ jsx(
156
+ Translation,
157
+ {
158
+ defaultMessage: "Last used {time}",
159
+ id: "h3R6gY",
160
+ description: "Label indicating when MFA was last used with time",
161
+ values: {
162
+ time: getComparativeReadableDate(
163
+ /* @__PURE__ */ new Date(),
164
+ new Date(settings.lastUsed),
165
+ { locale }
166
+ )
167
+ }
168
+ }
169
+ ) })
89
170
  ] })
90
- ] }) : /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: "Secure your account with an extra verification step" })
171
+ ] }) : /* @__PURE__ */ jsx(Text, { as: "p", size: "2", color: "gray", children: /* @__PURE__ */ jsx(
172
+ Translation,
173
+ {
174
+ defaultMessage: "Secure your account with an extra verification step",
175
+ id: "xZFdkq",
176
+ description: "Description for setting up multi-factor authentication"
177
+ }
178
+ ) })
91
179
  ] }),
92
- settings.isSetUp ? /* @__PURE__ */ jsx(ResetMfaDialog, { isPasswordSet, children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Disable" }) }) : /* @__PURE__ */ jsx(AddMfaDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Set up authenticator app" }) })
180
+ settings.isSetUp ? /* @__PURE__ */ jsx(ResetMfaDialog, { isPasswordSet, children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
181
+ Translation,
182
+ {
183
+ defaultMessage: "Disable",
184
+ id: "4flMgv",
185
+ description: "Button label to disable multi-factor authentication"
186
+ }
187
+ ) }) }) : /* @__PURE__ */ jsx(AddMfaDialog, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
188
+ Translation,
189
+ {
190
+ defaultMessage: "Set up authenticator app",
191
+ id: "oLNIQv",
192
+ description: "Button label to set up multi-factor authentication with an authenticator app"
193
+ }
194
+ ) }) })
93
195
  ] });
94
196
  }
95
197
  function getWidgetRootDomProps(state, domProps) {
@@ -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 { Button, 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 <Button variant=\"secondary\">Change</Button>\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 <Button variant=\"secondary\">Change</Button>\n </ChangePasswordDialog>\n ) : (\n <SetPasswordDialog>\n <Button variant=\"secondary\">Set a password</Button>\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 <Button variant=\"secondary\">Disable</Button>\n </ResetMfaDialog>\n ) : (\n <AddMfaDialog>\n <Button variant=\"secondary\">Set up authenticator app</Button>\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
+ {"version":3,"sources":["../../../src/lib/user-security.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card, Flex, Grid, Text } from \"@radix-ui/themes\";\nimport { Button, 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\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useLocale } from \"./i18n/use-locale.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>\n <Translation\n defaultMessage=\"Password\"\n id=\"z19aZa\"\n description=\"Label for password security settings section\"\n />\n </Skeleton>\n </Text>\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Skeleton>\n <Translation\n defaultMessage=\"Set a password to access your account\"\n id=\"leodiT\"\n description=\"Description for setting up a password\"\n />\n </Skeleton>\n </Text>\n </Flex>\n\n <ChangePasswordDialog>\n <Skeleton>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Change\"\n id=\"/ZV6cj\"\n description=\"Button label to change password\"\n />\n </Button>\n </Skeleton>\n </ChangePasswordDialog>\n </Grid>\n </Card>\n );\n};\n\nfunction PasswordSettings({\n settings,\n}: {\n settings: NonNullable<PasswordVerificationMethod>;\n}) {\n const locale = useLocale();\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 <Translation\n defaultMessage=\"Password\"\n id=\"z19aZa\"\n description=\"Label for password security settings section\"\n />\n </Text>\n\n {settings.isSetUp ? (\n settings.lastUsed && (\n <Text size=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"Last used {time}\"\n id=\"Jqn+r+\"\n description=\"Label indicating when password was last used with time\"\n values={{\n time: getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n { locale },\n ),\n }}\n />\n </Text>\n )\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"Set a password to access your account\"\n id=\"leodiT\"\n description=\"Description for setting up a password\"\n />\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ChangePasswordDialog>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Change\"\n id=\"/ZV6cj\"\n description=\"Button label to change password\"\n />\n </Button>\n </ChangePasswordDialog>\n ) : (\n <SetPasswordDialog>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Set a password\"\n id=\"zokPvK\"\n description=\"Button label to set a new password\"\n />\n </Button>\n </SetPasswordDialog>\n )}\n </Grid>\n );\n}\n\nfunction MfaSettings({\n settings,\n isPasswordSet,\n}: {\n settings: NonNullable<MfaVerificationMethod>;\n isPasswordSet: boolean;\n}) {\n const locale = useLocale();\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 <Translation\n defaultMessage=\"Multi-factor authentication\"\n id=\"f3uhhm\"\n description=\"Label for multi-factor authentication settings section\"\n />\n </Text>\n\n {settings.isSetUp ? (\n <Text size=\"2\">\n <Translation\n defaultMessage=\"Authenticator app\"\n id=\"0p/a72\"\n description=\"Label indicating MFA is set up with an authenticator app\"\n />\n {settings.lastUsed && (\n <>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <Text size=\"2\" color=\"gray\" mx=\"1\">\n ∙\n </Text>\n <Text size=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"Last used {time}\"\n id=\"h3R6gY\"\n description=\"Label indicating when MFA was last used with time\"\n values={{\n time: getComparativeReadableDate(\n new Date(),\n new Date(settings.lastUsed),\n { locale },\n ),\n }}\n />\n </Text>\n </>\n )}\n </Text>\n ) : (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"Secure your account with an extra verification step\"\n id=\"xZFdkq\"\n description=\"Description for setting up multi-factor authentication\"\n />\n </Text>\n )}\n </Flex>\n\n {settings.isSetUp ? (\n <ResetMfaDialog isPasswordSet={isPasswordSet}>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Disable\"\n id=\"4flMgv\"\n description=\"Button label to disable multi-factor authentication\"\n />\n </Button>\n </ResetMfaDialog>\n ) : (\n <AddMfaDialog>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Set up authenticator app\"\n id=\"oLNIQv\"\n description=\"Button label to set up multi-factor authentication with an authenticator app\"\n />\n </Button>\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":";AAqCI,SA2LU,UAxLJ,KAHN;AAnCJ,SAAS,MAAM,MAAM,MAAM,YAAY;AACvC,SAAS,QAAQ,gBAAgB;AACjC,SAAS,iBAAiB;AAC1B,SAAS,YAAY,sBAAsB;AAC3C,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAM7B,SAAS,sBAAsB;AAC/B,YAAY,cAAc;AAC1B,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAM1B,MAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,mBAAmB,SAAS,oBAAoB;AACtD,QAAM,cAAc,SAAS,oBAAoB;AACjD,SACE,qBAAC,SAAS,MAAT,EAAe,GAAG,sBAAsB,YAAY,QAAQ,GAC1D;AAAA,wBACC,oBAAC,SAAS,MAAT,EACC,8BAAC,oBAAiB,UAAU,kBAAkB,GAChD;AAAA,IAED,eACC,oBAAC,SAAS,MAAT,EACC;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,eAAe,CAAC,CAAC,kBAAkB;AAAA;AAAA,IACrC,GACF;AAAA,KAEJ;AAEJ;AAMA,MAAM,oBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,oBAAC,QAAK,MAAK,KAAK,GAAG,sBAAsB,SAAS,QAAQ,GACxD,8BAAC,gBAAa,OAAc,GAC9B;AAEJ;AAIA,MAAM,sBAA0D,CAAC,UAAU;AACzE,SACE,oBAAC,QAAK,MAAK,KAAK,GAAG,sBAAsB,WAAW,KAAK,GACvD,+BAAC,QAAK,SAAQ,iBAAgB,OAAM,UAAS,KAAI,KAC/C;AAAA,wBAAC,YACC,8BAAC,aAAU,GACb;AAAA,IAEA,qBAAC,QAAK,WAAU,UACd;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAY,MAAC,QAAO,QAAO,IAAG,KAAI,IAAG,QAClD,8BAAC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF,GACF;AAAA,MACA,oBAAC,QAAK,IAAG,KAAI,MAAK,KAAI,OAAM,QAC1B,8BAAC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF,GACF;AAAA,OACF;AAAA,IAEA,oBAAC,wBACC,8BAAC,YACC,8BAAC,UAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF,GACF;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AACF,GAEG;AACD,QAAM,SAAS,UAAU;AAEzB,SACE,qBAAC,QAAK,SAAQ,iBAAgB,OAAM,UAAS,KAAI,KAC/C;AAAA,wBAAC,aACC,8BAAC,kBAAe,GAClB;AAAA,IAEA,qBAAC,QAAK,WAAU,UACd;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAY,MAAC,QAAO,QAAO,IAAG,KAAI,IAAG,QAClD;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MAEC,SAAS,UACR,SAAS,YACP,oBAAC,QAAK,MAAK,KAAI,OAAM,QACnB;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA,UACZ,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,oBAAI,KAAK;AAAA,cACT,IAAI,KAAK,SAAS,QAAQ;AAAA,cAC1B,EAAE,OAAO;AAAA,YACX;AAAA,UACF;AAAA;AAAA,MACF,GACF,IAGF,oBAAC,QAAK,IAAG,KAAI,MAAK,KAAI,OAAM,QAC1B;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,OAEJ;AAAA,IAEC,SAAS,UACR,oBAAC,wBACC,8BAAC,UAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF,IAEA,oBAAC,qBACC,8BAAC,UAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,QAAM,SAAS,UAAU;AAEzB,SACE,qBAAC,QAAK,SAAQ,iBAAgB,OAAM,UAAS,KAAI,KAC/C;AAAA,wBAAC,aACC,8BAAC,cAAW,GACd;AAAA,IAEA,qBAAC,QAAK,WAAU,UACd;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAY,MAAC,QAAO,QAAO,IAAG,KAAI,IAAG,QAClD;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MAEC,SAAS,UACR,qBAAC,QAAK,MAAK,KACT;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd;AAAA,QACC,SAAS,YACR,iCAEE;AAAA,8BAAC,QAAK,MAAK,KAAI,OAAM,QAAO,IAAG,KAAI,oBAEnC;AAAA,UACA,oBAAC,QAAK,MAAK,KAAI,OAAM,QACnB;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA,cACZ,QAAQ;AAAA,gBACN,MAAM;AAAA,kBACJ,oBAAI,KAAK;AAAA,kBACT,IAAI,KAAK,SAAS,QAAQ;AAAA,kBAC1B,EAAE,OAAO;AAAA,gBACX;AAAA,cACF;AAAA;AAAA,UACF,GACF;AAAA,WACF;AAAA,SAEJ,IAEA,oBAAC,QAAK,IAAG,KAAI,MAAK,KAAI,OAAM,QAC1B;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,OAEJ;AAAA,IAEC,SAAS,UACR,oBAAC,kBAAe,eACd,8BAAC,UAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF,IAEA,oBAAC,gBACC,8BAAC,UAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,sBACP,OACA,UACA;AACA,SAAO,YAAY;AAAA,IACjB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACH;","names":[]}