diff --git a/src/pages/authentication/auth-forms/BusCustomFormWizard.js b/src/pages/authentication/auth-forms/BusCustomFormWizard.js index 62e04b6..866d7cb 100644 --- a/src/pages/authentication/auth-forms/BusCustomFormWizard.js +++ b/src/pages/authentication/auth-forms/BusCustomFormWizard.js @@ -183,17 +183,21 @@ const BusCustomFormWizard = (props) => { } }, [checkDistrictBlur]) - const handleCheckDistrict = async () => { + const handleCheckDistrict = () => { setDistrictErrStr(""); + if (selectedAddress5?.type === "hongKong") { - if (selectedAddress4 == null || selectedAddress4 == "" || selectedAddress4 == {}){ - setCheckDistrict(true) - setDistrictErrStr(getRequiredErrStr("district")) - }else { - setCheckDistrict(false) + if (!selectedAddress4 || Object.keys(selectedAddress4).length === 0) { + setCheckDistrict(true); + setDistrictErrStr(getRequiredErrStr("district")); + return false; } } - } + + setCheckDistrict(false); + return true; + }; + function getRequiredErrStr(fieldname){ return displayErrorMsg(intl.formatMessage({ id: 'require'},{fieldname:fieldname?intl.formatMessage({ id: fieldname}):""})); @@ -217,8 +221,12 @@ const BusCustomFormWizard = (props) => { } const checkDataField = (data) => { - // console.log(data.brExpiryDate) - if ( + const districtValid = + selectedAddress5?.type !== "hongKong" || + (selectedAddress4 && Object.keys(selectedAddress4).length > 0); + + + const valid = handleCaptcha(data.captchaField) && data.username !== "" && data.password !== "" && @@ -242,19 +250,15 @@ const BusCustomFormWizard = (props) => { handlePhone(data.phone) && handleUserName(data.username) && handleBrNo(data.brNo) && - handleCheckDistrict()&& - !checkUsername&& - !checkEmail&& - !checkDistrict - ) { - setisValid(true) - return isValid - } else { - setisValid(false) - return isValid - } + districtValid && + !checkUsername && + !checkEmail; + + setisValid(valid); }; + + const handleCheckBoxChange = (event) => { // console.log(event.target) if (event.target.name == 'termsAndConAccept') { @@ -358,7 +362,18 @@ const BusCustomFormWizard = (props) => { const { handleSubmit } = useForm({}) const _onSubmit = () => { + if (!handleCheckDistrict()) { + setLoding(false); + return; + } + + if (!isValid) { + setLoding(false); + return; + } + setLoding(true); + values.address4 = selectedAddress4==null?"":selectedAddress4.type values.address5 = selectedAddress5.type // console.log(values) @@ -608,6 +623,15 @@ const BusCustomFormWizard = (props) => { checkDataField(values) }, [values]) + useEffect(() => { + if ( + selectedAddress5?.type === "hongKong" && + values?.captchaField?.length === 5 + ) { + handleCheckDistrict(); + } + }, [values?.captchaField, selectedAddress5, selectedAddress4]); + return (
diff --git a/src/pages/authentication/auth-forms/CustomFormWizard.js b/src/pages/authentication/auth-forms/CustomFormWizard.js index 666a4b9..55e4dd6 100644 --- a/src/pages/authentication/auth-forms/CustomFormWizard.js +++ b/src/pages/authentication/auth-forms/CustomFormWizard.js @@ -197,17 +197,21 @@ const CustomFormWizard = (props) => { } } - const handleCheckDistrict = async () => { + const handleCheckDistrict = () => { setDistrictErrStr(""); + if (selectedAddress5?.type === "hongKong") { - if (selectedAddress4 == null || selectedAddress4 == "" || selectedAddress4 == {}){ - setCheckDistrict(true) - setDistrictErrStr(getRequiredErrStr("district")) - }else { - setCheckDistrict(false) + if (!selectedAddress4 || Object.keys(selectedAddress4).length === 0) { + setCheckDistrict(true); + setDistrictErrStr(getRequiredErrStr("district")); + return false; } } - } + + setCheckDistrict(false); + return true; + }; + useEffect(() => { if (username) { @@ -313,46 +317,43 @@ const CustomFormWizard = (props) => { } const checkDataField = (data) => { - // console.log(data) - if ( + const districtValid = + selectedAddress5?.type !== "hongKong" || + (selectedAddress4 && Object.keys(selectedAddress4).length > 0); + + + const valid = handleCaptcha(data.captchaField) && data.username !== "" && data.password !== "" && data.confirmPassword !== "" && - data.password == data.confirmPassword && + data.password === data.confirmPassword && selectedIdDocType.type !== "" && data.idNo !== "" && - // (data.enName !== "" || selectedIdDocType.type === "CNID") && - // data.chName !== "" && handleName(data.enName, data.chName) && data.address1 !== "" && data.email !== "" && data.emailConfirm !== "" && - data.email == data.emailConfirm && + data.email === data.emailConfirm && data.phone !== "" && data.phoneCountryCode !== "" && - termsAndConAccept == true && + termsAndConAccept === true && fileList.length !== 0 && - // data.captchaField && handlePassword(data.password) && handleEmail(data.email) && handleIdNo(data.idNo, selectedIdDocType.type, data.checkDigit) && handlePhone(data.phone) && handleUsername(data.username) && - handleCheckDistrict()&& + districtValid && !checkUsername && !checkEmail && - !checkIdDocNumber&& - !checkDistrict - ) { - setisValid(true) - return isValid - } else { - setisValid(false) - return isValid - } + !checkIdDocNumber; + + setisValid(valid); }; + + const handleCheckBoxChange = (event) => { if (event.target.name == 'termsAndConAccept') { setTermsAndConAccept(event.target.checked) @@ -449,14 +450,28 @@ const CustomFormWizard = (props) => { // }, [selectedAddress4, selectedAddress5]) useEffect(() => { - props.step == 2 ? _onSubmit() : null; - if (captchaImg == "") - onCaptchaChange(); - checkDataField(values) - }, [props.step]) + if (props.step == 2) { + handleCheckDistrict(); + _onSubmit(); + } + if (captchaImg == "") onCaptchaChange(); + checkDataField(values); + }, [props.step]); + const { handleSubmit } = useForm({}) const _onSubmit = () => { + // hard stop + if (!handleCheckDistrict()) { + setLoding(false); + return; + } + + if (!isValid) { + setLoding(false); + return; + } + setLoding(true); values.idDocType = selectedIdDocType.type values.address4 = selectedAddress4 == null ? "" : selectedAddress4.type @@ -838,6 +853,15 @@ const CustomFormWizard = (props) => { const { values } = formik + useEffect(() => { + if ( + selectedAddress5?.type === "hongKong" && + values?.captchaField?.length === 5 + ) { + handleCheckDistrict(); + } + }, [values?.captchaField, selectedAddress5, selectedAddress4]); + useEffect(() => { checkDataField(values) }, [values]) @@ -1404,6 +1428,9 @@ const CustomFormWizard = (props) => { getOptionLabel={(option) => option.type ? intl.formatMessage({ id: option.type }) : ""} onChange={(event, newValue) => { setSelectedAddress4(newValue); + + setCheckDistrict(false); + setDistrictErrStr(""); }} sx={{ '& .MuiInputBase-root': { alignItems: 'center' }, diff --git a/src/pages/authentication/auth-forms/IAmSmartFormWizard.js b/src/pages/authentication/auth-forms/IAmSmartFormWizard.js index 4306516..e51747a 100644 --- a/src/pages/authentication/auth-forms/IAmSmartFormWizard.js +++ b/src/pages/authentication/auth-forms/IAmSmartFormWizard.js @@ -1,19 +1,19 @@ -import { useEffect, useState, lazy } from 'react'; +import { useEffect, useState, } from 'react'; // material-ui import { - Button, - FormHelperText, - Grid, - IconButton, - InputLabel, - OutlinedInput, - Stack, - Typography, - FormGroup, - TextField, - Checkbox + Button, + FormHelperText, + Grid, IconButton, + InputLabel, OutlinedInput, + Stack, + Typography, + FormGroup, + TextField, + Checkbox + // MenuItem } from '@mui/material'; +import { useForm, } from 'react-hook-form' import Autocomplete from "@mui/material/Autocomplete"; // third party @@ -26,6 +26,7 @@ import { POST_IAMSMART_USER_REGISTER, POST_CAPTCHA, POST_USER_EMAIL } from "util import * as ComboData from "utils/ComboData"; import Loadable from 'components/Loadable'; +import { lazy } from 'react'; const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; @@ -33,1131 +34,1237 @@ import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; import iAmSmartICon from 'assets/images/icons/icon_iAmSmart.png'; import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons'; -import { Link, useLocation } from 'react-router-dom'; +import { Link } from 'react-router-dom'; import * as HttpUtils from "../../../utils/HttpUtils"; import LoopIcon from '@mui/icons-material/Loop'; import { useTheme } from '@mui/material/styles'; +import { useLocation } from "react-router-dom"; import { FormattedMessage, useIntl } from "react-intl"; -const IAmSmartFormWizard = (props) => { - const location = useLocation(); - const theme = useTheme(); - const intl = useIntl(); - const { locale } = intl; - - const [iAmSmartData, setIAmSmartData] = useState({}); - - const [checkUpload, setCheckUpload] = useState(false); - const [isLoading, setLoding] = useState(true); - const [isLoadingData, setLodingData] = useState(true); - - const [captchaImg, setCaptchaImage] = useState(""); - const [base64Url, setBase64Url] = useState(""); - const [checkCode, setCheckCode] = useState(""); - - const [selectedAddress4, setSelectedAddress4] = useState(null); - const [selectedAddress5, setSelectedAddress5] = useState(ComboData.country[0]); // usually hongKong - const [termsAndConAccept, setTermsAndConAccept] = useState(false); - const [termsAndConNotAccept, setTermsAndConNotAccept] = useState(false); - - const [isValid, setisValid] = useState(false); - - const [checkCountry, setCheckCountry] = useState(false); - - // email duplication - const [checkEmail, setCheckEmail] = useState(false); +// ============================|| FIREBASE - REGISTER ||============================ // + +const CustomFormWizard = (props) => { + const location = useLocation(); + const theme = useTheme(); + const intl = useIntl(); + const { locale } = intl; + + const [iAmSmartData, setIAmSmartData] = useState({}); + + const [checkUpload, setCheckUpload] = useState(false); + const [isLoading, setLoding] = useState(true); + const [isLoadingData, setLodingData] = useState(true); + + const [captchaImg, setCaptchaImage] = useState(""); + + const [selectedAddress4, setSelectedAddress4] = useState(null); + const [selectedAddress5, setSelectedAddress5] = useState(ComboData.country[0]); + const [termsAndConAccept, setTermsAndConAccept] = useState(false); + const [termsAndConNotAccept, setTermsAndConNotAccept] = useState(false); + const [isValid, setisValid] = useState(false); + const [checkCountry, setCheckCountry] = useState(false); + const email = document.getElementById("email-login") + const [checkEmail, setCheckEmail] = useState(false) + const [checkEmailBlur, setCheckEmailBlur] = useState(false) + const district = document.getElementById("address4-combo") + const [checkDistrict, setCheckDistrict] = useState(false) + const [checkDistrictBlur, setCheckDistrictBlur] = useState(false) + const [districtErrStr, setDistrictErrStr] = useState("") + + const address4ComboList = ComboData.district; + const address5ComboList = ComboData.country; + const [showId, setshowId] = useState(false); + const [showComId, setshowComId] = useState(false); + + const [base64Url, setBase64Url] = useState("") + const [checkCode, setCheckCode] = useState("") + + useEffect(() => { + location.state?.responseData ?? window.location.assign("/login"); + if (captchaImg == "") + onCaptchaChange(); + responseToData(); + }, []); + + useEffect(() => { + if ( + selectedAddress5?.type === "hongKong" && + values?.captchaField?.length === 5 + ) { + handleCheckDistrict(); + } + }, [values?.captchaField, selectedAddress5, selectedAddress4]); + + const handleClickShowId = () => { + setshowId(!showId); + }; - // district validation UI - const [checkDistrict, setCheckDistrict] = useState(false); - const [districtErrStr, setDistrictErrStr] = useState(""); + const handleMouseDownId = (event) => { + event.preventDefault(); + }; - const [showId, setshowId] = useState(false); - const [showComId, setshowComId] = useState(false); + const handleClickShowComId = () => { + setshowComId(!showId); + }; - const address4ComboList = ComboData.district; - const address5ComboList = ComboData.country; + const handleMouseDownComId = (event) => { + event.preventDefault(); + }; - const handleClickShowId = () => setshowId(!showId); - const handleMouseDownId = (event) => event.preventDefault(); + useEffect(() => { + if (district) { + district.addEventListener("blur", function () { + setCheckDistrictBlur(true) + }) + } + }, [district]) + + useEffect(() => { + if (checkDistrictBlur) { + handleCheckDistrict() + setCheckDistrictBlur(false) + } + }, [checkDistrictBlur]) + + const handleCheckDistrict = () => { + setDistrictErrStr(""); + + if (selectedAddress5?.type === "hongKong") { + if (!selectedAddress4 || Object.keys(selectedAddress4).length === 0) { + setCheckDistrict(true); + setDistrictErrStr(getRequiredErrStr("district")); + return false; + } + } + + setCheckDistrict(false); + return true; + }; - const handleClickShowComId = () => setshowComId(!showComId); - const handleMouseDownComId = (event) => event.preventDefault(); - // ===== Helpers ===== - function displayErrorMsg(errorMsg) { - return {errorMsg}; - } - function getRequiredErrStr(fieldname) { - return displayErrorMsg( - intl.formatMessage( - { id: 'require' }, - { fieldname: fieldname ? intl.formatMessage({ id: fieldname }) : "" } - ) - ); - } - - function getMaxErrStr(num, fieldname) { - return displayErrorMsg( - intl.formatMessage( - { id: 'noMoreThenNWords' }, - { num: num, fieldname: fieldname ? intl.formatMessage({ id: fieldname }) + ": " : "" } - ) - ); - } + function getRequiredErrStr(fieldname) { + return displayErrorMsg(intl.formatMessage({ id: 'require' }, { fieldname: fieldname ? intl.formatMessage({ id: fieldname }) : "" })); + } - function handlePhone(phone) { - return (phone || "").length >= 8; - } + function getMaxErrStr(num, fieldname) { + return displayErrorMsg(intl.formatMessage({ id: 'noMoreThenNWords' }, { num: num, fieldname: fieldname ? intl.formatMessage({ id: fieldname }) + ": " : "" })); + } - function handleCaptcha(captchaField) { - return (captchaField || "").length === 5; - } - function handleEmail(email) { - const validRegex = - /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; - return !!email?.match(validRegex); - } + const responseToData = () => { + //let rd = JSON.parse("{\"emailAddress\":\"test@gmail.com\",\"postalAddress\":{\"EngPremisesAddress\":{\"EngDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"TSING YI\"},\"EngEstate\":{\"EstateName\":\"Cheung Hang Estate\",\"EngPhase\":{\"PhaseName\":\"N/A\"}},\"BuildingName\":\"Hang Lai House\",\"EngBlock\":{\"BlockDescriptor\":\"Block\",\"BlockNo\":\"2\"},\"Region\":\"NT\",\"EngStreet\":{\"StreetName\":\"Liu To Road\",\"BuildingNoFrom\":\"6\"},\"Eng3dAddress\":{\"EngFloor\":{\"FloorNum\":\"33\"},\"EngUnit\":{\"UnitDescriptor\":\"Room\",\"UnitNo\":\"3301\"}}}},\"mobileNumber\":{\"CountryCode\":\"852\",\"SubscriberNumber\":\"99999999\"},\"residentialAddress\":{\"ChiPremisesAddress\":{\"Chi3dAddress\":{\"ChiUnit\":{\"UnitDescriptor\":\"室\",\"UnitNo\":\"1010\"},\"ChiFloor\":{\"FloorNum\":\"10\"}},\"ChiBlock\":{\"BlockDescriptor\":\"座\",\"BlockNo\":\"2\"},\"BuildingName\":\"亨麗樓(第2座)\",\"ChiDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"青衣\"},\"Region\":\"新界\",\"ChiEstate\":{\"EstateName\":\"長亨邨\"},\"ChiStreet\":{\"StreetName\":\"寮肚路\",\"BuildingNoFrom\":\"6\"}}},\"enName\":{\"UnstructuredName\":\"Testing Co One\"},\"idNo\":{\"Identification\":\"G561107\",\"CheckDigit\":\"4\"},\"chName\":{\"ChineseName\":\"測試商一\"}}"); + let rd = JSON.parse(location.state?.responseData.data); + let data = { + "enName": rd?.enName?.UnstructuredName ?? "", + "chName": rd?.chName?.ChineseName ?? "", + "idNo": rd?.idNo?.Identification ?? "", + "checkDigit": rd?.idNo?.CheckDigit ?? "", + "email": rd?.emailAddress ?? "", + "phone": rd?.mobileNumber?.SubscriberNumber ?? "", + "phoneCountryCode": rd?.mobileNumber?.CountryCode ?? "", + }; + + if (rd?.postalAddress) { + if (rd?.postalAddress?.EngPremisesAddress) { + data["address1"] = getAddressEng(rd?.postalAddress?.EngPremisesAddress); + } else if (rd.postalAddress.ChiPremisesAddress) { + data["address1"] = getAddressChi(rd?.postalAddress?.ChiPremisesAddress); + } + } else if (rd?.residentialAddress) { + if (rd?.residentialAddress?.EngPremisesAddress) { + data["address1"] = getAddressEng(rd?.residentialAddress?.EngPremisesAddress); + } else if (rd?.residentialAddress?.ChiPremisesAddress) { + data["address1"] = getAddressChi(rd?.residentialAddress?.ChiPremisesAddress); + } + } + + setIAmSmartData(data); - // ===== District validation (FIX #1) ===== - const isDistrictRequired = () => selectedAddress5?.type === "hongKong"; + } - const validateDistrict = () => { - setDistrictErrStr(""); - if (!isDistrictRequired()) { - setCheckDistrict(false); - return true; + const getAddressEng = (pAdd) => { + let unit = (pAdd.Eng3dAddress?.EngUnit?.UnitDescriptor ?? "") + " " + (pAdd.Eng3dAddress?.EngUnit?.UnitNo ?? ""); + let block = (pAdd.EngBlock?.BlockDescriptor ?? "") + " " + (pAdd.EngBlock?.BlockNo ?? ""); + let floor = pAdd.Eng3dAddress?.EngFloor?.FloorNum ? pAdd.Eng3dAddress?.EngFloor?.FloorNum + "/F " : ""; + let street = (pAdd.EngStreet?.EngUnit?.UnitDescriptor ?? "") + " " + (pAdd.Eng3dAddress?.EngUnit?.UnitNo ?? ""); + //let region = pAdd.Region ?? ""; + let buildingName = pAdd.BuildingName ?? ""; + let estate = pAdd.EngEstate?.EstateName ?? ""; + let district = pAdd.EngDistrict["Sub - district"] ?? ""; + return getAddressStr([unit, block, floor, buildingName, estate, street, district]); } - const ok = !!selectedAddress4?.type; - setCheckDistrict(!ok); - setDistrictErrStr(ok ? "" : getRequiredErrStr("district")); - return ok; - }; - - // Run district validation whenever district/country changes - useEffect(() => { - validateDistrict(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedAddress4, selectedAddress5]); - - // ===== Email duplication check (FIX #2) ===== - const checkEmailDuplicate = async (email) => { - const value = (email || "").trim(); - if (!value) return false; - if (!handleEmail(value)) return false; - - try { - const response = await axios.post(`${POST_USER_EMAIL}`, { e1: value }); - return Number(response.data?.[0]) === 1; - } catch (e) { - // choose: do not block if API fails (keeps old behavior) - return false; + const getAddressChi = (pAdd) => { + let unit = (pAdd.Chi3dAddress?.ChiUnit?.UnitDescriptor ?? "") + " " + (pAdd.Chi3dAddress?.ChiUnit?.UnitNo ?? ""); + let block = (pAdd.ChiBlock?.BlockDescriptor ?? "") + " " + (pAdd.ChiBlock?.BlockNo ?? ""); + let floor = pAdd.Chi3dAddress?.ChiFloor?.FloorNum ? pAdd.Chi3dAddress?.ChiFloor?.FloorNum + "樓 " : ""; + let street = (pAdd.ChiStreet?.ChiUnit?.UnitDescriptor ?? "") + " " + (pAdd.Chi3dAddress?.ChiUnit?.UnitNo ?? ""); + //let region = pAdd.Region ?? ""; + let buildingName = pAdd.BuildingName ?? ""; + let estate = pAdd.ChiEstate?.EstateName ?? ""; + let district = pAdd.ChiDistrict["Sub - district"] ?? ""; + return getAddressStr([district, street, estate, buildingName, street, floor, block, unit]); } - }; - - // ===== Captcha ===== - const onCaptchaChange = () => { - HttpUtils.post({ - url: POST_CAPTCHA, - params: { width: 130, height: 40, captcha: captchaImg }, - onSuccess: (responseData) => { - props.setBase64Url(responseData.base64Url); - setBase64Url(responseData.base64Url); - localStorage.setItem("base64Url", responseData.base64Url); - setCaptchaImage(localStorage.getItem('base64Url')); - } - }); - }; - // ===== iAM Smart data mapping ===== - const getAddressStr = (strs) => { - let add = ""; - strs.forEach(str => { - add += str?.trim() ? str.trim() + ", " : ""; - }); - add = add.trim(); - if (add?.slice(-1) === ",") add = add.substring(0, add.length - 1); - return add; - }; - - const getAddressEng = (pAdd) => { - let unit = (pAdd.Eng3dAddress?.EngUnit?.UnitDescriptor ?? "") + " " + (pAdd.Eng3dAddress?.EngUnit?.UnitNo ?? ""); - let block = (pAdd.EngBlock?.BlockDescriptor ?? "") + " " + (pAdd.EngBlock?.BlockNo ?? ""); - let floor = pAdd.Eng3dAddress?.EngFloor?.FloorNum ? pAdd.Eng3dAddress?.EngFloor?.FloorNum + "/F " : ""; - let street = (pAdd.EngStreet?.StreetName ?? "") + " " + (pAdd.EngStreet?.BuildingNoFrom ?? ""); - let buildingName = pAdd.BuildingName ?? ""; - let estate = pAdd.EngEstate?.EstateName ?? ""; - // NOTE: your original key had weird spacing; keep safe access - let district = pAdd.EngDistrict?.["Sub - district"] ?? pAdd.EngDistrict?.["Sub-district"] ?? ""; - return getAddressStr([unit, block, floor, buildingName, estate, street, district]); - }; - - const getAddressChi = (pAdd) => { - let unit = (pAdd.Chi3dAddress?.ChiUnit?.UnitDescriptor ?? "") + " " + (pAdd.Chi3dAddress?.ChiUnit?.UnitNo ?? ""); - let block = (pAdd.ChiBlock?.BlockDescriptor ?? "") + " " + (pAdd.ChiBlock?.BlockNo ?? ""); - let floor = pAdd.Chi3dAddress?.ChiFloor?.FloorNum ? pAdd.Chi3dAddress?.ChiFloor?.FloorNum + "樓 " : ""; - let street = (pAdd.ChiStreet?.StreetName ?? "") + " " + (pAdd.ChiStreet?.BuildingNoFrom ?? ""); - let buildingName = pAdd.BuildingName ?? ""; - let estate = pAdd.ChiEstate?.EstateName ?? ""; - let district = pAdd.ChiDistrict?.["Sub - district"] ?? pAdd.ChiDistrict?.["Sub-district"] ?? ""; - return getAddressStr([district, street, estate, buildingName, floor, block, unit]); - }; - - const responseToData = () => { - const raw = location.state?.responseData?.data; - if (!raw) return; - - let rd; - try { - rd = JSON.parse(raw); - } catch (e) { - return; + const getAddressStr = (strs) => { + let add = "" + strs.forEach(str => { + add += str.trim() ? str.trim() + ", " : ""; + }); + add = add.trim(); + if (add?.slice(- 1) == ",") { + add = add.substring(0, add.length - 1); + } + return add; } - let data = { - enName: rd?.enName?.UnstructuredName ?? "", - chName: rd?.chName?.ChineseName ?? "", - idNo: rd?.idNo?.Identification ?? "", - checkDigit: rd?.idNo?.CheckDigit ?? "", - email: rd?.emailAddress ?? "", - phone: rd?.mobileNumber?.SubscriberNumber ?? "", - phoneCountryCode: rd?.mobileNumber?.CountryCode ?? "", - address1: "" + const handleCheckEmail = async () => { + if (values?.email) { + if (handleEmail(values.email)) { + const response = await axios.post(`${POST_USER_EMAIL}`, { + e1: values.email, + }); + setCheckEmail((Number(response.data[0]) === 1)); + return Number(response.data[0]) === 1; + } + } }; - if (rd?.postalAddress) { - if (rd?.postalAddress?.EngPremisesAddress) { - data.address1 = getAddressEng(rd?.postalAddress?.EngPremisesAddress); - } else if (rd?.postalAddress?.ChiPremisesAddress) { - data.address1 = getAddressChi(rd?.postalAddress?.ChiPremisesAddress); - } - } else if (rd?.residentialAddress) { - if (rd?.residentialAddress?.EngPremisesAddress) { - data.address1 = getAddressEng(rd?.residentialAddress?.EngPremisesAddress); - } else if (rd?.residentialAddress?.ChiPremisesAddress) { - data.address1 = getAddressChi(rd?.residentialAddress?.ChiPremisesAddress); - } - } - setIAmSmartData(data); - }; - - useEffect(() => { - // redirect if no iAM Smart response - location.state?.responseData ?? window.location.assign("/login"); - - if (!captchaImg) onCaptchaChange(); - responseToData(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - // ===== Formik ===== - const formik = useFormik({ - initialValues: { - email: iAmSmartData.email ?? "", - emailConfirm: iAmSmartData.email ?? "", - address1: iAmSmartData.address1 ?? "", - address2: '', - address3: '', - phone: iAmSmartData.phone ?? "", - phoneCountryCode: iAmSmartData.phoneCountryCode ?? "852", - submit: null, - fax: '', - faxCountryCode: '852', - captchaField: '' - }, - validationSchema: yup.object().shape({ - address1: yup.string().max(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), - address2: yup.string().max(40), - address3: yup.string().max(40), - email: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))), - emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)) - .required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))) - .oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({ id: 'validSameEmail' }))), - phoneCountryCode: yup.string().min(2, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast2Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))), - phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), - captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))).min(5, displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))) - }) - }); - - const { values } = formik; - - // Apply iAM Smart data to form - useEffect(() => { - if (iAmSmartData) { - formik.setFieldValue("enName", iAmSmartData.enName ?? ""); - formik.setFieldValue("chName", iAmSmartData.chName ?? ""); - formik.setFieldValue("idNo", iAmSmartData.idNo ?? ""); - formik.setFieldValue("checkDigit", iAmSmartData.checkDigit ?? ""); - formik.setFieldValue("email", iAmSmartData.email ?? ""); - formik.setFieldValue("emailConfirm", iAmSmartData.email ?? ""); - formik.setFieldValue("phone", iAmSmartData.phone ?? ""); - formik.setFieldValue("phoneCountryCode", iAmSmartData.phoneCountryCode ?? ""); - formik.setFieldValue("address1", iAmSmartData.address1 ?? ""); - - props.setIdNo(iAmSmartData.idNo ?? ""); - setLodingData(false); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [iAmSmartData]); - - // ===== Validity check (FIX #3: no stale return) ===== - const checkDataField = (data) => { - const ok = - data.address1 !== "" && - data.email !== "" && - data.emailConfirm !== "" && - data.email === data.emailConfirm && - data.phone !== "" && - data.phoneCountryCode !== "" && - termsAndConAccept === true && - handleEmail(data.email) && - handlePhone(data.phone) && - handleCaptcha(data.captchaField) && - validateDistrict() && - !checkEmail && - !checkDistrict; - - setisValid(ok); - return ok; - }; - - // keep parent updated - useEffect(() => { - props.setUpdateValid(isValid); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isValid]); - - // re-check on relevant changes - useEffect(() => { - checkDataField(values); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [values, selectedAddress4, selectedAddress5, termsAndConAccept, termsAndConNotAccept, checkEmail, checkDistrict]); - - const handleCheckBoxChange = (event) => { - if (event.target.name === 'termsAndConAccept') { - setTermsAndConAccept(event.target.checked); - setTermsAndConNotAccept(!event.target.checked); - } - if (event.target.name === 'termsAndConNotAccept') { - setTermsAndConNotAccept(event.target.checked); - setTermsAndConAccept(!event.target.checked); + useEffect(() => { + if (email) { + email.addEventListener("blur", function () { + setCheckEmailBlur(true) + }) + } + }, [email]) + + useEffect(() => { + if (checkEmailBlur) { + handleCheckEmail() + setCheckEmailBlur(false) + } + }, [checkEmailBlur]) + + useEffect(() => { + if (iAmSmartData) { + formik.setFieldValue("enName", iAmSmartData.enName ?? ""); + formik.setFieldValue("chName", iAmSmartData.chName ?? ""); + formik.setFieldValue("idNo", iAmSmartData.idNo ?? ""); + formik.setFieldValue("checkDigit", iAmSmartData.checkDigit ?? ""); + formik.setFieldValue("email", iAmSmartData.email ?? ""); + formik.setFieldValue("emailConfirm", iAmSmartData.email ?? ""); + formik.setFieldValue("phone", iAmSmartData.phone ?? ""); + formik.setFieldValue("phoneCountryCode", iAmSmartData.phoneCountryCode ?? ""); + formik.setFieldValue("address1", iAmSmartData.address1 ?? ""); + props.setIdNo(iAmSmartData.idNo ?? ""); + setLodingData(false) + + if (iAmSmartData.email) { + handleCheckEmail(); + } + } + }, [iAmSmartData]) + + const onCaptchaChange = () => { + HttpUtils.post({ + url: POST_CAPTCHA, + params: { width: 130, height: 40, captcha: captchaImg }, + onSuccess: (responseData) => { + props.setBase64Url(responseData.base64Url) + setBase64Url(responseData.base64Url) + localStorage.setItem("base64Url", responseData.base64Url); + setCaptchaImage(localStorage.getItem('base64Url')); + } + }); } - }; - // ===== Submit (FIX #4: force email + district validation before posting) ===== - const _onSubmit = async () => { - setLoding(true); - // force sync validations - const districtOk = validateDistrict(); - - // force email dup check even if user never blurred - const duplicated = await checkEmailDuplicate(values.email); - setCheckEmail(duplicated); + const checkDataField = (data) => { + const districtValid = + selectedAddress5?.type !== "hongKong" || + (selectedAddress4 && Object.keys(selectedAddress4).length > 0); + + + const valid = + data.address1 !== "" && + data.email !== "" && + data.emailConfirm !== "" && + data.email === data.emailConfirm && + data.phone !== "" && + data.phoneCountryCode !== "" && + termsAndConAccept === true && + data.captchaField && + handleEmail(data.email) && + handlePhone(data.phone) && + handleCaptcha(data.captchaField) && + districtValid && + !checkEmail; + + setisValid(valid); + }; - // recompute validity using latest flags - const okNow = checkDataField(values) && districtOk && !duplicated; - if (!okNow) { - setLoding(false); - return; - } - - const userAddress = { - addressLine1: values.address1, - addressLine2: values.address2, - addressLine3: values.address3, - district: selectedAddress4?.type ? selectedAddress4.type : "", - country: selectedAddress5?.type ? selectedAddress5.type : "" + const handleCheckBoxChange = (event) => { + if (event.target.name == 'termsAndConAccept') { + setTermsAndConAccept(event.target.checked) + setTermsAndConNotAccept(!event.target.checked) + } + if (event.target.name == 'termsAndConNotAccept') { + setTermsAndConNotAccept(event.target.checked) + setTermsAndConAccept(!event.target.checked) + } }; - const userFaxNo = { - countryCode: values.faxCountryCode, - faxNumber: values.fax - }; + useEffect(() => { + props.setUpdateValid(isValid) + }, [isValid]) + + useEffect(() => { + checkDataField(values) + }, [ + selectedAddress4, selectedAddress5, + termsAndConAccept, termsAndConNotAccept]) + + useEffect(() => { + if (props.step == 2) { + handleCheckDistrict(); + _onSubmit(); + } + if (captchaImg == "") onCaptchaChange(); + checkDataField(values); + }, [props.step]); + + const { handleSubmit } = useForm({}) + const _onSubmit = async () => { + // hard stop: district + if (!handleCheckDistrict()) { + setLoding(false); + return; + } + + await handleCheckEmail(); + + // hard stop: overall validation (now includes fresh email result) + if (!isValid) { + setLoding(false); + return; + } + + setLoding(true); + + const userAddress = { + "addressLine1": "", + "addressLine2": "", + "addressLine3": "", + "district": "", + "country": "" + }; + userAddress.addressLine1 = values.address1 + userAddress.addressLine2 = values.address2 + userAddress.addressLine3 = values.address3 + userAddress.district = selectedAddress4 == null ? "" : selectedAddress4.type + userAddress.country = selectedAddress5.type + + const userFaxNo = { + "countryCode": values.faxCountryCode, + "faxNumber": values.fax, + }; + const userMobileNumber = { + "countryCode": values.phoneCountryCode, + "phoneNumber": values.phone, + }; + let tncFlag = false; + if (termsAndConAccept) { + tncFlag = true + } + if (termsAndConNotAccept) { + tncFlag = false + } + + const preferLocale = locale === 'en' ? 'en' : locale === 'zh-HK' ? 'zh_HK' : 'zh-CN' + const formData = { + enName: iAmSmartData.enName, + chName: iAmSmartData.chName, + emailAddress: values.email, + idDocType: "HKID", + identification: iAmSmartData.idNo, + checkDigit: iAmSmartData.checkDigit, + tncFlag: tncFlag, + type: "IND", + userFaxNo: JSON.stringify(userFaxNo), + userMobileNumber: JSON.stringify(userMobileNumber), + userAddress: JSON.stringify(userAddress), + captcha: base64Url, + checkCode: checkCode, + preferLocale: preferLocale + }; + + if (isValid) { + axios.post(POST_IAMSMART_USER_REGISTER, formData, { + headers: { + "Content-Type": "multipart/form-data" + } + }) + .then((response) => { + console.log(response) + setCheckUpload(true) + setLoding(false); + }) + .catch(error => { + console.error(error); + setLoding(false); + }); + } else { + setLoding(false); + } + } - const userMobileNumber = { - countryCode: values.phoneCountryCode, - phoneNumber: values.phone - }; + function handlePhone(phone) { + if (phone.length < 8) { + return false; + } else { + return true; + } + } - const tncFlag = termsAndConAccept ? true : false; - - const preferLocale = locale === 'en' ? 'en' : locale === 'zh-HK' ? 'zh_HK' : 'zh-CN'; - - const formData = { - enName: iAmSmartData.enName, - chName: iAmSmartData.chName, - emailAddress: values.email, - idDocType: "HKID", - identification: iAmSmartData.idNo, - checkDigit: iAmSmartData.checkDigit, - tncFlag: tncFlag, - type: "IND", - userFaxNo: JSON.stringify(userFaxNo), - userMobileNumber: JSON.stringify(userMobileNumber), - userAddress: JSON.stringify(userAddress), - captcha: base64Url, - checkCode: checkCode, - preferLocale: preferLocale - }; + function handleCaptcha(captchaField) { + if (captchaField.length == 5) { + return true + } else { + return false + } + } - try { - await axios.post(POST_IAMSMART_USER_REGISTER, formData, { - headers: { "Content-Type": "multipart/form-data" } - }); - setCheckUpload(true); - } catch (error) { - console.error(error); - setCheckUpload(false); - } finally { - setLoding(false); + function handleEmail(email) { + var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; + if (!email.match(validRegex)) { + return false; + } else { + return true; + } } - }; - // Auto-submit when step reaches 2 (existing behavior) - useEffect(() => { - if (props.step === 2) { - _onSubmit(); + function displayErrorMsg(errorMsg) { + return {errorMsg} } - if (!captchaImg) onCaptchaChange(); - checkDataField(values); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.step]); - - const handleCCPChange = (e) => e.preventDefault(); - - return ( - isLoadingData ? ( - - ) : ( - - e.preventDefault()}> - {/* Input Form */} - - - - -
- - - -
- - - 。 - - - iAM Smart - - : - - -
-
- - - - - - - - - - - - - - - - :{" "} - {iAmSmartData.idNo ? iAM Smart : null} - - - - - {iAmSmartData?.idNo?.slice(0, 4)} - {showId ? iAmSmartData?.idNo?.slice(4) : "****"} - {showId ? '(' + iAmSmartData.checkDigit + ')' : null} - - - {showId ? : } - - - - - - - - - - - : {iAmSmartData.enName} - {iAmSmartData.enName ? iAM Smart : null} - - - - - - - - - - {intl.formatMessage({ id: 'userChineseName' })}: {iAmSmartData.chName} - {iAmSmartData.chName ? iAM Smart : null} - - - - - - - - - - - * - - - - - { - if (e.key === 'Enter') e.preventDefault(); - } - }} - /> - {iAmSmartData.address1 !== "" && iAmSmartData.address1 === formik.values.address1 - ? iAM Smart - : null} - - - - { - if (e.key === 'Enter') e.preventDefault(); - } - }} - /> - - - - { - if (e.key === 'Enter') e.preventDefault(); - } - }} - /> - - - {/* District */} - option.type ? intl.formatMessage({ id: option.type }) : ""} - onChange={(event, newValue) => { - setSelectedAddress4(newValue); - }} - onBlur={() => validateDistrict()} - sx={{ - '& .MuiInputBase-root': { alignItems: 'center' }, - '& .MuiAutocomplete-endAdornment': { top: '50%', transform: 'translateY(-50%)' }, - '& .MuiOutlinedInput-root': { height: 40 } - }} - renderInput={(params) => ( - - )} - /> - - {/* Country */} - option.type ? intl.formatMessage({ id: option.type }) : ""} - onChange={(event, newValue) => { - if (newValue !== null) { - setSelectedAddress5(newValue); - if (newValue.type === 'hongKong') { - setCheckCountry(false); - } else { - setSelectedAddress4(null); - setCheckCountry(true); - } - } else { - setSelectedAddress4(null); - setCheckCountry(true); - } - }} - sx={{ - '& .MuiInputBase-root': { alignItems: 'center' }, - '& .MuiAutocomplete-endAdornment': { top: '50%', transform: 'translateY(-50%)' }, - '& .MuiOutlinedInput-root': { height: 40 } - }} - renderInput={(params) => ( - - )} - /> - - {formik.touched.address1 && formik.errors.address1 && ( - - {formik.errors.address1} - - )} - {formik.touched.address2 && formik.errors.address2 && ( - - {formik.errors.address2} - - )} - {formik.touched.address3 && formik.errors.address3 && ( - - {formik.errors.address3} - - )} - {checkDistrict && ( - - {districtErrStr} - - )} - - - - {/* Contact */} - - - - - - - - - - - - - - - - * - - - - - { - setCheckEmail(false); - formik.handleChange(e); - }} - placeholder={intl.formatMessage({ id: 'userContactEmail' })} - onBlur={async (e) => { - formik.handleBlur(e); - const dup = await checkEmailDuplicate(formik.values.email); - setCheckEmail(dup); - }} - inputProps={{ - onKeyDown: (e) => { - if (e.key === 'Enter') e.preventDefault(); - } - }} - /> - {iAmSmartData.email && iAmSmartData.email === formik.values.email - ? iAM Smart - : null} - - - {formik.touched.email && formik.errors.email && ( - - {formik.errors.email} - - )} - {checkEmail && ( - - - - )} - - - - - - - - - * - - - - - { - if (e.key === 'Enter') e.preventDefault(); - } - }} - /> - {iAmSmartData.email && iAmSmartData.email === formik.values.emailConfirm - ? iAM Smart - : null} - - - {formik.touched.emailConfirm && formik.errors.emailConfirm && ( - - {formik.errors.emailConfirm} - - )} - - - - - - {/* Phone/Fax */} - - - - - - - - * - - - - - { - const value = event.target.value; - if (value.match(/[^0-9]/)) return event.preventDefault(); - formik.setFieldValue("phoneCountryCode", value); - }} - placeholder={intl.formatMessage({ id: 'dialingCode' })} - error={Boolean(formik.touched.phone && formik.errors.phone)} - onBlur={formik.handleBlur} - inputProps={{ - maxLength: 3, - onKeyDown: (e) => { - if (e.key === 'Enter') e.preventDefault(); - } - }} - sx={{ width: '25%' }} - /> - { - const value = event.target.value; - if (value.match(/[^0-9]/)) return event.preventDefault(); - formik.setFieldValue("phone", value); - }} - placeholder={intl.formatMessage({ id: 'userContactNumber' })} - error={Boolean(formik.touched.phone && formik.errors.phone)} - onBlur={formik.handleBlur} - inputProps={{ - maxLength: 11, - onKeyDown: (e) => { - if (e.key === 'Enter') e.preventDefault(); - } - }} - fullWidth - /> - {iAmSmartData.phone && iAmSmartData.phone === formik.values.phone && iAmSmartData.phoneCountryCode === formik.values.phoneCountryCode - ? iAM Smart - : null} - - - {formik.touched.phone && formik.errors.phone && ( - - {formik.errors.phone} - - )} - - - - - - - - - - - - - { - const value = event.target.value; - if (value.match(/[^0-9]/)) return event.preventDefault(); - formik.setFieldValue("faxCountryCode", value); - }} - placeholder={intl.formatMessage({ id: 'dialingCode' })} - onBlur={formik.handleBlur} - inputProps={{ - maxLength: 3, - onKeyDown: (e) => { - if (e.key === 'Enter') e.preventDefault(); - } - }} - sx={{ width: '25%' }} - /> - { - const value = event.target.value; - if (value.match(/[^0-9]/)) return event.preventDefault(); - formik.setFieldValue("fax", value); - }} - placeholder={intl.formatMessage({ id: 'userFaxNumber' })} - inputProps={{ - maxLength: 8, - onKeyDown: (e) => { - if (e.key === 'Enter') e.preventDefault(); - } - }} - sx={{ width: '75%' }} - /> - - - - - - - {/* Terms */} - - - - - - * - - - - - -
- - - - - - - - - + + const formik = useFormik({ + initialValues: ({ + email: iAmSmartData.email ?? "", + emailConfirm: iAmSmartData.email ?? "", + address1: iAmSmartData.address1 ?? "", + address2: '', + address3: '', + phone: iAmSmartData.phone ?? "", + phoneCountryCode: iAmSmartData.phoneCountryCode ?? "852", + submit: null, + fax: '', + faxCountryCode: '852', + captchaField: '' + }), + validationSchema: yup.object().shape({ + address1: yup.string().max(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), + address2: yup.string().max(40), + address3: yup.string().max(40), + email: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))), + emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))).oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({ id: 'validSameEmail' }))), + phoneCountryCode: yup.string().min(2, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast2Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))), + phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), + captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))).min(5, displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')), + }), + }); + + const handleCCPChange = (e) => { + e.preventDefault(); + }; + + const { values } = formik + useEffect(() => { + checkDataField(values) + }, [values]) + + useEffect(() => { + if ( + selectedAddress5?.type === "hongKong" && + values?.captchaField?.length === 5 + ) { + handleCheckDistrict(); + } + }, [values?.captchaField, selectedAddress5, selectedAddress4]); + + return ( + isLoadingData ? + : + + + {/* Input Form */} + + + + + + +
+ + + +
+ + + 。 + + iAM Smart: + +
+
+ + + + + + + + + + + + + + + : {iAmSmartData.idNo ? iAM Smart : <>} + {/* {iAmSmartData.idNo + "(" + iAmSmartData.checkDigit + ")"} */} + + + + {iAmSmartData?.idNo?.slice(0, 4)}{showId ? iAmSmartData?.idNo?.slice(4) : "****"}{showId ? '(' + iAmSmartData.checkDigit + ')' : null} + + + {showId ? : } + + + + + + + + + + + : {iAmSmartData.enName}{iAmSmartData.enName ? iAM Smart : <>} + + + + + + + + + + {intl.formatMessage({ id: 'userChineseName' })}: {iAmSmartData.chName}{iAmSmartData.chName ? iAM Smart : <>} + + + + + + + + + + * + + + + + + { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + /> + {iAmSmartData.address1 != "" && iAmSmartData.address1 == formik.values.address1 ? iAM Smart : null} + + + + { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + /> + {iAmSmartData.address2 != "" && iAmSmartData.address2 == formik.values.address2 ? iAM Smart : null} + + + + + { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + /> + {iAmSmartData.address3 != "" && iAmSmartData.address3 == formik.values.address3 ? iAM Smart : null} + + + + option.type ? intl.formatMessage({ id: option.type }) : ""} + onChange={(event, newValue) => { + setSelectedAddress4(newValue); + + setCheckDistrict(false); + setDistrictErrStr(""); + }} + sx={{ + '& .MuiInputBase-root': { alignItems: 'center' }, + '& .MuiAutocomplete-endAdornment': { top: '50%', transform: 'translateY(-50%)' }, + '& .MuiOutlinedInput-root': { height: 40 } + }} + renderInput={(params) => } + /> + option.type ? intl.formatMessage({ id: option.type }) : ""} + onChange={(event, newValue) => { + if (newValue !== null) { + setSelectedAddress5(newValue); + if (newValue.type === 'hongKong') { + setCheckCountry(false) + } else { + setSelectedAddress4(""); + setCheckCountry(true) + } + } else { + setSelectedAddress4(""); + setCheckCountry(true) + } + }} + sx={{ + '& .MuiInputBase-root': { alignItems: 'center' }, + '& .MuiAutocomplete-endAdornment': { top: '50%', transform: 'translateY(-50%)' }, + '& .MuiOutlinedInput-root': { height: 40 } + }} + renderInput={(params) => } + /> + {formik.touched.address1 && formik.errors.address1 && ( + + {formik.errors.address1} + + )} + {formik.touched.address2 && formik.errors.address2 && ( + + {formik.errors.address2} + + )} + {formik.touched.address3 && formik.errors.address3 && ( + + {formik.errors.address3} + + )} + {checkDistrict && ( + + {districtErrStr} + + )} + + + + + + + + + + + + + + + + + * + + + + + + { + setCheckEmail(false); + formik.handleChange(e); + }} + placeholder={intl.formatMessage({ id: 'userContactEmail' })} + onBlur={formik.handleBlur} + inputProps={{ + onKeyDown: (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + /> + {iAmSmartData.email && iAmSmartData.email == formik.values.email ? iAM Smart : null} + + + {formik.touched.email && formik.errors.email && ( + + {formik.errors.email} + + )} + {checkEmail && ( + + + + )} + + + + + + + + * + + + + { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + /> + {iAmSmartData.email && iAmSmartData.email == formik.values.emailConfirm ? iAM Smart : null} + + + {formik.touched.emailConfirm && formik.errors.emailConfirm && ( + + {formik.errors.emailConfirm} + + )} + + + + + + + + + + + + + + * + + + + + { + const value = event.target.value; + if (value.match(/[^0-9]/)) { + return event.preventDefault(); + } + formik.setFieldValue("phoneCountryCode", value); + }} + placeholder={intl.formatMessage({ id: 'dialingCode' })} + error={Boolean(formik.touched.phone && formik.errors.phone)} + onBlur={formik.handleBlur} + inputProps={{ + maxLength: 3, + onKeyDown: (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + sx={{ width: '25%' }} + /> + { + const value = event.target.value; + if (value.match(/[^0-9]/)) { + return event.preventDefault(); + } + formik.setFieldValue("phone", value); + }} + placeholder={intl.formatMessage({ id: 'userContactNumber' })} + error={Boolean(formik.touched.phone && formik.errors.phone)} + onBlur={formik.handleBlur} + inputProps={{ + maxLength: 11, + onKeyDown: (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + fullWidth + /> + {iAmSmartData.phone && iAmSmartData.phone == formik.values.phone && iAmSmartData.phoneCountryCode == formik.values.phoneCountryCode ? iAM Smart : null} + + {formik.touched.phone && formik.errors.phone && ( + + {formik.errors.phone} + + )} + + + + + + + + + + + + + + + { + const value = event.target.value; + if (value.match(/[^0-9]/)) { + return event.preventDefault(); + } + formik.setFieldValue("faxCountryCode", value); + }} + placeholder={intl.formatMessage({ id: 'dialingCode' })} + onBlur={formik.handleBlur} + inputProps={{ + maxLength: 3, + onKeyDown: (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + sx={{ width: '25%' }} + /> + { + const value = event.target.value; + if (value.match(/[^0-9]/)) { + return event.preventDefault(); + } + formik.setFieldValue("fax", value); + }} + placeholder={intl.formatMessage({ id: 'userFaxNumber' })} + inputProps={{ + maxLength: 8, + onKeyDown: (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + } + }, + }} + sx={{ width: '75%' }} + /> + + + + + + + + + + + + + + * + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * + + + + + + + { onCaptchaChange() }}> + + + + + { + const value = event.target.value; + props.setCheckCode(event.target.value); + setCheckCode(event.target.value); + formik.setFieldValue("captchaField", value); + }} + sx={{ width: '75%' }} + /> + + + {formik.touched.captchaField && formik.errors.captchaField && ( + + {formik.errors.captchaField} + + )} + + + + + + + {/* Preview Form */} + + + + +
+ + + +
+
+
+ + + + + + + + {/* + Already have an account? + */} + + + + + + + + + {formik?.values?.idNo?.slice(0, 4)} + {/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} + + + {showComId ? formik?.values?.idNo?.slice(4) : "****"}{showComId ? '(' + formik.values.checkDigit + ')' : null} + {/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} + + + {showComId ? : } + + + + + + + : + + + {formik.values.enName} + + {iAmSmartData.enName ? iAM Smart : <>} + + + + + + : + + + {formik.values.chName} + + + + + + + : + + + + {formik.values.address1} + + {formik.values.address2 != null ? + + {formik.values.address2} + + : null} + {formik.values.address3 != null ? + + {formik.values.address3} + + : null} + {selectedAddress5.type === "hongKong" ? + + {/* + : + */} + + {!selectedAddress4 ? "" : intl.formatMessage({ id: selectedAddress4.type })} + + + : null} + + {/* + : + */} + + {intl.formatMessage({ id: selectedAddress5.type })} + + + + + + + + + + + + + + + + : + + + {formik.values.email} + + + + + + + : + + + +{formik.values.phoneCountryCode} {formik.values.phone} + + + + {formik.values.faxCountryCode != "" && formik.values.fax != "" ? + + + + : + + + +{formik.values.faxCountryCode} {formik.values.fax} + + + + : null} + -
- - - - - {/* Captcha */} - - - - - - * - - - - - - - - { onCaptchaChange(); }}> - - - - - { - const value = event.target.value; - props.setCheckCode(value); - setCheckCode(value); - formik.setFieldValue("captchaField", value); - }} - sx={{ width: '75%' }} - /> - - - - {formik.touched.captchaField && formik.errors.captchaField && ( - - {formik.errors.captchaField} - - )} - - - - - - -
- - {/* Preview Form */} - - - - -
- - - -
-
-
- - - - - - - - - - {iAmSmartData?.idNo?.slice(0, 4)} - - - {showComId ? iAmSmartData?.idNo?.slice(4) : "****"} - {showComId ? '(' + iAmSmartData.checkDigit + ')' : null} - - - - {showComId ? : } - - - - - - - - : - - - {iAmSmartData.enName} - - {iAmSmartData.enName ? iAM Smart : null} - - - - - - - : - - - {iAmSmartData.chName} - - - - - - - - : - - - {formik.values.address1} - {formik.values.address2 ? {formik.values.address2} : null} - {formik.values.address3 ? {formik.values.address3} : null} - - {selectedAddress5.type === "hongKong" ? ( - - {!selectedAddress4 ? "" : intl.formatMessage({ id: selectedAddress4.type })} - - ) : null} - - - {intl.formatMessage({ id: selectedAddress5.type })} - - - - - - - - - - - - - - - - - : - - {formik.values.email} - - - - - - - : - - - +{formik.values.phoneCountryCode} {formik.values.phone} - - - - - {formik.values.faxCountryCode && formik.values.fax ? ( - - - - : - - - +{formik.values.faxCountryCode} {formik.values.fax} - - - - ) : null} - - -
-
- - {/* Submit page */} - - - {isLoading ? ( - - ) : ( - - {checkUpload ? ( - - - - - - - - - - - ) : ( - - - - - - - - )} - - )} - - - - - ) - ); -}; - -export default IAmSmartFormWizard; + + {/* Submit page */} + + + {isLoading ? + : + + {checkUpload ? + // SUCCESS page + + + + + + + + + + + : + // ERROR page + + {/* */} + + + + + + + } + + } + + + + + ); +} + +export default CustomFormWizard;