@workos-inc/widgets 1.7.1 → 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 (215) hide show
  1. package/CHANGELOG.md +9 -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/css/lib/provider-icon.css +93 -3
  109. package/dist/esm/api/endpoint.d.ts +1 -0
  110. package/dist/esm/api/endpoint.js +1 -0
  111. package/dist/esm/api/endpoint.js.map +1 -1
  112. package/dist/esm/index.d.ts +1 -0
  113. package/dist/esm/index.js +3 -1
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/lib/add-mfa-dialog.js +133 -61
  116. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  117. package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
  118. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  119. package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
  120. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  121. package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
  122. package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
  123. package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
  124. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  125. package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
  126. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  127. package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
  128. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  129. package/dist/esm/lib/api-keys/api-keys.js +16 -2
  130. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  131. package/dist/esm/lib/api-keys/create-api-key.js +172 -20
  132. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  133. package/dist/esm/lib/api-keys/relative-time.js +12 -2
  134. package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
  135. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
  136. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  137. package/dist/esm/lib/change-password-dialog.js +122 -16
  138. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  139. package/dist/esm/lib/copy-button.d.ts +2 -1
  140. package/dist/esm/lib/copy-button.js +14 -2
  141. package/dist/esm/lib/copy-button.js.map +1 -1
  142. package/dist/esm/lib/delete-domain-dialog.js +52 -19
  143. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  144. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  145. package/dist/esm/lib/delete-user-dialog.js +36 -11
  146. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  147. package/dist/esm/lib/domain-actions.js +41 -7
  148. package/dist/esm/lib/domain-actions.js.map +1 -1
  149. package/dist/esm/lib/domain-item.js +42 -8
  150. package/dist/esm/lib/domain-item.js.map +1 -1
  151. package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
  152. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  153. package/dist/esm/lib/edit-user-role-dialog.js +90 -17
  154. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  155. package/dist/esm/lib/elements.d.ts +5 -2
  156. package/dist/esm/lib/elements.js +14 -3
  157. package/dist/esm/lib/elements.js.map +1 -1
  158. package/dist/esm/lib/elevated-access.js +78 -18
  159. package/dist/esm/lib/elevated-access.js.map +1 -1
  160. package/dist/esm/lib/generic-error.d.ts +5 -1
  161. package/dist/esm/lib/generic-error.js +53 -11
  162. package/dist/esm/lib/generic-error.js.map +1 -1
  163. package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
  164. package/dist/esm/lib/i18n/intl-context.js +12 -0
  165. package/dist/esm/lib/i18n/intl-context.js.map +1 -0
  166. package/dist/esm/lib/i18n/translation.d.ts +16 -0
  167. package/dist/esm/lib/i18n/translation.js +45 -0
  168. package/dist/esm/lib/i18n/translation.js.map +1 -0
  169. package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
  170. package/dist/esm/lib/i18n/use-locale.js +9 -0
  171. package/dist/esm/lib/i18n/use-locale.js.map +1 -0
  172. package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
  173. package/dist/esm/lib/i18n/use-translation.js +23 -0
  174. package/dist/esm/lib/i18n/use-translation.js.map +1 -0
  175. package/dist/esm/lib/identity-providers.d.ts +1 -1
  176. package/dist/esm/lib/invite-user-dialog.js +70 -15
  177. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  178. package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
  179. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  180. package/dist/esm/lib/logout-dialog.js +34 -10
  181. package/dist/esm/lib/logout-dialog.js.map +1 -1
  182. package/dist/esm/lib/organization-switcher.js +12 -2
  183. package/dist/esm/lib/organization-switcher.js.map +1 -1
  184. package/dist/esm/lib/pipes.js +175 -36
  185. package/dist/esm/lib/pipes.js.map +1 -1
  186. package/dist/esm/lib/resend-invite-dialog.js +67 -17
  187. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  188. package/dist/esm/lib/reset-mfa-dialog.js +50 -7
  189. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  190. package/dist/esm/lib/revoke-invite-dialog.js +42 -10
  191. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  192. package/dist/esm/lib/save-button.js +9 -1
  193. package/dist/esm/lib/save-button.js.map +1 -1
  194. package/dist/esm/lib/set-password-dialog.js +101 -13
  195. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  196. package/dist/esm/lib/user-actions-dropdown.js +54 -6
  197. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  198. package/dist/esm/lib/user-profile.js +81 -10
  199. package/dist/esm/lib/user-profile.js.map +1 -1
  200. package/dist/esm/lib/user-security.js +127 -25
  201. package/dist/esm/lib/user-security.js.map +1 -1
  202. package/dist/esm/lib/user-sessions.js +74 -15
  203. package/dist/esm/lib/user-sessions.js.map +1 -1
  204. package/dist/esm/lib/users-management.js +266 -51
  205. package/dist/esm/lib/users-management.js.map +1 -1
  206. package/dist/esm/lib/users-search.js +18 -4
  207. package/dist/esm/lib/users-search.js.map +1 -1
  208. package/dist/esm/lib/utils.d.ts +2 -1
  209. package/dist/esm/lib/utils.js +10 -7
  210. package/dist/esm/lib/utils.js.map +1 -1
  211. package/dist/esm/lib/view-dns-record-dialog.js +89 -18
  212. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  213. package/dist/esm/workos-widgets.client.js +2 -2
  214. package/dist/esm/workos-widgets.client.js.map +1 -1
  215. package/package.json +13 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/create-api-key.tsx"],"sourcesContent":["import {\n Box,\n Checkbox,\n Flex,\n ScrollArea,\n Text,\n Callout,\n} from \"@radix-ui/themes\";\nimport {\n Dialog,\n Label,\n Button,\n TextField,\n TextFieldSlot,\n} from \"../elements.js\";\nimport * as Form from \"@radix-ui/react-form\";\nimport {\n ExclamationTriangleIcon,\n InfoCircledIcon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport { CopyButton, CopyIconButton } from \"../copy-button.js\";\nimport * as React from \"react\";\nimport { pluralize } from \"../utils.js\";\nimport {\n useListOrganizationApiKeyPermissions,\n ListOrganizationApiKeyPermission,\n} from \"../../api/endpoint.js\";\nimport { useCreateApiKey } from \"../api/api-key.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\n\nexport function CreateApiKeyDialog() {\n const {\n state: { createDialogOpen, createdApiKey },\n dispatch,\n } = useApiKeysContext();\n\n return (\n <Dialog.Root\n open={createDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({ type: \"CLOSE_CREATE_DIALOG\" });\n }\n }}\n >\n {createdApiKey ? (\n <SaveApiKeyContent apiKey={createdApiKey.value} />\n ) : (\n <CreateApiKeyForm\n // always remount the form when the dialog is opened to reset the validation errors\n key={`${createDialogOpen}`}\n />\n )}\n </Dialog.Root>\n );\n}\n\nfunction CreateApiKeyForm() {\n const { dispatch } = useApiKeysContext();\n const [errors, setErrors] = React.useState<{\n name: boolean;\n }>({ name: false });\n\n const validate = (formData: FormData) => {\n const name = formData.get(\"name\")?.toString() ?? \"\";\n const errors = { name: !name.trim().length };\n setErrors(errors);\n const isValid = Object.values(errors).every((error) => error === false);\n return isValid;\n };\n\n const {\n mutate: createOrganizationApiKey,\n error,\n isPending,\n isSuccess,\n } = useCreateApiKey();\n const permissions = useListOrganizationApiKeyPermissions({ limit: 100 });\n\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Create API key\n </Dialog.Title>\n <Form.Root\n onSubmit={(e) => {\n if (isPending) return;\n e.preventDefault();\n const data = new FormData(e.currentTarget);\n const isValid = validate(data);\n if (!isValid) {\n return;\n }\n\n createOrganizationApiKey(\n {\n data: {\n name: data.get(\"name\")?.toString() ?? \"\",\n permissions: data.getAll(\"permission\").map(String) || [],\n },\n },\n {\n onSuccess: (data) => {\n dispatch({ type: \"SET_CREATED_API_KEY\", apiKey: data });\n },\n },\n );\n }}\n >\n <Flex direction=\"column\" align=\"stretch\" gap=\"4\">\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while creating the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <Form.Field name=\"name\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"2\">\n <Form.Label asChild>\n <Label>Name</Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"off\"\n placeholder=\"A descriptive name for the API key\"\n />\n </Form.Control>\n {errors.name && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n The name is required\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n {permissions.isSuccess && permissions.data.data.length > 0 && (\n <PermissionsField permissions={permissions.data.data} />\n )}\n </Flex>\n\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={isPending || isSuccess}>\n Cancel\n </Button>\n </Dialog.Close>\n <Button type=\"submit\" loading={isPending || isSuccess}>\n Create API key\n </Button>\n </Flex>\n </Form.Root>\n </Dialog.Content>\n );\n}\n\nfunction SaveApiKeyContent({ apiKey }: { apiKey: string }) {\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Save your key\n </Dialog.Title>\n <Dialog.Description size=\"2\">\n Please save this API key in a secure location. If you lose it,\n you&apos;ll need to generate a new one.\n </Dialog.Description>\n <Callout.Root mt=\"5\" mb=\"4\">\n <Callout.Icon>\n <InfoCircledIcon />\n </Callout.Icon>\n <Callout.Text>\n You won&apos;t be able to access the key again. Please copy it now.\n </Callout.Text>\n </Callout.Root>\n <TextField value={apiKey} readOnly>\n <TextFieldSlot side=\"right\">\n <CopyIconButton value={apiKey} />\n </TextFieldSlot>\n </TextField>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <CopyButton value={apiKey}>Copy and close</CopyButton>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n );\n}\n\nfunction Permission({\n checked,\n permission,\n onChange,\n}: {\n checked: boolean;\n permission: ListOrganizationApiKeyPermission;\n onChange: (isChecked: boolean) => void;\n}) {\n return (\n <label\n htmlFor={permission.slug}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"var(--space-2) var(--space-4)\",\n gap: \"var(--space-3)\",\n borderBottom: \"1px solid var(--gray-6)\",\n cursor: \"pointer\",\n }}\n >\n <Checkbox\n checked={checked}\n id={permission.slug}\n name=\"permission\"\n value={permission.slug}\n onCheckedChange={(e) => onChange(e === \"indeterminate\" ? false : e)}\n />\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n </Flex>\n </label>\n );\n}\n\nfunction PermissionsField({\n permissions = [],\n}: {\n permissions: ListOrganizationApiKeyPermission[];\n}) {\n const [selectedPermissions, setSelectedPermissions] = React.useState<\n ListOrganizationApiKeyPermission[]\n >([]);\n const [filter, setFilter] = React.useState(\"\");\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const filteredPermissions = React.useMemo(() => {\n return permissions.filter((p) => {\n return (\n !filter.trim().length ||\n p.description?.toLowerCase().match(filter.toLowerCase()) ||\n p.name.toLowerCase().match(filter.toLowerCase()) ||\n p.slug.toLowerCase().match(filter.toLowerCase())\n );\n });\n }, [permissions, filter]);\n\n React.useEffect(() => {\n const onResize = () => {\n if (fieldRef.current && filteredPermissions.length !== 0) {\n fieldRef.current.style.minHeight = \"unset\";\n }\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n }, [filteredPermissions.length]);\n\n return (\n <Form.Field name=\"permissions\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"1\">\n <Form.Label asChild>\n <Label>Permissions</Label>\n </Form.Label>\n <Text size=\"2\" mb=\"2\" color=\"gray\">\n Only enable the minimum permissions required for your use case.\n </Text>\n <Flex\n ref={fieldRef}\n style={{\n borderRadius: \"var(--radius-3)\",\n borderColor: \"var(--gray-6)\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n }}\n direction=\"column\"\n align=\"stretch\"\n >\n <TextField\n name=\"search\"\n value={filter}\n size=\"2\"\n onChange={(e) => {\n if (fieldRef.current) {\n fieldRef.current.style.minHeight =\n fieldRef.current.clientHeight + 2 + \"px\";\n }\n setFilter(e.target.value);\n }}\n style={{\n height: \"40px\",\n borderRadius: \"var(--radius-3) var(--radius-3) 0 0\",\n boxShadow: \"none\",\n }}\n placeholder=\"Search\"\n >\n <TextFieldSlot side=\"left\" px=\"3\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n {filteredPermissions.length > 0 ? (\n <>\n <ScrollArea\n scrollbars=\"vertical\"\n style={{\n flex: 1,\n maxHeight: \"calc(50vh - 150px)\",\n border: \"1px solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n {filteredPermissions.map((permission) => (\n <Permission\n checked={selectedPermissions.some(\n (sp) => sp.slug === permission.slug,\n )}\n key={permission.slug}\n permission={permission}\n onChange={(isChecked) =>\n setSelectedPermissions((prev) =>\n isChecked\n ? [...prev, permission]\n : prev.filter((sp) => sp.slug !== permission.slug),\n )\n }\n />\n ))}\n </ScrollArea>\n <Box\n px=\"4\"\n py=\"3\"\n mt={\"-1px\"}\n flexGrow=\"0\"\n style={{\n borderTop: \"0 solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n <SelectedPermissions\n total={permissions.length}\n selected={selectedPermissions.length}\n onToggle={() =>\n setSelectedPermissions((prev) =>\n prev.length === permissions.length ? [] : permissions,\n )\n }\n />\n </Box>\n </>\n ) : (\n <Flex\n gap=\"4\"\n pt=\"6\"\n pb=\"6\"\n style={{ borderTop: \"1px solid var(--gray-6)\" }}\n flexGrow=\"1\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n >\n <MagnifyingGlassIcon\n style={{\n color: \"var(--gray-9)\",\n width: \"var(--space-5)\",\n height: \"var(--space-5)\",\n }}\n />\n <Text size=\"2\" align=\"center\" mb=\"2\" wrap=\"balance\" weight=\"bold\">\n No permissions match your search\n </Text>\n <Button\n variant=\"secondary\"\n size=\"1\"\n onClick={() => setFilter(\"\")}\n >\n Clear search\n </Button>\n </Flex>\n )}\n </Flex>\n </Flex>\n </Form.Field>\n );\n}\n\nfunction SelectedPermissions({\n total,\n selected,\n onToggle,\n}: {\n total: number;\n selected: number;\n onToggle: () => void;\n}) {\n return (\n <Flex align=\"center\" gap=\"2\">\n <Text size=\"1\" style={{ lineHeight: 1, color: \"var(--gray-11)\" }}>\n {selected === 0\n ? \"No permissions selected\"\n : `${pluralize(\"permission\", selected)} selected`}\n </Text>\n <Text\n size=\"1\"\n onClick={onToggle}\n style={{ cursor: \"pointer\", color: \"var(--accent-10)\" }}\n >\n {total === selected ? \"Deselect all\" : \"Select all\"}\n </Text>\n </Flex>\n );\n}\n\nexport function CreateApiKeyButton() {\n const { dispatch } = useApiKeysContext();\n return (\n <Button\n variant=\"secondary\"\n onClick={() => dispatch({ type: \"OPEN_CREATE_DIALOG\" })}\n >\n Create API key\n </Button>\n );\n}\n"],"mappings":"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","names":["errors","error","data"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/create-api-key.tsx"],"sourcesContent":["import {\n Box,\n Checkbox,\n Flex,\n ScrollArea,\n Text,\n Callout,\n} from \"@radix-ui/themes\";\nimport {\n Dialog,\n Label,\n Button,\n TextField,\n TextFieldSlot,\n} from \"../elements.js\";\nimport * as Form from \"@radix-ui/react-form\";\nimport {\n ExclamationTriangleIcon,\n InfoCircledIcon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport { CopyButton, CopyIconButton } from \"../copy-button.js\";\nimport * as React from \"react\";\nimport {\n useListOrganizationApiKeyPermissions,\n ListOrganizationApiKeyPermission,\n} from \"../../api/endpoint.js\";\nimport { useCreateApiKey } from \"../api/api-key.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\nimport { Translation } from \"../i18n/translation.js\";\nimport { useTranslation } from \"../i18n/use-translation.js\";\n\nexport function CreateApiKeyDialog() {\n const {\n state: { createDialogOpen, createdApiKey },\n dispatch,\n } = useApiKeysContext();\n\n return (\n <Dialog.Root\n open={createDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({ type: \"CLOSE_CREATE_DIALOG\" });\n }\n }}\n >\n {createdApiKey ? (\n <SaveApiKeyContent apiKey={createdApiKey.value} />\n ) : (\n <CreateApiKeyForm\n // always remount the form when the dialog is opened to reset the validation errors\n key={`${createDialogOpen}`}\n />\n )}\n </Dialog.Root>\n );\n}\n\nfunction CreateApiKeyForm() {\n const { dispatch } = useApiKeysContext();\n const translate = useTranslation();\n const [errors, setErrors] = React.useState<{\n name: boolean;\n }>({ name: false });\n\n const validate = (formData: FormData) => {\n const name = formData.get(\"name\")?.toString() ?? \"\";\n const errors = { name: !name.trim().length };\n setErrors(errors);\n const isValid = Object.values(errors).every((error) => error === false);\n return isValid;\n };\n\n const {\n mutate: createOrganizationApiKey,\n error,\n isPending,\n isSuccess,\n } = useCreateApiKey();\n const permissions = useListOrganizationApiKeyPermissions({ limit: 100 });\n\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n <Translation\n defaultMessage=\"Create API key\"\n id=\"eUFRNS\"\n description=\"Dialog title for creating a new API key\"\n />\n </Dialog.Title>\n <Form.Root\n onSubmit={(e) => {\n if (isPending) return;\n e.preventDefault();\n const data = new FormData(e.currentTarget);\n const isValid = validate(data);\n if (!isValid) {\n return;\n }\n\n createOrganizationApiKey(\n {\n data: {\n name: data.get(\"name\")?.toString() ?? \"\",\n permissions: data.getAll(\"permission\").map(String) || [],\n },\n },\n {\n onSuccess: (data) => {\n dispatch({ type: \"SET_CREATED_API_KEY\", apiKey: data });\n },\n },\n );\n }}\n >\n <Flex direction=\"column\" align=\"stretch\" gap=\"4\">\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n <Translation\n defaultMessage=\"An error occurred while creating the API key.\"\n id=\"0LyBVd\"\n description=\"Error message when API key creation fails\"\n />\n </Callout.Text>\n </Callout.Root>\n )}\n <Form.Field name=\"name\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Name\"\n id=\"v0VmRy\"\n description=\"Label for API key name input field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"A descriptive name for the API key\",\n id: \"moyvr4\",\n description: \"Placeholder for API key name input\",\n })}\n />\n </Form.Control>\n {errors.name && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"The name is required\"\n id=\"oF9d2V\"\n description=\"Validation error when API key name is empty\"\n />\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n {permissions.isSuccess && permissions.data.data.length > 0 && (\n <PermissionsField permissions={permissions.data.data} />\n )}\n </Flex>\n\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={isPending || isSuccess}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"AyVAAW\"\n description=\"Button to cancel API key creation\"\n />\n </Button>\n </Dialog.Close>\n <Button type=\"submit\" loading={isPending || isSuccess}>\n <Translation\n defaultMessage=\"Create API key\"\n id=\"d4BNWL\"\n description=\"Button to submit and create the API key\"\n />\n </Button>\n </Flex>\n </Form.Root>\n </Dialog.Content>\n );\n}\n\nfunction SaveApiKeyContent({ apiKey }: { apiKey: string }) {\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n <Translation\n defaultMessage=\"Save your key\"\n id=\"wFFCij\"\n description=\"Dialog title prompting user to save their API key\"\n />\n </Dialog.Title>\n <Dialog.Description size=\"2\">\n <Translation\n defaultMessage=\"Please save this API key in a secure location. If you lose it, you'll need to generate a new one.\"\n id=\"sy+2x7\"\n description=\"Warning message about saving the API key\"\n />\n </Dialog.Description>\n <Callout.Root mt=\"5\" mb=\"4\">\n <Callout.Icon>\n <InfoCircledIcon />\n </Callout.Icon>\n <Callout.Text>\n <Translation\n defaultMessage=\"You won't be able to access the key again. Please copy it now.\"\n id=\"EFAK/K\"\n description=\"Callout warning that the key won't be accessible again\"\n />\n </Callout.Text>\n </Callout.Root>\n <TextField value={apiKey} readOnly>\n <TextFieldSlot side=\"right\">\n <CopyIconButton value={apiKey} />\n </TextFieldSlot>\n </TextField>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <CopyButton value={apiKey}>\n <Translation\n defaultMessage=\"Copy and close\"\n id=\"ViYtvQ\"\n description=\"Button to copy API key and close dialog\"\n />\n </CopyButton>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n );\n}\n\nfunction Permission({\n checked,\n permission,\n onChange,\n}: {\n checked: boolean;\n permission: ListOrganizationApiKeyPermission;\n onChange: (isChecked: boolean) => void;\n}) {\n return (\n <label\n htmlFor={permission.slug}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"var(--space-2) var(--space-4)\",\n gap: \"var(--space-3)\",\n borderBottom: \"1px solid var(--gray-6)\",\n cursor: \"pointer\",\n }}\n >\n <Checkbox\n checked={checked}\n id={permission.slug}\n name=\"permission\"\n value={permission.slug}\n onCheckedChange={(e) => onChange(e === \"indeterminate\" ? false : e)}\n />\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n </Flex>\n </label>\n );\n}\n\nfunction PermissionsField({\n permissions = [],\n}: {\n permissions: ListOrganizationApiKeyPermission[];\n}) {\n const [selectedPermissions, setSelectedPermissions] = React.useState<\n ListOrganizationApiKeyPermission[]\n >([]);\n const [filter, setFilter] = React.useState(\"\");\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const translate = useTranslation();\n const filteredPermissions = React.useMemo(() => {\n return permissions.filter((p) => {\n return (\n !filter.trim().length ||\n p.description?.toLowerCase().match(filter.toLowerCase()) ||\n p.name.toLowerCase().match(filter.toLowerCase()) ||\n p.slug.toLowerCase().match(filter.toLowerCase())\n );\n });\n }, [permissions, filter]);\n\n React.useEffect(() => {\n const onResize = () => {\n if (fieldRef.current && filteredPermissions.length !== 0) {\n fieldRef.current.style.minHeight = \"unset\";\n }\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n }, [filteredPermissions.length]);\n\n return (\n <Form.Field name=\"permissions\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"1\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Permissions\"\n id=\"6YN1wO\"\n description=\"Label for API key permissions field\"\n />\n </Label>\n </Form.Label>\n <Text size=\"2\" mb=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"Only enable the minimum permissions required for your use case.\"\n id=\"q2VEtG\"\n description=\"Help text for API key permissions selection\"\n />\n </Text>\n <Flex\n ref={fieldRef}\n style={{\n borderRadius: \"var(--radius-3)\",\n borderColor: \"var(--gray-6)\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n }}\n direction=\"column\"\n align=\"stretch\"\n >\n <TextField\n name=\"search\"\n value={filter}\n size=\"2\"\n onChange={(e) => {\n if (fieldRef.current) {\n fieldRef.current.style.minHeight =\n fieldRef.current.clientHeight + 2 + \"px\";\n }\n setFilter(e.target.value);\n }}\n style={{\n height: \"40px\",\n borderRadius: \"var(--radius-3) var(--radius-3) 0 0\",\n boxShadow: \"none\",\n }}\n placeholder={translate({\n defaultMessage: \"Search\",\n id: \"iyNcly\",\n description: \"Placeholder for permissions search input\",\n })}\n >\n <TextFieldSlot side=\"left\" px=\"3\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n {filteredPermissions.length > 0 ? (\n <>\n <ScrollArea\n scrollbars=\"vertical\"\n style={{\n flex: 1,\n maxHeight: \"calc(50vh - 150px)\",\n border: \"1px solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n {filteredPermissions.map((permission) => (\n <Permission\n checked={selectedPermissions.some(\n (sp) => sp.slug === permission.slug,\n )}\n key={permission.slug}\n permission={permission}\n onChange={(isChecked) =>\n setSelectedPermissions((prev) =>\n isChecked\n ? [...prev, permission]\n : prev.filter((sp) => sp.slug !== permission.slug),\n )\n }\n />\n ))}\n </ScrollArea>\n <Box\n px=\"4\"\n py=\"3\"\n mt={\"-1px\"}\n flexGrow=\"0\"\n style={{\n borderTop: \"0 solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n <SelectedPermissions\n total={permissions.length}\n selected={selectedPermissions.length}\n onToggle={() =>\n setSelectedPermissions((prev) =>\n prev.length === permissions.length ? [] : permissions,\n )\n }\n />\n </Box>\n </>\n ) : (\n <Flex\n gap=\"4\"\n pt=\"6\"\n pb=\"6\"\n style={{ borderTop: \"1px solid var(--gray-6)\" }}\n flexGrow=\"1\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n >\n <MagnifyingGlassIcon\n style={{\n color: \"var(--gray-9)\",\n width: \"var(--space-5)\",\n height: \"var(--space-5)\",\n }}\n />\n <Text size=\"2\" align=\"center\" mb=\"2\" wrap=\"balance\" weight=\"bold\">\n <Translation\n defaultMessage=\"No permissions match your search\"\n id=\"xjqT9f\"\n description=\"Empty state message when no permissions match search\"\n />\n </Text>\n <Button\n variant=\"secondary\"\n size=\"1\"\n onClick={() => setFilter(\"\")}\n >\n <Translation\n defaultMessage=\"Clear search\"\n id=\"YrMs63\"\n description=\"Button to clear permissions search\"\n />\n </Button>\n </Flex>\n )}\n </Flex>\n </Flex>\n </Form.Field>\n );\n}\n\nfunction SelectedPermissions({\n total,\n selected,\n onToggle,\n}: {\n total: number;\n selected: number;\n onToggle: () => void;\n}) {\n return (\n <Flex align=\"center\" gap=\"2\">\n <Text size=\"1\" style={{ lineHeight: 1, color: \"var(--gray-11)\" }}>\n {selected === 0 ? (\n <Translation\n defaultMessage=\"No permissions selected\"\n id=\"FqU9hv\"\n description=\"Message when no permissions are selected\"\n />\n ) : selected === 1 ? (\n <Translation\n defaultMessage=\"1 permission selected\"\n id=\"VouLgT\"\n description=\"Message showing count of selected permissions\"\n />\n ) : (\n <Translation\n defaultMessage=\"{count} permissions selected\"\n id=\"ZL90DI\"\n description=\"Message showing count of selected permissions\"\n values={{ count: selected }}\n />\n )}\n </Text>\n <Text\n size=\"1\"\n onClick={onToggle}\n style={{ cursor: \"pointer\", color: \"var(--accent-10)\" }}\n >\n {total === selected ? (\n <Translation\n defaultMessage=\"Deselect all\"\n id=\"63f7SY\"\n description=\"Button to deselect all permissions\"\n />\n ) : (\n <Translation\n defaultMessage=\"Select all\"\n id=\"onTqlA\"\n description=\"Button to select all permissions\"\n />\n )}\n </Text>\n </Flex>\n );\n}\n\nexport function CreateApiKeyButton() {\n const { dispatch } = useApiKeysContext();\n return (\n <Button\n variant=\"secondary\"\n onClick={() => dispatch({ type: \"OPEN_CREATE_DIALOG\" })}\n >\n <Translation\n defaultMessage=\"Create API key\"\n id=\"vq5724\"\n description=\"Button to open create API key dialog\"\n />\n </Button>\n );\n}\n"],"mappings":"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","names":["errors","error","data"]}
@@ -24,12 +24,22 @@ module.exports = __toCommonJS(relative_time_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_use_is_hydrated = require("../use-is-hydrated.js");
26
26
  var import_utils = require("../utils.js");
27
+ var import_translation = require("../i18n/translation.js");
28
+ var import_use_locale = require("../i18n/use-locale.js");
27
29
  function RelativeTime({ date }) {
28
30
  const isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
31
+ const locale = (0, import_use_locale.useLocale)();
29
32
  if (!date) {
30
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: "Never" });
33
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
34
+ import_translation.Translation,
35
+ {
36
+ defaultMessage: "Never",
37
+ id: "yXCbRa",
38
+ description: "Text indicating API key was never used"
39
+ }
40
+ ) });
31
41
  }
32
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: isHydrated ? (0, import_utils.getComparativeReadableDate)(/* @__PURE__ */ new Date(), date) : date.toLocaleDateString("en-US", {
42
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: isHydrated ? (0, import_utils.getComparativeReadableDate)(/* @__PURE__ */ new Date(), date, { locale }) : date.toLocaleDateString(locale, {
33
43
  month: "short",
34
44
  day: "numeric",
35
45
  year: "numeric"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/relative-time.tsx"],"sourcesContent":["import { useIsHydrated } from \"../use-is-hydrated.js\";\nimport { getComparativeReadableDate } from \"../utils.js\";\n\nexport function RelativeTime({ date }: { date?: Date }) {\n const isHydrated = useIsHydrated();\n\n if (!date) {\n return <>Never</>;\n }\n\n return (\n <>\n {isHydrated\n ? getComparativeReadableDate(new Date(), date)\n : date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOW;AAPX,6BAA8B;AAC9B,mBAA2C;AAEpC,SAAS,aAAa,EAAE,KAAK,GAAoB;AACtD,QAAM,iBAAa,sCAAc;AAEjC,MAAI,CAAC,MAAM;AACT,WAAO,2EAAE,mBAAK;AAAA,EAChB;AAEA,SACE,2EACG,2BACG,yCAA2B,oBAAI,KAAK,GAAG,IAAI,IAC3C,KAAK,mBAAmB,SAAS;AAAA,IAC/B,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC,GACP;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/relative-time.tsx"],"sourcesContent":["import { useIsHydrated } from \"../use-is-hydrated.js\";\nimport { getComparativeReadableDate } from \"../utils.js\";\nimport { Translation } from \"../i18n/translation.js\";\nimport { useLocale } from \"../i18n/use-locale.js\";\n\nexport function RelativeTime({ date }: { date?: Date }) {\n const isHydrated = useIsHydrated();\n const locale = useLocale();\n\n if (!date) {\n return (\n <>\n <Translation\n defaultMessage=\"Never\"\n id=\"yXCbRa\"\n description=\"Text indicating API key was never used\"\n />\n </>\n );\n }\n\n return (\n <>\n {isHydrated\n ? getComparativeReadableDate(new Date(), date, { locale })\n : date.toLocaleDateString(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWM;AAXN,6BAA8B;AAC9B,mBAA2C;AAC3C,yBAA4B;AAC5B,wBAA0B;AAEnB,SAAS,aAAa,EAAE,KAAK,GAAoB;AACtD,QAAM,iBAAa,sCAAc;AACjC,QAAM,aAAS,6BAAU;AAEzB,MAAI,CAAC,MAAM;AACT,WACE,2EACE;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,EAEJ;AAEA,SACE,2EACG,2BACG,yCAA2B,oBAAI,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,IACvD,KAAK,mBAAmB,QAAQ;AAAA,IAC9B,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC,GACP;AAEJ;","names":[]}
@@ -29,6 +29,7 @@ var import_endpoint2 = require("../../api/endpoint.js");
29
29
  var import_react_query = require("@tanstack/react-query");
30
30
  var import_react_icons = require("@radix-ui/react-icons");
31
31
  var import_elements = require("../elements.js");
32
+ var import_translation = require("../i18n/translation.js");
32
33
  function RevokeApiKeyDialog({
33
34
  apiKey,
34
35
  open,
@@ -51,20 +52,54 @@ function RevokeApiKeyDialog({
51
52
  }
52
53
  });
53
54
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Root, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Content, { maxWidth: "529px", children: [
54
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Title, { mb: "2", children: "Revoke API key?" }),
55
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Title, { mb: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
56
+ import_translation.Translation,
57
+ {
58
+ defaultMessage: "Revoke API key?",
59
+ id: "e18ZsK",
60
+ description: "Dialog title for confirming API key revocation"
61
+ }
62
+ ) }),
55
63
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "5", children: [
56
64
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Description, { size: "2", children: [
57
- "This API key will be immediately disabled. API request made using this key will be rejected, which could cause any systems still depending on it to break.",
58
- " ",
59
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "This action cannot be undone." })
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
66
+ import_translation.Translation,
67
+ {
68
+ defaultMessage: "This API key will be immediately disabled. API request made using this key will be rejected, which could cause any systems still depending on it to break.",
69
+ id: "GLPUiU",
70
+ description: "Warning about revoking API key"
71
+ }
72
+ ),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ import_translation.Translation,
75
+ {
76
+ defaultMessage: "This action cannot be undone.",
77
+ id: "PTbRJT",
78
+ description: "Warning that API key revocation is permanent"
79
+ }
80
+ ) })
60
81
  ] }),
61
82
  error && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Callout.Root, { color: "red", role: "alert", children: [
62
83
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Icon, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.ExclamationTriangleIcon, {}) }),
63
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: "An error occurred while revoking the API key." })
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
85
+ import_translation.Translation,
86
+ {
87
+ defaultMessage: "An error occurred while revoking the API key.",
88
+ id: "edrdLd",
89
+ description: "Error message when API key revocation fails"
90
+ }
91
+ ) })
64
92
  ] }),
65
93
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_key_details_card.ApiKeyDetailsCard, { apiKey }),
66
94
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "end", gap: "2", children: [
67
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: "Cancel" }) }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
96
+ import_translation.Translation,
97
+ {
98
+ defaultMessage: "Cancel",
99
+ id: "EKf0ES",
100
+ description: "Button to cancel API key revocation"
101
+ }
102
+ ) }) }),
68
103
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
69
104
  import_elements.Button,
70
105
  {
@@ -72,7 +107,14 @@ function RevokeApiKeyDialog({
72
107
  disabled: isPending || isSuccess,
73
108
  loading: isPending || isSuccess,
74
109
  onClick: () => deleteOrganizationApiKey({ apiKeyId: apiKey.id }),
75
- children: "Revoke key"
110
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
111
+ import_translation.Translation,
112
+ {
113
+ defaultMessage: "Revoke key",
114
+ id: "KSosDD",
115
+ description: "Button to confirm API key revocation"
116
+ }
117
+ )
76
118
  }
77
119
  )
78
120
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/revoke-api-key-dialog.tsx"],"sourcesContent":["import { Flex, Callout } from \"@radix-ui/themes\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n getListOrganizationApiKeysQueryKey,\n ListOrganizationApiKeysResponseData,\n} from \"../../api/endpoint.js\";\nimport { useDeleteOrganizationApiKey } from \"../../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ExclamationTriangleIcon } from \"@radix-ui/react-icons\";\nimport { AlertDialog, Button } from \"../elements.js\";\n\nexport function RevokeApiKeyDialog({\n apiKey,\n open,\n onOpenChange,\n}: {\n apiKey: ListOrganizationApiKeysResponseData;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteOrganizationApiKey,\n isPending,\n error,\n isSuccess,\n } = useDeleteOrganizationApiKey({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationApiKeysQueryKey(),\n });\n onOpenChange(false);\n },\n },\n });\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content maxWidth=\"529px\">\n <AlertDialog.Title mb=\"2\">Revoke API key?</AlertDialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <AlertDialog.Description size=\"2\">\n This API key will be immediately disabled. API request made using\n this key will be rejected, which could cause any systems still\n depending on it to break.{\" \"}\n <strong>This action cannot be undone.</strong>\n </AlertDialog.Description>\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while revoking the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <ApiKeyDetailsCard apiKey={apiKey} />\n <Flex justify=\"end\" gap=\"2\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">Cancel</Button>\n </AlertDialog.Cancel>\n <Button\n variant=\"destructive\"\n disabled={isPending || isSuccess}\n loading={isPending || isSuccess}\n onClick={() => deleteOrganizationApiKey({ apiKeyId: apiKey.id })}\n >\n Revoke key\n </Button>\n </Flex>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCQ;AAxCR,oBAA8B;AAC9B,kCAAkC;AAClC,sBAGO;AACP,IAAAA,mBAA4C;AAC5C,yBAA+B;AAC/B,yBAAwC;AACxC,sBAAoC;AAE7B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,kBAAc,mCAAe;AACnC,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAA4B;AAAA,IAC9B,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AACD,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,4CAAC,4BAAY,MAAZ,EAAiB,MAAY,cAC5B,uDAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,4BAAY,OAAZ,EAAkB,IAAG,KAAI,6BAAe;AAAA,IACzC,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,mDAAC,4BAAY,aAAZ,EAAwB,MAAK,KAAI;AAAA;AAAA,QAGN;AAAA,QAC1B,4CAAC,YAAO,2CAA6B;AAAA,SACvC;AAAA,MACC,SACC,6CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,MAAK,SAC7B;AAAA,oDAAC,sBAAQ,MAAR,EACC,sDAAC,8CAAwB,GAC3B;AAAA,QACA,4CAAC,sBAAQ,MAAR,EAAa,2DAEd;AAAA,SACF;AAAA,MAEF,4CAAC,iDAAkB,QAAgB;AAAA,MACnC,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KACtB;AAAA,oDAAC,4BAAY,QAAZ,EACC,sDAAC,0BAAO,SAAQ,aAAY,oBAAM,GACpC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,YACtB,SAAS,MAAM,yBAAyB,EAAE,UAAU,OAAO,GAAG,CAAC;AAAA,YAChE;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["import_endpoint"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/revoke-api-key-dialog.tsx"],"sourcesContent":["import { Flex, Callout } from \"@radix-ui/themes\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n getListOrganizationApiKeysQueryKey,\n ListOrganizationApiKeysResponseData,\n} from \"../../api/endpoint.js\";\nimport { useDeleteOrganizationApiKey } from \"../../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ExclamationTriangleIcon } from \"@radix-ui/react-icons\";\nimport { AlertDialog, Button } from \"../elements.js\";\nimport { Translation } from \"../i18n/translation.js\";\n\nexport function RevokeApiKeyDialog({\n apiKey,\n open,\n onOpenChange,\n}: {\n apiKey: ListOrganizationApiKeysResponseData;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteOrganizationApiKey,\n isPending,\n error,\n isSuccess,\n } = useDeleteOrganizationApiKey({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationApiKeysQueryKey(),\n });\n onOpenChange(false);\n },\n },\n });\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content maxWidth=\"529px\">\n <AlertDialog.Title mb=\"2\">\n <Translation\n defaultMessage=\"Revoke API key?\"\n id=\"e18ZsK\"\n description=\"Dialog title for confirming API key revocation\"\n />\n </AlertDialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <AlertDialog.Description size=\"2\">\n <Translation\n defaultMessage=\"This API key will be immediately disabled. API request made using this key will be rejected, which could cause any systems still depending on it to break.\"\n id=\"GLPUiU\"\n description=\"Warning about revoking API key\"\n />\n <strong>\n <Translation\n defaultMessage=\"This action cannot be undone.\"\n id=\"PTbRJT\"\n description=\"Warning that API key revocation is permanent\"\n />\n </strong>\n </AlertDialog.Description>\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n <Translation\n defaultMessage=\"An error occurred while revoking the API key.\"\n id=\"edrdLd\"\n description=\"Error message when API key revocation fails\"\n />\n </Callout.Text>\n </Callout.Root>\n )}\n <ApiKeyDetailsCard apiKey={apiKey} />\n <Flex justify=\"end\" gap=\"2\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"EKf0ES\"\n description=\"Button to cancel API key revocation\"\n />\n </Button>\n </AlertDialog.Cancel>\n <Button\n variant=\"destructive\"\n disabled={isPending || isSuccess}\n loading={isPending || isSuccess}\n onClick={() => deleteOrganizationApiKey({ apiKeyId: apiKey.id })}\n >\n <Translation\n defaultMessage=\"Revoke key\"\n id=\"KSosDD\"\n description=\"Button to confirm API key revocation\"\n />\n </Button>\n </Flex>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CU;AA1CV,oBAA8B;AAC9B,kCAAkC;AAClC,sBAGO;AACP,IAAAA,mBAA4C;AAC5C,yBAA+B;AAC/B,yBAAwC;AACxC,sBAAoC;AACpC,yBAA4B;AAErB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,kBAAc,mCAAe;AACnC,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAA4B;AAAA,IAC9B,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AACD,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,4CAAC,4BAAY,MAAZ,EAAiB,MAAY,cAC5B,uDAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,4BAAY,OAAZ,EAAkB,IAAG,KACpB;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,mDAAC,4BAAY,aAAZ,EAAwB,MAAK,KAC5B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd;AAAA,QACA,4CAAC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF;AAAA,SACF;AAAA,MACC,SACC,6CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,MAAK,SAC7B;AAAA,oDAAC,sBAAQ,MAAR,EACC,sDAAC,8CAAwB,GAC3B;AAAA,QACA,4CAAC,sBAAQ,MAAR,EACC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF;AAAA,SACF;AAAA,MAEF,4CAAC,iDAAkB,QAAgB;AAAA,MACnC,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KACtB;AAAA,oDAAC,4BAAY,QAAZ,EACC,sDAAC,0BAAO,SAAQ,aACd;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,YACtB,SAAS,MAAM,yBAAyB,EAAE,UAAU,OAAO,GAAG,CAAC;AAAA,YAE/D;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["import_endpoint"]}
@@ -39,6 +39,8 @@ var React = __toESM(require("react"), 1);
39
39
  var import_elements = require("./elements.js");
40
40
  var import_endpoint = require("../api/endpoint.js");
41
41
  var import_save_button = require("./save-button.js");
42
+ var import_translation = require("./i18n/translation.js");
43
+ var import_use_translation = require("./i18n/use-translation.js");
42
44
  function ChangePasswordDialog({
43
45
  children,
44
46
  ...props
@@ -61,6 +63,7 @@ function ChangePasswordDialog({
61
63
  );
62
64
  }
63
65
  function Content({ onClose }) {
66
+ const translate = (0, import_use_translation.useTranslation)();
64
67
  const changePassword = (0, import_endpoint.useUpdatePassword)({
65
68
  mutation: {
66
69
  onError: (error) => {
@@ -91,8 +94,22 @@ function Content({ onClose }) {
91
94
  });
92
95
  };
93
96
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
94
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children: "Change Password" }),
95
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: "Change your account password" }) }),
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
98
+ import_translation.Translation,
99
+ {
100
+ defaultMessage: "Change Password",
101
+ id: "kAYx7z",
102
+ description: "Dialog title for changing password"
103
+ }
104
+ ) }),
105
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ import_translation.Translation,
107
+ {
108
+ defaultMessage: "Change your account password",
109
+ id: "R5rXuR",
110
+ description: "Dialog description for changing password"
111
+ }
112
+ ) }) }),
96
113
  errorMessage && errorMessage !== "Invalid credentials" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", my: "-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: errorMessage }) }) : null,
97
114
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
98
115
  Form.Root,
@@ -120,7 +137,14 @@ function Content({ onClose }) {
120
137
  asChild: true,
121
138
  serverInvalid: !serverErrors.currentPassword,
122
139
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
123
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: "Enter your current password" }) }),
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
141
+ import_translation.Translation,
142
+ {
143
+ defaultMessage: "Enter your current password",
144
+ id: "uqn8py",
145
+ description: "Label for current password field"
146
+ }
147
+ ) }) }),
124
148
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
125
149
  import_elements.PasswordField,
126
150
  {
@@ -128,10 +152,21 @@ function Content({ onClose }) {
128
152
  required: true,
129
153
  disabled: changePassword.isPending || changePassword.isSuccess,
130
154
  autoComplete: "current-password",
131
- placeholder: "Current password"
155
+ placeholder: translate({
156
+ defaultMessage: "Current password",
157
+ id: "P2oB4G",
158
+ description: "Placeholder for current password field"
159
+ })
132
160
  }
133
161
  ) }),
134
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "Please enter your current password" }) }),
162
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
163
+ import_translation.Translation,
164
+ {
165
+ defaultMessage: "Please enter your current password",
166
+ id: "QKO3st",
167
+ description: "Error message when current password is missing"
168
+ }
169
+ ) }) }),
135
170
  serverErrors.currentPassword && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: serverErrors.currentPassword }) })
136
171
  ] })
137
172
  }
@@ -143,24 +178,56 @@ function Content({ onClose }) {
143
178
  asChild: true,
144
179
  serverInvalid: !serverErrors.password,
145
180
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
146
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: "Enter your new password" }) }),
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
+ import_translation.Translation,
183
+ {
184
+ defaultMessage: "Enter your new password",
185
+ id: "b/+TBS",
186
+ description: "Label for new password field"
187
+ }
188
+ ) }) }),
147
189
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
148
190
  import_elements.PasswordField,
149
191
  {
150
192
  autoComplete: "new-password",
151
- placeholder: "New password",
193
+ placeholder: translate({
194
+ defaultMessage: "New password",
195
+ id: "8d23GS",
196
+ description: "Placeholder for new password field"
197
+ }),
152
198
  required: true,
153
199
  disabled: changePassword.isPending || changePassword.isSuccess
154
200
  }
155
201
  ) }),
156
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "Please enter your new password" }) }),
157
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: (value) => value.length < 8, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "Password must be at least 8 characters" }) }),
202
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
203
+ import_translation.Translation,
204
+ {
205
+ defaultMessage: "Please enter your new password",
206
+ id: "L4yLAf",
207
+ description: "Error message when new password is missing"
208
+ }
209
+ ) }) }),
210
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: (value) => value.length < 8, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
211
+ import_translation.Translation,
212
+ {
213
+ defaultMessage: "Password must be at least 8 characters",
214
+ id: "WRjyrh",
215
+ description: "Error message when password is too short"
216
+ }
217
+ ) }) }),
158
218
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
159
219
  Form.Message,
160
220
  {
161
221
  match: (value, formData) => value === formData.get("oldPassword"),
162
222
  asChild: true,
163
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "You cannot reuse your current password" })
223
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
+ import_translation.Translation,
225
+ {
226
+ defaultMessage: "You cannot reuse your current password",
227
+ id: "mEkhOO",
228
+ description: "Error message when user tries to reuse current password"
229
+ }
230
+ ) })
164
231
  }
165
232
  )
166
233
  ] })
@@ -173,23 +240,48 @@ function Content({ onClose }) {
173
240
  asChild: true,
174
241
  serverInvalid: !serverErrors.confirmPassword,
175
242
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
176
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: "Confirm your new password" }) }),
243
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
244
+ import_translation.Translation,
245
+ {
246
+ defaultMessage: "Confirm your new password",
247
+ id: "K83lBn",
248
+ description: "Label for password confirmation field"
249
+ }
250
+ ) }) }),
177
251
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
178
252
  import_elements.PasswordField,
179
253
  {
180
254
  autoComplete: "new-password",
181
- placeholder: "Confirm new password",
255
+ placeholder: translate({
256
+ defaultMessage: "Confirm new password",
257
+ id: "cubpBN",
258
+ description: "Placeholder for password confirmation field"
259
+ }),
182
260
  required: true,
183
261
  disabled: changePassword.isPending || changePassword.isSuccess
184
262
  }
185
263
  ) }),
186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "Please confirm your new password" }) }),
264
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Message, { match: "valueMissing", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
265
+ import_translation.Translation,
266
+ {
267
+ defaultMessage: "Please confirm your new password",
268
+ id: "fXZhqG",
269
+ description: "Error message when password confirmation is missing"
270
+ }
271
+ ) }) }),
187
272
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
188
273
  Form.Message,
189
274
  {
190
275
  match: (value, formData) => value !== formData.get("password"),
191
276
  asChild: true,
192
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: "The new passwords you entered don\u2019t match." })
277
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
278
+ import_translation.Translation,
279
+ {
280
+ defaultMessage: "The new passwords you entered don't match.",
281
+ id: "Zdq2Hr",
282
+ description: "Error message when passwords don't match"
283
+ }
284
+ ) })
193
285
  }
194
286
  )
195
287
  ] })
@@ -203,7 +295,14 @@ function Content({ onClose }) {
203
295
  variant: "secondary",
204
296
  type: "button",
205
297
  disabled: changePassword.isPending || changePassword.isSuccess,
206
- children: "Cancel"
298
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
299
+ import_translation.Translation,
300
+ {
301
+ defaultMessage: "Cancel",
302
+ id: "hHNj31",
303
+ description: "Cancel button text"
304
+ }
305
+ )
207
306
  }
208
307
  ) }),
209
308
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -214,7 +313,14 @@ function Content({ onClose }) {
214
313
  done: changePassword.isSuccess,
215
314
  onDone: onClose,
216
315
  disabled: disableSubmit || void 0,
217
- children: "Change password"
316
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
317
+ import_translation.Translation,
318
+ {
319
+ defaultMessage: "Change password",
320
+ id: "8GDtZu",
321
+ description: "Submit button text to change password"
322
+ }
323
+ )
218
324
  }
219
325
  )
220
326
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/change-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as Form from \"@radix-ui/react-form\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { Button, Dialog, Label, PasswordField } from \"./elements.js\";\nimport { useUpdatePassword } from \"../api/endpoint.js\";\nimport { SaveButton } from \"./save-button.js\";\n\ninterface ChangePasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function ChangePasswordDialog({\n children,\n ...props\n}: ChangePasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open || open}\n onOpenChange={props.onOpenChange || setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <Content onClose={handleClose} />\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n onClose: () => void;\n}\n\nfunction Content({ onClose }: ContentProps) {\n const changePassword = useUpdatePassword({\n mutation: {\n onError: (error) => {\n const errorMsg = getMutationErrorMessage(error);\n if (errorMsg === \"Invalid credentials\") {\n setServerErrors({\n currentPassword:\n \"Your current password is incorrect. Please, try again.\",\n });\n }\n },\n },\n });\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n const [serverErrors, setServerErrors] = React.useState<{\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const errorMessage = React.useMemo(() => {\n if (changePassword.error) {\n return getMutationErrorMessage(changePassword.error);\n }\n\n return null;\n }, [changePassword.error]);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n\n changePassword.mutate({\n data: { currentPassword, newPassword },\n });\n };\n\n return (\n <>\n <Dialog.Title mb=\"5\">Change Password</Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>Change your account password</Dialog.Description>\n </VisuallyHidden>\n\n {errorMessage && errorMessage !== \"Invalid credentials\" ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{errorMessage}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={handleSubmit}\n onChange={(event) => {\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n const confirmPassword =\n formData.get(\"confirmPassword\")?.toString() ?? \"\";\n\n setDisableSubmit(\n currentPassword === \"\" ||\n newPassword === \"\" ||\n confirmPassword === \"\",\n );\n setServerErrors({});\n }}\n onClearServerErrors={() => {\n setServerErrors({});\n }}\n >\n <Flex mt=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field\n name=\"oldPassword\"\n asChild\n serverInvalid={!serverErrors.currentPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your current password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n autoComplete=\"current-password\"\n placeholder=\"Current password\"\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your current password\n </Text>\n </Form.Message>\n\n {serverErrors.currentPassword && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n {serverErrors.currentPassword}\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"password\"\n asChild\n serverInvalid={!serverErrors.password}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"New password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your new password\n </Text>\n </Form.Message>\n <Form.Message match={(value) => value.length < 8} asChild>\n <Text size=\"2\" color=\"red\">\n Password must be at least 8 characters\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) =>\n value === formData.get(\"oldPassword\")\n }\n asChild\n >\n <Text size=\"2\" color=\"red\">\n You cannot reuse your current password\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"confirmPassword\"\n asChild\n serverInvalid={!serverErrors.confirmPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Confirm your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"Confirm new password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please confirm your new password\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) => value !== formData.get(\"password\")}\n asChild\n >\n <Text size=\"2\" color=\"red\">\n The new passwords you entered don’t match.\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={changePassword.isPending || changePassword.isSuccess}\n >\n Cancel\n </Button>\n </Dialog.Close>\n\n <SaveButton\n type=\"submit\"\n loading={changePassword.isPending}\n done={changePassword.isSuccess}\n onDone={onClose}\n disabled={disableSubmit || undefined}\n >\n Change password\n </SaveButton>\n </Flex>\n </Form.Root>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{errorMessage}</section>\n </VisuallyHidden>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n return \"Something went wrong. Please try again.\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBI;AAvBJ,oBAAoD;AACpD,WAAsB;AACtB,YAAuB;AAEvB,sBAAqD;AACrD,sBAAkC;AAClC,yBAA2B;AAMpB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,GAAG;AACL,GAA8B;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAE5C,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC,uBAAO;AAAA,IAAP;AAAA,MACE,GAAG;AAAA,MACJ,MAAM,MAAM,QAAQ;AAAA,MACpB,cAAc,MAAM,gBAAgB;AAAA,MAEpC;AAAA,oDAAC,uBAAO,SAAP,EAAgB,UAAS;AAAA,QAE1B,4CAAC,uBAAO,SAAP,EAAe,UAAS,SACvB,sDAAC,WAAQ,SAAS,aAAa,GACjC;AAAA;AAAA;AAAA,EACF;AAEJ;AAMA,SAAS,QAAQ,EAAE,QAAQ,GAAiB;AAC1C,QAAM,qBAAiB,mCAAkB;AAAA,IACvC,UAAU;AAAA,MACR,SAAS,CAAC,UAAU;AAClB,cAAM,WAAW,wBAAwB,KAAK;AAC9C,YAAI,aAAa,uBAAuB;AACtC,0BAAgB;AAAA,YACd,iBACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,IAAI;AAC7D,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAI3C,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,eAAe,OAAO;AACxB,aAAO,wBAAwB,eAAe,KAAK;AAAA,IACrD;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,KAAK,CAAC;AAEzB,QAAM,eAAe,OAAO,UAA4C;AACtE,UAAM,eAAe;AAErB,UAAM,WAAW,IAAI,SAAS,MAAM,aAAa;AACjD,UAAM,kBAAkB,SAAS,IAAI,aAAa,GAAG,SAAS,KAAK;AACnE,UAAM,cAAc,SAAS,IAAI,UAAU,GAAG,SAAS,KAAK;AAE5D,mBAAe,OAAO;AAAA,MACpB,MAAM,EAAE,iBAAiB,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SACE,4EACE;AAAA,gDAAC,uBAAO,OAAP,EAAa,IAAG,KAAI,6BAAe;AAAA,IACpC,4CAAC,gCACC,sDAAC,uBAAO,aAAP,EAAmB,0CAA4B,GAClD;AAAA,IAEC,gBAAgB,iBAAiB,wBAChC,4CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,MAC3B,sDAAC,sBAAQ,MAAR,EAAc,wBAAa,GAC9B,IACE;AAAA,IAEJ;AAAA,MAAC,KAAK;AAAA,MAAL;AAAA,QACC,UAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,WAAW,IAAI,SAAS,MAAM,aAAa;AACjD,gBAAM,kBAAkB,SAAS,IAAI,aAAa,GAAG,SAAS,KAAK;AACnE,gBAAM,cAAc,SAAS,IAAI,UAAU,GAAG,SAAS,KAAK;AAC5D,gBAAM,kBACJ,SAAS,IAAI,iBAAiB,GAAG,SAAS,KAAK;AAEjD;AAAA,YACE,oBAAoB,MAClB,gBAAgB,MAChB,oBAAoB;AAAA,UACxB;AACA,0BAAgB,CAAC,CAAC;AAAA,QACpB;AAAA,QACA,qBAAqB,MAAM;AACzB,0BAAgB,CAAC,CAAC;AAAA,QACpB;AAAA,QAEA;AAAA,uDAAC,sBAAK,IAAG,KAAI,WAAU,UAAS,KAAI,KAClC;AAAA;AAAA,cAAC,KAAK;AAAA,cAAL;AAAA,gBACC,MAAK;AAAA,gBACL,SAAO;AAAA,gBACP,eAAe,CAAC,aAAa;AAAA,gBAE7B,uDAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,8DAAC,KAAK,OAAL,EAAW,SAAO,MACjB,sDAAC,yBAAM,yCAA2B,GACpC;AAAA,kBAEA,4CAAC,KAAK,SAAL,EAAa,SAAO,MACnB;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAS;AAAA,sBACT,UAAQ;AAAA,sBACR,UACE,eAAe,aAAa,eAAe;AAAA,sBAE7C,cAAa;AAAA,sBACb,aAAY;AAAA;AAAA,kBACd,GACF;AAAA,kBAEA,4CAAC,KAAK,SAAL,EAAa,OAAM,gBAAe,SAAO,MACxC,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,gDAE3B,GACF;AAAA,kBAEC,aAAa,mBACZ,4CAAC,KAAK,SAAL,EAAa,SAAO,MACnB,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAClB,uBAAa,iBAChB,GACF;AAAA,mBAEJ;AAAA;AAAA,YACF;AAAA,YAEA;AAAA,cAAC,KAAK;AAAA,cAAL;AAAA,gBACC,MAAK;AAAA,gBACL,SAAO;AAAA,gBACP,eAAe,CAAC,aAAa;AAAA,gBAE7B,uDAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,8DAAC,KAAK,OAAL,EAAW,SAAO,MACjB,sDAAC,yBAAM,qCAAuB,GAChC;AAAA,kBAEA,4CAAC,KAAK,SAAL,EAAa,SAAO,MACnB;AAAA,oBAAC;AAAA;AAAA,sBACC,cAAa;AAAA,sBACb,aAAY;AAAA,sBACZ,UAAQ;AAAA,sBACR,UACE,eAAe,aAAa,eAAe;AAAA;AAAA,kBAE/C,GACF;AAAA,kBAEA,4CAAC,KAAK,SAAL,EAAa,OAAM,gBAAe,SAAO,MACxC,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,4CAE3B,GACF;AAAA,kBACA,4CAAC,KAAK,SAAL,EAAa,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,SAAO,MACvD,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,oDAE3B,GACF;AAAA,kBACA;AAAA,oBAAC,KAAK;AAAA,oBAAL;AAAA,sBACC,OAAO,CAAC,OAAO,aACb,UAAU,SAAS,IAAI,aAAa;AAAA,sBAEtC,SAAO;AAAA,sBAEP,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,oDAE3B;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA;AAAA,YACF;AAAA,YAEA;AAAA,cAAC,KAAK;AAAA,cAAL;AAAA,gBACC,MAAK;AAAA,gBACL,SAAO;AAAA,gBACP,eAAe,CAAC,aAAa;AAAA,gBAE7B,uDAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,8DAAC,KAAK,OAAL,EAAW,SAAO,MACjB,sDAAC,yBAAM,uCAAyB,GAClC;AAAA,kBAEA,4CAAC,KAAK,SAAL,EAAa,SAAO,MACnB;AAAA,oBAAC;AAAA;AAAA,sBACC,cAAa;AAAA,sBACb,aAAY;AAAA,sBACZ,UAAQ;AAAA,sBACR,UACE,eAAe,aAAa,eAAe;AAAA;AAAA,kBAE/C,GACF;AAAA,kBACA,4CAAC,KAAK,SAAL,EAAa,OAAM,gBAAe,SAAO,MACxC,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,8CAE3B,GACF;AAAA,kBACA;AAAA,oBAAC,KAAK;AAAA,oBAAL;AAAA,sBACC,OAAO,CAAC,OAAO,aAAa,UAAU,SAAS,IAAI,UAAU;AAAA,sBAC7D,SAAO;AAAA,sBAEP,sDAAC,sBAAK,MAAK,KAAI,OAAM,OAAM,6DAE3B;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAEA,6CAAC,sBAAK,IAAG,KAAI,KAAI,KAAI,SAAQ,OAC3B;AAAA,wDAAC,uBAAO,OAAP,EACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,UAAU,eAAe,aAAa,eAAe;AAAA,gBACtD;AAAA;AAAA,YAED,GACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,eAAe;AAAA,gBACxB,MAAM,eAAe;AAAA,gBACrB,QAAQ;AAAA,gBACR,UAAU,iBAAiB;AAAA,gBAC5B;AAAA;AAAA,YAED;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,4CAAC,gCAAe,SAAO,MACrB,sDAAC,aAAQ,aAAU,UAAU,wBAAa,GAC5C;AAAA,KACF;AAEJ;AAEA,SAAS,wBAAwB,OAAgB;AAC/C,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AAEA,MACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,UACzB;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/change-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as Form from \"@radix-ui/react-form\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { Button, Dialog, Label, PasswordField } from \"./elements.js\";\nimport { useUpdatePassword } from \"../api/endpoint.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface ChangePasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function ChangePasswordDialog({\n children,\n ...props\n}: ChangePasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open || open}\n onOpenChange={props.onOpenChange || setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <Content onClose={handleClose} />\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n onClose: () => void;\n}\n\nfunction Content({ onClose }: ContentProps) {\n const translate = useTranslation();\n const changePassword = useUpdatePassword({\n mutation: {\n onError: (error) => {\n const errorMsg = getMutationErrorMessage(error);\n if (errorMsg === \"Invalid credentials\") {\n setServerErrors({\n currentPassword:\n \"Your current password is incorrect. Please, try again.\",\n });\n }\n },\n },\n });\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n const [serverErrors, setServerErrors] = React.useState<{\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const errorMessage = React.useMemo(() => {\n if (changePassword.error) {\n return getMutationErrorMessage(changePassword.error);\n }\n\n return null;\n }, [changePassword.error]);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n\n changePassword.mutate({\n data: { currentPassword, newPassword },\n });\n };\n\n return (\n <>\n <Dialog.Title mb=\"5\">\n <Translation\n defaultMessage=\"Change Password\"\n id=\"kAYx7z\"\n description=\"Dialog title for changing password\"\n />\n </Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Change your account password\"\n id=\"R5rXuR\"\n description=\"Dialog description for changing password\"\n />\n </Dialog.Description>\n </VisuallyHidden>\n\n {errorMessage && errorMessage !== \"Invalid credentials\" ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{errorMessage}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={handleSubmit}\n onChange={(event) => {\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n const confirmPassword =\n formData.get(\"confirmPassword\")?.toString() ?? \"\";\n\n setDisableSubmit(\n currentPassword === \"\" ||\n newPassword === \"\" ||\n confirmPassword === \"\",\n );\n setServerErrors({});\n }}\n onClearServerErrors={() => {\n setServerErrors({});\n }}\n >\n <Flex mt=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field\n name=\"oldPassword\"\n asChild\n serverInvalid={!serverErrors.currentPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Enter your current password\"\n id=\"uqn8py\"\n description=\"Label for current password field\"\n />\n </Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n autoComplete=\"current-password\"\n placeholder={translate({\n defaultMessage: \"Current password\",\n id: \"P2oB4G\",\n description: \"Placeholder for current password field\",\n })}\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Please enter your current password\"\n id=\"QKO3st\"\n description=\"Error message when current password is missing\"\n />\n </Text>\n </Form.Message>\n\n {serverErrors.currentPassword && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n {serverErrors.currentPassword}\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"password\"\n asChild\n serverInvalid={!serverErrors.password}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Enter your new password\"\n id=\"b/+TBS\"\n description=\"Label for new password field\"\n />\n </Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"New password\",\n id: \"8d23GS\",\n description: \"Placeholder for new password field\",\n })}\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Please enter your new password\"\n id=\"L4yLAf\"\n description=\"Error message when new password is missing\"\n />\n </Text>\n </Form.Message>\n <Form.Message match={(value) => value.length < 8} asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Password must be at least 8 characters\"\n id=\"WRjyrh\"\n description=\"Error message when password is too short\"\n />\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) =>\n value === formData.get(\"oldPassword\")\n }\n asChild\n >\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"You cannot reuse your current password\"\n id=\"mEkhOO\"\n description=\"Error message when user tries to reuse current password\"\n />\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"confirmPassword\"\n asChild\n serverInvalid={!serverErrors.confirmPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Confirm your new password\"\n id=\"K83lBn\"\n description=\"Label for password confirmation field\"\n />\n </Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"Confirm new password\",\n id: \"cubpBN\",\n description: \"Placeholder for password confirmation field\",\n })}\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Please confirm your new password\"\n id=\"fXZhqG\"\n description=\"Error message when password confirmation is missing\"\n />\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) => value !== formData.get(\"password\")}\n asChild\n >\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"The new passwords you entered don't match.\"\n id=\"Zdq2Hr\"\n description=\"Error message when passwords don't match\"\n />\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={changePassword.isPending || changePassword.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n\n <SaveButton\n type=\"submit\"\n loading={changePassword.isPending}\n done={changePassword.isSuccess}\n onDone={onClose}\n disabled={disableSubmit || undefined}\n >\n <Translation\n defaultMessage=\"Change password\"\n id=\"8GDtZu\"\n description=\"Submit button text to change password\"\n />\n </SaveButton>\n </Flex>\n </Form.Root>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{errorMessage}</section>\n </VisuallyHidden>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n return \"Something went wrong. Please try again.\";\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they come from the API and are displayed dynamically\n"],"mappings":"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","names":[]}