import React, { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import usersService from "../../../services/UsersService"; import Icons from "../../Helpers/Icons"; import InputCom from "../../Helpers/Inputs/InputCom"; import LoadingSpinner from "../../Spinners/LoadingSpinner"; import cover from "../../../assets/images/profile-info-cover.png"; import profileImage from "../../../assets/images/profile.jpg"; import { Form, Formik } from "formik"; import * as Yup from "yup"; import { apiConst } from "../../../lib/apiConst"; const validationSchema = Yup.object().shape({ email: Yup.string() .email("Wrong email format") .matches( // /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/, /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/, "Invalid email format" ) .min(3, "Minimum 3 characters") .max(50, "Maximum 50 characters") .required("Email is required"), firstname: Yup.string() .min(3, "Minimum 3 characters") .max(25, "Maximum 25 characters") .required("Firstname is required"), lastname: Yup.string() .min(3, "Minimum 3 characters") .max(25, "Maximum 25 characters") .required("Lastname is required"), city: Yup.string() .min(3, "Minimum 3 characters") .max(25, "Maximum 25 characters") .required("City is required"), state: Yup.string() .min(3, "Minimum 3 characters") .max(25, "Maximum 25 characters") .required("State is required"), }); export default function PersonalInfoTab({ datas, frstNmeHndlr, lstNmeHndlr, dscrphn, }) { let { userDetails } = useSelector((state) => state.userDetails); const image = localStorage.getItem("session_token") ? `${userDetails.session_image_server}${localStorage.getItem( "session_token" )}/profile/${userDetails.uid}` : ""; const apiCall = new usersService(); let navigate = useNavigate(); const initialValues = { firstname: userDetails?.firstname, lastname: userDetails?.lastname, state: userDetails?.state, city: userDetails?.city, email: userDetails?.email, profile: userDetails?.profile_pic, pref_email: 0, pref_phone: 0, accept_promo: false, online_name: userDetails?.online_name, }; let [profile, setProfile] = useState({ // state for requesting from load profile API loading: true, status: false, }); let [requestStatus, setRequestState] = useState({ // state for requesting from update api message: "", loading: false, status: false, }); const [profileImg, setProfileImg] = useState( userDetails?.session_image_server ? image : profileImage ); let [uploadStatus, setUploadStatus] = useState({ loading: false, status: false, message: "", }); // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS const [coverImg, setCoverImg] = useState(cover); // profile img const profileImgInput = useRef(null); const browseProfileImg = () => { profileImgInput.current.click(); }; const profileImgChangHandler = (e) => { setUploadStatus({ loading: false, status: false, message: "" }); const acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"]; // ARRAY OF SUPPORTED FORMATS const uploadedFile = e.target.files[0]; //UPLOADED FILE const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase(); const MAX_FILE_SIZE = 5 * 1048576; // 5MB if (!acceptedFormat.includes(fileFormat)) { //CHECKING FOR CORRECT UPLOAD FORMAT const msg = `Please select ${acceptedFormat .slice(0, -1) .join(", ")} or ${acceptedFormat.slice(-1)}`; setUploadStatus({ loading: false, status: false, message: msg }); return setTimeout(() => { profileImgInput.current.value = ""; // clear the input setUploadStatus({ loading: false, status: false, message: "" }); }, 5000); } if (uploadedFile.size > MAX_FILE_SIZE) { // CHECKING FOR CORRECT FILE SIZE setUploadStatus({ loading: false, status: false, message: "File must not exceed 5MB", }); return setTimeout(() => { profileImgInput.current.value = ""; // clear the input setUploadStatus({ loading: false, status: false, message: "" }); }, 5000); } if (e.target.value !== "") { const imgReader = new FileReader(); imgReader.onload = (event) => { let base64Img = imgReader.result.split(",")[1]; let reqData = { // PAYLOAD FOR API CALL file_name: uploadedFile?.name, file_size: uploadedFile?.size, file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(), file_data: base64Img, msg_type: "FILE", action: apiConst.WRENCHBOARD_PICTURE_PROFILE, }; setUploadStatus({ loading: true, status: false, message: "Loading...", }); apiCall .sendFiles(reqData) .then((res) => { if (res.status != 200 || res.data.internal_return < 0) { return setUploadStatus({ loading: false, status: false, message: "Something went wrong, try again", }); } setUploadStatus({ loading: false, status: true, message: "Uploaded successfully", }); setProfileImg(event.target.result); }) .catch((error) => { setUploadStatus({ loading: false, status: false, message: "Network error, try again", }); }) .finally(() => { setTimeout(() => { setUploadStatus({ loading: false, status: false, message: "" }); }, 5000); }); }; imgReader.readAsDataURL(uploadedFile); } }; // cover img const coverImgInput = useRef(null); const browseCoverImg = () => { coverImgInput.current.click(); }; const coverImgChangHandler = (e) => { if (e.target.value !== "") { const imgReader = new FileReader(); imgReader.onload = (event) => { setCoverImg(event.target.result); }; imgReader.readAsDataURL(e.target.files[0]); } }; const handleUpdateUser = (values, helpers) => { setRequestState({ message: "", loading: true, status: false }); // there is no profile accommodation on the payload delete values?.profile; const reqData = { ...values, pref_email: Number(values.pref_email?.toString()), pref_phone: Number(values.pref_phone?.toString()), }; apiCall .updateProfile(reqData) .then((res) => { // API CALL TO UPDATE USER DETAILS if (res.data.internal_return < 0) { setRequestState({ message: "Profile Was unable to update", loading: false, status: false, }); return; } setRequestState({ message: "Profile update successfully", loading: false, status: true, }); // toast.success("Update Successful"); setTimeout(() => { navigate("/", { replace: true }); window.location.reload(true); }, 1000); }) .catch((error) => { setRequestState({ message: "Opps! an error occurred. Try Agian", loading: false, status: false, }); }); }; useEffect(() => { setProfile({ loading: false, status: true }); }, []); return profile.loading ? (
) : (
{(props) => { return (
{/* inputs starts here */} {/* username */}
{/* Email */}
{props.errors.email && props.touched.email && (

{props.errors.email}

)}
{/* first name and last name */}
{props.errors.firstname && props.touched.firstname && (

{props.errors.firstname}

)}
{props.errors.lastname && props.touched.lastname && (

{props.errors.lastname}

)}
{/* Online Name */}
{props.errors.online_name && props.touched.online_name && (

{props.errors.online_name}

)}
{/* Country */}
{/* State/Province */}
{props.errors.state && props.touched.state && (

{props.errors.state}

)}
{/* City */}
{props.errors.city && props.touched.city && (

{props.errors.city}

)}
{/* Preferred Communication*/}
Email
Phone
{/* Allow Promotions */}
{/* inputs ends here */}
{/* {process.env.REACT_APP_SHOW_UPLOAD_PROFILE_PICTURE != 0 && */}

Update Profile

Profile of at least Size 200x200 . Gifs work too. Max 5mb .

profile profileImgChangHandler(e)} type="file" className="hidden" />
{uploadStatus.message && !uploadStatus.loading && (

{uploadStatus.message}

)} {uploadStatus.loading && (

{uploadStatus.message}

)}
{/* } */}
{requestStatus.message != "" && (

{requestStatus.message}

)}
{/* {" "} Cancel */} {requestStatus.loading ? ( ) : ( )}
); }}
); }