import { useEffect, useState, } from 'react';
// material-ui
import {
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
import { useFormik, FormikProvider } from 'formik';
import * as yup from 'yup';
import axios from "axios";
import { POST_IAMSMART_USER_REGISTER, POST_CAPTCHA, GET_USER_EMAIL } from "utils/ApiPathConst";
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';
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 } 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";
// ============================|| FIREBASE - REGISTER ||============================ //
const CustomFormWizard = (props) => {
const location = useLocation();
const theme = useTheme();
const intl = useIntl();
const [iAmSmartData, setIAmSmartData] = useState({});
const [checkUpload, setCheckUpload] = useState(false);
const [isLoading, setLoding] = 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 [districtErrStr, setDistrictErrStr] = useState("")
const address4ComboList = ComboData.district;
const address5ComboList = ComboData.country;
const [showId, setshowId] = useState(false);
const [showComId, setshowComId] = useState(false);
useEffect(() => {
location.state?.responseData ?? {}
if (captchaImg == "")
onCaptchaChange();
responseToData();
}, []);
const handleClickShowId = () => {
setshowId(!showId);
};
const handleMouseDownId = (event) => {
event.preventDefault();
};
const handleClickShowComId = () => {
setshowComId(!showId);
};
const handleMouseDownComId = (event) => {
event.preventDefault();
};
useEffect(() => {
setDistrictErrStr("");
if (selectedAddress5?.type === "hongKong") {
if (selectedAddress4 == null || selectedAddress4 == "" || selectedAddress4 == {})
setDistrictErrStr(getRequiredErrStr("district"))
}
}, [selectedAddress4, selectedAddress5])
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 }) + ": " : "" }));
}
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);
}
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 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]);
}
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 handleCheckEmail = async () => {
if (values?.email) {
const response = await axios.get(`${GET_USER_EMAIL}`, {
params: {
email: values.email,
}
})
setCheckEmail((Number(response.data[0]) === 1))
return Number(response.data[0]) === 1
}
}
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 ?? "");
}
}, [iAmSmartData])
const onCaptchaChange = () => {
HttpUtils.post({
url: POST_CAPTCHA,
params: { width: 130, height: 40, captcha: captchaImg },
onSuccess: (responseData) => {
props.setBase64Url(responseData.base64Url)
localStorage.setItem("base64Url", responseData.base64Url);
setCaptchaImage(localStorage.getItem('base64Url'));
}
});
}
const checkDataField = (data) => {
if (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) &&
!checkEmail
) {
setisValid(true)
return isValid
} else {
setisValid(false)
return isValid
}
};
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(() => {
props.setUpdateValid(isValid)
}, [isValid])
useEffect(() => {
checkDataField(values)
}, [
selectedAddress4, selectedAddress5,
termsAndConAccept, termsAndConNotAccept])
useEffect(() => {
props.step == 2 ? _onSubmit() : null;
if (captchaImg == "")
onCaptchaChange();
checkDataField(values)
}, [props.step])
const { handleSubmit } = useForm({})
const _onSubmit = () => {
setLoding(true);
const userAddress = {
"addressLine1": "",
"addressLine2": "",
"addressLine3": "",
"district": "",
"country": ""
};
userAddress.addressLine1 = values.address1
userAddress.addressLine2 = values.address2
userAddress.addressLine3 = values.address3
values.address4 = selectedAddress4 == null ? "" : selectedAddress4.type
values.address5 = 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 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)
};
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);
}
}
function handlePhone(phone) {
if (phone.length < 8) {
return false;
} else {
return true;
}
}
function handleCaptcha(captchaField) {
return captchaField;
}
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;
}
}
function displayErrorMsg(errorMsg) {
return {errorMsg}
}
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' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')),
}),
});
const { values } = formik
useEffect(() => {
checkDataField(values)
}, [values])
return (
);
}
export default CustomFormWizard;