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 { 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";
// ============================|| FIREBASE - REGISTER ||============================ //
const CustomFormWizard = (props) => {
const location = useLocation();
const theme = useTheme();
const [iAmSmartData, setIAmSmartData] = useState({});
const [checkUpload, setCheckUpload] = useState(false);
const [isLoading, setLoding] = useState(true);
const [captcha, setCaptcha] = useState([]);
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 address4ComboList = ComboData.district;
const address5ComboList = ComboData.country;
const termsAndCon = "此網址由香港特別行政區政府物流服務署製作及管理。本署會盡力確保網址上的資料無誤,\n"
+ "但有絕對酌情權隨時刪除、暫停登載或編輯各項資料而無須給予任何理由。\n由於任何與網址"
+ "內資料有關的理由或原因,而導致出現申索、損失或損害,本署概不負責。\n使用者須自行評"
+ "估本網址所載或與本網址有關連的各項資料,並應在根據該等資料行事前,參照印行的香港"
+ "特別行政區憲報以核實該等資料,以及徵詢獨立意見。\n版權公告本網頁的內容,包括但不限"
+ "於所有文本、平面圖像、圖畫、圖片、照片以及數據或其他資料的匯編,均受版權保障。\n香"
+ "港特別行政區政府是本網頁內所有版權作品的擁有人,除非預先得到政府物流服務署的書面"
+ "授權,否則嚴禁複製、改編、分發、發布或向公眾提供該等版權作品。"
useEffect(() => {
location.state?.responseData ?? {}
onCaptchaChange();
responseToData();
}, []);
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 = props.state.responseData;
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 ? str + ", " : "";
});
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("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 },
onSuccess: (responseData) => {
localStorage.setItem("checkCode", responseData.checkCode);
localStorage.setItem("base64Url", responseData.base64Url);
setCaptcha(localStorage.getItem('checkCode'));
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;
onCaptchaChange();
checkDataField(values)
}, [props.step])
const { handleSubmit } = useForm({})
const _onSubmit = () => {
setLoding(true);
values.address4 = selectedAddress4
values.address5 = selectedAddress5
const userAddress = {
"addressLine1": "",
"addressLine2": "",
"addressLine3": "",
"district": "",
"country": ""
};
userAddress.addressLine1 = values.address1
userAddress.addressLine2 = values.address2
userAddress.addressLine3 = values.address3
userAddress.district = values.address4
userAddress.country = values.address5
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 == captcha;
}
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(255).required(displayErrorMsg('請輸入第一行地址')),
address2: yup.string().max(255).required(displayErrorMsg('請輸入第二行地址')),
address3: yup.string().max(255).required(displayErrorMsg('請輸入第三行地址')),
email: yup.string().email(displayErrorMsg('請輸入電郵格式')).max(255).required(displayErrorMsg('請輸入電郵')),
emailConfirm: yup.string().email(displayErrorMsg('請輸入電郵格式')).max(255).required(displayErrorMsg('請輸入電郵')).oneOf([yup.ref('email'), null], displayErrorMsg('請輸入相同電郵')),
phoneCountryCode: yup.string().min(2, displayErrorMsg('請輸入最少2位數字')).required(displayErrorMsg('請輸入國際區號')),
phone: yup.string().min(8, displayErrorMsg('請輸入最少8位數字')).required(displayErrorMsg('請輸入聯絡電話')),
captchaField: yup.string().required(displayErrorMsg('請輸入驗證')).oneOf([captcha], displayErrorMsg('請輸入有效驗證')),
}),
});
const { values } = formik
useEffect(() => {
checkDataField(values)
}, [values])
return (
);
}
export default CustomFormWizard;