diff --git a/src/components/Partials/Header.jsx b/src/components/Partials/Header.jsx index 66c5f42..e9be0b3 100644 --- a/src/components/Partials/Header.jsx +++ b/src/components/Partials/Header.jsx @@ -36,6 +36,10 @@ export default function Header({ logoutModalHandler, sidebarHandler }) { const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE + const image = `${userDetails.session_image_server}${localStorage.getItem( + "session_token" + )}/profile/${userDetails.uid}`; + const handlerBalance = () => { setbalanceValue.toggle(); if (notificationDropdown) { @@ -91,7 +95,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) { // User Profile let { firstname, lastname, email, profile_pic_url } = userDetails; let userEmail = email?.split("@")[0]; - const userProfileImage = profile_pic_url || DEFAULT_PROFILE_IMAGE; + const userProfileImage = image || DEFAULT_PROFILE_IMAGE; return ( <> diff --git a/src/components/Settings/Tabs/PersonalInfoTab.jsx b/src/components/Settings/Tabs/PersonalInfoTab.jsx index 021751c..9d5dafa 100644 --- a/src/components/Settings/Tabs/PersonalInfoTab.jsx +++ b/src/components/Settings/Tabs/PersonalInfoTab.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import usersService from "../../../services/UsersService"; @@ -6,6 +6,9 @@ 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"; @@ -43,18 +46,13 @@ export default function PersonalInfoTab({ frstNmeHndlr, lstNmeHndlr, dscrphn, - profileImg, - coverImg, - profileImgInput, - browseProfileImg, - profileImgChangHandler, - coverImgInput, - browseCoverImg, - coverImgChangHandler, - uploadStatus }) { let { userDetails } = useSelector((state) => state.userDetails); + const image = `${userDetails.session_image_server}${localStorage.getItem( + "session_token" + )}/profile/${userDetails.uid}`; + const apiCall = new usersService(); let navigate = useNavigate(); @@ -85,6 +83,123 @@ export default function PersonalInfoTab({ 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 reqData = { + // PAYLOAD FOR API CALL + file_name: uploadedFile?.name, + file_size: uploadedFile?.size, + file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(), + file_data: event?.target?.result, + msg_type: "FILE", + action: 11300, + }; + 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 }); @@ -363,65 +478,77 @@ export default function PersonalInfoTab({ {/* {process.env.REACT_APP_SHOW_UPLOAD_PROFILE_PICTURE != 0 && */} -
- Profile of at least Size - - 300x300 - - . Gifs work too. - - Max 5mb - - . -
-+ Profile of at least Size + + 200x200 + + . Gifs work too. + + Max 5mb + + . +
+{uploadStatus.message}
} - {uploadStatus.loading &&{uploadStatus.message}
}+ {uploadStatus.message} +
+ )} + {uploadStatus.loading && ( +{uploadStatus.message}
+ )}