feat(userAccount): add validation for Iranian national code and update input handling

This commit is contained in:
hamed
2026-06-19 11:23:01 +03:30
parent da05a4e13c
commit a19058d9a2
3 changed files with 27 additions and 6 deletions
@@ -2,6 +2,7 @@ import ArrowLeftWhiteD from "@/components/icons/ArrowLeftWhiteD";
import {
changeDateType,
handleTimeExpiresToken,
isValidIranNationalCode,
removeAdditionalKeysDashboard,
} from "@/helper";
import { request } from "@/services/response";
@@ -81,6 +82,12 @@ function ButtonSendData({
};
const sendReq = () => {
if (information?.national_code && !isValidIranNationalCode(information.national_code)) {
setErrors((prev) => ({ ...prev, national_code: true }));
toast.error("کد ملی وارد شده معتبر نیست");
return;
}
setLoading(true);
information.prev_data ? patchData() : postData();
@@ -42,14 +42,14 @@ function Form({ insurance, errors, changeData, information }) {
<Field
req={true}
error={errors?.national_code}
type="number"
type="text"
iconGray={true}
name="national_code"
isTransparent={true}
changeData={changeData}
data={information?.national_code}
// کد ملی فقط وقتی از قبل مقدار دارد قفل می‌شود؛ اگر خالی است قابل افزودن باشد.
disable={Boolean(information?.national_code)}
changeData={(val, name) =>
changeData(val.replace(/\D/g, "").slice(0, 10), name)
}
value={information?.national_code ?? ""}
/>
</Content>
<Content req={true} error={errors?.name} title="نام" isConfirmed={false}>
+15 -1
View File
@@ -272,8 +272,8 @@ export const handleTimeExpiresToken = (expires_in) => {
};
export const removeAdditionalKeysDashboard = (information) => {
// فقط متادیتای سمت فرانت حذف می‌شود؛ national_code باید ارسال شود تا قابل ثبت/آپدیت باشد.
const {
national_code,
changed,
created,
id,
@@ -709,3 +709,17 @@ export function changeNumToDefault(str) {
.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;
};