{"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":[]}