{"version":3,"file":"login-821cc31e.js","sources":["../../../../firstmile.widgets/src/blocks/user/Login.tsx"],"sourcesContent":["import { Textbox, TextboxModel } from '@src/components/form/Textbox';\nimport { FC, FormEventHandler, useEffect, useRef, useState } from 'react';\nimport { PatternValidationRuleModel, RequiredValidationRuleModel } from '@src/app/validation';\nimport Button, { ButtonModel } from '@src/components/button/Button';\nimport { login, verifyEmail } from '@src/api/login';\nimport Modal from '@src/components/modal/Modal';\nimport Svg from '@src/components/svg/Svg';\n\ntype ValidationRule = RequiredValidationRuleModel | PatternValidationRuleModel;\n\nexport enum LoginStatus {\n UNKNOWN_ERROR = 0,\n LOGIN_SUCCESS = 1,\n REGISTER_USER = 2,\n LOGIN_FAILED = 3,\n}\n\ninterface Props {\n title: string;\n email: TextboxModel;\n password: TextboxModel;\n validationRules: ValidationRules;\n extraClassname?: string;\n submitBtnLabel: string;\n submitBtnDuringApiCallLabel: string;\n forgotPasswordCtaLabel: string;\n forgotPasswordCtaUrl: string;\n newMemberHint: string;\n newMemberCtaLabel: string;\n newMemberCtaUrl: string;\n apiUrl: string;\n genericErrorMessage: string;\n verifyEmailHeading: string;\n verifyEmailApiUrl: string;\n resendEmailDelaySecond?: number;\n formAction?: string;\n msButton?: ButtonModel;\n msError?: string;\n}\n\ninterface ValidationRules {\n email: ValidationRule[];\n password: ValidationRule[];\n}\n\ninterface ValidationResultState {\n email: string[];\n password: string[];\n}\n\ninterface LoginFormState {\n email: string;\n password: string;\n}\n\nlet timeoutResend: NodeJS.Timeout;\n\nconst Login: FC = (props) => {\n const [formValue, setFormValue] = useState({\n email: props.email.defaultValue,\n password: props.password.defaultValue,\n });\n\n const [ignoreValidation, setIgnoreValidation] = useState(true);\n const [apiCallInProgress, setApiCallInProgress] = useState(false);\n const [showModal, setShowModal] = useState(props?.msError ? true : false);\n const [modalMessage, setModalMessage] = useState(props?.msError ? props.msError : '');\n const [showVerifyModal, setShowVerifyModal] = useState(false);\n const [verifyEmailDescription, setVerifyEmailDescription] = useState('');\n const [canSendEmail, setCanSendEmail] = useState(true);\n const [clientSecret, setClientSecret] = useState();\n const [clientSalt, setClientSalt] = useState();\n\n const [validationResult, setValidationResult] = useState({\n email: [],\n password: [],\n });\n\n const verifyEmailRef = useRef(null);\n\n const handleInput: FormEventHandler = (e) => {\n const target = e.target as HTMLInputElement;\n\n setFormValue({\n ...formValue,\n [target.name]: target.value,\n });\n };\n\n const runFieldValidation = (fieldName: string) => {\n let messages: string[] = [];\n\n ((props.validationRules as any)[fieldName] as ValidationRule[]).forEach((rule) => {\n switch (rule.type) {\n case 'required':\n if ((formValue as any)[fieldName] === '' || (formValue as any)[fieldName] === undefined) messages.push(rule.message);\n case 'pattern':\n const regex = new RegExp((rule as PatternValidationRuleModel).pattern, 'gi');\n if (!regex.test((formValue as any)[fieldName])) messages.push(rule.message);\n default:\n break;\n }\n });\n\n setValidationResult((state) => {\n const newState = { ...state };\n (newState as any)[fieldName] = messages;\n return newState;\n });\n };\n\n Object.keys(props.validationRules).forEach((key) => {\n useEffect(() => {\n runFieldValidation(key);\n }, [(formValue as any)[key]]);\n });\n\n const handleClick = () => {\n if (ignoreValidation) setIgnoreValidation(false);\n if (formHasError(validationResult)) return;\n\n // call ajax\n setApiCallInProgress(true);\n login(props.apiUrl, formValue)\n .then((res) => {\n switch (res.status) {\n case LoginStatus.LOGIN_SUCCESS: {\n // if formAction is set, sent data to formAction for process next step\n const data = res.dataNextStep;\n\n if (props.formAction) {\n processNextStep(data);\n return;\n }\n\n // if formAction is not set, redirect to redirectUrl\n res.redirectUrl && window.location.replace(res.redirectUrl);\n return;\n }\n case LoginStatus.REGISTER_USER: {\n setVerifyEmailDescription(res.verifyEmailDescription);\n setClientSecret(res.clientSecret);\n setClientSalt(res.clientSalt);\n setShowVerifyModal(true);\n return;\n }\n case LoginStatus.LOGIN_FAILED: {\n setModalState(res.message, true);\n break;\n }\n case LoginStatus.UNKNOWN_ERROR: {\n setModalState(props.genericErrorMessage, true);\n return;\n }\n default: {\n setModalState(props.genericErrorMessage, true);\n return;\n }\n }\n })\n .catch(() => {\n setModalState(props.genericErrorMessage, true);\n })\n .finally(() => {\n setApiCallInProgress(false);\n });\n };\n\n const handleResendEmail = (e: MouseEvent) => {\n e.preventDefault();\n if (!canSendEmail || !clientSecret || !clientSalt) {\n return;\n }\n setApiCallInProgress(true);\n setCanSendEmail(false);\n verifyEmail(props.verifyEmailApiUrl, { email: formValue.email, secret: clientSecret, salt: clientSalt })\n .then((res) => {\n if (res.isSuccessful) {\n setClientSecret(res.clientSecret);\n setClientSalt(res.clientSalt);\n } else {\n setModalState(res.message, true);\n }\n })\n .catch(() => {\n setModalState(props.genericErrorMessage, true);\n })\n .finally(() => {\n setApiCallInProgress(false);\n clearTimeout(timeoutResend);\n\n timeoutResend = setTimeout(\n () => {\n setCanSendEmail(true);\n },\n props.resendEmailDelaySecond ? props.resendEmailDelaySecond * 1000 : 10000\n );\n });\n };\n\n const setModalState = (message: string, showModal: boolean) => {\n setModalMessage(message);\n setShowModal(showModal);\n };\n\n useEffect(() => {\n if (!verifyEmailDescription || !verifyEmailRef.current) return;\n\n const linkResend = verifyEmailRef.current.querySelector('a#resend-email');\n\n if (linkResend) {\n linkResend.addEventListener('click', handleResendEmail);\n }\n\n return () => {\n if (linkResend) {\n linkResend.removeEventListener('click', handleResendEmail);\n }\n };\n }, [verifyEmailDescription, canSendEmail, clientSecret, clientSalt]);\n\n useEffect(() => {\n if (!verifyEmailDescription || !verifyEmailRef.current) return;\n\n const linkResend = verifyEmailRef.current.querySelector('a#resend-email');\n\n if (linkResend) {\n linkResend.style.cursor = canSendEmail ? 'pointer' : 'not-allowed';\n linkResend.style.opacity = canSendEmail ? '1' : '0.5';\n }\n }, [canSendEmail]);\n\n const formHasError = (result: ValidationResultState) => {\n let hasError = false;\n Object.keys(result).every((key) => {\n if ((result as any)[key].length > 0) {\n hasError = true;\n return false;\n }\n return true;\n });\n return hasError;\n };\n\n // process next when login success if props.formAction is set\n const processNextStep = (receivedData?: any) => {\n // create form\n const form = document.createElement('form');\n form.setAttribute('method', 'POST');\n form.setAttribute('action', props.formAction ?? '');\n form.hidden = true;\n\n // create hidden field for set data\n const hiddenField = document.createElement('input');\n hiddenField.setAttribute('type', 'hidden');\n hiddenField.setAttribute('name', 'data');\n hiddenField.setAttribute('value', JSON.stringify(receivedData));\n form.appendChild(hiddenField);\n\n // add form and submit\n document.body.appendChild(form);\n form.submit();\n };\n\n return (\n
\n {!showVerifyModal && (\n
\n
e.preventDefault()}>\n

{props.title}

\n 0 ? validationResult.email[0] : undefined}\n hasError={validationResult.email.length > 0 && !ignoreValidation}\n isDisabled={apiCallInProgress}\n />\n 0 ? validationResult.password[0] : undefined}\n hasError={validationResult.password.length > 0 && !ignoreValidation}\n isDisabled={apiCallInProgress}\n />\n \n\n \n {props.forgotPasswordCtaLabel}\n \n\n {props.msButton && (\n
\n
\n )}\n\n
{props.newMemberHint}
\n\n \n {props.newMemberCtaLabel}\n \n \n
\n )}\n\n {showVerifyModal && (\n
\n
\n \n {props.verifyEmailHeading &&

{props.verifyEmailHeading}

}\n {verifyEmailDescription && (\n
\n )}\n
\n
\n )}\n\n {showModal && setModalState('', false)} />}\n \n );\n};\n\nexport default Login;\n"],"names":["LoginStatus","UNKNOWN_ERROR","LOGIN_SUCCESS","REGISTER_USER","LOGIN_FAILED","timeoutResend","Login","props","formValue","setFormValue","useState","email","defaultValue","password","ignoreValidation","setIgnoreValidation","apiCallInProgress","setApiCallInProgress","showModal","setShowModal","msError","modalMessage","setModalMessage","showVerifyModal","setShowVerifyModal","verifyEmailDescription","setVerifyEmailDescription","canSendEmail","setCanSendEmail","clientSecret","setClientSecret","clientSalt","setClientSalt","validationResult","setValidationResult","verifyEmailRef","useRef","handleInput","e","target","name","value","runFieldValidation","fieldName","messages","validationRules","forEach","rule","type","undefined","push","message","RegExp","pattern","test","state","newState","Object","keys","key","useEffect","handleClick","formHasError","login","apiUrl","then","res","status","data","dataNextStep","formAction","processNextStep","redirectUrl","window","location","replace","genericErrorMessage","catch","finally","handleResendEmail","preventDefault","verifyEmail","verifyEmailApiUrl","secret","salt","isSuccessful","clearTimeout","setTimeout","resendEmailDelaySecond","setModalState","current","linkResend","querySelector","addEventListener","removeEventListener","style","cursor","opacity","result","hasError","every","length","receivedData","form","document","createElement","setAttribute","hidden","hiddenField","JSON","stringify","appendChild","body","submit","extraClassname","_jsx","title","Textbox","Button","submitBtnDuringApiCallLabel","submitBtnLabel","forgotPasswordCtaUrl","forgotPasswordCtaLabel","msButton","newMemberHint","newMemberCtaUrl","newMemberCtaLabel","Svg","verifyEmailHeading","__html","Modal"],"mappings":"2QAUYA,IAAAA,GAAAA,IACVC,EAAAA,EAAAA,cAAgB,GAAhBA,gBACAC,EAAAA,EAAAA,cAAgB,GAAhBA,gBACAC,EAAAA,EAAAA,cAAgB,GAAhBA,gBACAC,EAAAA,EAAAA,aAAe,GAAfA,eAJUJ,IAAAA,GAAAA,CAAAA,CAAAA,EA6CZ,IAAIK,EAEJ,MAAMC,EAA8BC,GAAA,OAClC,KAAM,CAACC,EAAWC,CAAZ,EAA4BC,mBAAyB,CACzDC,MAAOJ,EAAMI,MAAMC,aACnBC,SAAUN,EAAMM,SAASD,YAAAA,CAFe,EAKpC,CAACE,EAAkBC,CAAnB,EAA0CL,mBAAS,EAAD,EAClD,CAACM,EAAmBC,CAApB,EAA4CP,mBAAS,EAAD,EACpD,CAACQ,EAAWC,CAAZ,EAA4BT,EAAAA,QAAAA,SAASH,GAAAA,GAAAA,MAAAA,EAAOa,QAAR,EACpC,CAACC,EAAcC,CAAf,EAAkCZ,mBAASH,GAAAA,MAAAA,EAAOa,QAAUb,EAAMa,QAAU,EAAlC,EAC1C,CAACG,EAAiBC,CAAlB,EAAwCd,mBAAS,EAAD,EAChD,CAACe,EAAwBC,CAAzB,EAAsDhB,mBAA6B,EAArB,EAC9D,CAACiB,EAAcC,CAAf,EAAkClB,mBAAS,EAAD,EAC1C,CAACmB,EAAcC,CAAf,EAAkCpB,EAAxC,QAAA,SAAA,EACM,CAACqB,EAAYC,CAAb,EAA8BtB,EAApC,QAAA,SAAA,EAEM,CAACuB,EAAkBC,CAAnB,EAA0CxB,mBAAgC,CAC9EC,MAAO,CADuE,EAE9EE,SAAU,CAAA,CAAA,CAF4C,EAKlDsB,EAAiBC,iBAAuB,IAAjB,EAEvBC,EAAyDC,GAAA,CAC7D,MAAMC,EAASD,EAAEC,OAEJ9B,EAAA,CACX,GAAGD,EACH,CAAC+B,EAAOC,MAAOD,EAAOE,KAAAA,CAFZ,CAAA,EAMRC,EAAsBC,GAAsB,CAChD,IAAIC,EAAqB,CAAA,EAEvBrC,EAAMsC,gBAAwBF,GAAgCG,QAAkBC,GAAA,CAChF,OAAQA,EAAKC,KAAb,CACE,IAAK,YACExC,EAAkBmC,KAAe,IAAOnC,EAAkBmC,KAAeM,SAAoBC,EAAAA,KAAKH,EAAKI,OAAnB,EAC3F,IAAK,UACW,IAAIC,OAAQL,EAAoCM,QAAS,IAAzD,EACHC,KAAM9C,EAAkBmC,EAA9B,GAAoDO,EAAAA,KAAKH,EAAKI,OAAnB,CALpD,CAAA,CADF,EAYAjB,EAA+BqB,GAAA,CAC7B,MAAMC,EAAW,CAAE,GAAGD,CAAAA,EACrBC,OAAAA,EAAiBb,GAAaC,EACxBY,CAAAA,CAHU,CAAA,EAOrBC,OAAOC,KAAKnD,EAAMsC,eAAlB,EAAmCC,QAAiBa,GAAA,CAClDC,EAAAA,QAAAA,UAAU,IAAM,CACdlB,EAAmBiB,CAAD,CACjB,EAAA,CAAEnD,EAAkBmD,EAApB,CAFM,CAAA,CADX,EAMA,MAAME,EAAc,IAAM,CACpB/C,GAAkBC,EAAoB,EAAD,EACrC+C,CAAAA,EAAa7B,CAAD,IAGhBhB,EAAqB,EAAD,EACpB8C,EAAMxD,EAAMyD,OAAQxD,CAAf,EACFyD,KAAcC,GAAA,CACb,OAAQA,EAAIC,OAAZ,CACE,IAAKnE,GAA2B,CAE9B,MAAMoE,EAAOF,EAAIG,aAEjB,GAAI9D,EAAM+D,WAAY,CACpBC,EAAgBH,CAAD,EACf,MACD,CAGDF,EAAIM,aAAeC,OAAOC,SAASC,QAAQT,EAAIM,WAA5B,EACnB,MACD,CACD,IAAKxE,GAA2B,CAC9B0B,EAA0BwC,EAAIzC,sBAAL,EACzBK,EAAgBoC,EAAIrC,YAAL,EACfG,EAAckC,EAAInC,UAAL,EACbP,EAAmB,EAAD,EAClB,MACD,CACD,IAAKxB,GAA0B,CACfkE,EAAAA,EAAIf,QAAS,EAAd,EACb,KACD,CACD,IAAKnD,GAA2B,CAChBO,EAAAA,EAAMqE,oBAAqB,EAA5B,EACb,MACD,CACD,QAAS,CACOrE,EAAAA,EAAMqE,oBAAqB,EAA5B,EACb,MACD,CAhCH,CAAA,CAFJ,EAqCGC,MAAM,IAAM,CACGtE,EAAAA,EAAMqE,oBAAqB,EAA5B,CAAA,CAtCjB,EAwCGE,QAAQ,IAAM,CACb7D,EAAqB,EAAD,CAAA,CAzCxB,EAAA,EA6CI8D,EAAqBzC,GAAkB,CAC3CA,EAAE0C,eAAF,EACI,GAACrD,GAAgB,CAACE,GAAgB,CAACE,KAGvCd,EAAqB,EAAD,EACpBW,EAAgB,EAAD,EACfqD,EAAY1E,EAAM2E,kBAAmB,CAAEvE,MAAOH,EAAUG,MAAOwE,OAAQtD,EAAcuD,KAAMrD,CAAAA,CAAhF,EACRkC,KAAcC,GAAA,CACTA,EAAImB,cACNvD,EAAgBoC,EAAIrC,YAAL,EACfG,EAAckC,EAAInC,UAAL,GAECmC,EAAAA,EAAIf,QAAS,EAAd,CACd,CAPL,EASG0B,MAAM,IAAM,CACGtE,EAAAA,EAAMqE,oBAAqB,EAA5B,CAAA,CAVjB,EAYGE,QAAQ,IAAM,CACb7D,EAAqB,EAAD,EACpBqE,aAAajF,CAAD,EAEZA,EAAgBkF,WACd,IAAM,CACJ3D,EAAgB,EAAD,CAAA,EAEjBrB,EAAMiF,uBAAyBjF,EAAMiF,uBAAyB,IAAO,GAJ7C,CAAA,CAhB9B,EAAA,EAyBIC,EAAgB,CAACtC,EAAiBjC,IAAuB,CAC7DI,EAAgB6B,CAAD,EACfhC,EAAaD,CAAD,CAAA,EAGd0C,EAAAA,QAAAA,UAAU,IAAM,CACV,GAAA,CAACnC,GAA0B,CAACU,EAAeuD,QAAS,OAExD,MAAMC,EAAaxD,EAAeuD,QAAQE,cAAiC,gBAAxD,EAEnB,OAAID,GACSE,EAAAA,iBAAiB,QAASd,CAArC,EAGK,IAAM,CACPY,GACSG,EAAAA,oBAAoB,QAASf,CAAxC,CACD,GAEF,CAACtD,EAAwBE,EAAcE,EAAcE,CAArD,CAdM,EAgBT6B,EAAAA,QAAAA,UAAU,IAAM,CACV,GAAA,CAACnC,GAA0B,CAACU,EAAeuD,QAAS,OAExD,MAAMC,EAAaxD,EAAeuD,QAAQE,cAAiC,gBAAxD,EAEfD,IACSI,EAAAA,MAAMC,OAASrE,EAAe,UAAY,cAC1CoE,EAAAA,MAAME,QAAUtE,EAAe,IAAM,MACjD,EACA,CAACA,CAAD,CATM,EAWHmC,MAAAA,EAAgBoC,GAAkC,CACtD,IAAIC,EAAW,GACf1C,cAAOC,KAAKwC,CAAZ,EAAoBE,MAAezC,GAC5BuC,EAAevC,GAAK0C,OAAS,GACrBF,EAAA,GACJ,IAEF,EALT,EAOOA,CAAAA,EAIH5B,EAAmB+B,GAAuB,OAExCC,MAAAA,EAAOC,SAASC,cAAc,MAAvB,EACRC,EAAAA,aAAa,SAAU,MAA5B,EACAH,EAAKG,aAAa,UAAUnG,EAAAA,EAAM+D,aAAN/D,KAAAA,EAAoB,EAAhD,EACAgG,EAAKI,OAAS,GAGRC,MAAAA,EAAcJ,SAASC,cAAc,OAAvB,EACRC,EAAAA,aAAa,OAAQ,QAAjC,EACYA,EAAAA,aAAa,OAAQ,MAAjC,EACAE,EAAYF,aAAa,QAASG,KAAKC,UAAUR,CAAf,CAAlC,EACAC,EAAKQ,YAAYH,CAAjB,EAGSI,SAAAA,KAAKD,YAAYR,CAA1B,EACAA,EAAKU,OAAL,CAAA,EAGF,SACE,MAAA,CAAK,UAAY,eAAa1G,EAAAA,EAAM2G,iBAAN3G,KAAAA,EAAwB,KAAtD,SACG,CAAA,CAACgB,KACA,MAAA,CAAK,UAAU,oBAAf,WACE,OAAA,CAAM,SAAiBe,GAAAA,EAAE0C,eAAzB,EAAA,SACE,CAAAmC,EAAA,KAAA,CAAI,UAAU,2BAAd,SAA0C5G,EAAM6G,KAAAA,CAAhD,EACAD,EAACE,EACK9G,CAAAA,GAAAA,EAAMI,MACV,eAAe,oBACf,KAAK,QACL,MAAOH,EAAUG,MACjB,YAAA0B,EACA,QAASJ,EAAiBtB,MAAM0F,OAAS,EAAIpE,EAAiBtB,MAAM,GAAKsC,OACzE,SAAUhB,EAAiBtB,MAAM0F,OAAS,GAAK,CAACvF,EAChD,WAAYE,CAAAA,CARd,EAUAmG,EAACE,EACK9G,CAAAA,GAAAA,EAAMM,SACV,eAAe,uBACf,KAAK,WACL,MAAOL,EAAUK,SACjB,YAAAwB,EACA,QAASJ,EAAiBpB,SAASwF,OAAS,EAAIpE,EAAiBpB,SAAS,GAAKoC,OAC/E,SAAUhB,EAAiBpB,SAASwF,OAAS,GAAK,CAACvF,EACnD,WAAYE,CAAAA,CApBhB,EAsBEmG,EAACG,EAAD,CACE,KAAMtG,EAAoBT,EAAMgH,4BAA8BhH,EAAMiH,eACpE,UAAU,qBACV,cAAe,CAAC,mBAAD,EACf,QAAS3D,EACT,SAAU7C,GAAsB8C,EAAa7B,CAAD,GAAsB,CAACnB,EACnE,KAAK,QAAA,CANP,EASAqG,EAAA,IAAA,CAAG,UAAU,qCAAqC,KAAM5G,EAAMkH,qBAA9D,SACGlH,EAAMmH,sBADT,CAAA,EAICnH,EAAMoH,YACL,MAAA,CAAK,UAAU,wBAAf,WACGL,EAAW/G,CAAAA,GAAAA,EAAMoH,QAAAA,CAAlB,CAAA,CADF,EAKFR,EAAA,MAAA,CAAK,UAAU,qCAAf,SAAqD5G,EAAMqH,aAAAA,CAA3D,EAEAT,EAAA,IAAA,CAAG,UAAU,oCAAoC,KAAM5G,EAAMsH,gBAA7D,SACGtH,EAAMuH,iBAAAA,CA5CX,CAAA,CAAA,CAAA,CAAA,CAHN,EAqDGvG,GACC4F,EAAA,MAAA,CAAK,UAAU,2BAAf,WACE,MAAA,CAAK,UAAU,iCAAf,SAAA,CACEA,EAACY,EAAD,CAAK,SAAS,eAAe,aAAc,GAAI,cAAe,GAAI,UAAU,gBAA5E,CAAA,EACCxH,EAAMyH,sBAAsB,KAAA,CAAI,UAAU,mCAAd,SAAkDzH,EAAMyH,kBAAAA,CAFvF,EAGGvG,GACC0F,EAAA,MAAA,CACE,IAAKhF,EACL,UAAU,uCACV,wBAAyB,CAAE8F,OAAQxG,CAAV,CAAA,CAP/B,CAAA,CAAA,CAAA,CAAA,CADF,EAeDP,GAAaiG,EAACe,EAAD,CAAO,SAAU7G,EAAc,iBAAkB,IAAMoE,EAAc,GAAI,EAAL,CAAA,CArEpF,CAAA,CAAA,CADF,CAyED"}