import { useEffect, useState, } from 'react';
// material-ui
import {
Box,
Button,
FormControl,
FormHelperText,
Grid, IconButton,
InputAdornment,
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";
// project import
// import AnimateButton from 'components/@extended/AnimateButton';
import { strengthColorChi, strengthIndicator } from 'utils/password-strength';
// import {apiPath} from "auth/utils";
import axios from "axios";
import { POST_PUBLIC_USER_REGISTER, POST_CAPTCHA, GET_USERNAME } from "utils/ApiPathConst";
// import * as HttpUtils from 'utils/HttpUtils';
import * as ComboData from "utils/ComboData";
import Loadable from 'components/Loadable';
import { lazy } from 'react';
const UploadFileTable = Loadable(lazy(() => import('./UploadFileTable')));
const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent')));
const PreviewUploadFileTable = Loadable(lazy(() => import('./PreviewUploadFileTable')));
// import UploadFileTable from './UploadFileTable';
// import LoadingComponent from "../../extra-pages/LoadingComponent";
// assets
import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons';
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
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 { Invaild } from 'utils/IconUtils';
// ============================|| FIREBASE - REGISTER ||============================ //
const BusCustomFormWizard = (props) => {
const theme = useTheme()
const [level, setLevel] = useState();
const [showPassword, setShowPassword] = useState(false);
const [showConfirmPassword, setshowConfirmPassword] = useState(false);
const [fileList, setFileList] = useState([]);
const [fileListData, setFileListData] = useState([]);
const [checkUpload, setCheckUpload] = useState(false);
const [isLoading, setLoding] = useState(true);
const [updateRows, setUpdateRows] = useState([]);
const [userNameList, setUserNameList] = useState([]);
const [captcha, setCaptcha] = useState([]);
const [captchaImg, setCaptchaImage] = useState([]);
const handleClickShowPassword = () => {
setShowPassword(!showPassword);
};
const handleClickShowConfirmPassword = () => {
setshowConfirmPassword(!showConfirmPassword);
};
const handleMouseDownPassword = (event) => {
event.preventDefault();
};
const changePassword = (value) => {
const temp = strengthIndicator(value);
setLevel(strengthColorChi(temp));
};
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 address4ComboList = ComboData.district;
const address5ComboList = ComboData.country;
const termsAndCon = "此網址由香港特別行政區政府物流服務署製作及管理。本署會盡力確保網址上的資料無誤,\n"
+ "但有絕對酌情權隨時刪除、暫停登載或編輯各項資料而無須給予任何理由。\n由於任何與網址"
+ "內資料有關的理由或原因,而導致出現申索、損失或損害,本署概不負責。\n使用者須自行評"
+ "估本網址所載或與本網址有關連的各項資料,並應在根據該等資料行事前,參照印行的香港"
+ "特別行政區憲報以核實該等資料,以及徵詢獨立意見。\n版權公告本網頁的內容,包括但不限"
+ "於所有文本、平面圖像、圖畫、圖片、照片以及數據或其他資料的匯編,均受版權保障。\n香"
+ "港特別行政區政府是本網頁內所有版權作品的擁有人,除非預先得到政府物流服務署的書面"
+ "授權,否則嚴禁複製、改編、分發、發布或向公眾提供該等版權作品。"
const refType = "identification";
useEffect(() => {
changePassword('');
// if (localStorage.getItem('checkCode') != null){
// setCaptcha(localStorage.getItem('checkCode'));
// setCaptchaImage(localStorage.getItem('base64Url'));
// localStorage.setItem("checkCode",null);
// localStorage.setItem("base64Url",null);
// }else{
onCaptchaChange();
// }
axios.get(`${GET_USERNAME}`)
.then((response) => {
if (response.status === 200) {
setUserNameList(response.data);
}
})
.catch(error => {
console.log(error);
return false;
});
}, []);
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) => {
// console.log(data.brExpiryDate)
if (data.username !== "" &&
data.password !== "" &&
data.confirmPassword !== "" &&
data.password == data.confirmPassword &&
// (data.enCompanyName !=="" || selectedAddress5 ==="內地")&&
(data.chCompanyName !== "" || data.enCompanyName !== "") &&
data.enName !== "" &&
data.chName !== "" &&
data.address1 !== "" &&
data.email !== "" &&
data.emailConfirm !== "" &&
data.email == data.emailConfirm &&
data.phone !== "" &&
data.phoneCountryCode !== "" &&
termsAndConAccept == true &&
fileList.length !== 0 &&
data.captchaField &&
data.brNo !== "" &&
data.brExpiryDate !== "" &&
handlePassword(data.password) &&
handleEmail(data.email) &&
handlePhone(data.phone) &&
handleUserName(data.username) &&
handleCaptcha(data.captchaField)
) {
setisValid(true)
return isValid
} else {
setisValid(false)
return isValid
}
};
const handleCheckBoxChange = (event) => {
console.log(event.target)
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(() => {
let updateRowList = new DataTransfer();
var updateRowsIndex = updateRows.length;
const saveFileList = [];
if (updateRowsIndex != null) {
for (let i = 0; i < updateRowsIndex; i++) {
const file = updateRows[i]
file.id = i;
updateRowList.items.add(file);
saveFileList.push(file);
}
let updatedFileList = updateRowList.files;
setFileList(updatedFileList);
setFileListData(saveFileList)
}
}, [updateRows]);
const handleFileUpload = (event) => {
let updateList = new DataTransfer();
let currentFileList = fileListData;
const uploadFileList = event.target.files;
const saveFileList = [];
var currentIndex = 0;
if (currentFileList.length != null) {
currentIndex = currentFileList.length;
for (let i = 0; i < currentIndex; i++) {
const file = currentFileList[i]
// file.id = currentIndex;
updateList.items.add(file);
saveFileList.push(file);
}
}
for (let i = 0; i < uploadFileList.length && currentIndex < 5; i++) {
const file = event.target.files[i]
let isDuplicate = false;
// Check if the file name already exists in saveFileList
for (let j = 0; j < saveFileList.length; j++) {
if (saveFileList[j].name === file.name) {
isDuplicate = true;
break;
}
}
if (!isDuplicate && i + currentIndex < 5) {
file.id = currentIndex + i
saveFileList.push(file)
updateList.items.add(file);
}
console.log("currentIndex")
console.log(currentIndex)
}
let updatedFileList = updateList.files;
setFileListData(saveFileList)
setFileList(updatedFileList);
};
useEffect(() => {
props.setUpdateValid(isValid)
}, [isValid])
useEffect(() => {
checkDataField(values)
}, [selectedAddress4, selectedAddress5,
termsAndConAccept, termsAndConNotAccept, fileList])
useEffect(() => {
props.step == 2 ? _onSubmit() : null;
onCaptchaChange();
checkDataField(values)
}, [props.step])
const { handleSubmit } = useForm({})
const _onSubmit = () => {
setLoding(true);
values.address4 = selectedAddress4
values.address5 = selectedAddress5
// console.log(values)
const busUserAddress = {
"addressLine1": "",
"addressLine2": "",
"addressLine3": "",
"district": "",
"country": ""
};
busUserAddress.addressLine1 = values.address1
busUserAddress.addressLine2 = values.address2
busUserAddress.addressLine3 = values.address3
busUserAddress.district = values.address4
busUserAddress.country = values.address5
const userFaxNo = {
"countryCode": values.faxCountryCode,
"faxNumber": values.fax,
};
const busUserContactTel = {
"countryCode": values.phoneCountryCode,
"phoneNumber": values.phone,
};
let tncFlag = false;
if (termsAndConAccept) {
tncFlag = true
}
if (termsAndConNotAccept) {
tncFlag = false
}
const user = {
username: values.username,
password: values.password,
name: values.username,
enCompanyName: values.enCompanyName,
chCompanyName: values.chCompanyName,
emailBus: values.email,
brNo: values.brNo,
brExpiryDate: values.brExpiryDate,
contactPerson: values.enName,
tncFlag: tncFlag,
type: "ORG"
};
var formData = new FormData();
for (let i = 0; i < fileListData.length; i++) {
const file = fileListData[i]
formData.append("multipartFileList", file);
}
formData.append("refType", refType);
for (const [key, value] of Object.entries(user)) {
formData.append(key, value);
}
formData.append("userFaxNo", JSON.stringify(userFaxNo));
formData.append("busUserContactTel", JSON.stringify(busUserContactTel));
formData.append("busUserAddress", JSON.stringify(busUserAddress));
if (isValid) {
axios.post(POST_PUBLIC_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 handleUserName(username) {
var symbol = /^(?=.*[!@#%&])/;
var space = /\s/;
if (username.length < 6) {
return false;
} else if (username.match(symbol)) {
return false;
} else if (username.match(space)) {
return false;
} else {
return true;
}
}
function handleCaptcha(captchaField) {
return captchaField == captcha;
}
function handlePassword(password) {
let new_pass = password;
// regular expressions to validate password
var lowerCase = /[a-z]/g;
var upperCase = /[A-Z]/g;
var numbers = /[0-9]/g;
var symbol = /^(?=.*[!@#%&])/;
var space = /\s/;
if (!new_pass.match(lowerCase)) {
return false;
} else if (!new_pass.match(upperCase)) {
return false;
} else if (!new_pass.match(numbers)) {
return false;
} else if (!new_pass.match(symbol)) {
return false;
} else if (new_pass.length < 8) {
return false;
}
else if (new_pass.match(space)) {
return false;
} else {
// console.log("password true")
return true;
}
}
function handleEmail(email) {
var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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: ({
username: '',
enName: '',
enCompanyName: '',
chCompanyName: '',
email: '',
address1: '',
address2: '',
address3: '',
password: '',
confirmPassword: '',
phone: '',
phoneCountryCode: '852',
submit: null,
fax: '',
faxCountryCode: '852',
brExpiryDate: '',
brNo: '',
emailConfirm: '',
captchaField: ''
}),
validationSchema: yup.object().shape({
username: yup.string().min(6, displayErrorMsg('用戶名稱最少6位')).required(displayErrorMsg('請輸入用戶名稱')).test(
"checkUserNameUsed",
displayErrorMsg("此用戶登入名稱已被注冊,請使用其他用戶登入名稱"),
function (value) {
if (userNameList.some(item => item.username === value)) {
return false
} else {
return true
}
}
)
.matches(/^[aA-zZ0-9\s]+$/, {message: displayErrorMsg("用戶名稱不包含特殊字符")})
.matches(/^\S*$/, {message: displayErrorMsg('用戶名稱不包含空格')}),
password: yup.string().min(8, displayErrorMsg('請輸入最少8位密碼')).required(displayErrorMsg('請輸入密碼'))
.matches(/^\S*$/, {message: displayErrorMsg('密碼不包含空格')})
.matches(/^(?=.*[a-z])/, {message: displayErrorMsg('請包括最少1個小寫字母')})
.matches(/^(?=.*[A-Z])/, {message: displayErrorMsg('請包括最少1個大寫字母')})
.matches(/^(?=.*[0-9])/, {message: displayErrorMsg('請包括最少1個數字')})
.matches(/^(?=.*[!@#%&])/, {message: displayErrorMsg('請包括最少1個特殊字符')}),
confirmPassword: yup.string().min(8, displayErrorMsg('請最少輸入8位密碼')).required(displayErrorMsg('請確認密碼')).oneOf([yup.ref('password'), null], displayErrorMsg('請輸入相同密碼')),
enName: yup.string().max(255).required(displayErrorMsg('請輸入英文姓名')),
enCompanyName: yup.string().matches(/^[^$^*()]+$/, {message: displayErrorMsg('No special characters $/^/*/(/)')}).when('chCompanyName', {
is: (chCompanyName) => !chCompanyName || chCompanyName.length === 0,
then: yup.string().required(displayErrorMsg('Please enter either English or Chinese name')),
}),
chCompanyName: yup.string().matches(/^[^$^*()]+$/, {message: displayErrorMsg('不包含特殊字符 $/^/*/(/)')}).when('enCompanyName', {
is: (enCompanyName) => !enCompanyName || enCompanyName.length === 0,
then: yup.string().required(displayErrorMsg('請輸入英文或中文名稱')),
}),
chName: yup.string().max(255).required(displayErrorMsg('請輸入中文姓名')),
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('請輸入國際區號')),
faxCountryCode: yup.string().min(2, displayErrorMsg('請輸入最少2位數字')),
phone: yup.string().min(8, displayErrorMsg('請輸入最少8位數字')).required(displayErrorMsg('請輸入聯絡電話')),
fax: yup.string().min(8, displayErrorMsg('請輸入最少8位數字')),
brExpiryDate: yup.date().min(new Date().toISOString().split("T")[0], displayErrorMsg('請輸入商業登記證有效日期')).max("2099-12-31", displayErrorMsg('請輸入商業登記證有效日期')).required(displayErrorMsg('請輸入商業登記證有效日期')),
brNo: yup.string().min(8, displayErrorMsg('請輸入商業登記證號碼')).required(displayErrorMsg('請輸入商業登記證號碼')),
captchaField: yup.string().required(displayErrorMsg('請輸入驗證')).oneOf([captcha], displayErrorMsg('請輸入有效驗證')),
}, ['enCompanyName', 'chCompanyName']),
});
const handleReset = (resetForm) => {
resetForm();
setSelectedAddress4("")
setSelectedAddress5(ComboData.country[0])
setCheckCountry(false)
setFileList([])
setFileListData([])
onCaptchaChange()
};
const { values } = formik
useEffect(() => {
checkDataField(values)
}, [values])
return (
);
}
export default BusCustomFormWizard;