{"version":3,"file":"password_link_resent_content-CpmNZgo8.js","sources":["../../app/javascript/components/password_reset/components/set_new_password_content.tsx","../../app/javascript/components/password_reset/components/new_password_set_content.tsx","../../app/javascript/components/password_reset/components/password_expired_content.tsx","../../app/javascript/components/password_reset/components/password_link_resent_content.tsx"],"sourcesContent":["import React, { FormEvent, useCallback, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport * as yup from \"yup\";\nimport { useSnackbar } from \"baseui/snackbar\";\nimport { snackBarOverrides } from \"../../components/base_ui/progress_and_validation/snackbar\";\nimport FormControl from \"../../components/base_ui/inputs/form_control\";\nimport { Button } from \"../../components/base_ui/inputs/button\";\nimport Input from \"../../components/base_ui/inputs/input\";\nimport { StyledHeading } from \"../../shared/login_and_sign_up/styled\";\nimport { passwordRegex, passwordRegexMismatchMessage } from \"../../../utils/string_utils\";\nimport useForm from \"../../shared/use_form\";\nimport { Misuse } from \"@carbon/icons-react\";\nimport { Theme } from \"baseui/styles\";\nimport { ParagraphMedium } from \"baseui/typography\";\n\nexport const StyledParagraphMedium = styled(ParagraphMedium)`\n  margin-top: 0;\n  margin-bottom: ${({ theme }) => theme.sizing.scale800};\n  color: ${({ theme }) => theme.colors.contentTertiary};\n\n  .styled-highlighted-paragraph {\n    font-weight: 700;\n  }\n`;\n\nconst Form = styled.form``;\n\nconst FormControlOverrides = {\n  ControlContainer: {\n    style: ({ $theme }: { $theme: Theme }) => {\n      return {\n        marginBottom: $theme.sizing.scale800,\n      };\n    },\n  },\n  Caption: {\n    style: {\n      \"margin-bottom\": \"0\",\n    },\n  },\n  Label: {\n    style: {\n      textTransform: \"none\",\n    },\n  },\n};\n\nconst schema = yup.object().shape({\n  password: yup.string().required().matches(passwordRegex, passwordRegexMismatchMessage),\n  confirmPassword: yup\n    .string()\n    .required()\n    .oneOf([yup.ref(\"password\")], \"Passwords do not match\"),\n});\n\nexport default function SetNewPasswordContent({\n  actionKey,\n  title,\n  description,\n  setPasswordEndpointUrl,\n  onSetPasswordSuccessRedirectUrl,\n}: {\n  actionKey: string;\n  title: string;\n  description?: string;\n  setPasswordEndpointUrl: string;\n  onSetPasswordSuccessRedirectUrl: string;\n}) {\n  const navigate = useNavigate();\n  const { enqueue } = useSnackbar();\n  const [isFetching, setIsFetching] = useState(false);\n\n  const initialFormData = {\n    password: \"\",\n    confirmPassword: \"\",\n  };\n\n  const { form, values, validateForm } = useForm(initialFormData, schema, true);\n\n  const save = useCallback(\n    async (event: FormEvent) => {\n      event.preventDefault();\n\n      const showErrorSnackbar = () => {\n        setIsFetching(false);\n        enqueue({\n          message:\n            \"Updating user password failed, please try again or notify help@mentorcollective.org\",\n          startEnhancer: () => <Misuse size={24} />,\n          overrides: snackBarOverrides,\n        });\n      };\n\n      try {\n        await validateForm();\n      } catch (error) {\n        return;\n      }\n\n      try {\n        setIsFetching(true);\n\n        const response = await fetch(setPasswordEndpointUrl, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n          body: JSON.stringify({\n            action_key: actionKey,\n            password: values.password,\n            password_confirmation: values.confirmPassword,\n          }),\n        });\n\n        const parsedResponse = await response.json();\n\n        setIsFetching(false);\n\n        if (parsedResponse.isSuccess === false) {\n          showErrorSnackbar();\n        } else {\n          navigate(onSetPasswordSuccessRedirectUrl);\n        }\n      } catch (error) {\n        showErrorSnackbar();\n      }\n    },\n    [\n      enqueue,\n      validateForm,\n      setPasswordEndpointUrl,\n      actionKey,\n      values.password,\n      values.confirmPassword,\n      navigate,\n      onSetPasswordSuccessRedirectUrl,\n    ],\n  );\n\n  return (\n    <>\n      <StyledHeading>{title}</StyledHeading>\n      {description && <StyledParagraphMedium>{description}</StyledParagraphMedium>}\n      <Form>\n        <FormControl\n          label={\"Enter New Password\"}\n          caption={\n            \"Must be 10 or more characters and contain at least 1 uppercase character, 1 number, and 1 special character.\"\n          }\n          error={form.password.errors.join(\" \")}\n          overrides={FormControlOverrides}\n        >\n          <Input\n            required\n            type=\"password\"\n            aria-label=\"password input\"\n            dataTest={\"password-input\"}\n            value={form.password.value}\n            onChange={({ currentTarget: { value } }) => form.password.set(value)}\n            placeholder=\"Enter your new password\"\n          />\n        </FormControl>\n        <FormControl\n          label={\"Confirm New Password\"}\n          error={form.confirmPassword.errors.join(\" \")}\n          overrides={FormControlOverrides}\n        >\n          <Input\n            required\n            type=\"password\"\n            aria-label=\"confirm password input\"\n            dataTest={\"confirm-password-input\"}\n            value={form.confirmPassword.value || \"\"}\n            onChange={({ currentTarget: { value } }) => {\n              form.confirmPassword.set(value);\n            }}\n            placeholder=\"Confirm your new password\"\n          />\n        </FormControl>\n\n        <Button\n          isLoading={isFetching}\n          onClick={save}\n          isStretched={true}\n          data-test=\"set-password-button\"\n        >\n          Set New Password\n        </Button>\n      </Form>\n    </>\n  );\n}\n","import React from \"react\";\nimport { StyledHeading } from \"../../shared/login_and_sign_up/styled\";\nimport { StyledParagraphMedium } from \"./set_new_password_content\";\nimport { Button } from \"../../components/base_ui/inputs/button\";\n\nexport default function NewPasswordSetContent({\n  baseUrl,\n  title,\n  description,\n  logInButtonText = \"Sign In\",\n}: {\n  baseUrl: string;\n  title: string;\n  description: string;\n  logInButtonText?: string;\n}) {\n  // Disallow back button to go back to the form, route to sign in page instead.\n  window.onpopstate = () => {\n    window.location.replace(baseUrl);\n  };\n\n  return (\n    <>\n      <StyledHeading>{title}</StyledHeading>\n      <StyledParagraphMedium>{description}</StyledParagraphMedium>\n      <Button\n        onClick={() => {\n          window.location.replace(baseUrl);\n        }}\n        data-test=\"log-in-to-dashboard-button\"\n      >\n        {logInButtonText}\n      </Button>\n    </>\n  );\n}\n","import React, { useState } from \"react\";\nimport { StyledHeading } from \"../../shared/login_and_sign_up/styled\";\nimport { StyledParagraphMedium } from \"./set_new_password_content\";\nimport { Button } from \"../../components/base_ui/inputs/button\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Misuse } from \"@carbon/icons-react\";\nimport { snackBarOverrides } from \"../../components/base_ui/progress_and_validation/snackbar\";\nimport { useSnackbar } from \"baseui/snackbar\";\n\nexport default function PasswordExpiredContent({\n  actionKey,\n  title,\n  description,\n  requestAnotherLinkEndpointUrl,\n  onLinkRequestSuccessRedirectUrl,\n}: {\n  actionKey: string;\n  title: string;\n  description: React.ReactNode;\n  requestAnotherLinkEndpointUrl: string;\n  onLinkRequestSuccessRedirectUrl: string;\n}) {\n  const [isFetching, setIsFetching] = useState(false);\n  const navigate = useNavigate();\n  const { enqueue } = useSnackbar();\n\n  return (\n    <>\n      <StyledHeading data-test=\"password-expired-heading\">{title}</StyledHeading>\n      <StyledParagraphMedium>{description}</StyledParagraphMedium>\n      <Button\n        data-test=\"request-another-link-button\"\n        isLoading={isFetching}\n        onClick={async () => {\n          setIsFetching(true);\n          const response = await fetch(requestAnotherLinkEndpointUrl, {\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n            },\n            body: JSON.stringify({\n              action_key: actionKey,\n            }),\n          });\n\n          const parsedResponse = await response.json();\n\n          setIsFetching(false);\n\n          if (parsedResponse.isSuccess === false) {\n            enqueue({\n              message:\n                \"Requesting another link failed, please try again or notify help@mentorcollective.org\",\n              startEnhancer: () => <Misuse size={24} />,\n              overrides: snackBarOverrides,\n            });\n          } else {\n            navigate(onLinkRequestSuccessRedirectUrl);\n          }\n        }}\n      >\n        Request Another Link\n      </Button>\n    </>\n  );\n}\n","import React from \"react\";\nimport { StyledHeading } from \"../../shared/login_and_sign_up/styled\";\nimport { StyledParagraphMedium } from \"./set_new_password_content\";\n\nexport default function PasswordLinkResentContent({\n  title,\n  description,\n}: {\n  title: string;\n  description: string;\n}) {\n  return (\n    <>\n      <StyledHeading data-test=\"password-resent-heading\">{title}</StyledHeading>\n      <StyledParagraphMedium>{description}</StyledParagraphMedium>\n    </>\n  );\n}\n"],"names":["StyledParagraphMedium","styled","ParagraphMedium","theme","Form","FormControlOverrides","$theme","schema","yup.object","yup.string","passwordRegex","passwordRegexMismatchMessage","yup.ref","SetNewPasswordContent","actionKey","title","description","setPasswordEndpointUrl","onSetPasswordSuccessRedirectUrl","navigate","useNavigate","enqueue","useSnackbar","isFetching","setIsFetching","useState","initialFormData","form","values","validateForm","useForm","save","useCallback","event","showErrorSnackbar","jsx","Misuse","snackBarOverrides","parsedResponse","jsxs","Fragment","StyledHeading","FormControl","Input","value","Button","NewPasswordSetContent","baseUrl","logInButtonText","PasswordExpiredContent","requestAnotherLinkEndpointUrl","onLinkRequestSuccessRedirectUrl","PasswordLinkResentContent"],"mappings":"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"}