{"version":3,"sources":["components/LinkButton/LinkButton.tsx","pages/Home.tsx","utils/parseQueryString.ts","hooks/useClientCoBranding.ts","components/Branding/Branding.tsx","components/Input/Input.tsx","components/Button/Button.tsx","hooks/useXSRFTokenContext.ts","hooks/useGetMagicCode.ts","constants/LoginInfoEnum.ts","utils/isValidEmail.ts","hooks/useFormMemory.ts","components/PoweredByFooter/PoweredByFooter.tsx","utils/urlIsLocal.ts","components/CredentialsForm/CredentialsForm.tsx","hooks/useLogin.ts","components/EmailForm/EmailForm.tsx","components/PasswordRequirement/PasswordRequirement.tsx","hooks/useConfirmEmail.ts","components/ConfirmCodeForm/ConfirmCodeForm.tsx","components/Checkbox/Checkbox.tsx","hooks/useApiRequest.ts","components/Confirm2faForm/Confirm2faForm.tsx","hooks/useConfirm2faCode.ts","components/Confirm2faForm/Confirm2faRecoveryCodeForm.tsx","components/RegistrationForm/RegistrationForm.tsx","components/RegistrationStart/RegistrationStart.tsx","pages/Login/Login.tsx","components/Manage/Authenticator/Authenticator.tsx","hooks/Authenticator/useAuthenticatorSettings.ts","hooks/Authenticator/useGenerateRecoveryCodes.ts","hooks/Authenticator/useForgetBrowser.ts","hooks/Authenticator/useAuthenticatorDisable.ts","hooks/Authenticator/useAuthenticatorReset.ts","components/Manage/Authenticator/AuthenticatorEnable.tsx","hooks/Authenticator/useAuthenticatorEnable.ts","pages/Manage/Manage.tsx","pages/NotFound.tsx","hooks/useXSRFToken.ts","components/RequireXSRFToken/RequireXSRFToken.tsx","components/FormMemory/FormMemory.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["LinkButton","children","props","type","className","Home","src","alt","to","parseQueryString","string","pairs","split","parseKeyValuePairs","undefined","k","v","decodeURIComponent","delimiter","pairDelimiter","keyFormat","x","valueFormat","allowMultipleValues","map","queryParam","kvp","key","value","reduce","query","push","useClientCoBranding","returnUrl","useState","loading","setLoading","errors","setErrors","brandingData","setBrandingData","useEffect","data","FormData","append","fetch","process","method","body","then","response","a","json","responseData","catch","Branding","displayName","startsWith","displayLogoUri","Input","prepend","error","inputProps","ref","useRef","focus","setFocus","hasErrors","length","elem","current","onFocus","onBlur","addEventListener","removeEventListener","join","Button","primary","buttonProps","disabled","XSRFTokenContext","createContext","useXSRFTokenContext","useContext","LoginInfoEnum","useGetMagicCode","xsrfToken","success","result","setResult","useCallback","email","headers","isValidEmail","test","defaultFormMemory","confirmationCode","termsAndConditionText","newPassword","loginInfo","FormMemory","useFormMemory","PoweredByFooter","memory","queryParams","window","location","search","unescape","ReturnUrl","branding","toLowerCase","target","rel","href","title","ensureUrlIsLocal","url","urlIsLocal","CredentialsForm","password","setPassword","passwordErrors","setPasswordErrors","goBack","setGoBack","setSuccess","requires2fa","setRequires2fa","action","useLogin","login","loginLoading","getMagicCode","magicCodeSent","magicCodeLoading","magicCodeErrors","disableForm","passwordErrorMessage","magicCodeErrorMessage","onSubmit","e","preventDefault","onMagicCodeSubmit","generalError","find","field","errorMessages","filter","item","placeholder","onChange","onClick","EmailForm","setMemory","hasSubmitted","setHasSubmitted","setEmail","emailErrors","setEmailErrors","emailSuccess","setEmailSuccess","Checkout","Membership","Redeem","Login","Register","autoFocus","PasswordRequirement","isComplete","useConfirmEmail","onResponse","on2faRequired","code","firstName","lastName","acceptTerms","ConfirmCodeForm","history","useHistory","is2faRequired","confirmEmail","setCode","codeErrors","setCodeErrors","resendDisableCounter","setResendDisableCounter","showHelpText","setShowHelpText","newUser","codeError","toggleHelpText","show","id","setInterval","clearInterval","escape","inputMode","name","style","trim","autoComplete","Checkbox","checked","role","aria-checked","tabIndex","useApiRequestFn","basePathAndQuery","useXsrfToken","requiresXsrfToken","toUpperCase","isReady","setIsReady","resultStatus","setResultStatus","setResponseData","appendPathAndQuery","xsrfTokenHeader","useApiRequestOnLoad","pathAndQuery","apiFunction","status","Confirm2faForm","rememberMe","setRememberMe","trustBrowser","setTrustBrowser","enableFunction","options","trustBrowserFor2fa","provider","useConfirm2faCodeFn","confirm2faCode","confirm2faCodeIsReady","Confirm2faRecoveryCodeForm","useConfirm2faRecoveryCodeFn","confirmRecoveryCode","confirmRecoveryCodeIsReady","RegistrationForm","agreeToTerms","setAgreeToTerms","agreeToTermsError","setAgreeToTermsError","setFirstName","firstNameErrors","setFirstNameErrors","setLastName","lastNameErrors","setLastNameErrors","RegistrationStart","magicCodeSuccess","login_info","LoginInfo","heroImageUri","backgroundImage","backgroundPosition","heroImageCssBackgroundPosition","path","exact","component","Authenticator","statusMessage","setStatusMessage","authenticatorSettingsStatus","authenticatorSettings","generateRecoveryCodesFunction","recoveryCodes","useGenerateRecoveryCodesFn","generateRecoveryCodes","generateRecoveryCodesIsReady","generateRecoveryCodesStatus","recoveryCodeResult","forgetBrowserFunction","useForgetBrowserFn","forgetBrowser","forgetBrowserIsReady","forgetBrowserStatus","authenticatorDisableFunction","useAuthenticatorDisableFn","disableAuthenticator","disableAuthenticatorIsReady","disableAuthenticatorStatus","authenticatorResetFunction","useAuthenticatorResetFn","resetAuthenticator","resetAuthenticatorIsReady","resetAuthenticatorStatus","go","forgetBrowserSuccess","onEnableAuthenticator","i","is2faEnabled","recoveryCodesLeft","isMachineRemembered","hasAuthenticator","AuthenticatorEnable","initAuthenticatorEnableStatus","initAuthenticatorEnable","useAuthenticatorEnablePostFn","enableAuthenticator","isEnableReady","enableAuthenticatorStatus","textAlign","sharedKey","encodeURIComponent","authenticatorUri","maxWidth","Manage","NotFound","useXSRFToken","token","setToken","credentials","document","cookie","RequireXSRFToken","Provider","JSON","stringify","FormMemoryProvider","formMemory","App","Boolean","hostname","match","ReactDOM","render","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.6df93056.chunk.js","sourcesContent":["import React from 'react';\nimport './LinkButton.css';\n\nexport const LinkButton: React.FC, HTMLButtonElement>> = ({children, ...props}) => {\n return ;\n}","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { LinkButton } from '../components/LinkButton/LinkButton';\n\nexport const Home: React.FC = () => {\n return (\n
\n
\n
\n
\n WithWine\n
\n \n
\n Continue to Login \n
\n
\n
\n
\n
\n );\n}","export const parseQueryString = (string: string) => {\n const pairs = string.split('?')[1] || string.split('?')[0];\n return parseKeyValuePairs(pairs, undefined, undefined, k => k, v => decodeURIComponent(v || ''));\n}\n\nexport const parseCookieString = (string: string) => {\n return parseKeyValuePairs(string, ';', '=', k => (k || '').trim(), v => decodeURIComponent((v || '').trim()));\n}\n\nconst parseKeyValuePairs = (string: string, delimiter: string = '&', pairDelimiter: string = '=',\n keyFormat = (x: string) => x, valueFormat = (x: string) => x,\n allowMultipleValues: boolean = false): { [key: string]: string } => {\n var split = string.split(delimiter)\n .map((queryParam) => {\n let kvp = queryParam.split(pairDelimiter)\n return { key: keyFormat(kvp[0]), value: valueFormat(kvp[1]) };\n });\n\n if (allowMultipleValues) {\n return split.reduce((query: any, kvp) => {\n query[kvp.key] = query[kvp.key] || [];\n query[kvp.key].push(kvp.value);\n return query;\n }, {});\n }\n\n return split.reduce((query: any, kvp) => {\n query[kvp.key] = kvp.value;\n return query;\n }, {}); \n}","import 'whatwg-fetch';\nimport { useEffect, useState } from 'react';\nimport { DataResponse } from '../models/DataResponse';\nimport { Error } from '../models/Error';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\nexport interface BrandingData { \n displayName: string;\n displayLogoUri: string | null;\n heroImageUri: string | null;\n heroImageCssBackgroundPosition: string | null;\n brandId: string | null;\n loginInfo: string | null;\n}\n\ntype ClientCoBranding = [BrandingData | null, { loading: boolean, errors: {field: string, error: string}[] | null }];\n\nexport const useClientCoBranding = (returnUrl: string): ClientCoBranding => {\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState(null);\n const [brandingData, setBrandingData] = useState(null);\n \n useEffect(() => {\n if (returnUrl) {\n setLoading(true);\n const data = new FormData();\n data.append('returnUrl', returnUrl);\n fetch(`${endPoint}/Account/ClientCoBranding`, {\n method: 'POST',\n body: data\n }).then(async (response) => {\n const responseData = (await response.json()) as DataResponse;\n setLoading(false);\n setErrors(responseData.errors);\n setBrandingData(responseData.data);\n }).catch((errors) => {\n setLoading(false);\n setErrors(errors);\n })\n }\n }, [returnUrl]);\n\n return [brandingData, { loading, errors }];\n}","import React from 'react';\nimport { BrandingData } from '../../hooks/useClientCoBranding';\n\ninterface BrandingProps {\n data: BrandingData | null;\n}\n\nexport const Branding: React.FC = ({ data }) => {\n\n if (!data || !data.displayName || data.displayName.startsWith('WithWine')) {\n return (\n <>\n
\n WithWine\n
\n \n );\n }\n\n const { displayLogoUri, displayName } = data;\n\n return (\n <>\n
\n {displayLogoUri && {displayName}\n {!displayLogoUri && displayName !== 'withwine' &&

{displayName}

}\n {!displayLogoUri && displayName === 'withwine' && WithWine}\n
\n \n );\n}","import React, { useRef, useEffect, useState } from 'react';\nimport { InputProps } from './InputProps';\nimport './Input.css';\n\nexport const Input: React.FC = ({ children, prepend, append, errors, error, ...inputProps }) => {\n\n const ref = useRef(null);\n const [focus, setFocus] = useState(false);\n const hasErrors = (errors && errors.length > 0) || error;\n\n useEffect(() => {\n const elem = ref.current;\n if (elem) {\n const onFocus = () => {\n setFocus(true);\n };\n const onBlur = () => {\n setFocus(false);\n }\n elem.addEventListener('focus', onFocus);\n elem.addEventListener('blur', onBlur);\n return () => {\n elem.removeEventListener('focus', onFocus);\n elem.removeEventListener('blur', onBlur);\n }\n }\n }, [setFocus])\n\n return (\n <>\n
\n {prepend}\n \n {append}\n
\n {errors && errors.length > 0 &&

\n {errors!.join(' ')}\n

}\n \n );\n}","import React from 'react';\nimport { ButtonProps } from './ButtonProps';\nimport './Button.css';\nimport { NavLink } from 'react-router-dom';\n\nexport const Button: React.FC = ({ children, primary, to, ...buttonProps }) => {\n\n if (to) {\n return (\n
\n {children}\n
\n );\n }\n\n return (\n
\n \n
\n )\n}","import { createContext, useContext } from 'react';\n\nexport const XSRFTokenContext = createContext(null);\n\nexport const useXSRFTokenContext = () => {\n return useContext(XSRFTokenContext);\n}\n\n","import 'whatwg-fetch';\nimport { useState, useCallback } from 'react';\nimport { useXSRFTokenContext } from './useXSRFTokenContext';\nimport { DataResponse } from '../models/DataResponse';\nimport { Error } from '../models/Error';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\ntype GetMagicCode = [(email: string, returnUrl: string) => void, { loading: boolean, errors: {field: string, error: string}[] | null, success: boolean | null }];\n\nexport const useGetMagicCode = (): GetMagicCode => {\n\n const xsrfToken = useXSRFTokenContext();\n\n const [result, setResult] = useState<{ loading: boolean, errors: Error[] | null, success: boolean | null }>({\n loading: false, errors: null, success: null\n });\n\n const getMagicCode = useCallback((email: string, returnUrl: string) => {\n setResult(result => { return { ...result, success: null, errors: null }; })\n if (xsrfToken) {\n const data = new FormData();\n data.append('email', email);\n data.append('returnUrl', returnUrl);\n setResult(result => { return { ...result, loading: true }; });\n\n fetch(`${endPoint}/Account/MagicCode`, {\n method: 'POST',\n headers: {\n 'X-XSRF-Token': xsrfToken,\n 'Accept': 'application/json'\n },\n body: data\n }).then(async (response) => {\n const responseData = (await response.json()) as DataResponse;\n setResult({ loading: false, errors: responseData.errors, success: !responseData.errors });\n }).catch((errors) => {\n setResult({ loading: false, errors: errors, success: false });\n });\n }\n }, [xsrfToken, setResult]);\n\n return [getMagicCode, { ...result }];\n}","export enum LoginInfoEnum {\n Login = 'login',\n Register = 'register',\n Membership = 'membership',\n Checkout = 'checkout',\n Brand = 'brand',\n Redeem = 'redeem'\n};\n","export const isValidEmail = (email: string) => {\n const re = /[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?/;\n return re.test(email);\n}","import { createContext, useContext, Dispatch, SetStateAction } from 'react';\n\nexport interface FormMemoryInterface {\n email: string;\n returnUrl: string;\n confirmationCode: string;\n termsAndConditionText: string;\n newPassword: string;\n loginInfo: string;\n}\n\nexport const defaultFormMemory = {\n email: '',\n returnUrl: '',\n confirmationCode: '',\n termsAndConditionText: '',\n newPassword: '',\n loginInfo: ''\n};\n\nexport const FormMemory = createContext<[FormMemoryInterface, Dispatch>]>([defaultFormMemory, () => defaultFormMemory]);\n\nexport const useFormMemory = () => {\n return useContext(FormMemory);\n}\n\n","import React from 'react';\nimport './PoweredByFooter.css';\nimport { useClientCoBranding } from '../../hooks/useClientCoBranding';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useFormMemory } from '../../hooks/useFormMemory';\n\n\nexport const PoweredByFooter: React.FC = () => {\n\n const [memory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const returnUrl = memory.returnUrl || unescape(queryParams.returnUrl || queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [branding] = useClientCoBranding(returnUrl);\n\n\n if (!branding) {\n return (<>);\n }\n\n const { displayName } = branding;\n\n return (\n <>\n {(displayName && !(displayName || '').toLowerCase().startsWith('withwine')) &&\n \n WithWine\n }\n \n );\n}","export const urlIsLocal = (url: string) : boolean => {\n return (url && url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) ? true : false;\n}\n\nexport const ensureUrlIsLocal = (url: string): string => {\n return urlIsLocal(url) ? url : '/';\n}","import React, { useState, useCallback, FormEvent } from 'react';\nimport { Redirect } from 'react-router';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button/Button';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useLogin } from '../../hooks/useLogin';\nimport { useGetMagicCode } from '../../hooks/useGetMagicCode';\nimport { isValidEmail } from '../../utils/isValidEmail';\nimport { LinkButton } from '../LinkButton/LinkButton'; \nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\nimport { ensureUrlIsLocal } from '../../utils/urlIsLocal';\n\nexport const CredentialsForm: React.FC = () => {\n const [memory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const returnUrl = memory.returnUrl || unescape(queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [password, setPassword] = useState('');\n const [passwordErrors, setPasswordErrors] = useState([]);\n const [goBack, setGoBack] = useState(false);\n const [login, { success, errors, requires2fa, loading: loginLoading }] = useLogin();\n const [getMagicCode, { success: magicCodeSent, loading: magicCodeLoading, errors: magicCodeErrors }] = useGetMagicCode();\n const disableForm = magicCodeSent === true || magicCodeLoading || loginLoading;\n let passwordErrorMessage = '';\n let magicCodeErrorMessage = '';\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n if (disableForm) {\n return;\n }\n \n let emailErrors: string[] = [];\n let passwordErrors: string[] = [];\n\n if (!memory.email || !isValidEmail(memory.email)) {\n return ;\n }\n\n if (!password) {\n passwordErrors = ['Password is required.'];\n }\n\n if (emailErrors.length > 0 || passwordErrors.length > 0) {\n setPasswordErrors(passwordErrors);\n return;\n }\n\n setPasswordErrors([]);\n \n login(memory.email, password, returnUrl);\n \n }, [memory.email, password, returnUrl, login, disableForm]);\n\n const onMagicCodeSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n if (!disableForm) {\n getMagicCode(memory.email, returnUrl)\n }\n }, [memory.email, returnUrl, disableForm, getMagicCode]);\n\n if (goBack || !memory.email || !isValidEmail(memory.email)) {\n return ;\n }\n\n if (requires2fa) {\n return ;\n }\n\n if (success) {\n window.location.href = ensureUrlIsLocal(returnUrl);\n return
;\n }\n\n if (magicCodeSent) {\n return ;\n }\n\n if (errors && errors.length > 0) {\n const generalError = (errors.find((error) => error.field === ''));\n if (generalError) {\n passwordErrorMessage = generalError.error;\n }\n }\n\n if (magicCodeErrors && magicCodeErrors.length > 0) {\n const errorMessages = (magicCodeErrors.filter((item) => item.error !== '')).map(item => item.error).join(', ');\n if (errorMessages) {\n magicCodeErrorMessage = errorMessages;\n }\n }\n \n return (\n <>\n

Have an account?

\n

\n Login using your WithWine account. What's this?
\n \n Enter the password associated with {memory.email}, then click "Login".\n \n

\n
\n setPassword(e.target.value)} \n errors={passwordErrors}\n error={!!passwordErrorMessage}\n />\n {passwordErrorMessage &&

{passwordErrorMessage}

}\n
\n \n \n \n
\n
\n

Continue without password?

\n {magicCodeErrorMessage &&

{magicCodeErrorMessage}

}\n
\n \n
\n
\n setGoBack(true)}>Back\n
\n
\n \n )\n};","import 'whatwg-fetch';\nimport { useState, useCallback } from 'react';\nimport { useXSRFTokenContext } from './useXSRFTokenContext';\nimport { DataResponse, ActionResponseData } from '../models/DataResponse';\nimport { Error } from '../models/Error';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\ntype Login = [(email: string, password: string, returnUrl: string) => void, { loading: boolean, errors: {field: string, error: string}[] | null, success: boolean | null, requires2fa: boolean | null }];\n\nexport const useLogin = (): Login => {\n\n const xsrfToken = useXSRFTokenContext();\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState(null);\n const [success, setSuccess] = useState(null);\n const [requires2fa, setRequires2fa] = useState(null);\n\n const login = useCallback((email: string, password: string, returnUrl: string) => {\n if (xsrfToken) {\n const data = new FormData();\n data.append('email', email);\n data.append('password', password);\n data.append('rememberMe', 'true');\n data.append('returnUrl', returnUrl);\n\n setLoading(true);\n fetch(`${endPoint}/Account/Login`, {\n method: 'POST',\n headers: {\n 'X-XSRF-Token': xsrfToken,\n 'Accept': 'application/json'\n },\n body: data\n }).then(async (response) => {\n const responseData = (await response.json()) as DataResponse;\n setLoading(false);\n setErrors(responseData.errors);\n\n if (responseData.type === 'Action' && (responseData.data as ActionResponseData).action === 'SendCode') {\n setRequires2fa(true);\n } else if (!responseData.errors) {\n setRequires2fa(false);\n }\n\n setSuccess(!responseData.errors);\n }).catch((errors) => {\n setLoading(false);\n setErrors(errors);\n });\n }\n }, [xsrfToken, setLoading, setErrors, setSuccess]);\n\n return [login, { loading, errors, success, requires2fa }];\n}","import React, { useState, useCallback, FormEvent } from 'react';\nimport { Redirect } from 'react-router';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button/Button';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { isValidEmail } from '../../utils/isValidEmail';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { LoginInfoEnum } from '../../constants/LoginInfoEnum'\nimport { useClientCoBranding } from '../../hooks/useClientCoBranding';\nimport { LinkButton } from '../LinkButton/LinkButton';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\n\nexport const EmailForm: React.FC = () => {\n const [memory, setMemory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const [hasSubmitted, setHasSubmitted] = useState(false);\n const [email, setEmail] = useState(queryParams.email || '');\n const [emailErrors, setEmailErrors] = useState([]);\n const [emailSuccess, setEmailSuccess] = useState(false);\n const returnUrl = memory.returnUrl || unescape(queryParams.returnUrl || queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [branding] = useClientCoBranding(returnUrl);\n let generalErrorMessage = '';\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n setHasSubmitted(true);\n \n let emailErrors: string[] = [];\n let passwordErrors: string[] = [];\n\n if (!email) {\n emailErrors = ['Email is required.'];\n } else if (!isValidEmail(email)) {\n emailErrors = ['Invalid email.'];\n }\n\n if (emailErrors.length > 0 || passwordErrors.length > 0) {\n setEmailErrors(emailErrors);\n return;\n }\n\n setEmailErrors([]);\n setEmailSuccess(true);\n \n }, [email, setHasSubmitted]);\n\n if (emailSuccess) {\n setMemory({ \n ...memory,\n email\n });\n return ;\n }\n \n return (\n <>\n

\n {(() => {\n switch ((memory.loginInfo || '').toLowerCase()) {\n case LoginInfoEnum.Checkout:\n return 'Continue to Checkout';\n case LoginInfoEnum.Membership:\n return 'Continue to Membership';\n case LoginInfoEnum.Redeem:\n return 'Continue to Gift Card Redemption';\n case LoginInfoEnum.Login:\n return 'Secure Login';\n case LoginInfoEnum.Register:\n return 'Register an Account';\n default:\n return 'Continue to ' + ((branding && branding.displayName) || 'WithWine');\n }\n })()}\n

\n

\n Enter your email address.\n

\n
\n {\n if (hasSubmitted) {\n const email = e.target.value;\n let emailErrors: string[] = [];\n\n if (!email) {\n emailErrors = ['Email is required.'];\n } else if (!isValidEmail(email)) {\n emailErrors = ['Invalid email.'];\n }\n\n setEmailErrors(emailErrors);\n }\n setEmail(e.target.value);\n }}\n errors={emailErrors}\n error={!!generalErrorMessage}\n />\n
\n \n {memory.loginInfo === LoginInfoEnum.Login && setMemory({ ...memory, loginInfo: LoginInfoEnum.Register })}>Register}\n {memory.loginInfo === LoginInfoEnum.Register && setMemory({ ...memory, loginInfo: LoginInfoEnum.Login })}>Login}\n \n
\n \n \n )\n};","import React from 'react';\nimport { PasswordRequirementProps } from './PasswordRequirementProps';\nimport './PasswordRequirement.css';\n\nexport const PasswordRequirement: React.FC = ({ isComplete, children }) => {\n return (\n \n {children && {children}}\n {isComplete === true && (complete)}\n {isComplete === false && (incomplete)}\n \n );\n}","import 'whatwg-fetch';\nimport { useState, useCallback } from 'react';\nimport { useXSRFTokenContext } from './useXSRFTokenContext';\nimport { DataResponse, ActionResponseData } from '../models/DataResponse';\nimport { Error } from '../models/Error';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\ntype ConfirmCode = [\n (\n email: string, \n code: string,\n returnUrl: string,\n firstName?: string,\n lastName?: string,\n newPassword?: string,\n acceptTerms?: boolean\n ) => void, \n { \n loading: boolean, \n errors: {field: string, error: string}[] | null, \n success: boolean | null\n }\n];\n\ntype ConfirmEmailResponse = {\n emailAddress: string,\n confirmationCode: string,\n firstName: string | null,\n lastName: string | null\n};\n\nexport const useConfirmEmail = (onResponse?: (response: ConfirmEmailResponse) => void, on2faRequired?: (is2faRequired: boolean) => void): ConfirmCode => {\n const xsrfToken = useXSRFTokenContext();\n\n const [result, setResult] = useState<{ loading: boolean, errors: Error[] | null, success: boolean | null }>({\n loading: false, errors: null, success: null\n });\n\n const confirmEmail = useCallback((\n email: string, \n code: string,\n returnUrl: string,\n firstName?: string,\n lastName?: string,\n newPassword?: string,\n acceptTerms?: boolean\n ) => {\n setResult(result => { return { ...result, success: null, errors: null }; });\n if (xsrfToken) {\n const data = new FormData();\n data.append('emailAddress', email);\n data.append('confirmationCode', code);\n data.append('returnUrl', returnUrl);\n\n if (firstName) {\n data.append('firstName', firstName);\n }\n\n if (lastName) {\n data.append('lastName', lastName);\n }\n\n if (newPassword) {\n data.append('newPassword', newPassword);\n }\n\n if (acceptTerms) {\n data.append('acceptTermsAndConditions', 'true');\n }\n\n setResult(result => { return { ...result, loading: true }; });\n\n fetch(`${endPoint}/Account/ConfirmEmail`, {\n method: 'POST',\n headers: {\n 'X-XSRF-Token': xsrfToken,\n 'Accept': 'application/json'\n },\n body: data\n }).then(async (response) => {\n const responseData = (await response.json()) as DataResponse;\n setResult({ loading: false, errors: responseData.errors, success: responseData.type === 'Redirect' });\n\n if (responseData.type === 'Action' && (responseData.data as ActionResponseData).action === 'SendCode') {\n if (on2faRequired) {\n on2faRequired(true);\n }\n } else if (onResponse && responseData.data) {\n onResponse(responseData.data as ConfirmEmailResponse);\n }\n }).catch((errors) => {\n setResult({ loading: false, errors: errors, success: false });\n });\n }\n }, [xsrfToken, onResponse, setResult, on2faRequired]);\n\n return [confirmEmail, { ...result }];\n}","import React, { useCallback, FormEvent, useState, useEffect } from 'react';\nimport { useHistory } from 'react-router';\nimport { Link, Redirect } from 'react-router-dom';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button/Button';\nimport { LinkButton } from '../LinkButton/LinkButton';\nimport { PasswordRequirement } from '../PasswordRequirement/PasswordRequirement';\nimport { useConfirmEmail } from '../../hooks/useConfirmEmail';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { useGetMagicCode } from '../../hooks/useGetMagicCode';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\nimport { ensureUrlIsLocal } from '../../utils/urlIsLocal';\n\nexport const ConfirmCodeForm = () => {\n\n const history = useHistory();\n const [memory, setMemory] = useFormMemory();\n const [confirmEmail, { loading, success, errors }] = useConfirmEmail(\n response => {\n setMemory({ ...memory, confirmationCode: response.confirmationCode });\n },\n is2faRequired => {\n history.push(`/Account/Login/2fa${window.location.search}`);\n });\n const [code, setCode] = useState('');\n const [codeErrors, setCodeErrors] = useState([]);\n const [password, setPassword] = useState('');\n const [passwordErrors, setPasswordErrors] = useState([]);\n const [getMagicCode, { success: magicCodeSent, loading: magicCodeLoading }] = useGetMagicCode();\n const [resendDisableCounter, setResendDisableCounter] = useState(0);\n const [showHelpText, setShowHelpText] = useState(false);\n\n useEffect(() => {\n if (errors && errors.length > 0) {\n const newUser = errors.find(error => error.field === 'AcceptTermsAndConditions');\n const codeError = errors.find(error => error.field === 'ConfirmationCode');\n const newPassword = errors.find(error => error.field === 'NewPassword');\n\n if (codeError && codeError.error) {\n setCodeErrors([codeError.error])\n }\n\n if (newPassword && newPassword.error) {\n setPasswordErrors([newPassword.error])\n }\n\n if (newUser) {\n setMemory((memory) => {\n return {\n ...memory,\n termsAndConditionText: newUser.error,\n newPassword: password\n }\n });\n }\n }\n }, [errors, code, password, setCodeErrors, setMemory]);\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n let codeErrors: string[] = [];\n \n if (!code) {\n codeErrors = ['Code is required.'];\n } else if (code.length !== 6) {\n codeErrors = ['Code should be exactly six characters in length.'];\n }\n\n if (codeErrors.length > 0) {\n setCodeErrors(codeErrors);\n return;\n } else {\n setCodeErrors([]);\n }\n\n confirmEmail(memory.email, code, memory.returnUrl, undefined, undefined, password);\n\n }, [code, memory, password, confirmEmail]);\n\n const toggleHelpText = (show: boolean) => {\n setShowHelpText(show);\n };\n\n const onMagicCodeSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n setResendDisableCounter((resendDisableCounter) => {\n if (magicCodeLoading || resendDisableCounter !== 0) {\n return resendDisableCounter;\n }\n getMagicCode(memory.email, memory.returnUrl);\n setShowHelpText(true);\n return 30;\n });\n }, [memory, magicCodeLoading, getMagicCode, setResendDisableCounter]);\n\n useEffect(() => {\n const id = setInterval(() => {\n setResendDisableCounter((resendDisableCounter) => {\n if (resendDisableCounter > 0) { \n return resendDisableCounter-1;\n }\n return resendDisableCounter;\n });\n }, 1000);\n return () => {\n clearInterval(id);\n };\n }, [setResendDisableCounter]);\n\n if (memory.confirmationCode && memory.termsAndConditionText) {\n return \n }\n\n if (!memory.email) {\n return \n }\n\n if (success) {\n window.location.href = ensureUrlIsLocal(memory.returnUrl);\n return
\n }\n\n return (\n <>\n

Verify your email

\n

\n We've sent an email with a 6-digit code to {memory.email}.
\n It will expire in a few minutes, so enter it soon.\n

\n
\n setCode((e.target.value + '').trim())}\n autoComplete={'nope'}\n errors={codeErrors}\n disabled={loading}\n />\n setPassword(e.target.value)}\n autoComplete={'new-password'}\n errors={passwordErrors}\n disabled={loading}\n />\n

\n \n <>Passwords must be \n = 8 ? true : false) : null}>at least 8 characters long\n <> with at least one \n number<>, \n symbol<>, \n uppercase\n <> and \n lowercase\n <> letter\n \n

\n\n
\n \n \n \n
\n
\n \n Back\n \n |\n toggleHelpText(true)}>Having trouble?\n
\n \n
\n

\n If you are unable to locate your 6-digit code, try the following:\n

\n
    \n
  • Check your SPAM folder
  • \n
  • Search your email for contact@withwine.com
  • \n
  • Double-check your email address is spelled correctly
  • \n
  • Check the email domain ends correctly, for example gmail.com and not gmail.com.au
  • \n
\n

\n toggleHelpText(false)}>Hide\n

\n
\n \n );\n}\n","import React from 'react';\nimport { CheckboxProps } from './CheckboxProps';\nimport './Checkbox.css';\n\nexport const Checkbox: React.FC = ({ checked, children, onClick, error, className }) => {\n return (\n
\n
\n \n
\n {children &&
{children}
}\n
\n );\n}","import 'whatwg-fetch';\nimport { useState, useEffect, useCallback } from 'react';\nimport { DataResponse } from '../models/DataResponse';\nimport { Error } from '../models/Error';\nimport { useXSRFTokenContext } from './useXSRFTokenContext';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\nexport type ResponseStatus = { loading: boolean, errors: Error[] | null, success: boolean | null };\n\n\nexport const useApiRequestFn = ({ basePathAndQuery, method, useXsrfToken }:\n { basePathAndQuery: string, method: 'GET' | 'POST' | string, useXsrfToken?: boolean }): [(options: { appendPathAndQuery: string, body?: FormData }) => void, boolean, ResponseStatus, T | null] => {\n\n const requiresXsrfToken = typeof(useXsrfToken) === 'undefined' ? (method.toUpperCase() === 'POST') : useXsrfToken;\n const xsrfToken = useXSRFTokenContext();\n const [isReady, setIsReady] = useState(!requiresXsrfToken);\n const [resultStatus, setResultStatus] = useState({\n loading: false, errors: null, success: null\n });\n const [responseData, setResponseData] = useState(null);\n\n useEffect(() => {\n setIsReady(!requiresXsrfToken || (xsrfToken && xsrfToken.length && xsrfToken.length > 0 ? true : false));\n }, [xsrfToken, requiresXsrfToken, setIsReady]);\n\n const apiRequest = useCallback(({ appendPathAndQuery, body }: { appendPathAndQuery: string, body?: FormData }) => {\n if (!isReady) {\n return;\n }\n\n setResultStatus(result => { return { ...result, loading: true }; });\n\n const xsrfTokenHeader : Record = requiresXsrfToken ? { 'X-XSRF-Token': xsrfToken || '' } : { };\n\n fetch(`${endPoint}${basePathAndQuery}${appendPathAndQuery}`, {\n method: method,\n headers: {\n ...xsrfTokenHeader,\n 'Accept': 'application/json'\n },\n body: body\n }).then(async (response) => {\n const responseData = (await response.json()) as DataResponse;\n ;\n setResultStatus({ loading: false, errors: responseData.errors, success: !responseData.errors });\n setResponseData(responseData.data);\n }).catch((errors) => {\n setResultStatus({ loading: false, errors: errors, success: false });\n });\n }, [setResultStatus, xsrfToken, requiresXsrfToken, isReady, method, basePathAndQuery]);\n\n return [apiRequest, isReady, { ...resultStatus }, responseData];\n}\n\nexport const useApiRequestOnLoad = ({ pathAndQuery, method, body, useXsrfToken }:\n { pathAndQuery: string, method: 'GET' | 'POST' | string, body?: FormData, useXsrfToken?: boolean }): [ResponseStatus, T | null] => {\n\n const [apiFunction, isReady, status, data] = useApiRequestFn(\n { basePathAndQuery: pathAndQuery, method: method, useXsrfToken: useXsrfToken });\n\n useEffect(() => {\n if (isReady) {\n apiFunction({\n appendPathAndQuery: '',\n body: body\n });\n }\n }, [isReady, apiFunction, body]);\n\n return [status, data];\n}","import React, { useCallback, FormEvent, useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button/Button';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { LinkButton } from '../LinkButton/LinkButton';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\nimport { ensureUrlIsLocal } from '../../utils/urlIsLocal';\nimport { useConfirm2faCodeFn } from '../../hooks/useConfirm2faCode';\n\nexport const Confirm2faForm = () => {\n\n const [memory] = useFormMemory();\n const [code, setCode] = useState('');\n const [codeErrors, setCodeErrors] = useState([]);\n const [showHelpText, setShowHelpText] = useState(false);\n const [rememberMe, setRememberMe] = useState(false);\n const [trustBrowser, setTrustBrowser] = useState(false);\n const [confirm2faCode, confirm2faCodeIsReady, { loading, success, errors }] = useConfirm2faCodeFn();\n\n useEffect(() => {\n if (errors && errors.length > 0) {\n setCodeErrors(errors.map(e => e.error));\n }\n }, [errors, code, setCodeErrors]);\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n if (!confirm2faCodeIsReady) {\n return;\n }\n\n let codeErrors: string[] = [];\n \n if (!code) {\n codeErrors = ['Code is required.'];\n } else if (code.length !== 6) {\n codeErrors = ['Code should be exactly six characters in length.'];\n }\n\n if (codeErrors.length > 0) {\n setCodeErrors(codeErrors);\n return;\n } else {\n setCodeErrors([]);\n }\n\n confirm2faCode(code, { returnUrl: memory.returnUrl, rememberMe: rememberMe, trustBrowserFor2fa: trustBrowser });\n\n }, [confirm2faCode, confirm2faCodeIsReady, code, memory, rememberMe, trustBrowser ]);\n\n const toggleHelpText = (show: boolean) => {\n setShowHelpText(show);\n };\n\n if (success) {\n window.location.href = ensureUrlIsLocal(memory.returnUrl);\n return
\n }\n\n return (\n <>\n

Verification Code

\n

\n Your account is protected with 2 factor authentication. Enter your authentication code below.\n

\n
\n setCode((e.target.value + '').trim())}\n autoComplete={'nope'}\n errors={codeErrors}\n disabled={loading}\n />\n setRememberMe(!rememberMe)} checked={rememberMe} className='mb'>Remember me\n setTrustBrowser(!trustBrowser)} checked={trustBrowser}>Trust this device\n\n
\n \n \n
\n
\n \n Back\n \n |\n toggleHelpText(true)}>Having trouble?\n
\n \n
\n

\n If you are unable to locate your 6-digit code or authenticator device, try the following:\n

\n
    \n
  • \n If you saved your recovery codes, you can login using a recovery code\n
  • \n
  • Contact WithWine support hello@withwine.com
  • \n
\n

\n toggleHelpText(false)}>Hide\n

\n
\n \n );\n}\n","import { ResponseStatus, useApiRequestFn } from './useApiRequest';\nimport { useCallback } from 'react';\n\nexport const useConfirm2faCodeFn = (): [(code: string, options: { rememberMe: boolean, trustBrowserFor2fa: boolean, returnUrl: string, provider?: string }) => void, boolean, ResponseStatus] => {\n const [enableFunction, isReady, status] = useApiRequestFn({\n basePathAndQuery: '/Account/VerifyCode',\n method: 'POST',\n useXsrfToken: true\n });\n\n const verifyCodeFunctionWrapper = useCallback((code: string, options: { rememberMe?: boolean, trustBrowserFor2fa: boolean, returnUrl: string, provider?: string }) => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n data.append('code', code);\n data.append('returnUrl', options.returnUrl);\n data.append('rememberBrowser', options.trustBrowserFor2fa ? 'true' : 'false');\n\n if (typeof options.provider !== 'undefined') {\n data.append('provider', options.provider);\n }\n if (typeof options.rememberMe !== 'undefined') {\n data.append('rememberMe', options.rememberMe ? 'true' : 'false');\n }\n\n enableFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, enableFunction]);\n\n return [verifyCodeFunctionWrapper, isReady, status];\n}\n\nexport const useConfirm2faRecoveryCodeFn = (): [(code: string, options: { returnUrl: string }) => void, boolean, ResponseStatus] => {\n const [enableFunction, isReady, status] = useApiRequestFn({\n basePathAndQuery: '/Account/VerifyRecoveryCode',\n method: 'POST',\n useXsrfToken: true\n });\n\n const verifyCodeFunctionWrapper = useCallback((code: string, options: { returnUrl: string }) => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n data.append('code', code);\n data.append('returnUrl', options.returnUrl);\n\n enableFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, enableFunction]);\n\n return [verifyCodeFunctionWrapper, isReady, status];\n}","import React, { useCallback, FormEvent, useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button/Button';\nimport { LinkButton } from '../LinkButton/LinkButton';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\nimport { ensureUrlIsLocal } from '../../utils/urlIsLocal';\nimport { useConfirm2faRecoveryCodeFn } from '../../hooks/useConfirm2faCode';\n\nexport const Confirm2faRecoveryCodeForm = () => {\n\n const [memory] = useFormMemory();\n const [code, setCode] = useState('');\n const [codeErrors, setCodeErrors] = useState([]);\n const [showHelpText, setShowHelpText] = useState(false);\n const [confirmRecoveryCode, confirmRecoveryCodeIsReady, { loading, success, errors }] = useConfirm2faRecoveryCodeFn();\n\n useEffect(() => {\n if (errors && errors.length > 0) {\n setCodeErrors(errors.map(e => e.error));\n }\n }, [errors, code, setCodeErrors]);\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n\n if (!confirmRecoveryCodeIsReady) {\n return;\n }\n\n let codeErrors: string[] = [];\n \n if (!code) {\n codeErrors = ['Code is required.'];\n }\n\n if (codeErrors.length > 0) {\n setCodeErrors(codeErrors);\n return;\n } else {\n setCodeErrors([]);\n }\n\n confirmRecoveryCode(code, { returnUrl: memory.returnUrl });\n\n }, [confirmRecoveryCode, confirmRecoveryCodeIsReady, code, memory ]);\n\n const toggleHelpText = (show: boolean) => {\n setShowHelpText(show);\n };\n\n if (success) {\n window.location.href = ensureUrlIsLocal(memory.returnUrl);\n return
\n }\n\n return (\n <>\n

Recovery Code

\n

\n Your account is protected with 2 factor authentication. Enter one of your recovery codes below.\n

\n
\n setCode((e.target.value + '').trim())}\n autoComplete={'nope'}\n errors={codeErrors}\n disabled={loading}\n />\n\n
\n \n \n
\n
\n \n Back\n \n |\n toggleHelpText(true)}>Having trouble?\n
\n \n
\n

\n If your recovery codes aren't working:\n

\n \n

\n toggleHelpText(false)}>Hide\n

\n
\n \n );\n}\n","import React, { useState, FormEvent, useCallback } from 'react';\nimport { useHistory } from 'react-router';\nimport { Redirect } from 'react-router-dom';\nimport { Input } from '../Input/Input';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { Button } from '../Button/Button';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { useConfirmEmail } from '../../hooks/useConfirmEmail';\nimport { PoweredByFooter } from '../PoweredByFooter/PoweredByFooter';\nimport { ensureUrlIsLocal } from '../../utils/urlIsLocal';\n\nexport const RegistrationForm: React.FC = () => {\n\n const history = useHistory();\n const [memory, setMemory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const [agreeToTerms, setAgreeToTerms] = useState(false);\n const [agreeToTermsError, setAgreeToTermsError] = useState(false);\n const [firstName, setFirstName] = useState(unescape(queryParams.firstName || ''));\n const [firstNameErrors, setFirstNameErrors] = useState([]);\n const [lastName, setLastName] = useState(unescape(queryParams.lastName || ''));\n const [lastNameErrors, setLastNameErrors] = useState([]);\n const [confirmEmail, { success, errors }] = useConfirmEmail(\n (response) => {\n if (!firstName && !lastName) {\n if (response.firstName) {\n setFirstName(response.firstName);\n }\n if (response.lastName) {\n setLastName(response.lastName);\n }\n }\n },\n is2faRequired => {\n history.push(`/Account/Login/2fa${window.location.search}`);\n });\n\n const onSubmit = useCallback((e: FormEvent) => {\n e.preventDefault();\n let firstNameErrors: string[] = [];\n let lastNameErrors: string[] = [];\n\n if (!firstName) {\n firstNameErrors = ['Please provide your first name'];\n }\n\n if (!lastName) {\n lastNameErrors = ['Please provide your last name'];\n }\n\n if (firstNameErrors.length > 0 || lastNameErrors.length > 0 || !agreeToTerms) {\n setFirstNameErrors(firstNameErrors);\n setLastNameErrors(lastNameErrors);\n setAgreeToTermsError(!agreeToTerms);\n return;\n } else {\n setFirstNameErrors([]);\n setLastNameErrors([]);\n }\n\n confirmEmail(memory.email, memory.confirmationCode, memory.returnUrl, firstName, lastName, memory.newPassword, true);\n\n }, [confirmEmail, memory, firstName, lastName, agreeToTerms, setAgreeToTermsError, setFirstNameErrors, setLastNameErrors]);\n\n if (success) {\n window.location.href = ensureUrlIsLocal(memory.returnUrl);\n return
;\n }\n\n if (success === false && errors && errors.find && errors.find(error => error.field === 'ConfirmationCode') && memory.email) {\n setMemory({ ...memory, confirmationCode: '', termsAndConditionText: '' });\n //Temporary code expired. Resend a new one.\n return \n }\n\n if (!memory.email || !memory.confirmationCode || !memory.termsAndConditionText) {\n if (memory.email) {\n return \n }\n return \n }\n\n return (\n <>\n

What's your name?

\n
\n setFirstName((e.target.value + '').trim())} \n errors={firstNameErrors}\n />\n setLastName((e.target.value + '').trim())} \n errors={lastNameErrors}\n />\n
\n setAgreeToTerms(!agreeToTerms)} checked={agreeToTerms} error={agreeToTermsError}>\n I agree to the Terms of Use\n \n
\n
\n \n \n
\n
\n \n
\n
\n \n );\n}\n\n ","import React, { useState, useEffect } from 'react';\nimport { Redirect } from 'react-router';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useGetMagicCode } from '../../hooks/useGetMagicCode';\nimport { isValidEmail } from '../../utils/isValidEmail';\nimport { useFormMemory } from '../../hooks/useFormMemory';\n\nexport const RegistrationStart: React.FC = () => {\n const [memory, setMemory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const returnUrl = memory.returnUrl || unescape(queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [email] = useState(queryParams.email || '');\n const [getMagicCode, { success: magicCodeSuccess, loading: magicCodeLoading }] = useGetMagicCode();\n\n useEffect(() => {\n if (email && isValidEmail(email)) {\n if (!magicCodeLoading && magicCodeSuccess == null) {\n getMagicCode(email, returnUrl)\n }\n }\n }, [getMagicCode, magicCodeLoading, email, returnUrl, magicCodeSuccess]);\n\n if (!email || !isValidEmail(email) || magicCodeSuccess === false) {\n return ;\n }\n\n if (magicCodeSuccess) {\n setMemory({ \n ...memory,\n email\n });\n return ;\n }\n\n return (\n <>\n
\n \n )\n};","import React, { useEffect } from 'react';\nimport { Route } from 'react-router-dom';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useClientCoBranding } from '../../hooks/useClientCoBranding';\nimport { Branding } from '../../components/Branding/Branding';\nimport { CredentialsForm } from '../../components/CredentialsForm/CredentialsForm';\nimport { EmailForm } from '../../components/EmailForm/EmailForm';\nimport { ConfirmCodeForm } from '../../components/ConfirmCodeForm/ConfirmCodeForm';\nimport { Confirm2faForm } from '../../components/Confirm2faForm/Confirm2faForm';\nimport { Confirm2faRecoveryCodeForm } from '../../components/Confirm2faForm/Confirm2faRecoveryCodeForm';\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport { RegistrationForm } from '../../components/RegistrationForm/RegistrationForm';\nimport { RegistrationStart } from '../../components/RegistrationStart/RegistrationStart';\nimport './Login.css';\n\nexport const Login: React.FC = () => {\n const [memory, setMemory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const returnUrl = memory.returnUrl || unescape(queryParams.returnUrl || queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [branding] = useClientCoBranding(returnUrl);\n const loginInfo = memory.loginInfo || (branding && branding.loginInfo) || unescape(queryParams.login_info || queryParams.loginInfo || queryParams.LoginInfo || '');\n\n useEffect(() => {\n setMemory((memory) => {\n return {\n ...memory,\n returnUrl,\n loginInfo\n }\n });\n }, [returnUrl, loginInfo, setMemory]);\n\n return (\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n
\n
\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router';\nimport { Link } from 'react-router-dom';\nimport { Button } from '../../Button/Button';\nimport { useAuthenticatorSettings } from '../../../hooks/Authenticator/useAuthenticatorSettings'\nimport { useGenerateRecoveryCodesFn } from '../../../hooks/Authenticator/useGenerateRecoveryCodes'\nimport { useForgetBrowserFn } from '../../../hooks/Authenticator/useForgetBrowser'\nimport { useAuthenticatorDisableFn } from '../../../hooks/Authenticator/useAuthenticatorDisable'\nimport { useAuthenticatorResetFn } from '../../../hooks/Authenticator/useAuthenticatorReset'\n\nexport const Authenticator: React.FC = () => {\n const history = useHistory();\n\n const [statusMessage, setStatusMessage] = useState('');\n const [authenticatorSettingsStatus, authenticatorSettings] = useAuthenticatorSettings();\n const [generateRecoveryCodes, generateRecoveryCodesIsReady, generateRecoveryCodesStatus, recoveryCodeResult] = useGenerateRecoveryCodesFn();\n const [forgetBrowser, forgetBrowserIsReady, forgetBrowserStatus] = useForgetBrowserFn();\n const [disableAuthenticator, disableAuthenticatorIsReady, disableAuthenticatorStatus] = useAuthenticatorDisableFn();\n const [resetAuthenticator, resetAuthenticatorIsReady, resetAuthenticatorStatus] = useAuthenticatorResetFn();\n\n useEffect(() => setStatusMessage(authenticatorSettings ? (authenticatorSettings.statusMessage || '') : ''), [authenticatorSettings, setStatusMessage]);\n useEffect(() => setStatusMessage(recoveryCodeResult ? (recoveryCodeResult.statusMessage || '') : ''), [recoveryCodeResult, setStatusMessage]);\n useEffect(() => {\n if (disableAuthenticatorStatus.success) {\n history.go(0);\n }\n }, [disableAuthenticatorStatus, history]);\n useEffect(() => {\n if (resetAuthenticatorStatus.success) {\n history.push('/Account/Manage/Authenticator/Enable');\n }\n }, [resetAuthenticatorStatus, history]);\n\n const forgetBrowserSuccess = forgetBrowserStatus.success;\n useEffect(() => {\n if (forgetBrowserSuccess) {\n setStatusMessage('The current browser is no longer trusted. When you login again from this browser you will be asked for your two factor authentication code.');\n }\n }, [forgetBrowserSuccess, setStatusMessage]);\n\n const onEnableAuthenticator = () => {\n history.push('/Account/Manage/Authenticator/Enable');\n };\n \n return (\n <>\n

Two Factor Authentication

\n {statusMessage &&

{statusMessage}

}\n {authenticatorSettingsStatus.loading &&
}\n {!authenticatorSettingsStatus.loading && authenticatorSettings == null &&

Please login to continue.

}\n {authenticatorSettingsStatus.errors && authenticatorSettingsStatus.errors.length && authenticatorSettingsStatus.errors.length > 0 &&\n <>\n {authenticatorSettingsStatus.errors.map((e, i) =>

{e.error}

)}\n }\n {authenticatorSettingsStatus.success && authenticatorSettings &&\n <>\n {authenticatorSettings.is2faEnabled ?\n <>\n

Recovery Codes

\n {recoveryCodeResult && recoveryCodeResult.recoveryCodes && recoveryCodeResult.recoveryCodes.length > 0 ?\n <>\n
\n

\n Put these codes in a safe place.\n

\n

\n If you lose your device and don't have the recovery codes you will lose access to your account.\n

\n

\n Generating new recovery codes does not change the keys used in authenticator apps. If you wish to change the key used in an authenticator app you should reset your authenticator keys below.\n

\n
\n
\n {recoveryCodeResult.recoveryCodes.map(code =>

{code}

)}\n
\n :\n <>\n {authenticatorSettings.recoveryCodesLeft <= 5 &&

You have {authenticatorSettings.recoveryCodesLeft} recovery {authenticatorSettings.recoveryCodesLeft === 1 ? 'code' : 'codes'} left.

}\n {authenticatorSettings.recoveryCodesLeft > 0 &&

If you generate new recovery codes, your existing codes will no longer work.

}\n }\n \n\n {forgetBrowserStatus.success ?\n <>\n :\n <>\n {authenticatorSettings.isMachineRemembered && <>\n

Trusted Browser

\n

This browser has been remembered as trusted so will not require two factor authentication on every login attempt. You should \"forget this browser\" if it is accessible by others.

\n \n }\n }\n

Disable

\n \n :\n <>}\n

Authenticator App

\n

You can use an Authenticator App for two factor authentication such as:

\n
    \n
  • \n Microsoft Authenticator for Android and iOS\n
  • \n
  • \n Google Authenticator for Android and iOS\n
  • \n
\n {authenticatorSettingsStatus.success && authenticatorSettings.hasAuthenticator ? \n <>\n \n \n :\n <>\n }\n {authenticatorSettingsStatus.success && !authenticatorSettings.hasAuthenticator ?\n \n : <>}\n }\n \n )\n};","import { ResponseStatus, useApiRequestOnLoad } from '../useApiRequest';\n\ntype TwoFactorAuthenticationViewModel = { hasAuthenticator: boolean, is2faEnabled: boolean, isMachineRemembered: boolean, recoveryCodesLeft: number, statusMessage: string | null };\n\nexport const useAuthenticatorSettings = (): [ResponseStatus, TwoFactorAuthenticationViewModel | null] => {\n return useApiRequestOnLoad({\n pathAndQuery: '/Authenticator/Index',\n method: 'GET'\n });\n}","import { ResponseStatus, useApiRequestFn } from '../useApiRequest';\nimport { useCallback } from 'react';\n\ntype RecoveryCodesViewModel = { recoveryCodes: string[] | null, statusMessage: string | null };\n\nexport const useGenerateRecoveryCodesFn = (): [() => void, boolean, ResponseStatus, RecoveryCodesViewModel | null] => {\n const [generateRecoveryCodesFunction, isReady, status, recoveryCodes] = useApiRequestFn({\n basePathAndQuery: '/Authenticator/GenerateRecoveryCodes',\n method: 'POST',\n useXsrfToken: true\n });\n\n const generateRecoveryCodesFunctionWrapper = useCallback(() => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n generateRecoveryCodesFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, generateRecoveryCodesFunction]);\n\n return [generateRecoveryCodesFunctionWrapper, isReady, status, recoveryCodes];\n}","import { ResponseStatus, useApiRequestFn } from '../useApiRequest';\nimport { useCallback } from 'react';\nimport { ActionResponseData } from '../../models/DataResponse';\n\nexport const useForgetBrowserFn = (): [() => void, boolean, ResponseStatus, ActionResponseData | null] => {\n const [forgetBrowserFunction, isReady, status, action] = useApiRequestFn({\n basePathAndQuery: '/Authenticator/ForgetBrowser',\n method: 'POST',\n useXsrfToken: true\n });\n\n const forgetBrowserFunctionWrapper = useCallback(() => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n forgetBrowserFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, forgetBrowserFunction]);\n\n return [forgetBrowserFunctionWrapper, isReady, status, action];\n}","import { ResponseStatus, useApiRequestFn } from '../useApiRequest';\nimport { useCallback } from 'react';\nimport { ActionResponseData } from '../../models/DataResponse';\n\nexport const useAuthenticatorDisableFn = (): [() => void, boolean, ResponseStatus, ActionResponseData | null] => {\n const [authenticatorDisableFunction, isReady, status, action] = useApiRequestFn({\n basePathAndQuery: '/Authenticator/Disable',\n method: 'POST',\n useXsrfToken: true\n });\n\n const authenticatorDisableFunctionWrapper = useCallback(() => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n authenticatorDisableFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, authenticatorDisableFunction]);\n\n return [authenticatorDisableFunctionWrapper, isReady, status, action];\n}","import { ResponseStatus, useApiRequestFn } from '../useApiRequest';\nimport { useCallback } from 'react';\nimport { ActionResponseData } from '../../models/DataResponse';\n\nexport const useAuthenticatorResetFn = (): [() => void, boolean, ResponseStatus, ActionResponseData | null] => {\n const [authenticatorResetFunction, isReady, status, action] = useApiRequestFn({\n basePathAndQuery: '/Authenticator/Reset',\n method: 'POST',\n useXsrfToken: true\n });\n\n const authenticatorResetFunctionWrapper = useCallback(() => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n\n authenticatorResetFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, authenticatorResetFunction]);\n\n return [authenticatorResetFunctionWrapper, isReady, status, action];\n}","import React, { useState, useCallback } from 'react';\nimport { Redirect } from 'react-router';\nimport { Link } from 'react-router-dom';\nimport { Input } from '../../Input/Input';\nimport { Button } from '../../Button/Button';\nimport { useAuthenticatorEnable, useAuthenticatorEnablePostFn } from '../../../hooks/Authenticator/useAuthenticatorEnable'\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\nexport const AuthenticatorEnable: React.FC = () => {\n\n const [code, setCode] = useState('');\n const [initAuthenticatorEnableStatus, initAuthenticatorEnable] = useAuthenticatorEnable();\n const [enableAuthenticator, isEnableReady, enableAuthenticatorStatus] = useAuthenticatorEnablePostFn();\n const codeErrors = enableAuthenticatorStatus.errors ? enableAuthenticatorStatus.errors.map(e => e.error) : [];\n\n const onEnableAuthenticator = useCallback(() => {\n if (!isEnableReady) {\n return;\n }\n enableAuthenticator(code);\n }, [code, enableAuthenticator, isEnableReady]);\n\n if (enableAuthenticatorStatus.success) {\n return ;\n }\n \n return (\n <>\n

Enable Two Factor Authentication

\n {initAuthenticatorEnable && initAuthenticatorEnable.statusMessage &&

{initAuthenticatorEnable.statusMessage}

}\n {(initAuthenticatorEnableStatus.loading || !isEnableReady) ?\n
\n :\n (!initAuthenticatorEnable ?\n <>\n

Please login to continue.

\n \n :\n <>\n

To use an authenticator app, follow the steps below:

\n
    \n
  1. \n Download an authenticator app like\n Microsoft Authenticator (Android and iOS) or\n Google Authenticator (Android and iOS).\n
  2. \n
  3. \n

    Scan the QR Code or enter the following key into your authenticator app. Spaces and casing do not matter.

    \n

    {initAuthenticatorEnable.sharedKey}

    \n

    \n {'QR\n

    \n
  4. \n
  5. \n

    \n Once you have scanned the QR code or input the key above, your authenticator app will provide you\n with a unique code. Enter the code in the confirmation box below.\n

    \n setCode((e.target.value + '').trim())}\n errors={codeErrors}\n disabled={enableAuthenticatorStatus.loading} />\n \n
  6. \n
\n\n )}\n \n )\n};","import { ResponseStatus, useApiRequestOnLoad, useApiRequestFn } from '../useApiRequest';\nimport { useCallback } from 'react';\n\ntype EnableAuthenticatorViewModel = {\n sharedKey: string | null,\n authenticatorUri: string | null,\n statusMessage: string | null\n};\n\nexport const useAuthenticatorEnable = (): [ResponseStatus, EnableAuthenticatorViewModel | null] => {\n return useApiRequestOnLoad({\n pathAndQuery: '/Authenticator/Enable',\n method: 'GET'\n });\n};\n\nexport const useAuthenticatorEnablePostFn = (): [(code: string) => void, boolean, ResponseStatus] => {\n const [enableFunction, isReady, status] = useApiRequestFn({\n basePathAndQuery: '/Authenticator/Enable',\n method: 'POST',\n useXsrfToken: true\n });\n\n const enableFunctionWrapper = useCallback((code: string) => {\n if (!isReady) {\n return;\n }\n const data = new FormData();\n data.append('code', code);\n\n enableFunction({\n appendPathAndQuery: '',\n body: data\n })\n }, [isReady, enableFunction]);\n\n return [enableFunctionWrapper, isReady, status];\n}","import React, { useEffect } from 'react';\nimport { Route } from 'react-router-dom';\nimport { parseQueryString } from '../../utils/parseQueryString';\nimport { useClientCoBranding } from '../../hooks/useClientCoBranding';\nimport { Branding } from '../../components/Branding/Branding';\nimport { Authenticator } from '../../components/Manage/Authenticator/Authenticator'\nimport { AuthenticatorEnable } from '../../components/Manage/Authenticator/AuthenticatorEnable'\nimport { useFormMemory } from '../../hooks/useFormMemory';\nimport './Manage.css';\n\nexport const Manage: React.FC = () => {\n const [memory, setMemory] = useFormMemory();\n const queryParams = parseQueryString(window.location.search || '');\n const returnUrl = memory.returnUrl || unescape(queryParams.returnUrl || queryParams.ReturnUrl || 'https://www.withwine.com/');\n const [branding] = useClientCoBranding(returnUrl);\n\n useEffect(() => {\n setMemory((memory) => {\n return {\n ...memory,\n returnUrl\n }\n });\n }, [returnUrl, setMemory]);\n\n return (\n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { LinkButton } from '../components/LinkButton/LinkButton';\n\nexport const NotFound: React.FC = () => {\n return (\n
\n
\n
\n
\n WithWine\n
\n

\n Sorry, the requested page could not be found.\n

\n \n Return to Login\n \n
\n
\n
\n );\n}","import 'whatwg-fetch';\nimport { useState, useEffect } from 'react';\nimport { parseCookieString } from '../utils/parseQueryString';\nimport { Error } from '../models/Error';\n\nconst endPoint = process.env.REACT_APP_API_ENDPOINT;\n\ntype XSRFTokenType = [string | null, {loading: boolean, errors: {field: string, error: string}[] | null}];\n\nexport const useXSRFToken = (): XSRFTokenType => {\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState(null);\n const [token, setToken] = useState(null);\n\n useEffect(() => {\n fetch(`${endPoint}/Home/XsrfToken`, {\n method: 'GET',\n credentials: 'same-origin'\n }).then(() => {\n const cookies = parseCookieString(document.cookie);\n const token = cookies['XSRF-TOKEN'] || null;\n setToken(token);\n setLoading(false);\n if (!token) {\n setErrors([{ field: '', error: 'An error has occurred.' }]);\n } else {\n setErrors(null);\n }\n }).catch((errors) => {\n setLoading(false);\n setErrors(errors);\n });\n }, []);\n\n return [token, { loading, errors }];\n}","import React from 'react';\nimport { useXSRFToken } from '../../hooks/useXSRFToken';\nimport { XSRFTokenContext } from '../../hooks/useXSRFTokenContext';\n\nexport const RequireXSRFToken: React.FC = ({ children }) => {\n\n const [token, { loading, errors }] = useXSRFToken();\n\n if (loading) {\n return null;\n }\n\n if (!loading && !token) {\n return <>{errors && JSON.stringify(errors)}\n }\n\n return (\n {children}\n );\n}","import React, { useState } from 'react';\nimport { FormMemory, defaultFormMemory, FormMemoryInterface } from '../../hooks/useFormMemory';\n\nexport const FormMemoryProvider: React.FC = ({children}) => {\n const formMemory = useState(defaultFormMemory);\n return (\n {children}\n );\n}","import React from 'react';\nimport { BrowserRouter as Router, Route, Switch } from 'react-router-dom';\nimport { Home } from './pages/Home';\nimport { Login } from './pages/Login/Login';\nimport { Manage } from './pages/Manage/Manage';\nimport { NotFound } from './pages/NotFound';\nimport { RequireXSRFToken } from './components/RequireXSRFToken/RequireXSRFToken';\nimport './App.css';\nimport { FormMemoryProvider } from './components/FormMemory/FormMemory';\n\nconst App: React.FC = () => {\n return (\n
\n \n \n \n \n } />\n } />\n \n \n \n \n
\n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}