fix(doctor claim): mobile field is the account number, read-only

Mobile is prefilled from the logged-in user's cookie (userInfo.mobile_number)
and rendered read-only; removed it from editable form state/validation and
send that number in the claim body. Backend already enforces it must match
the account, so the field can't diverge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hamed
2026-07-11 15:16:27 +03:30
co-authored by Claude Opus 4.8
parent f584f581e5
commit 813225ff6d
+16 -9
View File
@@ -7,11 +7,20 @@ import { Box, Button, Modal, TextField } from "@mui/material";
import { styleDefault } from "@/mui"; import { styleDefault } from "@/mui";
import JalaliDatePicker from "@/components/common/JalaliDatePicker"; import JalaliDatePicker from "@/components/common/JalaliDatePicker";
import CloseModalD from "@/components/icons/CloseModalD"; import CloseModalD from "@/components/icons/CloseModalD";
import Cookies from "js-cookie";
import { convertToJalali, isUserLoggedIn } from "@/helper"; import { convertToJalali, isUserLoggedIn } from "@/helper";
import { request } from "@/services/response"; import { request } from "@/services/response";
import Altcha from "@/components/Altcha"; import Altcha from "@/components/Altcha";
const initialForm = { national_code: "", birth_date: "", first_name: "", last_name: "", mobile: "" }; const initialForm = { national_code: "", birth_date: "", first_name: "", last_name: "" };
function currentUserMobile() {
try {
return JSON.parse(Cookies.get("userInfo") || "{}")?.mobile_number || "";
} catch {
return "";
}
}
/** /**
* احراز مالکیت پروفایل پزشک ایمپورت‌شده (unclaimed). * احراز مالکیت پروفایل پزشک ایمپورت‌شده (unclaimed).
@@ -37,6 +46,7 @@ function ClaimProfileSection({ doctor }) {
} }
const loggedIn = isUserLoggedIn(); const loggedIn = isUserLoggedIn();
const userMobile = currentUserMobile();
const setField = (key, value) => { const setField = (key, value) => {
setForm((f) => ({ ...f, [key]: value })); setForm((f) => ({ ...f, [key]: value }));
@@ -50,8 +60,6 @@ function ClaimProfileSection({ doctor }) {
if (!form.birth_date) errs.birth_date = "تاریخ تولد را انتخاب کنید"; if (!form.birth_date) errs.birth_date = "تاریخ تولد را انتخاب کنید";
if (!form.first_name.trim()) errs.first_name = "نام الزامی است"; if (!form.first_name.trim()) errs.first_name = "نام الزامی است";
if (!form.last_name.trim()) errs.last_name = "نام خانوادگی الزامی است"; if (!form.last_name.trim()) errs.last_name = "نام خانوادگی الزامی است";
const mob = form.mobile.replace(/[۰-۹]/g, (d) => "۰۱۲۳۴۵۶۷۸۹".indexOf(d));
if (!/^09\d{9}$/.test(mob)) errs.mobile = "شماره موبایل نامعتبر است";
setFieldErrors(errs); setFieldErrors(errs);
return Object.keys(errs).length === 0; return Object.keys(errs).length === 0;
}; };
@@ -61,7 +69,7 @@ function ClaimProfileSection({ doctor }) {
setLoading(true); setLoading(true);
setError(""); setError("");
try { try {
await request.postDoctorClaim(doctor.uuid, { ...form, altcha }); await request.postDoctorClaim(doctor.uuid, { ...form, mobile: userMobile, altcha });
setLoading(false); setLoading(false);
setSuccess(true); setSuccess(true);
} catch (err) { } catch (err) {
@@ -219,11 +227,10 @@ function ClaimProfileSection({ doctor }) {
/> />
<TextField <TextField
label="شماره موبایل" label="شماره موبایل"
value={form.mobile} value={userMobile}
error={!!fieldErrors.mobile} helperText="شمارهٔ حساب کاربری شما (غیرقابل ویرایش)"
helperText={fieldErrors.mobile || "باید با شماره حساب کاربری شما یکی باشد"} InputProps={{ readOnly: true }}
onChange={(e) => setField("mobile", e.target.value)} inputProps={{ dir: "ltr" }}
inputProps={{ maxLength: 11, dir: "ltr" }}
fullWidth fullWidth
/> />
<JalaliDatePicker <JalaliDatePicker