feat(userAccount): add validation for Iranian national code and update input handling
This commit is contained in:
@@ -2,6 +2,7 @@ import ArrowLeftWhiteD from "@/components/icons/ArrowLeftWhiteD";
|
|||||||
import {
|
import {
|
||||||
changeDateType,
|
changeDateType,
|
||||||
handleTimeExpiresToken,
|
handleTimeExpiresToken,
|
||||||
|
isValidIranNationalCode,
|
||||||
removeAdditionalKeysDashboard,
|
removeAdditionalKeysDashboard,
|
||||||
} from "@/helper";
|
} from "@/helper";
|
||||||
import { request } from "@/services/response";
|
import { request } from "@/services/response";
|
||||||
@@ -81,6 +82,12 @@ function ButtonSendData({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const sendReq = () => {
|
const sendReq = () => {
|
||||||
|
if (information?.national_code && !isValidIranNationalCode(information.national_code)) {
|
||||||
|
setErrors((prev) => ({ ...prev, national_code: true }));
|
||||||
|
toast.error("کد ملی وارد شده معتبر نیست");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
information.prev_data ? patchData() : postData();
|
information.prev_data ? patchData() : postData();
|
||||||
|
|||||||
@@ -42,14 +42,14 @@ function Form({ insurance, errors, changeData, information }) {
|
|||||||
<Field
|
<Field
|
||||||
req={true}
|
req={true}
|
||||||
error={errors?.national_code}
|
error={errors?.national_code}
|
||||||
type="number"
|
type="text"
|
||||||
iconGray={true}
|
iconGray={true}
|
||||||
name="national_code"
|
name="national_code"
|
||||||
isTransparent={true}
|
isTransparent={true}
|
||||||
changeData={changeData}
|
changeData={(val, name) =>
|
||||||
data={information?.national_code}
|
changeData(val.replace(/\D/g, "").slice(0, 10), name)
|
||||||
// کد ملی فقط وقتی از قبل مقدار دارد قفل میشود؛ اگر خالی است قابل افزودن باشد.
|
}
|
||||||
disable={Boolean(information?.national_code)}
|
value={information?.national_code ?? ""}
|
||||||
/>
|
/>
|
||||||
</Content>
|
</Content>
|
||||||
<Content req={true} error={errors?.name} title="نام" isConfirmed={false}>
|
<Content req={true} error={errors?.name} title="نام" isConfirmed={false}>
|
||||||
|
|||||||
+15
-1
@@ -272,8 +272,8 @@ export const handleTimeExpiresToken = (expires_in) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const removeAdditionalKeysDashboard = (information) => {
|
export const removeAdditionalKeysDashboard = (information) => {
|
||||||
|
// فقط متادیتای سمت فرانت حذف میشود؛ national_code باید ارسال شود تا قابل ثبت/آپدیت باشد.
|
||||||
const {
|
const {
|
||||||
national_code,
|
|
||||||
changed,
|
changed,
|
||||||
created,
|
created,
|
||||||
id,
|
id,
|
||||||
@@ -709,3 +709,17 @@ export function changeNumToDefault(str) {
|
|||||||
.replace(/[٠-٩]/g, d => "٠١٢٣٤٥٦٧٨٩".indexOf(d));
|
.replace(/[٠-٩]/g, d => "٠١٢٣٤٥٦٧٨٩".indexOf(d));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// اعتبارسنجی کد ملی ایران: ۱۰ رقم + الگوریتم رقم کنترلی.
|
||||||
|
export const isValidIranNationalCode = (input) => {
|
||||||
|
if (!input) return false;
|
||||||
|
const code = String(input).replace(/\D/g, "");
|
||||||
|
if (!/^\d{10}$/.test(code)) return false;
|
||||||
|
// کدهای با ارقام یکسان (مثل 0000000000) نامعتبرند
|
||||||
|
if (/^(\d)\1{9}$/.test(code)) return false;
|
||||||
|
const check = +code[9];
|
||||||
|
let sum = 0;
|
||||||
|
for (let i = 0; i < 9; i++) sum += +code[i] * (10 - i);
|
||||||
|
const r = sum % 11;
|
||||||
|
return r < 2 ? check === r : check === 11 - r;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user