@workos-inc/widgets 1.10.2 → 1.11.0-next.1776971102464

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 (42) hide show
  1. package/CHANGELOG.md +14 -5
  2. package/dist/cjs/api/endpoint.cjs +68 -0
  3. package/dist/cjs/api/endpoint.cjs.map +1 -1
  4. package/dist/cjs/api/endpoint.d.cts +87 -1
  5. package/dist/cjs/experimental/api/fetch.cjs +44 -0
  6. package/dist/cjs/experimental/api/fetch.cjs.map +1 -1
  7. package/dist/cjs/experimental/api/fetch.d.cts +117 -1
  8. package/dist/cjs/experimental/api/react-query.cjs +76 -0
  9. package/dist/cjs/experimental/api/react-query.cjs.map +1 -1
  10. package/dist/cjs/experimental/api/react-query.d.cts +155 -1
  11. package/dist/cjs/experimental/api/swr.cjs +88 -0
  12. package/dist/cjs/experimental/api/swr.cjs.map +1 -1
  13. package/dist/cjs/experimental/api/swr.d.cts +153 -1
  14. package/dist/cjs/lib/change-email-dialog.cjs +372 -0
  15. package/dist/cjs/lib/change-email-dialog.cjs.map +1 -0
  16. package/dist/cjs/lib/change-email-dialog.d.cts +13 -0
  17. package/dist/cjs/lib/set-password-dialog.cjs +145 -132
  18. package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
  19. package/dist/cjs/lib/set-password-dialog.d.cts +8 -1
  20. package/dist/cjs/lib/user-profile.cjs +21 -1
  21. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  22. package/dist/esm/api/endpoint.d.ts +87 -1
  23. package/dist/esm/api/endpoint.js +62 -0
  24. package/dist/esm/api/endpoint.js.map +1 -1
  25. package/dist/esm/experimental/api/fetch.d.ts +117 -1
  26. package/dist/esm/experimental/api/fetch.js +40 -0
  27. package/dist/esm/experimental/api/fetch.js.map +1 -1
  28. package/dist/esm/experimental/api/react-query.d.ts +155 -1
  29. package/dist/esm/experimental/api/react-query.js +68 -0
  30. package/dist/esm/experimental/api/react-query.js.map +1 -1
  31. package/dist/esm/experimental/api/swr.d.ts +153 -1
  32. package/dist/esm/experimental/api/swr.js +78 -0
  33. package/dist/esm/experimental/api/swr.js.map +1 -1
  34. package/dist/esm/lib/change-email-dialog.d.ts +13 -0
  35. package/dist/esm/lib/change-email-dialog.js +343 -0
  36. package/dist/esm/lib/change-email-dialog.js.map +1 -0
  37. package/dist/esm/lib/set-password-dialog.d.ts +8 -1
  38. package/dist/esm/lib/set-password-dialog.js +144 -132
  39. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  40. package/dist/esm/lib/user-profile.js +21 -1
  41. package/dist/esm/lib/user-profile.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/change-email-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Form } from \"radix-ui\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport {\n getMeQueryKey,\n Me,\n useAuthenticationInformation,\n useSendEmailChange,\n useVerifyEmailChange,\n} from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { Button, Dialog, Label, TextField } from \"./elements.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\nimport * as Otp from \"./otp-input.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { SetPasswordForm } from \"./set-password-dialog.js\";\n\ninterface ChangeEmailDialogProps {\n user: Me;\n children?: ReactNode;\n}\n\nexport function ChangeEmailDialog({ children, user }: ChangeEmailDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root open={open} onOpenChange={setOpen}>\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <ElevatedAccess>\n <Content user={user} onClose={handleClose} />\n </ElevatedAccess>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n user: Me;\n onClose: () => void;\n}\n\ntype Step =\n | { name: \"send\" }\n | { name: \"verify\"; newEmail: string }\n | { name: \"set-password\"; newEmail: string };\n\nfunction Content({ user, onClose }: ContentProps) {\n const [step, setStep] = React.useState<Step>({ name: \"send\" });\n const authInfo = useAuthenticationInformation();\n\n const passwordIsSetUp =\n authInfo.data?.data.verificationMethods.Password?.isSetUp;\n\n const handleVerified = React.useCallback(\n (newEmail: string) => {\n if (passwordIsSetUp === false) {\n setStep({ name: \"set-password\", newEmail });\n } else {\n onClose();\n }\n },\n [passwordIsSetUp, onClose],\n );\n\n switch (step.name) {\n case \"send\":\n return (\n <SendEmailChangeForm\n user={user}\n onSuccess={(newEmail) => setStep({ name: \"verify\", newEmail })}\n />\n );\n case \"verify\":\n return (\n <VerifyEmailChangeForm\n newEmail={step.newEmail}\n onBack={() => setStep({ name: \"send\" })}\n onSuccess={() => handleVerified(step.newEmail)}\n />\n );\n case \"set-password\":\n return <SetPasswordStep newEmail={step.newEmail} onDone={onClose} />;\n }\n}\n\ninterface SendEmailChangeFormProps {\n user: Me;\n onSuccess: (newEmail: string) => void;\n}\n\nfunction SendEmailChangeForm({ user, onSuccess }: SendEmailChangeFormProps) {\n const translate = useTranslation();\n const [newEmail, setNewEmail] = React.useState(\"\");\n const sendEmailChange = useSendEmailChange({\n mutation: {\n onSuccess: (_response, variables) => {\n onSuccess(variables.data.newEmail);\n },\n },\n });\n\n return (\n <>\n <Dialog.Title mb=\"2\">\n <Translation\n defaultMessage=\"Change email address\"\n id=\"KdUdX9\"\n description=\"Dialog title for changing the user's email address\"\n />\n </Dialog.Title>\n\n <Dialog.Description mb=\"5\">\n <Translation\n defaultMessage=\"We'll send a verification code to your new email address to confirm the change. Your current email is {email}.\"\n id=\"K6x8v6\"\n description=\"Description explaining that a verification code will be sent to the new email, including the user's current email\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {user.email}\n </Text>\n ),\n }}\n />\n </Dialog.Description>\n\n {sendEmailChange.error ? (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendEmailChange.error)}\n </Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={(event) => {\n event.preventDefault();\n const trimmed = newEmail.trim();\n if (!trimmed) return;\n sendEmailChange.mutate({ data: { newEmail: trimmed } });\n }}\n >\n <Flex my=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field name=\"newEmail\" asChild>\n <Flex direction=\"column\" gap=\"1\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"New email address\"\n id=\"dbgchn\"\n description=\"Label for the new email input\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n type=\"email\"\n autoComplete=\"email\"\n autoFocus\n required\n value={newEmail}\n onChange={(event) => setNewEmail(event.target.value)}\n placeholder={translate({\n defaultMessage: \"name@example.com\",\n id: \"QyYabV\",\n description: \"Placeholder for the new email input\",\n })}\n disabled={sendEmailChange.isPending}\n />\n </Form.Control>\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={sendEmailChange.isPending}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"submit\"\n loading={sendEmailChange.isPending}\n disabled={!newEmail.trim()}\n >\n <Translation\n defaultMessage=\"Send verification code\"\n id=\"1bX9l4\"\n description=\"Button text to send the email change verification code\"\n />\n </Button>\n </Flex>\n </Form.Root>\n </>\n );\n}\n\ninterface VerifyEmailChangeFormProps {\n newEmail: string;\n onBack: () => void;\n onSuccess: () => void;\n}\n\nfunction VerifyEmailChangeForm({\n newEmail,\n onBack,\n onSuccess,\n}: VerifyEmailChangeFormProps) {\n const client = useQueryClient();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyEmailChange = useVerifyEmailChange({\n mutation: {\n onSuccess: async (response) => {\n setElevatedAccess({\n token: response.elevatedAccessToken,\n expiresAt: response.expiresAt,\n });\n client.setQueryData<Me>(getMeQueryKey(), (old) =>\n old ? { ...old, ...response.user } : response.user,\n );\n await client.invalidateQueries({ queryKey: getMeQueryKey() });\n },\n },\n });\n\n const isSubmitting = verifyEmailChange.isPending;\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n if (!code) return;\n verifyEmailChange.mutate({ data: { code } });\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Dialog.Title mb=\"2\">\n <Translation\n defaultMessage=\"Enter verification code\"\n id=\"upvyOt\"\n description=\"Dialog title for entering the email change verification code\"\n />\n </Dialog.Title>\n\n <Dialog.Description>\n <Translation\n defaultMessage=\"A verification code was sent to {email}. Please enter it below.\"\n id=\"9OH/qs\"\n description=\"Description explaining where the email change code was sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {newEmail}\n </Text>\n ),\n }}\n />\n </Dialog.Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyEmailChange.error ? (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyEmailChange.error)}\n </Text>\n ) : null}\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"between\" align=\"center\">\n <Button\n variant=\"secondary\"\n type=\"button\"\n onClick={onBack}\n disabled={isSubmitting}\n >\n <Translation\n defaultMessage=\"Use a different email\"\n id=\"HVuco9\"\n description=\"Button text to go back and change the new email address\"\n />\n </Button>\n <Flex gap=\"3\">\n <Dialog.Close>\n <Button variant=\"secondary\" type=\"button\" disabled={isSubmitting}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <SaveButton\n type=\"submit\"\n loading={isSubmitting}\n done={verifyEmailChange.isSuccess}\n onDone={onSuccess}\n >\n <Translation\n defaultMessage=\"Confirm\"\n id=\"EmYENK\"\n description=\"Confirm button text for verification\"\n />\n </SaveButton>\n </Flex>\n </Flex>\n\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {verifyEmailChange.error\n ? getMutationErrorMessage(verifyEmailChange.error)\n : null}\n </section>\n </VisuallyHidden>\n </Form.Root>\n );\n}\n\ninterface SetPasswordStepProps {\n newEmail: string;\n onDone: () => void;\n}\n\nfunction SetPasswordStep({ newEmail, onDone }: SetPasswordStepProps) {\n return (\n <SetPasswordForm\n description={\n <Dialog.Description>\n <Translation\n defaultMessage=\"Your email has been successfully updated to {email}. You can also set a password now if you'd like to be able to sign in with email and password.\"\n id=\"U7k/vL\"\n description=\"Description for the set-password step after a successful email change\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {newEmail}\n </Text>\n ),\n }}\n />\n </Dialog.Description>\n }\n onSuccess={onDone}\n cancel={\n <Button variant=\"secondary\" type=\"button\" onClick={onDone}>\n <Translation\n defaultMessage=\"Not now\"\n id=\"/7/PVX\"\n description=\"Button to dismiss the set-password step and close the dialog\"\n />\n </Button>\n }\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 (\n <Translation\n defaultMessage=\"Something went wrong. Please try again.\"\n id=\"Dn/G2O\"\n description=\"Generic error message for email change failure\"\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { Me } from '../api/endpoint.cjs';
4
+ import '@tanstack/react-query';
5
+ import '../api/widgets-api-client.cjs';
6
+
7
+ interface ChangeEmailDialogProps {
8
+ user: Me;
9
+ children?: ReactNode;
10
+ }
11
+ declare function ChangeEmailDialog({ children, user }: ChangeEmailDialogProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { ChangeEmailDialog };
@@ -29,7 +29,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
  var set_password_dialog_exports = {};
31
31
  __export(set_password_dialog_exports, {
32
- SetPasswordDialog: () => SetPasswordDialog
32
+ SetPasswordDialog: () => SetPasswordDialog,
33
+ SetPasswordForm: () => SetPasswordForm
33
34
  });
34
35
  module.exports = __toCommonJS(set_password_dialog_exports);
35
36
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -58,6 +59,13 @@ function SetPasswordDialog({
58
59
  ] });
59
60
  }
60
61
  function Content({ onClose }) {
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SetPasswordForm, { onSuccess: onClose });
63
+ }
64
+ function SetPasswordForm({
65
+ onSuccess,
66
+ cancel,
67
+ description
68
+ }) {
61
69
  const translate = (0, import_use_translation.useTranslation)();
62
70
  const setPassword = (0, import_endpoint.useCreatePassword)();
63
71
  const securitySettings = (0, import_use_security_settings.useSecuritySettings)();
@@ -74,24 +82,26 @@ function Content({ onClose }) {
74
82
  (0, import_use_dialog_close.useDialogClose)(setPassword.isSuccess, () => {
75
83
  securitySettings.update("Password", true);
76
84
  });
77
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
78
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
79
- import_translation.Translation,
80
- {
81
- defaultMessage: "Set New Password",
82
- id: "4ymFUc",
83
- description: "Dialog title for setting a new password"
84
- }
85
- ) }),
86
- /* @__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)(
87
- import_translation.Translation,
88
- {
89
- defaultMessage: "Set a new password for your account",
90
- id: "KYv5vS",
91
- description: "Screen reader description for set password dialog"
92
- }
93
- ) }) }),
94
- setPassword.error ? /* @__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: getMutationErrorMessage(setPassword.error) }) }) : null,
85
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "5", children: [
86
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
88
+ import_translation.Translation,
89
+ {
90
+ defaultMessage: "Set a password",
91
+ id: "0N6IHb",
92
+ description: "Dialog title for setting a password"
93
+ }
94
+ ) }),
95
+ description ?? /* @__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)(
96
+ import_translation.Translation,
97
+ {
98
+ defaultMessage: "Set a new password for your account",
99
+ id: "KYv5vS",
100
+ description: "Screen reader description for set password dialog"
101
+ }
102
+ ) }) })
103
+ ] }),
104
+ setPassword.error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: getMutationErrorMessage(setPassword.error) }) }) : null,
95
105
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
96
106
  import_radix_ui.Form.Root,
97
107
  {
@@ -103,128 +113,130 @@ function Content({ onClose }) {
103
113
  setDisableSubmit(password === "" || confirmPassword === "");
104
114
  },
105
115
  children: [
106
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { mt: "5", direction: "column", gap: "4", children: [
107
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Field, { name: "password", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
108
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
109
- import_translation.Translation,
110
- {
111
- defaultMessage: "Enter a new password",
112
- id: "OHDxyL",
113
- description: "Label for password input field"
114
- }
115
- ) }) }),
116
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
117
- import_elements.PasswordField,
118
- {
119
- autoFocus: true,
120
- required: true,
121
- autoComplete: "new-password",
122
- placeholder: translate({
123
- defaultMessage: "New password",
124
- id: "ABfT4E",
125
- description: "Placeholder for password input"
126
- }),
127
- disabled: setPassword.isPending || setPassword.isSuccess
128
- }
129
- ) }),
130
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
131
- import_translation.Translation,
132
- {
133
- defaultMessage: "Please enter a new password",
134
- id: "+2kQs5",
135
- description: "Error message when password field is empty"
136
- }
137
- ) }) }),
138
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
139
- import_translation.Translation,
140
- {
141
- defaultMessage: "Password must be at least 8 characters",
142
- id: "WRjyrh",
143
- description: "Error message when password is too short"
144
- }
145
- ) }) })
146
- ] }) }),
147
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Field, { name: "confirmPassword", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
148
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
149
- import_translation.Translation,
150
- {
151
- defaultMessage: "Confirm your new password",
152
- id: "K83lBn",
153
- description: "Label for password confirmation field"
154
- }
155
- ) }) }),
156
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
157
- import_elements.PasswordField,
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "5", children: [
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "4", children: [
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Field, { name: "password", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
120
+ import_translation.Translation,
121
+ {
122
+ defaultMessage: "Enter a password",
123
+ id: "YxbwGs",
124
+ description: "Label for password input field"
125
+ }
126
+ ) }) }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
128
+ import_elements.PasswordField,
129
+ {
130
+ autoFocus: true,
131
+ required: true,
132
+ autoComplete: "new-password",
133
+ placeholder: translate({
134
+ defaultMessage: "Password",
135
+ id: "HYO1Ra",
136
+ description: "Placeholder for password input"
137
+ }),
138
+ disabled: setPassword.isPending || setPassword.isSuccess
139
+ }
140
+ ) }),
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
142
+ import_translation.Translation,
143
+ {
144
+ defaultMessage: "Please enter a new password",
145
+ id: "+2kQs5",
146
+ description: "Error message when password field is empty"
147
+ }
148
+ ) }) }),
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
150
+ import_translation.Translation,
151
+ {
152
+ defaultMessage: "Password must be at least 8 characters",
153
+ id: "WRjyrh",
154
+ description: "Error message when password is too short"
155
+ }
156
+ ) }) })
157
+ ] }) }),
158
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Field, { name: "confirmPassword", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
159
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
160
+ import_translation.Translation,
161
+ {
162
+ defaultMessage: "Confirm your password",
163
+ id: "/c8Kki",
164
+ description: "Label for password confirmation field"
165
+ }
166
+ ) }) }),
167
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
168
+ import_elements.PasswordField,
169
+ {
170
+ required: true,
171
+ autoComplete: "new-password",
172
+ placeholder: translate({
173
+ defaultMessage: "Confirm password",
174
+ id: "1VNN1w",
175
+ description: "Placeholder for password confirmation input"
176
+ }),
177
+ disabled: setPassword.isPending || setPassword.isSuccess
178
+ }
179
+ ) }),
180
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
181
+ import_translation.Translation,
182
+ {
183
+ defaultMessage: "Please confirm your new password",
184
+ id: "vfwqWf",
185
+ description: "Error message when password confirmation is empty"
186
+ }
187
+ ) }) }),
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
189
+ import_radix_ui.Form.Message,
190
+ {
191
+ match: (value, formData) => value !== formData.get("password"),
192
+ asChild: true,
193
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
194
+ import_translation.Translation,
195
+ {
196
+ defaultMessage: "The passwords you entered don't match.",
197
+ id: "ayYwQx",
198
+ description: "Error message when passwords don't match"
199
+ }
200
+ ) })
201
+ }
202
+ )
203
+ ] }) })
204
+ ] }),
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { gap: "3", justify: "end", children: [
206
+ cancel ?? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
207
+ import_elements.Button,
158
208
  {
159
- required: true,
160
- autoComplete: "new-password",
161
- placeholder: translate({
162
- defaultMessage: "Confirm new password",
163
- id: "O79vjp",
164
- description: "Placeholder for password confirmation input"
165
- }),
166
- disabled: setPassword.isPending || setPassword.isSuccess
209
+ variant: "secondary",
210
+ disabled: setPassword.isPending || setPassword.isSuccess,
211
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
212
+ import_translation.Translation,
213
+ {
214
+ defaultMessage: "Cancel",
215
+ id: "VJVs4m",
216
+ description: "Button to cancel setting password"
217
+ }
218
+ )
167
219
  }
168
220
  ) }),
169
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.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)(
170
- import_translation.Translation,
171
- {
172
- defaultMessage: "Please confirm your new password",
173
- id: "vfwqWf",
174
- description: "Error message when password confirmation is empty"
175
- }
176
- ) }) }),
177
221
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
178
- import_radix_ui.Form.Message,
222
+ import_save_button.SaveButton,
179
223
  {
180
- match: (value, formData) => value !== formData.get("password"),
181
- asChild: true,
182
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "red", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
+ loading: setPassword.isPending,
225
+ done: setPassword.isSuccess,
226
+ onDone: onSuccess,
227
+ type: "submit",
228
+ disabled: disableSubmit || void 0,
229
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
230
  import_translation.Translation,
184
231
  {
185
- defaultMessage: "The passwords you entered don't match.",
186
- id: "ayYwQx",
187
- description: "Error message when passwords don't match"
232
+ defaultMessage: "Set password",
233
+ id: "jSfqX/",
234
+ description: "Button to confirm setting new password"
188
235
  }
189
- ) })
236
+ )
190
237
  }
191
238
  )
192
- ] }) })
193
- ] }),
194
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { mt: "5", gap: "3", justify: "end", children: [
195
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
196
- import_elements.Button,
197
- {
198
- variant: "secondary",
199
- disabled: setPassword.isPending || setPassword.isSuccess,
200
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
201
- import_translation.Translation,
202
- {
203
- defaultMessage: "Cancel",
204
- id: "VJVs4m",
205
- description: "Button to cancel setting password"
206
- }
207
- )
208
- }
209
- ) }),
210
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
211
- import_save_button.SaveButton,
212
- {
213
- loading: setPassword.isPending,
214
- done: setPassword.isSuccess,
215
- onDone: onClose,
216
- type: "submit",
217
- disabled: disableSubmit || void 0,
218
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
219
- import_translation.Translation,
220
- {
221
- defaultMessage: "Set password",
222
- id: "jSfqX/",
223
- description: "Button to confirm setting new password"
224
- }
225
- )
226
- }
227
- )
239
+ ] })
228
240
  ] }),
229
241
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { "aria-live": "polite", children: getMutationErrorMessage(setPassword.error) }) })
230
242
  ]
@@ -250,6 +262,7 @@ function getMutationErrorMessage(error) {
250
262
  }
251
263
  // Annotate the CommonJS export names for ESM import in node:
252
264
  0 && (module.exports = {
253
- SetPasswordDialog
265
+ SetPasswordDialog,
266
+ SetPasswordForm
254
267
  });
255
268
  //# sourceMappingURL=set-password-dialog.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/set-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { Dialog, Label, PasswordField, Button } from \"./elements.js\";\nimport { Form } from \"radix-ui\";\nimport { useCreatePassword } from \"../api/endpoint.js\";\nimport { useSecuritySettings } from \"./use-security-settings.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { useDialogClose } from \"./use-dialog-close.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface SetPasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function SetPasswordDialog({\n children,\n ...props\n}: SetPasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root {...props} open={open} onOpenChange={setOpen}>\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <ElevatedAccess>\n <Content onClose={handleClose} />\n </ElevatedAccess>\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 setPassword = useCreatePassword();\n const securitySettings = useSecuritySettings();\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const password = formData.get(\"password\")?.toString();\n\n if (!password) {\n return;\n }\n\n setPassword.mutate({ data: { password } });\n };\n\n useDialogClose(setPassword.isSuccess, () => {\n securitySettings.update(\"Password\", true);\n });\n\n return (\n <>\n <Dialog.Title mb=\"5\">\n <Translation\n defaultMessage=\"Set New Password\"\n id=\"4ymFUc\"\n description=\"Dialog title for setting a new password\"\n />\n </Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Set a new password for your account\"\n id=\"KYv5vS\"\n description=\"Screen reader description for set password dialog\"\n />\n </Dialog.Description>\n </VisuallyHidden>\n\n {setPassword.error ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>\n {getMutationErrorMessage(setPassword.error)}\n </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 password = formData.get(\"password\")?.toString();\n const confirmPassword = formData.get(\"confirmPassword\")?.toString();\n setDisableSubmit(password === \"\" || confirmPassword === \"\");\n }}\n >\n <Flex mt=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field name=\"password\" asChild>\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Enter a new password\"\n id=\"OHDxyL\"\n description=\"Label for password input field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"New password\",\n id: \"ABfT4E\",\n description: \"Placeholder for password input\",\n })}\n disabled={setPassword.isPending || setPassword.isSuccess}\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Please enter a new password\"\n id=\"+2kQs5\"\n description=\"Error message when password field is empty\"\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 </Flex>\n </Form.Field>\n\n <Form.Field name=\"confirmPassword\" asChild>\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 <Form.Control asChild>\n <PasswordField\n required\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"Confirm new password\",\n id: \"O79vjp\",\n description: \"Placeholder for password confirmation input\",\n })}\n disabled={setPassword.isPending || setPassword.isSuccess}\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=\"vfwqWf\"\n description=\"Error message when password confirmation is empty\"\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 passwords you entered don't match.\"\n id=\"ayYwQx\"\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 disabled={setPassword.isPending || setPassword.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"VJVs4m\"\n description=\"Button to cancel setting password\"\n />\n </Button>\n </Dialog.Close>\n\n <SaveButton\n loading={setPassword.isPending}\n done={setPassword.isSuccess}\n onDone={onClose}\n type=\"submit\"\n disabled={disableSubmit || undefined}\n >\n <Translation\n defaultMessage=\"Set password\"\n id=\"jSfqX/\"\n description=\"Button to confirm setting new password\"\n />\n </SaveButton>\n </Flex>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(setPassword.error)}\n </section>\n </VisuallyHidden>\n </Form.Root>\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 (\n <Translation\n defaultMessage=\"Something went wrong. Please try again.\"\n id=\"jLzoYu\"\n description=\"Generic error message for password setting failure\"\n />\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/set-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { Dialog, Label, PasswordField, Button } from \"./elements.js\";\nimport { Form } from \"radix-ui\";\nimport { useCreatePassword } from \"../api/endpoint.js\";\nimport { useSecuritySettings } from \"./use-security-settings.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { useDialogClose } from \"./use-dialog-close.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface SetPasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function SetPasswordDialog({\n children,\n ...props\n}: SetPasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root {...props} open={open} onOpenChange={setOpen}>\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <ElevatedAccess>\n <Content onClose={handleClose} />\n </ElevatedAccess>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n onClose: () => void;\n}\n\nfunction Content({ onClose }: ContentProps) {\n return <SetPasswordForm onSuccess={onClose} />;\n}\n\ninterface SetPasswordFormProps {\n onSuccess?: () => void;\n cancel?: React.ReactNode;\n description?: React.ReactNode;\n}\n\nexport function SetPasswordForm({\n onSuccess,\n cancel,\n description,\n}: SetPasswordFormProps) {\n const translate = useTranslation();\n const setPassword = useCreatePassword();\n const securitySettings = useSecuritySettings();\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const password = formData.get(\"password\")?.toString();\n\n if (!password) {\n return;\n }\n\n setPassword.mutate({ data: { password } });\n };\n\n useDialogClose(setPassword.isSuccess, () => {\n securitySettings.update(\"Password\", true);\n });\n\n return (\n <Flex direction=\"column\" gap=\"5\">\n <Flex direction=\"column\" gap=\"2\">\n <Dialog.Title>\n <Translation\n defaultMessage=\"Set a password\"\n id=\"0N6IHb\"\n description=\"Dialog title for setting a password\"\n />\n </Dialog.Title>\n {description ?? (\n <VisuallyHidden>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Set a new password for your account\"\n id=\"KYv5vS\"\n description=\"Screen reader description for set password dialog\"\n />\n </Dialog.Description>\n </VisuallyHidden>\n )}\n </Flex>\n\n {setPassword.error ? (\n <Callout.Root color=\"red\">\n <Callout.Text>\n {getMutationErrorMessage(setPassword.error)}\n </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 password = formData.get(\"password\")?.toString();\n const confirmPassword = formData.get(\"confirmPassword\")?.toString();\n setDisableSubmit(password === \"\" || confirmPassword === \"\");\n }}\n >\n <Flex direction=\"column\" gap=\"5\">\n <Flex direction=\"column\" gap=\"4\">\n <Form.Field name=\"password\" asChild>\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Enter a password\"\n id=\"YxbwGs\"\n description=\"Label for password input field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"Password\",\n id: \"HYO1Ra\",\n description: \"Placeholder for password input\",\n })}\n disabled={setPassword.isPending || setPassword.isSuccess}\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"Please enter a new password\"\n id=\"+2kQs5\"\n description=\"Error message when password field is empty\"\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 </Flex>\n </Form.Field>\n\n <Form.Field name=\"confirmPassword\" asChild>\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Confirm your password\"\n id=\"/c8Kki\"\n description=\"Label for password confirmation field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <PasswordField\n required\n autoComplete=\"new-password\"\n placeholder={translate({\n defaultMessage: \"Confirm password\",\n id: \"1VNN1w\",\n description:\n \"Placeholder for password confirmation input\",\n })}\n disabled={setPassword.isPending || setPassword.isSuccess}\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=\"vfwqWf\"\n description=\"Error message when password confirmation is empty\"\n />\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) =>\n value !== formData.get(\"password\")\n }\n asChild\n >\n <Text size=\"2\" color=\"red\">\n <Translation\n defaultMessage=\"The passwords you entered don't match.\"\n id=\"ayYwQx\"\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 gap=\"3\" justify=\"end\">\n {cancel ?? (\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n disabled={setPassword.isPending || setPassword.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"VJVs4m\"\n description=\"Button to cancel setting password\"\n />\n </Button>\n </Dialog.Close>\n )}\n\n <SaveButton\n loading={setPassword.isPending}\n done={setPassword.isSuccess}\n onDone={onSuccess}\n type=\"submit\"\n disabled={disableSubmit || undefined}\n >\n <Translation\n defaultMessage=\"Set password\"\n id=\"jSfqX/\"\n description=\"Button to confirm setting new password\"\n />\n </SaveButton>\n </Flex>\n </Flex>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(setPassword.error)}\n </section>\n </VisuallyHidden>\n </Form.Root>\n </Flex>\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 (\n <Translation\n defaultMessage=\"Something went wrong. Please try again.\"\n id=\"jLzoYu\"\n description=\"Generic error message for password setting failure\"\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
2
3
  import { ReactNode } from 'react';
3
4
  import { RootProps } from '@radix-ui/themes/components/dialog';
4
5
 
@@ -6,5 +7,11 @@ interface SetPasswordDialogProps extends RootProps {
6
7
  children?: ReactNode;
7
8
  }
8
9
  declare function SetPasswordDialog({ children, ...props }: SetPasswordDialogProps): react_jsx_runtime.JSX.Element;
10
+ interface SetPasswordFormProps {
11
+ onSuccess?: () => void;
12
+ cancel?: React.ReactNode;
13
+ description?: React.ReactNode;
14
+ }
15
+ declare function SetPasswordForm({ onSuccess, cancel, description, }: SetPasswordFormProps): react_jsx_runtime.JSX.Element;
9
16
 
10
- export { SetPasswordDialog };
17
+ export { SetPasswordDialog, SetPasswordForm };
@@ -39,6 +39,7 @@ var React = __toESM(require("react"), 1);
39
39
  var import_themes = require("@radix-ui/themes");
40
40
  var import_elements = require("./elements.js");
41
41
  var DataList = __toESM(require("./data-list.js"), 1);
42
+ var import_change_email_dialog = require("./change-email-dialog.js");
42
43
  var import_edit_user_profile_dialog = require("./edit-user-profile-dialog.js");
43
44
  var import_utils = require("./utils.js");
44
45
  var import_oauth_icons = require("./oauth-icons.js");
@@ -125,7 +126,26 @@ const UserProfile = ({
125
126
  description: "Label for user's email address field"
126
127
  }
127
128
  ) }),
128
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListValue, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { align: "center", minHeight: "var(--space-6)", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", children: user.email }) }) })
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListValue, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
130
+ import_themes.Flex,
131
+ {
132
+ align: "center",
133
+ justify: "between",
134
+ width: "100%",
135
+ minHeight: "var(--space-6)",
136
+ children: [
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", children: user.email }),
138
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_change_email_dialog.ChangeEmailDialog, { user, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
139
+ import_translation.Translation,
140
+ {
141
+ defaultMessage: "Edit",
142
+ id: "+2ILQR",
143
+ description: "Button text to edit the user's email address"
144
+ }
145
+ ) }) })
146
+ ]
147
+ }
148
+ ) })
129
149
  ] }),
130
150
  oauthAccounts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
131
151
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ListSeparator, {}),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/user-profile.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\nimport {\n Box,\n Card,\n Flex,\n Inset,\n Separator,\n Strong,\n Text,\n} from \"@radix-ui/themes\";\nimport { Avatar, Button, Skeleton } from \"./elements.js\";\nimport * as DataList from \"./data-list.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 <List>\n {user.profilePictureUrl && (\n <>\n <ListItem>\n <ListTitle minWidth=\"220px\">\n <Translation\n defaultMessage=\"Profile picture\"\n description=\"Label for the user's avatar\"\n id=\"RvLqCQ\"\n />\n </ListTitle>\n <ListValue>\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl}\n />\n </ListValue>\n </ListItem>\n\n <ListSeparator />\n </>\n )}\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Full name\"\n id=\"kkBScm\"\n description=\"Label for user's full name field\"\n />\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Email address\"\n id=\"nLk5pa\"\n description=\"Label for user's email address field\"\n />\n </ListTitle>\n <ListValue>\n <Flex align=\"center\" minHeight=\"var(--space-6)\">\n <Text size=\"2\">{user.email}</Text>\n </Flex>\n </ListValue>\n </ListItem>\n\n {oauthAccounts.length > 0 && (\n <>\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Connected accounts\"\n id=\"AW/A69\"\n description=\"Label for user's connected OAuth accounts\"\n />\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n </>\n )}\n </List>\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 <List>\n <ListItem>\n <ListTitle minWidth=\"220px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Full name\"\n id=\"nc7fru\"\n description=\"Loading placeholder for full name label\"\n />\n </Skeleton>\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Skeleton>\n <Translation\n defaultMessage=\"Email address\"\n id=\"gjqw+H\"\n description=\"Loading placeholder for email address label\"\n />\n </Skeleton>\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n </List>\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 ListIdContext = React.createContext<string | null>(null);\nListIdContext.displayName = \"ListIdContext\";\n\nconst List = ({ children }: { children: React.ReactNode }) => {\n const listId = `user-profile-list-${React.useId()}`;\n return (\n <ListIdContext.Provider value={listId}>\n <DataList.Root as=\"div\">{children}</DataList.Root>\n </ListIdContext.Provider>\n );\n};\n\nconst ListItemIdContext = React.createContext<string | null>(null);\nListItemIdContext.displayName = \"ListItemIdContext\";\n\nconst ListItem = ({ children }: { children: React.ReactNode }) => {\n const listId = React.useContext(ListIdContext);\n const currentId = React.useId();\n const listItemId = [listId, \"item\", currentId].filter(Boolean).join(\"-\");\n return (\n <ListItemIdContext.Provider value={listItemId}>\n <DataList.Item align=\"center\">{children}</DataList.Item>\n </ListItemIdContext.Provider>\n );\n};\n\nconst ListTitle = ({\n children,\n ...props\n}: Omit<DataList.LabelProps, \"as\" | \"role\" | \"asChild\">) => {\n const listItemId = React.useContext(ListItemIdContext);\n const titleId = [listItemId, \"title\"].filter(Boolean).join(\"-\");\n return (\n <DataList.Label as=\"div\" role=\"term\" highContrast id={titleId} {...props}>\n <Strong>{children}</Strong>\n </DataList.Label>\n );\n};\n\nconst ListValue = ({ children }: { children: React.ReactNode }) => {\n const listItemId = React.useContext(ListItemIdContext);\n const titleId = [listItemId, \"title\"].filter(Boolean).join(\"-\");\n return (\n <DataList.Value as=\"div\" role=\"definition\" aria-labelledby={titleId}>\n {children}\n </DataList.Value>\n );\n};\n\nconst ListSeparator = () => (\n <Box asChild gridColumn=\"span 2\" aria-hidden>\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":[]}
1
+ {"version":3,"sources":["../../../src/lib/user-profile.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\nimport {\n Box,\n Card,\n Flex,\n Inset,\n Separator,\n Strong,\n Text,\n} from \"@radix-ui/themes\";\nimport { Avatar, Button, Skeleton } from \"./elements.js\";\nimport * as DataList from \"./data-list.js\";\nimport { Me, OAuthProfile, MeOauthProfiles } from \"../api/endpoint.js\";\nimport { ChangeEmailDialog } from \"./change-email-dialog.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 <List>\n {user.profilePictureUrl && (\n <>\n <ListItem>\n <ListTitle minWidth=\"220px\">\n <Translation\n defaultMessage=\"Profile picture\"\n description=\"Label for the user's avatar\"\n id=\"RvLqCQ\"\n />\n </ListTitle>\n <ListValue>\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl}\n />\n </ListValue>\n </ListItem>\n\n <ListSeparator />\n </>\n )}\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Full name\"\n id=\"kkBScm\"\n description=\"Label for user's full name field\"\n />\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Email address\"\n id=\"nLk5pa\"\n description=\"Label for user's email address field\"\n />\n </ListTitle>\n <ListValue>\n <Flex\n align=\"center\"\n justify=\"between\"\n width=\"100%\"\n minHeight=\"var(--space-6)\"\n >\n <Text size=\"2\">{user.email}</Text>\n\n <ChangeEmailDialog user={user}>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Edit\"\n id=\"+2ILQR\"\n description=\"Button text to edit the user's email address\"\n />\n </Button>\n </ChangeEmailDialog>\n </Flex>\n </ListValue>\n </ListItem>\n\n {oauthAccounts.length > 0 && (\n <>\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Translation\n defaultMessage=\"Connected accounts\"\n id=\"AW/A69\"\n description=\"Label for user's connected OAuth accounts\"\n />\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n </>\n )}\n </List>\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 <List>\n <ListItem>\n <ListTitle minWidth=\"220px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Full name\"\n id=\"nc7fru\"\n description=\"Loading placeholder for full name label\"\n />\n </Skeleton>\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n\n <ListSeparator />\n\n <ListItem>\n <ListTitle>\n <Skeleton>\n <Translation\n defaultMessage=\"Email address\"\n id=\"gjqw+H\"\n description=\"Loading placeholder for email address label\"\n />\n </Skeleton>\n </ListTitle>\n <ListValue>\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 </ListValue>\n </ListItem>\n </List>\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 ListIdContext = React.createContext<string | null>(null);\nListIdContext.displayName = \"ListIdContext\";\n\nconst List = ({ children }: { children: React.ReactNode }) => {\n const listId = `user-profile-list-${React.useId()}`;\n return (\n <ListIdContext.Provider value={listId}>\n <DataList.Root as=\"div\">{children}</DataList.Root>\n </ListIdContext.Provider>\n );\n};\n\nconst ListItemIdContext = React.createContext<string | null>(null);\nListItemIdContext.displayName = \"ListItemIdContext\";\n\nconst ListItem = ({ children }: { children: React.ReactNode }) => {\n const listId = React.useContext(ListIdContext);\n const currentId = React.useId();\n const listItemId = [listId, \"item\", currentId].filter(Boolean).join(\"-\");\n return (\n <ListItemIdContext.Provider value={listItemId}>\n <DataList.Item align=\"center\">{children}</DataList.Item>\n </ListItemIdContext.Provider>\n );\n};\n\nconst ListTitle = ({\n children,\n ...props\n}: Omit<DataList.LabelProps, \"as\" | \"role\" | \"asChild\">) => {\n const listItemId = React.useContext(ListItemIdContext);\n const titleId = [listItemId, \"title\"].filter(Boolean).join(\"-\");\n return (\n <DataList.Label as=\"div\" role=\"term\" highContrast id={titleId} {...props}>\n <Strong>{children}</Strong>\n </DataList.Label>\n );\n};\n\nconst ListValue = ({ children }: { children: React.ReactNode }) => {\n const listItemId = React.useContext(ListItemIdContext);\n const titleId = [listItemId, \"title\"].filter(Boolean).join(\"-\");\n return (\n <DataList.Value as=\"div\" role=\"definition\" aria-labelledby={titleId}>\n {children}\n </DataList.Value>\n );\n};\n\nconst ListSeparator = () => (\n <Box asChild gridColumn=\"span 2\" aria-hidden>\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":[]}