{"version":3,"file":"sign_up_flow-hkPqQZTN.js","sources":["../../app/javascript/utils/password_utils.js","../../app/javascript/components/sign_up/sign_up_additional_info.jsx","../../app/javascript/components/sign_up/existing_user/additional_info.jsx","../../app/javascript/components/sign_up/existing_user/reset_password/email.jsx","../../app/javascript/components/sign_up/existing_user/reset_password/sms.tsx","../../app/javascript/components/sign_up/existing_user/reset_password/index.jsx","../../app/javascript/utils/headers.ts","../../app/javascript/components/sign_up/existing_user/sign_in_form.jsx","../../app/javascript/components/sign_up/disambiguate_during_sign_up.jsx","../../app/javascript/components/sign_up/sign_up_flow.jsx","../../app/javascript/entrypoints/react_rails/sign_up/sign_up_flow.tsx"],"sourcesContent":["// check if a password meets the minimum requirements:\n// - 10-30 characters\n// - 1 number\n// - 1 upper case letter\n// - 1 special character\nfunction isValidPassword(password) {\n  // password does not meet requirements (10-30 char, 1 num, 1 upper, 1 special)\n  const passFormat = /^(?=.*\\d)(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\\s).{10,30}$/;\n\n  return password.match(passFormat) ? true : false;\n}\n\nexport { isValidPassword };\n","// Third-party imports.\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport styled from \"styled-components\";\nimport { ParagraphSmall } from \"baseui/typography\";\nimport { NewTab } from \"@carbon/icons-react\";\nimport { StyledLink } from \"baseui/link\";\n\nconst Heading = styled(ParagraphSmall)`\n  margin-top: ${({ theme }) => theme.sizing.scale400};\n  margin-bottom: 0px;\n  font-weight: ${({ theme }) => theme.typography.HeadingXSmall.fontWeight};\n`;\n\nconst StyledParagraphSmall = styled(ParagraphSmall)`\n  margin-top: ${({ theme }) => theme.sizing.scale800};\n`;\n\nconst StyledLinksContainer = styled(ParagraphSmall)`\n  display: inline-grid;\n  grid-template-columns: auto auto;\n  grid-gap: 5px;\n  margin-top: ${({ theme }) => theme.sizing.scale300};\n  margin-bottom: 0px;\n  color: ${({ theme }) => theme.colors.primary500};\n`;\nclass SignUpAdditionalInfo extends React.Component {\n  textContainerRef = React.createRef();\n\n  static propTypes = {\n    role: PropTypes.string.isRequired, // 'Student' or 'Mentor'\n    translator: PropTypes.object.isRequired,\n  };\n\n  render() {\n    return (\n      <div ref={this.textContainerRef}>\n        {this.renderFirstParagraph()}\n        <StyledParagraphSmall>\n          {this.props.translator.transformText(\n            \"The next few steps will ensure that you have the information to succeed in your mentorship.\",\n          )}\n        </StyledParagraphSmall>\n        <Heading>Still confused?</Heading>\n        <StyledLinksContainer>\n          <NewTab size={20} />\n          <StyledLink\n            className=\"program-info-url-link\"\n            aria-label={`${this.getProgramInfoLinkText()}, opens in a new tab`}\n            data-test=\"program-info-url-link\"\n            href={this.customOrDefaultProgramInfoUrl()}\n            target=\"_blank\"\n          >\n            {this.getProgramInfoLinkText()}\n          </StyledLink>\n        </StyledLinksContainer>\n        <StyledLinksContainer>\n          <NewTab size={20} />\n          <StyledLink\n            aria-label=\"Send an email to help@mentorcollective.org to ask individual questions, opens in a new tab\"\n            href=\"mailto:help@mentorcollective.org\"\n            target=\"_blank\"\n          >\n            You can also email us at help@mentorcollective.org to ask individual questions\n          </StyledLink>\n        </StyledLinksContainer>\n      </div>\n    );\n  }\n\n  renderFirstParagraph() {\n    const match = this.props.role === \"Student\" ? \"mentor\" : \"mentee\";\n\n    return (\n      <StyledParagraphSmall>\n        Mentor Collective is an international mentoring community that partners with institutions\n        like yours to deliver a transformative mentorship experience. You're in the process of being\n        matched with a {this.props.translator.transformText(match)} in your institution's program.\n      </StyledParagraphSmall>\n    );\n  }\n\n  customOrDefaultProgramInfoUrl() {\n    // These are URLs on our partner-facing website.\n    if (this.props.role === \"Student\") {\n      return \"https://www.mentorcollective.org/mentees\";\n    } else if (this.props.role === \"Mentor\") {\n      return \"https://www.mentorcollective.org/mentors\";\n    }\n  }\n\n  getProgramInfoLinkText() {\n    const role = this.props.role === \"Mentor\" ? \"mentor\" : \"mentee\";\n    return this.props.translator.transformText(\n      `Head over to the Mentor Collective website to learn more about becoming a ${role}`,\n    );\n  }\n\n  componentDidMount() {\n    if (this.textContainerRef?.current?.scrollIntoView) {\n      this.textContainerRef.current.scrollIntoView();\n    }\n  }\n}\n\nexport default SignUpAdditionalInfo;\n","// Third-party imports.\nimport React from \"react\";\nimport styled from \"styled-components\";\nimport { ParagraphSmall } from \"baseui/typography\";\nimport { StyledLink } from \"baseui/link\";\n\nconst Heading = styled(ParagraphSmall)`\n  margin-top: ${({ theme }) => theme.sizing.scale400};\n  margin-bottom: ${({ theme }) => theme.sizing.scale300};\n  font-weight: ${({ theme }) => theme.typography.HeadingXSmall.fontWeight};\n`;\n\nclass ExistingUserAdditionalInfo extends React.Component {\n  textContainerRef = React.createRef();\n\n  render() {\n    return (\n      <div className=\"additional-info\" ref={this.textContainerRef}>\n        <ParagraphSmall>\n          Since you already have a mentor or mentee account with us, it's important that we link\n          your new signup rather than create a new account. If you have multiple emails, make sure\n          you enter the one with the domain outlined above (in bold).\n        </ParagraphSmall>\n        <Heading>Still can't log in?</Heading>\n        <ParagraphSmall>\n          Click \"Forgot password?\" and we'll send you a link to reset it. For any further questions,\n          please write to{\" \"}\n          <StyledLink href=\"mailto:help@mentorcollective.org\">help@mentorcollective.org</StyledLink>{\" \"}\n          or hit the \"back\" button on your browser and choose \"I'm not sure\" when asked \"Is this\n          you?\" and a team member will reach out within 1 business day.\n        </ParagraphSmall>\n      </div>\n    );\n  }\n\n  componentDidMount() {\n    if (this.textContainerRef?.current?.scrollIntoView) {\n      this.textContainerRef.current.scrollIntoView();\n    }\n  }\n}\n\nexport default ExistingUserAdditionalInfo;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport jQuery from \"jquery\";\nimport { ParagraphMedium } from \"baseui/typography\";\nimport { CenteredLoadingSpinner } from \"../../../components/base_ui/progress_and_validation/spinner/centered_loading_spinner\";\nimport { Button } from \"../../../components/base_ui/inputs/button\";\nimport FormControl from \"../../../components/base_ui/inputs/form_control\";\nimport Input from \"../../../components/base_ui/inputs/input\";\n\nconst EmailFormControlOverrides = {\n  Label: {\n    style: ({ $theme }) => ({\n      fontFamily: $theme.typography.LabelMedium.fontFamily,\n      fontWeight: $theme.typography.LabelMedium.fontWeight,\n      fontSize: $theme.typography.LabelMedium.fontSize,\n      lineHeight: $theme.typography.LabelMedium.lineHeight,\n      textTransform: \"none\",\n    }),\n  },\n};\n\nfunction ResetEmailConfirmation({ email }) {\n  return (\n    <div className=\"text-align-center vertical-spacing-top two-rems\">\n      <ParagraphMedium>\n        No worries! We sent an email to <strong>{email}</strong> that will let you log in and reset\n        your password. If you didn't receive it, contact help@mentorcollective.org.\n      </ParagraphMedium>\n    </div>\n  );\n}\nResetEmailConfirmation.propTypes = {\n  email: PropTypes.string.isRequired,\n};\nfunction ResetWithKnownEmail({ email, onClickSend, errors, emailInFlight, emailSent }) {\n  if (emailSent) {\n    return <ResetEmailConfirmation email={email} />;\n  }\n  return (\n    <div className=\"text-align-center\">\n      <ParagraphMedium>\n        Would you like to send a password reset email to <strong>{email}</strong>?\n      </ParagraphMedium>\n      {errors > 0 && (\n        <div className=\"form-errors\">\n          {errors.map((error) => (\n            <div key={error} className=\"error-item\">\n              {error}\n            </div>\n          ))}\n        </div>\n      )}\n\n      <div className=\"vertical-spacing-top two-rems\">\n        {emailInFlight && <CenteredLoadingSpinner />}\n        <Button onClick={() => onClickSend(email)}>Send Email</Button>\n      </div>\n    </div>\n  );\n}\nResetWithKnownEmail.propTypes = {\n  email: PropTypes.string.isRequired,\n  onClickSend: PropTypes.func.isRequired,\n  errors: PropTypes.array.isRequired,\n  emailInFlight: PropTypes.bool.isRequired,\n  emailSent: PropTypes.bool.isRequired,\n};\n\nclass ResetWithUnknownEmail extends React.Component {\n  static propTypes = {\n    emailDomain: PropTypes.string.isRequired,\n    onClickSend: PropTypes.func.isRequired,\n    errors: PropTypes.array.isRequired,\n    emailInFlight: PropTypes.bool.isRequired,\n    emailSent: PropTypes.bool.isRequired,\n    onClickBack: PropTypes.func.isRequired,\n  };\n\n  state = {\n    inputEmail: \"\",\n  };\n\n  render() {\n    if (this.props.emailSent) {\n      return <ResetEmailConfirmation email={this.state.inputEmail} />;\n    }\n    return (\n      <div className=\"text-align-center\">\n        <div className=\"text-align-center vertical-spacing-top two-rems\">\n          <ParagraphMedium>\n            Just enter your existing <strong>{this.props.emailDomain}</strong> email, and we'll send\n            you a link to reset your password.\n          </ParagraphMedium>\n          <div className=\"vertical-spacing-top two-rems\">\n            <FormControl label=\"Email\" overrides={EmailFormControlOverrides}>\n              <Input\n                value={this.state.inputEmail}\n                placeholder=\"Email\"\n                onChange={({ currentTarget: { value: updatedEmail } }) =>\n                  this.setState((prevState) => ({ ...prevState, inputEmail: updatedEmail }))\n                }\n              />\n            </FormControl>\n          </div>\n          {this.props.errors.length > 0 && (\n            <div className=\"form-errors\">\n              {this.props.errors.map((error) => (\n                <div key={error} className=\"error-item\">\n                  {error}\n                </div>\n              ))}\n            </div>\n          )}\n          <div className=\"vertical-spacing-top two-rems\">\n            {this.props.emailInFlight && <CenteredLoadingSpinner />}\n            <Button\n              disabled={this.state.inputEmail.length < 1}\n              onClick={() => this.props.onClickSend(this.state.inputEmail)}\n            >\n              Send Email\n            </Button>\n          </div>\n          <div className=\"vertical-spacing-top two-rems\">\n            <Button onClick={() => this.props.onClickBack()}>Back</Button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default class ResetWithEmail extends React.Component {\n  static propTypes = {\n    // What do we already know about this existing user? We should either have\n    // the email that a user entered and we validated as an existing account,\n    // or if we instead identified them based on first/last name, the domain\n    // of the email they already have registered (we don't know 100% if this is actually\n    // the current user or not yet, so we don't have the full email), and whether or not\n    // the already registered user has a valid phone #\n    knownUserInfo: PropTypes.oneOfType([\n      PropTypes.shape({\n        emailDomain: PropTypes.string.isRequired,\n        hasValidPhone: PropTypes.bool.isRequired,\n        id: PropTypes.number.isRequired,\n      }),\n      PropTypes.shape({\n        email: PropTypes.string.isRequired,\n      }),\n    ]),\n    sendPasswordResetEmailPath: PropTypes.string.isRequired,\n    programId: PropTypes.string.isRequired,\n    roleToRegisterFor: PropTypes.string.isRequired,\n    onClickBack: PropTypes.func.isRequired,\n  };\n\n  state = {\n    errors: [],\n    resetInFlight: false,\n    emailSent: false,\n  };\n\n  isEmailValidForKnownUser = async (email) => {\n    try {\n      const result = await jQuery.get({\n        url: \"/api/users/check_valid_email\",\n        data: {\n          user_id: this.props.knownUserInfo.id,\n          email_to_validate: email,\n        },\n      });\n      return result.is_valid;\n    } catch (response) {\n      this.setState((prevState) => ({\n        ...prevState,\n        errors: [\n          \"There was a problem validating your input email address. Please try again or refresh the page\",\n        ],\n      }));\n      return false;\n    }\n  };\n\n  sendResetPasswordEmail = async (email) => {\n    this.setState((prevState) => ({ ...prevState, resetInFlight: true }));\n    try {\n      await jQuery.post({\n        url: this.props.sendPasswordResetEmailPath,\n        data: {\n          email,\n          program_id: this.props.programId,\n          role: this.props.roleToRegisterFor,\n        },\n      });\n      this.setState((prevState) => ({ ...prevState, emailSent: true }));\n    } catch (response) {\n      // Display the error in the form.\n      if (response.responseJSON) {\n        this.setState((prevState) => ({ ...prevState, errors: response.responseJSON.errors }));\n      } else if (response.status === 404) {\n        this.setState((prevState) => ({\n          ...prevState,\n          errors: [\"Couldn't find any user with that email address.\"],\n        }));\n      } else {\n        this.setState((prevState) => ({\n          ...prevState,\n          errors: [`Error: HTTP ${response.status}. Please try again or refresh the page.`],\n        }));\n      }\n      return;\n    } finally {\n      this.setState((prevState) => ({ ...prevState, resetInFlight: false }));\n    }\n  };\n\n  render() {\n    return this.props.knownUserInfo.email ? (\n      <ResetWithKnownEmail\n        email={this.props.knownUserInfo.email}\n        errors={this.state.errors}\n        onClickSend={this.sendResetPasswordEmail}\n        emailInFlight={this.state.resetInFlight}\n        emailSent={this.state.emailSent}\n      />\n    ) : (\n      <ResetWithUnknownEmail\n        emailDomain={this.props.knownUserInfo.emailDomain}\n        errors={this.state.errors}\n        onClickSend={async (email) => {\n          const isEmailValid = await this.isEmailValidForKnownUser(email);\n          if (isEmailValid) {\n            await this.sendResetPasswordEmail(email);\n          } else {\n            this.setState((prevState) => ({\n              ...prevState,\n              errors: [\n                `The email you entered doesn't match your existing email we have on file. Please enter your existing ${this.props.knownUserInfo.emailDomain} email and try again.`,\n              ],\n            }));\n          }\n        }}\n        emailInFlight={this.state.resetInFlight}\n        emailSent={this.state.emailSent}\n        onClickBack={this.props.onClickBack}\n      />\n    );\n  }\n}\n","import React, { useState } from \"react\";\nimport jQuery from \"jquery\";\nimport { ParagraphMedium } from \"baseui/typography\";\nimport { CenteredLoadingSpinner } from \"../../../components/base_ui/progress_and_validation/spinner/centered_loading_spinner\";\nimport { Button } from \"../../../components/base_ui/inputs/button\";\nimport FormControl from \"../../../components/base_ui/inputs/form_control\";\nimport Input from \"../../../components/base_ui/inputs/input\";\n\nexport async function sendRecoverySMS(\n  userId: string,\n  programId: string,\n  firstName: string,\n  lastName: string\n): Promise<void> {\n  try {\n    const result = await jQuery.post({\n      url: \"/api/users/send_sms_recovery_code\",\n      data: {\n        user_id: userId,\n        program_id: programId,\n        first_name: firstName,\n        last_name: lastName,\n      },\n    });\n    if (!result.sms_sent) {\n      throw new Error(\"Something went wrong. SMS not sent\");\n    }\n  } catch (response) {\n    throw new Error(\"Something went wrong trying to send an account recovery SMS\");\n  }\n}\n\nexport default function ResetWithSms({\n  onClickBack,\n  userId,\n  programId,\n  roleToRegisterFor,\n}: {\n  onClickBack: () => void;\n  userId: string;\n  programId: string;\n  roleToRegisterFor: string;\n}) {\n  const [inputRecoveryCode, setInputRecoveryCode] = useState<string>(\"\");\n  const [checkingCode, setCheckingCode] = useState<boolean>(false);\n  const [error, setError] = useState<string>(\"\");\n\n  return (\n    <div className=\"text-align-center vertical-spacing-top two-rems\">\n      <ParagraphMedium>\n        Great! We just sent a recovery code to the phone number you have registered to your existing\n        account. Once you receive it, please enter it below.\n      </ParagraphMedium>\n      <div className=\"vertical-spacing-top two-rems\">\n        <FormControl\n          label=\"Recovery Code\"\n          overrides={{\n            Label: {\n              style: ({ $theme }) => ({\n                fontFamily: $theme.typography.LabelMedium.fontFamily,\n                fontWeight: $theme.typography.LabelMedium.fontWeight,\n                fontSize: $theme.typography.LabelMedium.fontSize,\n                lineHeight: $theme.typography.LabelMedium.lineHeight,\n                textTransform: \"none\",\n              }),\n            },\n          }}\n        >\n          <Input\n            value={inputRecoveryCode}\n            placeholder=\"999999\"\n            onChange={({ currentTarget: { value: updatedCode } }) =>\n              setInputRecoveryCode(updatedCode)\n            }\n          />\n        </FormControl>\n      </div>\n      {error && (\n        <div className=\"form-errors\">\n          <div className=\"error-item\">{error}</div>\n        </div>\n      )}\n      <div className=\"vertical-spacing-top two-rems\">\n        <Button\n          onClick={async () => {\n            setCheckingCode(true);\n            try {\n              const result = await jQuery.post({\n                url: \"/api/users/validate_recovery_code\",\n                data: {\n                  user_id: userId,\n                  program_id: programId,\n                  recovery_code: inputRecoveryCode,\n                  role: roleToRegisterFor,\n                },\n              });\n              if (!result.validated) {\n                setError(\n                  \"Invalid code. Please double check your phone and try again. If you're still having problems, go back to the previous page and try again.\"\n                );\n              } else if (result.recovery_link) {\n                window.location.replace(result.recovery_link);\n              }\n            } catch (response) {\n              setError(\"There was a problem sending your code. Please reload and try again.\");\n            } finally {\n              setCheckingCode(false);\n            }\n          }}\n        >\n          Sign in\n        </Button>\n      </div>\n      <div className=\"vertical-spacing-top two-rems\">\n        {checkingCode && <CenteredLoadingSpinner />}\n        <Button onClick={() => onClickBack()}>Back</Button>\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport ResetWithEmail from \"./email\";\nimport ResetWithSms, { sendRecoverySMS } from \"./sms\";\nimport { ParagraphMedium } from \"baseui/typography\";\nimport { CenteredLoadingSpinner } from \"../../../components/base_ui/progress_and_validation/spinner/centered_loading_spinner\";\nimport { Button } from \"../../../components/base_ui/inputs/button\";\n\nconst email = \"email\";\nconst sms = \"sms\";\n\nexport default class ExistingUserResetPassword extends React.Component {\n  static propTypes = {\n    // What do we already know about this existing user? We should either have\n    // the email that a user entered and we validated as an existing account,\n    // or if we instead identified them based on first/last name, the domain\n    // of the email they already have registered (we don't know 100% if this is actually\n    // the current user or not yet, so we don't have the full email), and whether or not\n    // the already registered user has a valid phone #\n    knownUserInfo: PropTypes.oneOfType([\n      PropTypes.shape({\n        emailDomain: PropTypes.string.isRequired,\n        hasValidPhone: PropTypes.bool.isRequired,\n        id: PropTypes.number.isRequired,\n      }),\n      PropTypes.shape({\n        email: PropTypes.string.isRequired,\n      }),\n    ]),\n    inputUserInfo: PropTypes.shape({\n      firstName: PropTypes.string.isRequired,\n      lastName: PropTypes.string.isRequired,\n    }).isRequired,\n    sendPasswordResetEmailPath: PropTypes.string.isRequired,\n    programId: PropTypes.string.isRequired,\n    roleToRegisterFor: PropTypes.string.isRequired,\n  };\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      recoveryType: props.knownUserInfo.email ? props.knownUserInfo.email : undefined,\n      isSendingSMS: false,\n      error: undefined,\n    };\n  }\n\n  render() {\n    return !this.props.knownUserInfo.hasValidPhone || this.state.recoveryType === email ? (\n      <ResetWithEmail\n        knownUserInfo={this.props.knownUserInfo}\n        sendPasswordResetEmailPath={this.props.sendPasswordResetEmailPath}\n        programId={this.props.programId}\n        roleToRegisterFor={this.props.roleToRegisterFor}\n        onClickBack={() =>\n          this.setState((prevState) => ({ ...prevState, recoveryType: undefined }))\n        }\n      />\n    ) : this.state.recoveryType === sms ? (\n      <ResetWithSms\n        onClickBack={() =>\n          this.setState((prevState) => ({ ...prevState, recoveryType: undefined }))\n        }\n        userId={this.props.knownUserInfo.id}\n        programId={this.props.programId}\n        roleToRegisterFor={this.props.roleToRegisterFor}\n      />\n    ) : (\n      <div className=\"text-align-center\">\n        <div className=\"text-align-center vertical-spacing-top two-rems\">\n          <ParagraphMedium>\n            Looks like you have both an e-mail address and phone number associated with your\n            existing account. To reset your password, we can send a code to either one. How would\n            you like to receive your recovery code?\n          </ParagraphMedium>\n        </div>\n        {this.state.error && (\n          <div className=\"form-errors\">\n            <div className=\"error-item\">{this.state.error}</div>\n          </div>\n        )}\n        <div className=\"vertical-spacing-top two-rems\">\n          <Button\n            onClick={() => {\n              this.setState((prevState) => ({ ...prevState, recoveryType: email }));\n            }}\n          >\n            Reset with Email\n          </Button>\n        </div>\n        <div className=\"vertical-spacing-top two-rems\">\n          {this.state.isSendingSMS && <CenteredLoadingSpinner />}\n          <Button\n            onClick={async () => {\n              this.setState((prevState) => ({ ...prevState, isSendingSMS: true }));\n              try {\n                await sendRecoverySMS(\n                  this.props.knownUserInfo.id,\n                  this.props.programId,\n                  this.props.inputUserInfo.firstName,\n                  this.props.inputUserInfo.lastName\n                );\n              } catch (error) {\n                this.setState((prevState) => ({\n                  ...prevState,\n                  isSendingSMS: false,\n                  error:\n                    \"Something went wrong trying to send a SMS recovery code. Please reload the page and try again.\",\n                }));\n              }\n              this.setState((prevState) => ({\n                ...prevState,\n                isSendingSMS: false,\n                recoveryType: sms,\n              }));\n            }}\n          >\n            Reset with SMS\n          </Button>\n        </div>\n      </div>\n    );\n  }\n}\n","import styled from \"styled-components\";\n\n/**\n * This component allows us to insert a Header 1 with the styling of\n * a Header 3 in the sign in / sign up flow pages.\n * @deprecated\n */\nexport const H1asH3 = styled.h1`\n  font-size: 1.375em;\n  font-weight: normal;\n  letter-spacing: 0.0025em;\n  line-height: 1.5em;\n  margin-top: 0em;\n  margin-bottom: 0.1em;\n`;\n\n/**\n * This component allows us to insert a Header 1 with the styling without\n * any visual indication that the text is different than the rest of a paragraph\n * in the sign in / sign up flow pages.\n * @deprecated\n */\nexport const SilentH1 = styled.h1<{ bold?: boolean }>`\n  display: inline;\n  font-size: 1em;\n  font-weight: ${({ bold }: { bold?: boolean }) => (bold ? \"bold\" : \"normal\")};\n  font-style: normal;\n`;\n","// Third-party imports.\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport jQuery from \"jquery\";\nimport { StyledLink } from \"baseui/link\";\nimport styled from \"styled-components\";\nimport { ParagraphMedium, ParagraphSmall } from \"baseui/typography\";\n\n// Our imports.\nimport { CenteredLoadingSpinner } from \"../../components/base_ui/progress_and_validation/spinner/centered_loading_spinner\";\nimport { Button } from \"../../components/base_ui/inputs/button\";\nimport FormControl from \"../../components/base_ui/inputs/form_control\";\nimport Input from \"../../components/base_ui/inputs/input\";\n\nimport ExistingUserAdditionalInfo from \"./additional_info\";\nimport ExistingUserResetPassword from \"./reset_password\";\nimport \"./sign_in_form.css\";\nimport { SilentH1 } from \"../../../utils/headers\";\n\nconst StyledContainer = styled.div`\n  margin-top: ${({ theme }) => theme.sizing.scale600};\n`;\n\nconst StyledParagraph = styled(ParagraphSmall)`\n  color: ${({ theme }) => theme.colors.contentTertiary};\n`;\n\nconst StyledInputsContainer = styled.div`\n  label {\n    font-family: ${({ theme }) => theme.typography.LabelMedium.fontFamily};\n    font-weight: ${({ theme }) => theme.typography.LabelMedium.fontWeight};\n    font-size: ${({ theme }) => theme.typography.LabelMedium.fontSize};\n    line-height: ${({ theme }) => theme.typography.LabelMedium.lineHeight};\n    text-transform: none;\n  }\n`;\n\n// This component relies on a parent component to keep the email and password state for it.\nclass ExistingUserSignInForm extends React.Component {\n  static propTypes = {\n    roleToRegisterFor: PropTypes.string.isRequired, // \"Mentor\" | \"Student\"\n    programId: PropTypes.string.isRequired,\n\n    // What do we already know about this existing user? We should either have\n    // the email that a user entered and we validated as an existing account,\n    // or if we instead identified them based on first/last name, the domain\n    // of the email they already have registered (we don't know 100% if this is actually\n    // the current user or not yet, so we don't have the full email), and whether or not\n    // the already registered user has a valid phone #\n    knownUserInfo: PropTypes.oneOfType([\n      PropTypes.shape({\n        emailDomain: PropTypes.string.isRequired,\n        hasValidPhone: PropTypes.bool.isRequired,\n        id: PropTypes.number.isRequired,\n      }),\n      PropTypes.shape({\n        email: PropTypes.string.isRequired,\n      }),\n    ]),\n    inputUserInfo: PropTypes.shape({\n      firstName: PropTypes.string.isRequired,\n      lastName: PropTypes.string.isRequired,\n    }).isRequired,\n\n    // What URL do we hit to sign up and register this person?\n    signInPath: PropTypes.string.isRequired,\n    registerPath: PropTypes.string.isRequired,\n    sendPasswordResetEmailPath: PropTypes.string.isRequired,\n\n    csrfToken: PropTypes.string.isRequired,\n  };\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      inputEmail: props.knownUserInfo.email ? props.knownUserInfo.email : \"\",\n      inputPassword: \"\",\n\n      // For tracking when we should display a spinner to let the user know we're doing something on\n      // their behalf.\n      processingSubmission: false,\n\n      // Show/hide for the \"additional info\" box at the bottom of the screen.\n      displayingAdditionalInfo: false,\n\n      // We may display errors to the user if information they provided is invalid.\n      errors: [],\n\n      // If the User has signaled that they forgot their password\n      forgotPassword: false,\n    };\n  }\n\n  render() {\n    let existingUserAdditionalInfo;\n    if (this.state.displayingAdditionalInfo) {\n      existingUserAdditionalInfo = <ExistingUserAdditionalInfo />;\n    }\n\n    let headerElement;\n    if (this.props.knownUserInfo.emailDomain) {\n      headerElement = (\n        <StyledContainer>\n          <SilentH1>\n            Please log in to your existing account, using your{\" \"}\n            <strong>{this.props.knownUserInfo.emailDomain}</strong> email.\n          </SilentH1>\n        </StyledContainer>\n      );\n    } else {\n      headerElement = (\n        <StyledContainer>\n          <SilentH1>You already have an account with us — nice!</SilentH1>\n          <ParagraphMedium>\n            Enter your password to log in and register for this year's program.\n          </ParagraphMedium>\n        </StyledContainer>\n      );\n    }\n\n    return (\n      <div className=\"existing-user-sign-in-form\">\n        {this.state.forgotPassword ? (\n          <ExistingUserResetPassword\n            knownUserInfo={this.props.knownUserInfo}\n            sendPasswordResetEmailPath={this.props.sendPasswordResetEmailPath}\n            programId={this.props.programId}\n            roleToRegisterFor={this.props.roleToRegisterFor}\n            inputUserInfo={this.props.inputUserInfo}\n          />\n        ) : (\n          <React.Fragment>\n            <div className=\"text-align-center\">{headerElement}</div>\n            {this.renderFormElement()}\n            {this.renderFormErrorsElement()}\n            <div className=\"text-align-center vertical-spacing-top two-rems\">\n              <StyledLink\n                aria-label=\"Reset your password\"\n                className=\"forgot-your-password\"\n                tabIndex=\"0\"\n                onClick={() =>\n                  this.setState((prevState) => ({ ...prevState, forgotPassword: true }))\n                }\n              >\n                Forgot password?\n              </StyledLink>\n            </div>\n          </React.Fragment>\n        )}\n\n        <div className=\"additional-info-container\">\n          <div className=\"additional-info-link-container\">\n            <StyledParagraph>\n              Not sure what's going on?{\" \"}\n              <StyledLink\n                tabIndex=\"0\"\n                onClick={() =>\n                  this.setState({ displayingAdditionalInfo: !this.state.displayingAdditionalInfo })\n                }\n              >\n                Learn More\n              </StyledLink>\n            </StyledParagraph>\n          </div>\n          {existingUserAdditionalInfo}\n        </div>\n      </div>\n    );\n  }\n\n  renderFormErrorsElement() {\n    if (this.state.errors.length === 0) {\n      return null;\n    }\n\n    const errorItems = this.state.errors.map((error) => (\n      <div key={error} className=\"error-item\">\n        {error}\n      </div>\n    ));\n\n    return <div className=\"form-errors\">{errorItems}</div>;\n  }\n\n  renderFormElement() {\n    // We aren't using the submit capabilities of the <form> element -- that is handled by Ajax.\n    return (\n      <form\n        name=\"existing_user_sign_in_form\"\n        className=\"vertical-spacing two-rems text-align-center\"\n        onSubmit={this.onSubmitSignInForm}\n      >\n        {this.renderFormItems()}\n        {this.state.processingSubmission && <CenteredLoadingSpinner />}\n        <Button className=\"signinButton\" disabled={!this.allowSubmit()}>\n          Done\n        </Button>\n      </form>\n    );\n  }\n\n  renderFormItems() {\n    return (\n      <StyledInputsContainer>\n        <div>\n          <FormControl label=\"Email\">\n            <Input\n              aria-label=\"email\"\n              name=\"email\"\n              value={this.state.inputEmail}\n              placeholder=\"Enter your email\"\n              onChange={({ currentTarget: { value: updatedEmail } }) =>\n                this.setState((prevState) => ({\n                  ...prevState,\n                  inputEmail: updatedEmail,\n                  errors: [],\n                }))\n              }\n            />\n          </FormControl>\n        </div>\n        <div>\n          <FormControl label=\"Password\">\n            <Input\n              aria-label=\"password\"\n              type=\"password\"\n              name=\"password\"\n              value={this.state.inputPassword}\n              placeholder=\"Enter your password\"\n              onChange={({ currentTarget: { value: updatedPassword } }) =>\n                this.setState((prevState) => ({\n                  ...prevState,\n                  inputPassword: updatedPassword,\n                  errors: [],\n                }))\n              }\n            />\n          </FormControl>\n        </div>\n      </StyledInputsContainer>\n    );\n  }\n\n  /**\n   * @return {Boolean} True if we allow the user to click the submit button, false otherwise.\n   */\n  allowSubmit() {\n    return this.state.inputEmail && this.state.inputPassword;\n  }\n\n  onSubmitSignInForm = async (event) => {\n    // We don't actually want the form to be submitted. Instead we take data from the form and\n    // submit it using AJAX.\n    event.preventDefault();\n\n    // Start the button spinning so the user knows we're doing something.\n    this.setState({ processingSubmission: true });\n\n    // This is a two-request process: first we make a POST request to sign the user in, then we make\n    // a POST request to register them for the program (if they are not registered already).\n    try {\n      // Note we are binding the return value of jQuery.post and then awaiting, not awaiting\n      // directly. This is because we need to access the CSRF token in the first response so we can\n      // use it in the second response. Rails generates a new CSRF token in between the first\n      // request and the second.\n\n      // See http://api.jquery.com/jQuery.ajax/#jqXHR for documentation about the jqXHR object.\n      const signInjqXHR = jQuery.post({\n        url: this.props.signInPath,\n        headers: { \"X-CSRF-Token\": this.props.csrfToken },\n        data: {\n          api_user: {\n            email: this.state.inputEmail,\n            password: this.state.inputPassword,\n          },\n        },\n      });\n      await signInjqXHR;\n      const newCSRFToken = signInjqXHR.getResponseHeader(\"X-CSRF-Token\");\n\n      await jQuery.post({\n        url: this.props.registerPath,\n        headers: { \"X-CSRF-Token\": newCSRFToken },\n        data: {\n          role: this.props.roleToRegisterFor,\n          program_id: this.props.programId,\n        },\n      });\n    } catch (response) {\n      // Display the error in the form.\n      this.setState({ errors: [response.responseText] });\n      return;\n    } finally {\n      this.setState({ processingSubmission: false });\n    }\n\n    // We're now signed in and registered for the new program, put them on the pipe.\n    window.location.reload();\n  };\n}\n\nexport default ExistingUserSignInForm;\n","// Our imports\nimport { SilentH1 } from \"../../utils/headers\";\n\n// Third-party imports.\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport \"./disambiguate_during_sign_up.css\";\nimport { Button } from \"../components/base_ui/inputs/button\";\nimport { ParagraphMedium } from \"baseui/typography\";\n\nclass DisambiguateDuringSignUp extends React.Component {\n  static propTypes = {\n    schoolName: PropTypes.string.isRequired,\n    role: PropTypes.string.isRequired,\n\n    email: PropTypes.string.isRequired,\n    firstName: PropTypes.string.isRequired,\n    lastName: PropTypes.string.isRequired,\n\n    existingUserData: PropTypes.object,\n\n    onYesThatsMeClicked: PropTypes.func.isRequired,\n    onNoThatsNotMeClicked: PropTypes.func.isRequired,\n  };\n\n  render() {\n    return (\n      <div className=\"disambiguate-during-sign-up\">\n        <ParagraphMedium>\n          Our records show that somebody with the following contact information was either invited\n          to this program by {this.props.schoolName}, or has been part of a Mentor Collective\n          program in the past.\n        </ParagraphMedium>\n\n        {this.props.existingUserData && this.props.existingUserData?.redactedEmail && (\n          <ParagraphMedium data-test=\"redacted-email\">\n            Email: {this.props.existingUserData.redactedEmail}\n          </ParagraphMedium>\n        )}\n\n        {this.props.existingUserData && this.props.existingUserData?.redactedPhone && (\n          <ParagraphMedium data-test=\"redacted-phone\">\n            Phone: {this.props.existingUserData.redactedPhone}\n          </ParagraphMedium>\n        )}\n\n        <SilentH1>\n          <b>Is this you?</b>\n        </SilentH1>\n\n        <div>\n          <div className=\"vertical-spacing-top one-rem\">\n            <Button className=\"yes-thats-me\" onClick={this.onClickedYesThatsMe}>\n              Yes, that's me\n            </Button>\n          </div>\n\n          <div className=\"vertical-spacing-top one-rem\">\n            <Button className=\"no-thats-not-me\" onClick={this.onClickedNoThatsNotMe}>\n              No, that's not me\n            </Button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  onClickedYesThatsMe = () => {\n    this.props.onYesThatsMeClicked();\n  };\n\n  onClickedNoThatsNotMe = () => {\n    this.props.onNoThatsNotMeClicked();\n  };\n}\n\nexport default DisambiguateDuringSignUp;\n","// Third-party imports.\nimport React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport jQuery from \"jquery\";\nimport _ from \"lodash\";\nimport \"./sign_up_flow.css\";\n\n// Our imports.\nimport * as Utils from \"../../utils/utils\";\nimport { isValidPassword } from \"../../utils/password_utils\";\nimport { LoginPage as LoginBackground } from \"../login\";\nimport LegalTermsAgreement from \"../legal_terms_agreement\";\nimport EuCitizenCheckbox from \"./eu_citizen_checkbox\";\nimport { CenteredLoadingSpinner } from \"../components/base_ui/progress_and_validation/spinner/centered_loading_spinner\";\nimport { Button } from \"../components/base_ui/inputs/button\";\nimport FormControl from \"../components/base_ui/inputs/form_control\";\nimport Input from \"../components/base_ui/inputs/input\";\nimport SignUpAdditionalInfo from \"./sign_up_additional_info\";\nimport ExistingUserSignInForm from \"./existing_user/sign_in_form\";\nimport DisambiguateDuringSignUp from \"./disambiguate_during_sign_up\";\nimport styled, { ThemeProvider } from \"styled-components\";\nimport {\n  StyledCard,\n  StyledHeading,\n  StyledParagraphMedium,\n} from \"../shared/login_and_sign_up/styled\";\nimport SsoButton from \"../sso_button\";\nimport deprecatedTheme from \"../styling/deprecated_theme\";\nimport { LabelTranslator } from \"../../utils/label_utils\";\nimport { StyledLink } from \"baseui/link\";\nimport { ParagraphSmall } from \"baseui/typography\";\nimport { Provider as StyletronProvider } from \"styletron-react\";\nimport { BaseProvider } from \"baseui\";\nimport baseuiTheme from \"../../components/styling/baseui_theme\";\nimport { ThemeProvider as MaterialThemeProvider, THEME_ID } from \"@mui/material/styles\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFnsV3\";\nimport materialTheme from \"../styling/material_theme\";\nimport { Client as Styletron } from \"styletron-engine-atomic\";\nimport ProgramSchoolLogoBlock from \"../shared/login_and_sign_up/program_school_logo_block\";\nimport { Enterprise } from \"@carbon/icons-react\";\nimport { emailRegex } from \"../../utils/string_utils\";\n\nconst engine = new Styletron();\n\nconst StyledParagraphSmall = styled(ParagraphSmall)`\n  color: ${({ theme }) => theme.colors.contentTertiary};\n  margin-top: 0px;\n  margin-bottom: 0px;\n`;\n\nconst CheckboxContainer = styled.div`\n  margin-top: ${({ theme }) => theme.sizing.scale800};\n  margin-bottom: ${({ theme }) => theme.sizing.scale800};\n`;\n\nconst ButtonContainer = styled.div`\n  margin-top: ${({ theme }) => theme.sizing.scale800};\n  margin-bottom: ${({ theme }) => theme.sizing.scale1000};\n`;\n\n// States.\nconst signUpForm = \"signUpForm\";\nconst existingUserSignInForm = \"existingUserSignInForm\";\nconst disambiguating = \"disambiguating\";\n\n// Disambiguation outcomes.\nconst yesThatsMe = \"yes-thats-me\";\nconst noThatsNotMe = \"no-thats-not-me\";\nclass SignUpFlow extends React.Component {\n  static propTypes = {\n    userId: PropTypes.string,\n    userFullName: PropTypes.string,\n    activeSsoTokenForSchool: PropTypes.bool,\n    role: PropTypes.string.isRequired, // e.g. 'Student' or 'Mentor'\n    programData: PropTypes.shape({\n      id: PropTypes.string.isRequired,\n      title: PropTypes.string.isRequired,\n      logo: PropTypes.string,\n      shortName: PropTypes.string.isRequired,\n      schoolName: PropTypes.string.isRequired,\n      schoolShortName: PropTypes.string.isRequired,\n      programInfoUrl: PropTypes.string,\n      schoolId: PropTypes.string.isRequired,\n      schoolLogo: PropTypes.string,\n      programCustomLabel: PropTypes.object.isRequired,\n      higherEdSegment: PropTypes.string.isRequired,\n    }).isRequired,\n    isSsoEnabled: PropTypes.bool.isRequired,\n    ssoConnection: PropTypes.string,\n    ssoBrand: PropTypes.string,\n\n    // What URL to we hit to check if the user is signed up?\n    checkIfUserSignedUpPath: PropTypes.string.isRequired,\n    // What URL do we hit to determine if the user who's signing up is already a contact?\n    detectExistingContactPath: PropTypes.string.isRequired,\n    // What URL do we hit to determine if the user who's signing up might be a duplicate?\n    detectDuplicatesPath: PropTypes.string.isRequired,\n\n    // What URL do we hit to sign up and register this person?\n    signUpAndRegisterPath: PropTypes.string.isRequired,\n    signInPath: PropTypes.string.isRequired,\n    registerPath: PropTypes.string.isRequired,\n    sendPasswordResetEmailPath: PropTypes.string.isRequired,\n\n    csrfToken: PropTypes.string.isRequired,\n  };\n\n  constructor(props) {\n    super(props);\n\n    const program = {\n      programSequence: {\n        higherEdSegment: props?.programData?.higherEdSegment?.toUpperCase(),\n      },\n      programCustomLabel: props.programData.programCustomLabel,\n    };\n\n    const translator = new LabelTranslator(program);\n\n    this.state = {\n      currentState: signUpForm, // Which state are we in?\n      translator: translator,\n      email: \"\",\n      firstName: \"\",\n      lastName: \"\",\n      password: \"\",\n      confirmPassword: \"\",\n      // GDPR regulations require the next two items.\n      isEUCitizen: false,\n      acceptedLegalTerms: false,\n\n      // For tracking when we should display a spinner to let the user know we're doing something on\n      // their behalf.\n      processingSubmission: false,\n\n      // We may display errors to the user if information they provided is invalid.\n      errorLegalTerms: false,\n      errorEmail: false,\n      errorFirstName: false,\n      errorLastName: false,\n      errorPassword: false,\n      errorConfirmPassword: false,\n      errors: [],\n\n      // Show/hide for the \"additional info\" box at the bottom of the screen.\n      displayingAdditionalInfo: false,\n\n      // Has this user been through the disambiguation flow? May be null, or strings yesThatsMe or\n      // noThatsNotMe (defined at the top of this file).\n      disambiguationOutcome: null,\n      // What the backend has told us about the other user who might be this one (if applicable).\n      existingUserData: null,\n    };\n  }\n\n  render() {\n    return (\n      <StyletronProvider value={engine}>\n        <BaseProvider theme={baseuiTheme}>\n          <ThemeProvider theme={{ ...deprecatedTheme, ...baseuiTheme }}>\n            <MaterialThemeProvider theme={{ [THEME_ID]: materialTheme }}>\n              <LocalizationProvider dateAdapter={AdapterDateFns}>\n                <div className=\"sign-up-flow\">{this.renderForCurrentState()}</div>\n              </LocalizationProvider>\n            </MaterialThemeProvider>\n          </ThemeProvider>\n        </BaseProvider>\n      </StyletronProvider>\n    );\n  }\n\n  renderForCurrentState() {\n    switch (this.state.currentState) {\n      case signUpForm: {\n        let signUpAdditionalInfo;\n        if (this.state.displayingAdditionalInfo) {\n          signUpAdditionalInfo = (\n            <SignUpAdditionalInfo role={this.props.role} translator={this.state.translator} />\n          );\n        }\n\n        return (\n          <LoginBackground>\n            <StyledCard>\n              <ProgramSchoolLogoBlock\n                programLogo={this.props.programData.logo}\n                programName={this.props.programData.title}\n                schoolLogo={this.props.programData.schoolLogo}\n                schoolName={this.props.programData.schoolName}\n              />\n              {this.renderSignUpForm()}\n              <div>\n                <div className=\"text-align-center\">\n                  <StyledParagraphSmall>\n                    Not sure what's going on?{\" \"}\n                    <StyledLink\n                      data-test=\"additional-info-btn\"\n                      tabIndex=\"0\"\n                      onClick={() =>\n                        this.setState({\n                          displayingAdditionalInfo: !this.state.displayingAdditionalInfo,\n                        })\n                      }\n                    >\n                      Learn More\n                    </StyledLink>\n                  </StyledParagraphSmall>\n                </div>\n                {signUpAdditionalInfo}\n              </div>\n            </StyledCard>\n          </LoginBackground>\n        );\n      }\n      case disambiguating: {\n        return (\n          <div>\n            <div className=\"brand-name text-align-center\">\n              <ProgramSchoolLogoBlock\n                programLogo={this.props.programData.logo}\n                programName={this.props.programData.title}\n                schoolLogo={this.props.programData.schoolLogo}\n                schoolName={this.props.programData.schoolName}\n              />\n            </div>\n            <DisambiguateDuringSignUp\n              role={this.props.role}\n              schoolName={this.props.programData.schoolShortName}\n              email={this.state.email}\n              firstName={this.state.firstName}\n              lastName={this.state.lastName}\n              existingUserData={this.state.existingUserData}\n              onNoThatsNotMeClicked={this.onNoThatsNotMeClicked}\n              onYesThatsMeClicked={this.onYesThatsMeClicked}\n            />\n          </div>\n        );\n      }\n      case existingUserSignInForm: {\n        return (\n          <div>\n            <div className=\"brand-name text-align-center\">\n              <ProgramSchoolLogoBlock\n                programLogo={this.props.programData.logo}\n                programName={this.props.programData.title}\n                schoolLogo={this.props.programData.schoolLogo}\n                schoolName={this.props.programData.schoolName}\n              />\n            </div>\n            <ExistingUserSignInForm\n              roleToRegisterFor={this.props.role}\n              programId={this.props.programData.id}\n              knownUserInfo={\n                this.state.existingUserData\n                  ? { ...this.state.existingUserData }\n                  : { email: this.state.email }\n              }\n              inputUserInfo={{\n                firstName: this.state.firstName,\n                lastName: this.state.lastName,\n              }}\n              signInPath={this.props.signInPath}\n              registerPath={this.props.registerPath}\n              sendPasswordResetEmailPath={this.props.sendPasswordResetEmailPath}\n              csrfToken={this.props.csrfToken}\n            />\n          </div>\n        );\n      }\n    }\n  }\n\n  onNoThatsNotMeClicked = () => {\n    // Change state so the form appears again, then submit it. We pass a callback to setState which\n    // fires once the form has been rendered.\n    this.setState(\n      { currentState: signUpForm, disambiguationOutcome: noThatsNotMe },\n      this.signUpAndRegister,\n    );\n  };\n\n  onYesThatsMeClicked = () => {\n    this.setState({ disambiguationOutcome: yesThatsMe });\n\n    // The user has indicated that they have an existing account. The account may be already signed\n    // up (have a password), or it may not.\n    if (this.state.existingUserData.isSignedUp) {\n      // The other account is signed up, so the user needs to sign into it. Clear the data you've\n      // typed in so far.\n      this.setState({\n        currentState: existingUserSignInForm,\n        email: \"\",\n        password: \"\",\n      });\n      return;\n    }\n\n    // Otherwise, we can just go ahead and sign them up ourselves.\n\n    // Change state so the form appears again, then submit it. We pass a callback to setState which\n    // fires once the form has been rendered.\n    this.setState({ currentState: signUpForm }, () =>\n      this.signUpAndRegister(this.state.existingUserData.id),\n    );\n  };\n\n  renderSignUpForm() {\n    let text;\n    switch (this.props.role) {\n      case \"Student\":\n        text = this.state.translator.transformText(\"Sign Up to Get a Mentor\");\n        break;\n      case \"Mentor\":\n        text = this.state.translator.transformText(\"Sign Up to Be a Mentor\");\n        break;\n    }\n\n    return (\n      <div>\n        <div>\n          <StyledHeading>{text}</StyledHeading>\n          {this.renderMessageSection()}\n        </div>\n        {this.props.userId\n          ? this.renderLoggedInUserRegistration()\n          : this.renderNotLoggedInUserRegistration()}\n      </div>\n    );\n  }\n\n  renderLoggedInUserRegistration() {\n    const ssoText = `Continue With ${\n      this.props.ssoBrand ? this.props.ssoBrand : \"Institutional Credentials\"\n    }`;\n    return (\n      <Fragment>\n        {this.props.isSsoEnabled ? (\n          <Fragment>\n            {this.props.activeSsoTokenForSchool && (\n              <form name=\"sign_up_form\" onSubmit={this.onLoggedInUserSubmitSignUp}>\n                <ButtonContainer>\n                  <Button\n                    className=\"ssoButton\"\n                    isStretched={true}\n                    leftIcon={<Enterprise size={32} />}\n                    dataAnalyticsId=\"continue-with-sso-logged-in-user\"\n                  >\n                    {ssoText}\n                  </Button>\n                </ButtonContainer>\n              </form>\n            )}\n            {!this.props.activeSsoTokenForSchool && (\n              <ButtonContainer>\n                <SsoButton\n                  csrfToken={this.props.csrfToken}\n                  schoolId={this.props.programData.schoolId}\n                  connection={this.props.ssoConnection}\n                  buttonText={ssoText}\n                  dataAnalyticsId=\"continue-with-sso-logged-in-user\"\n                />\n              </ButtonContainer>\n            )}\n          </Fragment>\n        ) : (\n          <form name=\"sign_up_form\" onSubmit={this.onLoggedInUserSubmitSignUp}>\n            <ButtonContainer>\n              <Button\n                className=\"signupButton\"\n                data-analytics-id=\"signup-mc-registration-logged-in-user\"\n                isStretched={true}\n              >\n                Sign Up\n              </Button>\n            </ButtonContainer>\n          </form>\n        )}\n      </Fragment>\n    );\n  }\n\n  renderNotLoggedInUserRegistration() {\n    const queryParams = {\n      is_eu: this.state.isEUCitizen,\n      accepted_terms: this.state.acceptedLegalTerms,\n    };\n\n    return (\n      <Fragment>\n        {this.props.isSsoEnabled && (\n          <div>\n            <CheckboxContainer>\n              <LegalTermsAgreement\n                acceptedLegalTerms={this.state.acceptedLegalTerms}\n                hasError={this.state.errorLegalTerms}\n                onAgreementStatusChanged={(agreementStatus) =>\n                  this.setState({ acceptedLegalTerms: agreementStatus, errorLegalTerms: false })\n                }\n              />\n              <EuCitizenCheckbox\n                schoolId={this.props.programData.schoolId}\n                euCitizen={this.state.isEUCitizen}\n                onChange={(event) => this.onFormDataChanged(\"isEUCitizen\", event.target.checked)}\n              />\n            </CheckboxContainer>\n            <ButtonContainer>\n              <SsoButton\n                csrfToken={this.props.csrfToken}\n                dataAnalyticsId=\"continue-with-sso-not-logged-in-user\"\n                className=\"vertical-spacing two-rems text-align-center\"\n                schoolId={this.props.programData.schoolId}\n                connection={this.props.ssoConnection}\n                onSubmit={this.handleSsoValidate}\n                queryParams={queryParams}\n                buttonText={`Continue With ${\n                  this.props.ssoBrand ? this.props.ssoBrand : \"Institutional Credentials\"\n                }`}\n              />\n            </ButtonContainer>\n          </div>\n        )}\n        {!this.props.isSsoEnabled && this.renderFormElement()}\n        {this.renderFormErrorsElement()}\n      </Fragment>\n    );\n  }\n\n  renderMessageSection() {\n    return (\n      <Fragment>\n        {this.props.userId ? (\n          <Fragment>\n            <StyledParagraphMedium>\n              Welcome back,{\" \"}\n              <span className=\"styled-highlighted-paragraph\">{this.props.userFullName}</span>!\n              {this.props.isSsoEnabled &&\n                ` This program requires you to sign up using ${\n                  this.props.ssoBrand ? this.props.ssoBrand : \"Institutional Credentials\"\n                }.`}{\" \"}\n              Please follow the next few steps to get you registered for{\" \"}\n              <span className=\"styled-highlighted-paragraph\">\n                {this.props.programData.shortName} {this.props.programData.title}\n              </span>{\" \"}\n              at {this.props.programData.schoolName}.\n            </StyledParagraphMedium>\n            <StyledParagraphMedium>\n              Not your account?{\" \"}\n              <StyledLink tabIndex=\"0\" onClick={this.signOut} data-test={\"registration-sign-out\"}>\n                Sign out\n              </StyledLink>\n            </StyledParagraphMedium>\n          </Fragment>\n        ) : (\n          <StyledParagraphMedium>\n            Welcome! Please sign up to join the{\" \"}\n            <span className=\"styled-highlighted-paragraph\">\n              {this.props.programData.shortName} {this.props.programData.title}\n            </span>{\" \"}\n            at {this.props.programData.schoolName}.\n          </StyledParagraphMedium>\n        )}\n      </Fragment>\n    );\n  }\n\n  renderFormElement() {\n    // We aren't using the submit capabilities of the <form> element -- that is handled by Ajax.\n    return (\n      <form name=\"sign_up_form\" onSubmit={this.onSubmitSignUpForm}>\n        {this.renderFormItems()}\n        <CheckboxContainer>\n          <LegalTermsAgreement\n            acceptedLegalTerms={this.state.acceptedLegalTerms}\n            hasError={this.state.errorLegalTerms}\n            onAgreementStatusChanged={(agreementStatus) =>\n              this.setState({ acceptedLegalTerms: agreementStatus, errorLegalTerms: false })\n            }\n          />\n          <EuCitizenCheckbox\n            schoolId={this.props.programData.schoolId}\n            euCitizen={this.state.isEUCitizen}\n            onChange={(event) => this.onFormDataChanged(\"isEUCitizen\", event.target.checked)}\n          />\n        </CheckboxContainer>\n        {this.state.processingSubmission && <CenteredLoadingSpinner />}\n        <ButtonContainer>\n          <Button\n            className=\"signupButton\"\n            data-analytics-id=\"signup-mc-registration-not-logged-in-user\"\n            isStretched={true}\n            data-test={\"registration-sign-up-submit-button\"}\n          >\n            Sign Up\n          </Button>\n        </ButtonContainer>\n      </form>\n    );\n  }\n\n  renderFormItems() {\n    return (\n      <div className=\"styled-inputs\">\n        <FormControl\n          label=\"Email\"\n          error={this.state.errorEmail}\n          caption={\n            this.state.errorEmail\n              ? this.state.email.trim() === \"\"\n                ? \"Email is required.\"\n                : \"Invalid email format.\"\n              : \"\"\n          }\n        >\n          <Input\n            aria-label=\"email\"\n            name=\"email\"\n            value={this.state.email}\n            placeholder=\"Enter your email\"\n            onChange={this.onEmailChanged}\n            dataTest={\"registration-email-input\"}\n          />\n        </FormControl>\n        <FormControl\n          label=\"First Name\"\n          error={this.state.errorFirstName}\n          caption={this.state.errorFirstName ? \"First name is required.\" : \"\"}\n        >\n          <Input\n            aria-label=\"first name\"\n            name=\"first_name\"\n            value={this.state.firstName}\n            placeholder=\"Enter your first name\"\n            onChange={(event) => {\n              this.onFormDataChanged(\"firstName\", event.target.value);\n              this.setState({ errorFirstName: false });\n            }}\n            dataTest={\"registration-first-name-input\"}\n          />\n        </FormControl>\n        <FormControl\n          label=\"Last Name\"\n          error={this.state.errorLastName}\n          caption={this.state.errorLastName ? \"Last name is required.\" : \"\"}\n        >\n          <Input\n            aria-label=\"last name\"\n            name=\"last_name\"\n            value={this.state.lastName}\n            placeholder=\"Enter your last name\"\n            onChange={(event) => {\n              this.onFormDataChanged(\"lastName\", event.target.value);\n              this.setState({ errorLastName: false });\n            }}\n            dataTest={\"registration-last-name-input\"}\n          />\n        </FormControl>\n        <FormControl\n          label=\"Password\"\n          caption={\n            this.state.errorPassword && this.state.password.trim() === \"\"\n              ? \"Password is required.\"\n              : \"Must be 10 or more characters and contain at least 1 uppercase character, 1 number, and 1 special character.\"\n          }\n          error={this.state.errorPassword}\n        >\n          <Input\n            aria-label=\"password\"\n            type=\"password\"\n            name=\"password\"\n            value={this.state.password}\n            placeholder=\"Enter your password\"\n            onChange={this.onPasswordChanged}\n            dataTest={\"registration-password-input\"}\n          />\n        </FormControl>\n        <FormControl\n          label=\"Confirm Password\"\n          error={this.state.errorConfirmPassword}\n          caption={\n            this.state.errorConfirmPassword\n              ? this.state.confirmPassword.trim() === \"\"\n                ? \"Confirm password is required.\"\n                : \"Passwords do not match.\"\n              : \"\"\n          }\n        >\n          <Input\n            aria-label=\"confirm password\"\n            type=\"password\"\n            name=\"confirm_password\"\n            value={this.state.confirmPassword}\n            onChange={(event) => {\n              this.onFormDataChanged(\"confirmPassword\", event.target.value);\n              this.setState({ errorConfirmPassword: false });\n            }}\n            dataTest={\"registration-confirm-password-input\"}\n          />\n        </FormControl>\n      </div>\n    );\n  }\n\n  onEmailChanged = (event) => {\n    const email = event.target.value;\n\n    this.setState({ errorEmail: false });\n    this.onFormDataChanged(\"email\", email);\n    this.checkIfSignedUp(email);\n  };\n\n  onPasswordChanged = (event) => {\n    this.setState({ errorPassword: false });\n    this.onFormDataChanged(\"password\", event.target.value);\n  };\n\n  // We don't want to overwhelm the backend with requests, so we debounce it to ensure that the\n  // check is only made 300 milliseconds after the user stops typing.\n  checkIfSignedUp = _.debounce((email) => {\n    // If we're in the signing-in-to-an-existing-user stage, don't check -- we don't want to update\n    // the state no matter what the email changes to.\n    if (this.state.existingUserData && this.state.existingUserData.isSignedUp) {\n      return;\n    }\n\n    jQuery.getJSON(this.props.checkIfUserSignedUpPath, { email }).then((response) => {\n      this.setState({ currentState: response.signed_up ? existingUserSignInForm : signUpForm });\n    });\n  }, 300);\n\n  onFormDataChanged(key, newValue) {\n    // Whenever form data changes, we want to reset the errors attribute as they may no longer be\n    // relevant. (There might still be errors, of course, but we want to be optimistic. We'll\n    // discover them again when the user presses submit.)\n    const update = { errors: [] };\n    update[key] = newValue;\n\n    this.setState(update);\n  }\n\n  renderFormErrorsElement() {\n    if (this.state.errors.length === 0) {\n      return null;\n    }\n\n    const errorItems = this.state.errors.map((error) => (\n      <div key={error} className=\"error-item\">\n        {error}\n      </div>\n    ));\n\n    return <div className=\"form-errors\">{errorItems}</div>;\n  }\n\n  handleSsoValidate = (e) => {\n    let validForSso = true;\n\n    if (this.state.acceptedLegalTerms === false) {\n      e.preventDefault();\n      this.setState({ errorLegalTerms: true });\n      validForSso = false;\n    }\n\n    return validForSso;\n  };\n\n  /**\n   * Checks to make sure the information is valid, before allowing submission to proceed. Also\n   * populates this.state.errors if it returns false.\n   * @return {Boolean} True if we allow submission to proceed, false otherwise.\n   */\n  validateBeforeSubmission() {\n    let errorsDetected = false;\n\n    // no email\n    if (this.state.email.trim() === \"\") {\n      this.setState({ errorEmail: true });\n      errorsDetected = true;\n    }\n\n    // invalid email format\n    if (!this.state.email.match(emailRegex)) {\n      this.setState({ errorEmail: true });\n      errorsDetected = true;\n    }\n\n    // no first name\n    if (this.state.firstName.trim() === \"\") {\n      this.setState({ errorFirstName: true });\n      errorsDetected = true;\n    }\n\n    // no last name\n    if (this.state.lastName.trim() === \"\") {\n      this.setState({ errorLastName: true });\n      errorsDetected = true;\n    }\n\n    // password does not meet requirements\n    if (!isValidPassword(this.state.password)) {\n      this.setState({ errorPassword: true });\n      errorsDetected = true;\n    }\n\n    // password confirm is null or does not match password\n    if (\n      this.state.confirmPassword.trim() === \"\" ||\n      this.state.password !== this.state.confirmPassword\n    ) {\n      this.setState({ errorConfirmPassword: true });\n      errorsDetected = true;\n    }\n\n    // legal terms were not accepted\n    if (this.state.acceptedLegalTerms === false) {\n      this.setState({ errorLegalTerms: true });\n      errorsDetected = true;\n    }\n\n    return !errorsDetected;\n  }\n\n  signOut = async () => {\n    await fetch(\"/api/users/sign_out\", {\n      method: \"DELETE\",\n      headers: {\n        \"X-CSRF-Param\": \"authenticity_token\",\n        \"X-CSRF-Token\": `${this.props.csrfToken}`,\n      },\n    }).then(() => {\n      window.location.reload();\n    });\n  };\n\n  onLoggedInUserSubmitSignUp = async (event) => {\n    event.preventDefault();\n    try {\n      await jQuery.post({\n        url: this.props.registerPath,\n        headers: { \"X-CSRF-Token\": this.props.csrfToken },\n        data: {\n          role: this.props.role,\n          program_id: this.props.programData.id,\n        },\n      });\n    } catch (response) {\n      // Display the error in the form.\n      this.setState({ errors: response.responseJSON.errors });\n      return;\n    } finally {\n      this.setState({ processingSubmission: false });\n    }\n\n    // We're now signed in. Reload the page to show the user the next step in the pre-match flow.\n    window.location.reload();\n  };\n\n  onSubmitSignUpForm = async (event) => {\n    // We don't actually want the form to be submitted. Instead we take data from the form and\n    // submit it using AJAX.\n    event.preventDefault();\n\n    const validationPassed = this.validateBeforeSubmission();\n    if (!validationPassed) {\n      return;\n    }\n\n    // If we've already been through the disambiguation flow, just submit the form normally.\n    if (this.state.disambiguationOutcome !== null) {\n      return this.signUpAndRegister();\n    }\n\n    // Start the button spinning so the user knows we're doing something.\n    this.setState({ processingSubmission: true });\n\n    // Check to see if there are any existing contact users (not signed up) with the same name and email\n    try {\n      const data = {\n        program_id: this.props.programData.id,\n        first_name: this.state.firstName,\n        last_name: this.state.lastName,\n        email: this.state.email,\n      };\n      const response = await jQuery.getJSON(this.props.detectExistingContactPath, data);\n      const matchingUserFromContact = Utils.withKeysCamelized(response.data).matchingUser;\n\n      if (matchingUserFromContact !== null && !matchingUserFromContact.signedUp) {\n        // If the call to the backend revealed that there's another user matching these details,\n        // proceed to sign up with that information.\n        return this.signUpAndRegister(matchingUserFromContact.id);\n      }\n    } catch (response) {\n      // Do nothing: we'll notice the error on the backend, and we just want registration to proceed.\n    }\n\n    // Check to see if there are any existing users with the same name.\n    try {\n      const data = {\n        program_id: this.props.programData.id,\n        first_name: this.state.firstName,\n        last_name: this.state.lastName,\n      };\n      const response = await jQuery.getJSON(this.props.detectDuplicatesPath, data);\n      const matchingUserData = Utils.withKeysCamelized(response.data).matchingUser;\n\n      if (matchingUserData !== null) {\n        // If the call to the backend revealed that there's another user matching these details,\n        // switch into the disambiguation flow.\n        this.setState({ currentState: disambiguating, existingUserData: matchingUserData });\n        return;\n      }\n    } catch (response) {\n      // Do nothing: we'll notice the error on the backend, and we just want registration to proceed.\n    }\n\n    // Otherwise, proceed with the registration.\n    return this.signUpAndRegister();\n  };\n\n  async signUpAndRegister(existingUserId) {\n    try {\n      await jQuery.post({\n        url: this.props.signUpAndRegisterPath,\n        data: {\n          email: this.state.email,\n          first_name: this.state.firstName,\n          last_name: this.state.lastName,\n          password: this.state.password,\n\n          is_eu_citizen: this.state.isEUCitizen,\n          has_accepted_privacy_policy: this.state.acceptedLegalTerms,\n\n          role: this.props.role,\n          program_id: this.props.programData.id,\n\n          // The id of the (not signed-up) User record that we should \"absorb\" with this signup --\n          // if any.\n          existing_user_id: existingUserId,\n        },\n      });\n    } catch (response) {\n      // Display the error in the form.\n      this.setState({ errors: response.responseJSON.errors });\n      return;\n    } finally {\n      this.setState({ processingSubmission: false });\n    }\n\n    // We're now signed in. Reload the page to show the user the next step in the pre-match flow.\n    window.location.reload();\n  }\n}\n\nexport default SignUpFlow;\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport SignUpFlow from \"../../../components/sign_up/sign_up_flow\";\n\nfunction init() {\n  const componentElements = document.querySelectorAll('[data-react-class=\"sign_up/sign_up_flow\"]');\n  componentElements.forEach((rootElement) => {\n    const classString = rootElement.getAttribute(\"data-react-class\");\n    const propsJson = rootElement.getAttribute(\"data-react-props\");\n    const props = rootElement && JSON.parse(propsJson ?? \"\");\n    if (classString) {\n      const root = createRoot(rootElement);\n      root.render(<SignUpFlow {...props} />);\n    }\n  });\n}\n\nif (document.readyState === \"complete\" || document.readyState === \"interactive\") {\n  // document has at least been parsed\n  init();\n} else {\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    init();\n  });\n}\n"],"names":["isValidPassword","password","passFormat","Heading","styled","ParagraphSmall","theme","StyledParagraphSmall","StyledLinksContainer","SignUpAdditionalInfo","React","__publicField","jsxs","jsx","NewTab","StyledLink","match","role","_b","_a","PropTypes","ExistingUserAdditionalInfo","EmailFormControlOverrides","$theme","ResetEmailConfirmation","email","ParagraphMedium","ResetWithKnownEmail","onClickSend","errors","emailInFlight","emailSent","error","CenteredLoadingSpinner","Button","ResetWithUnknownEmail","FormControl","Input","updatedEmail","prevState","ResetWithEmail","jQuery","response","sendRecoverySMS","userId","programId","firstName","lastName","ResetWithSms","onClickBack","roleToRegisterFor","inputRecoveryCode","setInputRecoveryCode","useState","checkingCode","setCheckingCode","setError","updatedCode","result","sms","ExistingUserResetPassword","props","SilentH1","bold","StyledContainer","StyledParagraph","StyledInputsContainer","ExistingUserSignInForm","event","signInjqXHR","newCSRFToken","existingUserAdditionalInfo","headerElement","errorItems","updatedPassword","DisambiguateDuringSignUp","engine","Styletron","CheckboxContainer","ButtonContainer","signUpForm","existingUserSignInForm","disambiguating","yesThatsMe","noThatsNotMe","SignUpFlow","_","e","validForSso","data","matchingUserFromContact","Utils.withKeysCamelized","matchingUserData","program","translator","LabelTranslator","StyletronProvider","BaseProvider","baseuiTheme","ThemeProvider","deprecatedTheme","MaterialThemeProvider","THEME_ID","materialTheme","LocalizationProvider","AdapterDateFns","signUpAdditionalInfo","LoginBackground","StyledCard","ProgramSchoolLogoBlock","text","StyledHeading","ssoText","Fragment","Enterprise","SsoButton","queryParams","LegalTermsAgreement","agreementStatus","EuCitizenCheckbox","StyledParagraphMedium","key","newValue","update","errorsDetected","emailRegex","existingUserId","init","rootElement","classString","propsJson","createRoot"],"mappings":"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"}