"use client"; import { getDefaultCountryCode, t } from "@/utils"; import { MdAddPhotoAlternate, MdVerifiedUser } from "react-icons/md"; import { Label } from "../ui/label"; import { Input } from "../ui/input"; import { useEffect, useState } from "react"; import { useSelector } from "react-redux"; import { loadUpdateUserData, userSignUpData } from "@/redux/reducer/authSlice"; import { Switch } from "../ui/switch"; import { Textarea } from "../ui/textarea"; import { Button, buttonVariants } from "../ui/button"; import { Fcmtoken, settingsData } from "@/redux/reducer/settingSlice"; import { getUserInfoApi, getVerificationStatusApi, updateProfileApi, } from "@/utils/api"; import { toast } from "sonner"; import CustomLink from "@/components/Common/CustomLink"; import Image from "next/image"; import PhoneInput from "react-phone-input-2"; import "react-phone-input-2/lib/style.css"; import { isValidPhoneNumber } from "libphonenumber-js/max"; import { Loader2 } from "lucide-react"; const Profile = () => { const UserData = useSelector(userSignUpData); const IsLoggedIn = UserData !== undefined && UserData !== null; const settings = useSelector(settingsData); const placeholder_image = settings?.placeholder_image; const [profileImage, setProfileImage] = useState(""); const [profileFile, setProfileFile] = useState(null); const fetchFCM = useSelector(Fcmtoken); const [formData, setFormData] = useState({ name: "", email: "", phone: "", address: "", notification: 1, show_personal_details: 0, region_code: "", country_code: "", }); const [isLoading, setIsLoading] = useState(false); const [isPending, setIsPending] = useState(false); const [VerificationStatus, setVerificationStatus] = useState(""); const [RejectionReason, setRejectionReason] = useState(""); const getVerificationProgress = async () => { try { const res = await getVerificationStatusApi.getVerificationStatus(); if (res?.data?.error === true) { setVerificationStatus("not applied"); } else { const status = res?.data?.data?.status; const rejectReason = res?.data?.data?.rejection_reason; setVerificationStatus(status); setRejectionReason(rejectReason); } } catch (error) { console.log(error); } }; const getUserDetails = async () => { try { const res = await getUserInfoApi.getUserInfo(); if (res?.data?.error === false) { const region = ( res?.data?.data?.region_code || process.env.NEXT_PUBLIC_DEFAULT_COUNTRY || "in" ).toLowerCase(); const countryCode = res?.data?.data?.country_code?.replace("+", "") || getDefaultCountryCode(); setFormData({ name: res?.data?.data?.name || "", email: res?.data?.data?.email || "", phone: res?.data?.data?.mobile || "", address: res?.data?.data?.address || "", notification: res?.data?.data?.notification, show_personal_details: Number(res?.data?.data?.show_personal_details), region_code: region, country_code: countryCode, }); setProfileImage(res?.data?.data?.profile || placeholder_image); const currentFcmId = UserData?.fcm_id; if (!res?.data?.data?.fcm_id && currentFcmId) { const updatedData = { ...res?.data?.data, fcm_id: currentFcmId }; loadUpdateUserData(updatedData); } else { loadUpdateUserData(res?.data?.data); } } else { toast.error(res?.data?.message); } } catch (error) { console.log("Error fetching user details:", error); } }; useEffect(() => { if (IsLoggedIn) { const fetchData = async () => { setIsPending(true); try { await Promise.all([getVerificationProgress(), getUserDetails()]); } catch (error) { console.log("Error in parallel API calls:", error); } finally { setIsPending(false); } }; fetchData(); } }, []); const handleChange = (e) => { const { id, value } = e.target; setFormData((prevData) => ({ ...prevData, [id]: value, })); }; const handlePhoneChange = (value, data) => { const dial = data?.dialCode || ""; const iso2 = data?.countryCode || ""; // region code (in, us, ae) setFormData((prev) => { const pureMobile = value.startsWith(dial) ? value.slice(dial.length) : value; return { ...prev, phone: pureMobile, country_code: dial, region_code: iso2, }; }); }; const handleSwitchChange = (id) => { setFormData((prevData) => ({ ...prevData, [id]: prevData[id] === 1 ? 0 : 1, })); }; const handleImageChange = (e) => { const file = e.target.files[0]; if (file) { setProfileFile(file); const reader = new FileReader(); reader.onload = () => { setProfileImage(reader.result); }; reader.readAsDataURL(file); } }; const handleSubmit = async (e) => { e.preventDefault(); try { if (!formData?.name.trim() || !formData?.address.trim()) { toast.error(t("emptyFieldNotAllowed")); return; } const mobileNumber = formData.phone || ""; // ✅ Validate phone number ONLY if user entered one as it is optional if ( Boolean(mobileNumber) && !isValidPhoneNumber(`+${formData.country_code}${mobileNumber}`) ) { toast.error(t("invalidPhoneNumber")); return; } setIsLoading(true); const response = await updateProfileApi.updateProfile({ name: formData.name, email: formData.email, mobile: mobileNumber, address: formData.address, profile: profileFile, fcm_id: fetchFCM ? fetchFCM : "", notification: formData.notification, country_code: formData.country_code, show_personal_details: formData?.show_personal_details, region_code: formData.region_code.toUpperCase(), }); const data = response.data; if (data.error !== true) { const currentFcmId = UserData?.fcm_id; if (!data?.data?.fcm_id && currentFcmId) { const updatedData = { ...data?.data, fcm_id: currentFcmId }; loadUpdateUserData(updatedData); } else { loadUpdateUserData(data?.data); } toast.success(data.message); } else { toast.error(data.message); } } catch (error) { console.error("Error:", error); } finally { setIsLoading(false); } }; // Show loader when pending is true if (isPending) { return (
); } return (
{/* use next js image directly here */} {profileImage && ( User profile )}

{UserData?.name}

{UserData?.email}

{(() => { switch (VerificationStatus) { case "approved": return (
{t("verified")}
); case "not applied": return (
{t("verfiyNow")}
); case "rejected": return (
{RejectionReason && (

{RejectionReason}

)} {t("applyAgain")}
); case "pending": case "resubmitted": return ( ); default: return null; } })()}

{t("personalInfo")}

handleSwitchChange("notification")} />
handleSwitchChange("show_personal_details") } />
handlePhoneChange(phone, data)} inputProps={{ name: "phone", }} enableLongNumbers disabled={UserData?.type === "phone"} />

{t("address")}