{"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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"}