diff --git a/src/pages/authentication/auth-forms/CustomFormWizard.js b/src/pages/authentication/auth-forms/CustomFormWizard.js index 820fdfb..f02719a 100644 --- a/src/pages/authentication/auth-forms/CustomFormWizard.js +++ b/src/pages/authentication/auth-forms/CustomFormWizard.js @@ -376,21 +376,66 @@ const CustomFormWizard = (props) => { } function handleIdNo(idNo,selectedIdDocType,checkDigit) { - var pattern = /^[A-Z][0-9]*$/; - var space = /\s/; - if (!idNo.match(pattern)) { - return false; - }else if - (selectedIdDocType=="HKID"&&checkDigit==""){ - return false; - } - else if (idNo.match(space)) { - return false; - }else if (idNo.length < 7) { - return false; - } else { - // console.log("IdNo true") - return true; + // var pattern = /^[A-Z][0-9]*$/; + var pattern_HKIDv1 = /^[A-Z]{1}[0-9]{6}$/; + var pattern_HKIDv2 = /^[A-Z]{2}[0-9]{6}$/; + var pattern_passport = /^[A-Z]{1}[0-9]{8}$/; + var pattern_CHID = /^[0-9]{6}(20|19)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9X]{1}/; + var pattern_otherCert = /^[A-Z]{1}[0-9]{5,}/; + // var space = /\s/; + // if (!idNo.match(pattern)) { + // return false; + // } else if (selectedIdDocType=="HKID"&&checkDigit==""){ + // return false; + // } else if (idNo.match(space)) { + // return false; + // } else if (idNo.length < 6) { + // return false; + // } else { + // // console.log("IdNo true") + // return true; + // } + switch (selectedIdDocType) { + case "HKID": + if (checkDigit === "") return false + if (idNo.match(pattern_HKIDv1)) { + return true + } else if (idNo.match(pattern_HKIDv2)) { + return true + } else { + return false + } + case "passport": + if (idNo.match(pattern_passport)) { + return true + } else { + return false + } + case "CNID": + if (idNo.match(pattern_CHID)) { + const subStr_year = idNo.substring(6, 10) + const subStr_month = idNo.substring(10, 12) + const subStr_date = idNo.substring(12, 14) + + const today = new Date() + const inputDate = new Date(`${subStr_year}-${subStr_month}-${subStr_date}`) + + if (inputDate > today || inputDate === "Invalid Date" || inputDate.getFullYear().toString() !== subStr_year || (inputDate.getMonth() + 1).toString().padStart(2, "0") !== subStr_month || inputDate.getDate().toString().padStart(2, "0") !== subStr_date) { + return false + } else { + return true + } + } else { + return false + } + case "otherCert": + if (idNo.match(pattern_otherCert)) { + return true + } else { + return false + } + default: + break; } } @@ -480,17 +525,57 @@ const CustomFormWizard = (props) => { address3: yup.string().max(255).required('請輸入第三行地址'), email: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵'), emailConfirm: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵').oneOf([yup.ref('email'), null], '請輸入相同電郵'), - idNo: yup.string().required('請輸入證件號碼') - .matches(/^[aA-zZ0-9\s]+$/, "證件號碼不包含特殊字符") - .matches(/^\S*$/, '證件號碼不包含空格') - .test('checkIDCardFormat', '請輸入香港身份證號碼', function(value) { + idNo: yup.string().required(`請輸入${selectedIdDocInputType}號碼`) + .matches(/^[aA-zZ0-9\s]+$/, `${selectedIdDocInputType}號碼不包含特殊字符`) + .matches(/^\S*$/, `${selectedIdDocInputType}號碼不包含空格`) + .test('checkIDCardFormat', `請輸入有效的${selectedIdDocInputType}號碼`, function(value) { const idDocType = selectedIdDocType.type; - var pattern = /^[A-Z][0-9]*$/; + var pattern_HKIDv1 = /^[A-Z]{1}[0-9]{6}$/; + var pattern_HKIDv2 = /^[A-Z]{2}[0-9]{6}$/; + var pattern_passport = /^[A-Z]{1}[0-9]{8}$/; + var pattern_CHID = /^[0-9]{6}(20|19)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9X]{1}/; + var pattern_otherCert = /^[A-Z]{1}[0-9]{5,}/; if(value!==undefined){ - if (!value.match(pattern)&&idDocType=="HKID"&&value.length<7) { - return false - } else { - return true + switch (idDocType) { + case "HKID": + if (value.match(pattern_HKIDv1)) { + return true + } else if (value.match(pattern_HKIDv2)) { + return true + } else { + return false + } + case "passport": + if (value.match(pattern_passport)) { + return true + } else { + return false + } + case "CNID": + if (value.match(pattern_CHID)) { + const subStr_year = value.substring(6, 10) + const subStr_month = value.substring(10, 12) + const subStr_date = value.substring(12, 14) + + const today = new Date() + const inputDate = new Date(`${subStr_year}-${subStr_month}-${subStr_date}`) + + if (inputDate > today || inputDate === "Invalid Date" || inputDate.getFullYear().toString() !== subStr_year || (inputDate.getMonth() + 1).toString().padStart(2, "0") !== subStr_month || inputDate.getDate().toString().padStart(2, "0") !== subStr_date) { + return false + } else { + return true + } + } else { + return false + } + case "otherCert": + if (value.match(pattern_otherCert)) { + return true + } else { + return false + } + default: + break; } } }), @@ -754,17 +839,31 @@ const CustomFormWizard = (props) => { { + const ele = document.getElementById('idNo-login') + const startPos = ele.selectionStart + if (e.type === "change") { + if (!(e.target.value.match(/\s/g))) { + const newValue = await e.target.value.toUpperCase() + await formik.setFieldValue("idNo", newValue) + ele.setSelectionRange(startPos, startPos) + } else { + await formik.setFieldValue("idNo", formik.values.idNo) + ele.setSelectionRange(startPos-1, startPos-1) + } + } + }} placeholder="證件號碼" fullWidth sx={{mr:1}} error={Boolean(formik.touched.idNo && formik.errors.idNo)} onBlur={formik.handleBlur} inputProps={{ - maxLength: selectedIdDocType.type =='HKID'?7:18, + maxLength: selectedIdDocType.type =='HKID'?8:18, onKeyDown: (e) => { + console.log(e) if (e.key === 'Enter') { e.preventDefault(); } @@ -813,9 +912,22 @@ const CustomFormWizard = (props) => { { + const ele = document.getElementById('idNo-login') + const startPos = ele.selectionStart + if (e.type === "change") { + if (!(e.target.value.match(/\s/g))) { + const newValue = await e.target.value.toUpperCase() + await formik.setFieldValue("idNo", newValue) + ele.setSelectionRange(startPos, startPos) + } else { + await formik.setFieldValue("idNo", formik.values.idNo) + ele.setSelectionRange(startPos-1, startPos-1) + } + } + }} placeholder="證件號碼" fullWidth sx={{mr:1}}