Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 53db8df5c7 |
@@ -33,7 +33,7 @@ export default function FamilyManageTabs({
|
|||||||
loading: false,
|
loading: false,
|
||||||
data: null,
|
data: null,
|
||||||
};
|
};
|
||||||
|
console.log('accountDetails',accountDetails)
|
||||||
// State for family details, tasks, waitlist, and pending
|
// State for family details, tasks, waitlist, and pending
|
||||||
const [details, setDetails] = useState({
|
const [details, setDetails] = useState({
|
||||||
familyDetails: { ...initialDetailState },
|
familyDetails: { ...initialDetailState },
|
||||||
@@ -66,8 +66,10 @@ export default function FamilyManageTabs({
|
|||||||
// State for family task popout
|
// State for family task popout
|
||||||
const [familyTaskPopout, setFamilyTaskPopout] = useState(false);
|
const [familyTaskPopout, setFamilyTaskPopout] = useState(false);
|
||||||
|
|
||||||
|
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
||||||
|
|
||||||
// State for profile image
|
// State for profile image
|
||||||
const [profileImg, setProfileImg] = useState(profile);
|
const [profileImg, setProfileImg] = useState(accountDetails.image ? accountDetails.image : profile);
|
||||||
|
|
||||||
// Ref for profile image input
|
// Ref for profile image input
|
||||||
const profileImgInput = useRef(null);
|
const profileImgInput = useRef(null);
|
||||||
@@ -90,24 +92,78 @@ export default function FamilyManageTabs({
|
|||||||
* Checks if the selected file exceeds the maximum file size limit and displays an alert if it does.
|
* Checks if the selected file exceeds the maximum file size limit and displays an alert if it does.
|
||||||
* If the file is within the size limit, it reads the file using the FileReader API and sets the profile image state with the result.
|
* If the file is within the size limit, it reads the file using the FileReader API and sets the profile image state with the result.
|
||||||
*/
|
*/
|
||||||
const profileImgChangeHandler = (e) => {
|
// const profileImgChangeHandler = (e) => {
|
||||||
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
|
// const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
|
||||||
|
|
||||||
const file = e.target.files[0];
|
// const file = e.target.files[0];
|
||||||
if (file && file.size > MAX_FILE_SIZE) {
|
// if (file && file.size > MAX_FILE_SIZE) {
|
||||||
alert("File size exceeds the limit.");
|
// alert("File size exceeds the limit.");
|
||||||
return;
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (file) {
|
||||||
|
// const imgReader = new FileReader();
|
||||||
|
// imgReader.onload = () => {
|
||||||
|
// const imageDataUrl = imgReader.result;
|
||||||
|
|
||||||
|
// // Set the profile image
|
||||||
|
// setProfileImg(imageDataUrl);
|
||||||
|
// };
|
||||||
|
// imgReader.readAsDataURL(file);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
|
const profileImgChangeHandler = (e) => {
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
let acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"] // ARRAY OF SUPPORTED FORMATS
|
||||||
|
let uploadedFile = e.target.files[0] //UPLOADED FILE
|
||||||
|
|
||||||
|
const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase();
|
||||||
|
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 (file) {
|
if(uploadedFile.size > 5*1048576){ // CHECKING FOR CORRECT FILE SIZE
|
||||||
const imgReader = new FileReader();
|
setUploadStatus({loading: false, status: false, message:'File must not exceed 5MB'})
|
||||||
imgReader.onload = () => {
|
return setTimeout(()=>{
|
||||||
const imageDataUrl = imgReader.result;
|
profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
},5000)
|
||||||
|
}
|
||||||
|
|
||||||
// Set the profile image
|
if (e.target.value !== "") {
|
||||||
setProfileImg(imageDataUrl);
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
let reqData = { // PAYLOAD FOR API CALL
|
||||||
|
family_uid: accountDetails?.family_uid,
|
||||||
|
file_name: uploadedFile?.name,
|
||||||
|
file_size: uploadedFile?.size,
|
||||||
|
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
||||||
|
file_data: event?.target?.result,
|
||||||
|
msg_type: 'FILE',
|
||||||
|
action: 111305
|
||||||
|
}
|
||||||
|
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(file);
|
imgReader.readAsDataURL(e.target.files[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -298,6 +354,7 @@ export default function FamilyManageTabs({
|
|||||||
profileImgChangeHandler={profileImgChangeHandler}
|
profileImgChangeHandler={profileImgChangeHandler}
|
||||||
browseProfileImg={browseProfileImg}
|
browseProfileImg={browseProfileImg}
|
||||||
accountDetails={accountDetails}
|
accountDetails={accountDetails}
|
||||||
|
uploadStatus={uploadStatus}
|
||||||
/>
|
/>
|
||||||
<div className="mt-4 flex flex-col justify-center items-center gap-2 lg:flex-row lg:justify-center lg:items-center xl:flex-col xl:justify-center xl:items-center 2xl:flex-row 2xl:justify-center 2xl:items-center 2xl:gap-[2px]">
|
<div className="mt-4 flex flex-col justify-center items-center gap-2 lg:flex-row lg:justify-center lg:items-center xl:flex-col xl:justify-center xl:items-center 2xl:flex-row 2xl:justify-center 2xl:items-center 2xl:gap-[2px]">
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ export default function FamilyTable({
|
|||||||
familyList,
|
familyList,
|
||||||
loader,
|
loader,
|
||||||
popUpHandler,
|
popUpHandler,
|
||||||
|
imageServer
|
||||||
}) {
|
}) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
@@ -54,11 +55,13 @@ export default function FamilyTable({
|
|||||||
banner,
|
banner,
|
||||||
enable_traking,
|
enable_traking,
|
||||||
profile_picture,
|
profile_picture,
|
||||||
|
imageServer
|
||||||
}) => {
|
}) => {
|
||||||
// Check for valid dates
|
// Check for valid dates
|
||||||
const addedDate = added ? added.split(" ")[0] : "N/A";
|
const addedDate = added ? added.split(" ")[0] : "N/A";
|
||||||
const loginDate = last_login ? formatDateString(last_login) : "N/A";
|
const loginDate = last_login ? formatDateString(last_login) : "N/A";
|
||||||
const key = `family-${family_uid}`; // Assign a unique key
|
const key = `family-${family_uid}`; // Assign a unique key
|
||||||
|
const image = localStorage.getItem('session_token') ? `${imageServer}${localStorage.getItem('session_token')}/family/${family_uid}` : ''
|
||||||
|
|
||||||
const trackingStatus =
|
const trackingStatus =
|
||||||
enable_traking === "0"
|
enable_traking === "0"
|
||||||
@@ -76,8 +79,8 @@ export default function FamilyTable({
|
|||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1]">
|
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1]">
|
||||||
<img
|
<img
|
||||||
src={profile_picture}
|
// src={profile_picture}
|
||||||
// src={profile_picture || localImgLoad(`images/icons/${banner}`)}
|
src={image || profile_picture || localImgLoad(`images/icons/${banner}`)}
|
||||||
alt={`Avatar of ${firstname} ${lastname}`}
|
alt={`Avatar of ${firstname} ${lastname}`}
|
||||||
className="w-full h-full"
|
className="w-full h-full"
|
||||||
/>
|
/>
|
||||||
@@ -133,6 +136,7 @@ export default function FamilyTable({
|
|||||||
task_count,
|
task_count,
|
||||||
family_uid,
|
family_uid,
|
||||||
banner,
|
banner,
|
||||||
|
image
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -182,7 +186,7 @@ export default function FamilyTable({
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody className="h-full">
|
<tbody className="h-full">
|
||||||
{currentFamilyList?.map((familyMember, index) => {
|
{currentFamilyList?.map((familyMember, index) => {
|
||||||
return <FamilyRow key={index} {...familyMember} />;
|
return <FamilyRow key={index} {...familyMember} imageServer={imageServer} />;
|
||||||
})}
|
})}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -213,7 +217,7 @@ export default function FamilyTable({
|
|||||||
<PaginatedList
|
<PaginatedList
|
||||||
onClick={handlePagination}
|
onClick={handlePagination}
|
||||||
prev={currentPage == 0}
|
prev={currentPage == 0}
|
||||||
next={currentPage + itemsPerPage >= familyList.length}
|
next={currentPage + itemsPerPage >= familyList?.length}
|
||||||
data={familyList}
|
data={familyList}
|
||||||
start={indexOfFirstItem}
|
start={indexOfFirstItem}
|
||||||
stop={indexOfLastItem}
|
stop={indexOfLastItem}
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
|
|||||||
const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE
|
const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE
|
||||||
const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE
|
const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE
|
||||||
|
|
||||||
|
const image = `${userDetails.session_image_server}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/profile/${userDetails.uid}`;
|
||||||
|
|
||||||
const handlerBalance = () => {
|
const handlerBalance = () => {
|
||||||
setbalanceValue.toggle();
|
setbalanceValue.toggle();
|
||||||
if (notificationDropdown) {
|
if (notificationDropdown) {
|
||||||
@@ -91,7 +95,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
|
|||||||
// User Profile
|
// User Profile
|
||||||
let { firstname, lastname, email, profile_pic_url } = userDetails;
|
let { firstname, lastname, email, profile_pic_url } = userDetails;
|
||||||
let userEmail = email?.split("@")[0];
|
let userEmail = email?.split("@")[0];
|
||||||
const userProfileImage = profile_pic_url || DEFAULT_PROFILE_IMAGE;
|
const userProfileImage = image || DEFAULT_PROFILE_IMAGE;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import usersService from "../../../services/UsersService";
|
import usersService from "../../../services/UsersService";
|
||||||
@@ -6,6 +6,9 @@ import Icons from "../../Helpers/Icons";
|
|||||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||||
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
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 { Form, Formik } from "formik";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
|
|
||||||
@@ -43,18 +46,13 @@ export default function PersonalInfoTab({
|
|||||||
frstNmeHndlr,
|
frstNmeHndlr,
|
||||||
lstNmeHndlr,
|
lstNmeHndlr,
|
||||||
dscrphn,
|
dscrphn,
|
||||||
profileImg,
|
|
||||||
coverImg,
|
|
||||||
profileImgInput,
|
|
||||||
browseProfileImg,
|
|
||||||
profileImgChangHandler,
|
|
||||||
coverImgInput,
|
|
||||||
browseCoverImg,
|
|
||||||
coverImgChangHandler,
|
|
||||||
uploadStatus
|
|
||||||
}) {
|
}) {
|
||||||
let { userDetails } = useSelector((state) => state.userDetails);
|
let { userDetails } = useSelector((state) => state.userDetails);
|
||||||
|
|
||||||
|
const image = `${userDetails.session_image_server}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/profile/${userDetails.uid}`;
|
||||||
|
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
|
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
@@ -85,6 +83,123 @@ export default function PersonalInfoTab({
|
|||||||
status: 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 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) => {
|
const handleUpdateUser = (values, helpers) => {
|
||||||
setRequestState({ message: "", loading: true, status: false });
|
setRequestState({ message: "", loading: true, status: false });
|
||||||
|
|
||||||
@@ -374,7 +489,7 @@ export default function PersonalInfoTab({
|
|||||||
<p className="text-base text-thin-light-gray mb-5">
|
<p className="text-base text-thin-light-gray mb-5">
|
||||||
Profile of at least Size
|
Profile of at least Size
|
||||||
<span className="ml-1 text-dark-gray dark:text-white">
|
<span className="ml-1 text-dark-gray dark:text-white">
|
||||||
300x300
|
200x200
|
||||||
</span>
|
</span>
|
||||||
. Gifs work too.
|
. Gifs work too.
|
||||||
<span className="ml-1 text-dark-gray dark:text-white">
|
<span className="ml-1 text-dark-gray dark:text-white">
|
||||||
@@ -383,11 +498,11 @@ export default function PersonalInfoTab({
|
|||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex justify-center">
|
<div className="flex justify-center">
|
||||||
<div className="w-full relative">
|
<div className="w-[200px] h-[200px] relative">
|
||||||
<img
|
<img
|
||||||
src={profileImg}
|
src={profileImg}
|
||||||
alt="profile"
|
alt="profile"
|
||||||
className="sm:w-[198px] sm:h-[198px] w-[120px] h-[120px] rounded-full overflow-hidden object-contain object-center"
|
className="sm:w-[198px] sm:h-[198px] w-full h-full rounded-full overflow-hidden object-cover object-center"
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
ref={profileImgInput}
|
ref={profileImgInput}
|
||||||
@@ -397,7 +512,7 @@ export default function PersonalInfoTab({
|
|||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
onClick={browseProfileImg}
|
onClick={browseProfileImg}
|
||||||
className="w-[32px] h-[32px] absolute bottom-7 sm:right-10 right-[105px] hover:bg-pink bg-dark-gray rounded-full cursor-pointer"
|
className="w-[32px] h-[32px] absolute bottom-4 right-4 hover:bg-pink bg-dark-gray rounded-full cursor-pointer"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
width="32"
|
width="32"
|
||||||
@@ -418,8 +533,20 @@ export default function PersonalInfoTab({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{uploadStatus.message && !uploadStatus.loading && <p className={`text-center ${uploadStatus.status ? 'text-green-500':'text-red-500'}`}>{uploadStatus.message}</p>}
|
{uploadStatus.message && !uploadStatus.loading && (
|
||||||
{uploadStatus.loading && <p className="text-center">{uploadStatus.message}</p>}
|
<p
|
||||||
|
className={`text-center ${
|
||||||
|
uploadStatus.status
|
||||||
|
? "text-green-500"
|
||||||
|
: "text-red-500"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{uploadStatus.message}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{uploadStatus.loading && (
|
||||||
|
<p className="text-center">{uploadStatus.message}</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* } */}
|
{/* } */}
|
||||||
|
|||||||
+115
-194
@@ -6,8 +6,6 @@ import React, {
|
|||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import cover from "../../assets/images/profile-info-cover.png";
|
|
||||||
import profile from "../../assets/images/profile.jpg";
|
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
import Icons from "../Helpers/Icons";
|
import Icons from "../Helpers/Icons";
|
||||||
import Layout from "../Partials/Layout";
|
import Layout from "../Partials/Layout";
|
||||||
@@ -26,161 +24,8 @@ import RecipientAccountTab from "./Tabs/RecipientAccountTab";
|
|||||||
export default function Settings({ faq }) {
|
export default function Settings({ faq }) {
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
const [profileImg, setProfileImg] = useState(
|
|
||||||
userDetails?.profile_pic_url ? userDetails.profile_pic_url : profile
|
|
||||||
);
|
|
||||||
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
|
||||||
const [coverImg, setCoverImg] = useState(cover);
|
|
||||||
const [reloadCardList, setReloadCardList] = useState(false); // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
|
const [reloadCardList, setReloadCardList] = useState(false); // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
|
||||||
|
|
||||||
// profile img
|
|
||||||
const profileImgInput = useRef(null);
|
|
||||||
const browseProfileImg = () => {
|
|
||||||
profileImgInput.current.click();
|
|
||||||
};
|
|
||||||
const profileImgChangHandler = (e) => {
|
|
||||||
// if (e.target.value !== "") {
|
|
||||||
// const imgReader = new FileReader();
|
|
||||||
// imgReader.onload = (event) => {
|
|
||||||
// setProfileImg(event.target.result);
|
|
||||||
// };
|
|
||||||
// imgReader.readAsDataURL(e.target.files[0]);
|
|
||||||
// }
|
|
||||||
setUploadStatus({loading: false, status: false, message:''})
|
|
||||||
let acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"] // ARRAY OF SUPPORTED FORMATS
|
|
||||||
let uploadedFile = e.target.files[0] //UPLOADED FILE
|
|
||||||
|
|
||||||
if(!acceptedFormat.includes(uploadedFile?.type?.split("/")[1]?.toLowerCase())){ //CHECKING FOR CORRECT UPLOAD FORMAT
|
|
||||||
let msg = 'Please select '
|
|
||||||
for(let i=0; i<=acceptedFormat.length-1; i++){
|
|
||||||
if(i == acceptedFormat.length-1){
|
|
||||||
msg+=`or ${acceptedFormat[i]}`
|
|
||||||
}else{
|
|
||||||
msg+=`${acceptedFormat[i]}, `
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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 > 5*1048576){ // 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: 'WRENCHBOARD_PICTURE_PROFILE',
|
|
||||||
// action: 11307
|
|
||||||
}
|
|
||||||
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(e.target.files[0]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// 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]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Tabs Handling
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
name: "personal",
|
|
||||||
title: "Edit Profile",
|
|
||||||
iconName: "people-hover",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
name: "payment",
|
|
||||||
title: "Payment Cards",
|
|
||||||
iconName: "bank-card",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
name: "recipients-account",
|
|
||||||
title: "Recipients Account",
|
|
||||||
iconName: "bank-card",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
name: "notification",
|
|
||||||
title: "Notification Setting",
|
|
||||||
iconName: "notification-setting",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
name: "login_activity",
|
|
||||||
title: "Login Activity",
|
|
||||||
iconName: "login-activity",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
name: "password",
|
|
||||||
title: "Change Password",
|
|
||||||
iconName: "password-hover",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 7,
|
|
||||||
name: "faq",
|
|
||||||
title: "FAQ",
|
|
||||||
iconName: "block-question",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 8,
|
|
||||||
name: "privacy",
|
|
||||||
title: "Privacy Policy",
|
|
||||||
iconName: "page-right",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 9,
|
|
||||||
name: "terms",
|
|
||||||
title: "Terms and Conditions",
|
|
||||||
iconName: "page-right",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const [tab, setTab] = useState(tabs[0].name);
|
|
||||||
const tabHandler = (value) => {
|
|
||||||
setTab(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Recipient Account
|
// Recipient Account
|
||||||
const [recipientAccount, setRecipientAccount] = useState({
|
const [recipientAccount, setRecipientAccount] = useState({
|
||||||
state: false,
|
state: false,
|
||||||
@@ -223,6 +68,120 @@ export default function Settings({ faq }) {
|
|||||||
getRecipientAccount();
|
getRecipientAccount();
|
||||||
}, [reloadCardList]);
|
}, [reloadCardList]);
|
||||||
|
|
||||||
|
// Tabs Handling
|
||||||
|
const tabs = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "personal",
|
||||||
|
title: "Edit Profile",
|
||||||
|
iconName: "people-hover",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "payment",
|
||||||
|
title: "Payment Cards",
|
||||||
|
iconName: "bank-card",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "recipients_account",
|
||||||
|
title: "Recipients Account",
|
||||||
|
iconName: "bank-card",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
name: "notification",
|
||||||
|
title: "Notification Setting",
|
||||||
|
iconName: "notification-setting",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
name: "login_activity",
|
||||||
|
title: "Login Activity",
|
||||||
|
iconName: "login-activity",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
name: "password",
|
||||||
|
title: "Change Password",
|
||||||
|
iconName: "password-hover",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 7,
|
||||||
|
name: "faq",
|
||||||
|
title: "FAQ",
|
||||||
|
iconName: "block-question",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 8,
|
||||||
|
name: "privacy",
|
||||||
|
title: "Privacy Policy",
|
||||||
|
iconName: "page-right",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 9,
|
||||||
|
name: "terms",
|
||||||
|
title: "Terms and Conditions",
|
||||||
|
iconName: "page-right",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const [tab, setTab] = useState(() => {
|
||||||
|
// Retrieve the active tab from local storage or use the default tab
|
||||||
|
return localStorage.getItem("activeTab") || tabs[0].name;
|
||||||
|
});
|
||||||
|
|
||||||
|
const tabHandler = (value) => {
|
||||||
|
setTab(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Update local storage when the tab changes
|
||||||
|
useEffect(() => {
|
||||||
|
localStorage.setItem("activeTab", tab);
|
||||||
|
}, [tab]);
|
||||||
|
|
||||||
|
const tabComponents = {
|
||||||
|
personal: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PersonalInfoTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
payment: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PaymentMathodsTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
recipients_account: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<RecipientAccountTab
|
||||||
|
recipientAccount={recipientAccount}
|
||||||
|
setRecipientAccount={setRecipientAccount}
|
||||||
|
setReloadCardList={setReloadCardList}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
notification: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<NotificationSettingTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
login_activity: <LoginActivityTab />,
|
||||||
|
password: <ChangePasswordTab />,
|
||||||
|
faq: <FaqTab datas={faq} />,
|
||||||
|
privacy: <PrivacyPolicyTab />,
|
||||||
|
terms: <TermsConditionTab />,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default tab component
|
||||||
|
const defaultTabComponent = (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PersonalInfoTab />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
// Selected tab component based on the current 'tab'
|
||||||
|
const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Layout>
|
<Layout>
|
||||||
@@ -263,45 +222,7 @@ export default function Settings({ faq }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
||||||
<div className="content-body-items flex-1">
|
<div className="content-body-items flex-1">
|
||||||
{tab === "personal" && (
|
{selectedTabComponent}
|
||||||
<div className="tab-item">
|
|
||||||
<PersonalInfoTab
|
|
||||||
profileImg={profileImg}
|
|
||||||
coverImg={coverImg}
|
|
||||||
browseProfileImg={browseProfileImg}
|
|
||||||
profileImgInput={profileImgInput}
|
|
||||||
profileImgChangHandler={profileImgChangHandler}
|
|
||||||
coverImgChangHandler={coverImgChangHandler}
|
|
||||||
browseCoverImg={browseCoverImg}
|
|
||||||
coverImgInput={coverImgInput}
|
|
||||||
uploadStatus={uploadStatus}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "payment" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<PaymentMathodsTab />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "recipients-account" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<RecipientAccountTab
|
|
||||||
recipientAccount={recipientAccount}
|
|
||||||
setRecipientAccount={setRecipientAccount}
|
|
||||||
setReloadCardList={setReloadCardList}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "notification" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<NotificationSettingTab />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "login_activity" && <LoginActivityTab />}
|
|
||||||
{tab === "password" && <ChangePasswordTab />}
|
|
||||||
{tab === "faq" && <FaqTab datas={faq} />}
|
|
||||||
{tab === "privacy" && <PrivacyPolicyTab />}
|
|
||||||
{tab === "terms" && <TermsConditionTab />}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -19,16 +19,6 @@ class usersService {
|
|||||||
return this.postAuxEnd("/completesignuplink", reqData);
|
return this.postAuxEnd("/completesignuplink", reqData);
|
||||||
}
|
}
|
||||||
|
|
||||||
assignJobTask(reqData) {
|
|
||||||
var postData = {
|
|
||||||
uid: localStorage.getItem("uid"),
|
|
||||||
member_id: localStorage.getItem("member_id"),
|
|
||||||
sessionid: localStorage.getItem("session_token"),
|
|
||||||
...reqData,
|
|
||||||
};
|
|
||||||
return this.postAuxEnd("/assigntask", postData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// FUNCTION TO GET USER CURRENT TASK DUE TIME
|
// FUNCTION TO GET USER CURRENT TASK DUE TIME
|
||||||
getHomeDate() {
|
getHomeDate() {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -45,7 +35,7 @@ class usersService {
|
|||||||
uid: localStorage.getItem("uid"),
|
uid: localStorage.getItem("uid"),
|
||||||
member_id: localStorage.getItem("member_id"),
|
member_id: localStorage.getItem("member_id"),
|
||||||
sessionid: localStorage.getItem("session_token"),
|
sessionid: localStorage.getItem("session_token"),
|
||||||
action: 11202,
|
action: 11202
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/recentactivities", postData);
|
return this.postAuxEnd("/recentactivities", postData);
|
||||||
}
|
}
|
||||||
@@ -378,7 +368,7 @@ class usersService {
|
|||||||
page: 0,
|
page: 0,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
allstatus: 0,
|
allstatus: 0
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/activetaskslist", postData);
|
return this.postAuxEnd("/activetaskslist", postData);
|
||||||
}
|
}
|
||||||
@@ -608,7 +598,7 @@ class usersService {
|
|||||||
sessionid: localStorage.getItem("session_token"),
|
sessionid: localStorage.getItem("session_token"),
|
||||||
page: 0,
|
page: 0,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
...reqdata,
|
...reqdata
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/familyupdate", postData);
|
return this.postAuxEnd("/familyupdate", postData);
|
||||||
}
|
}
|
||||||
@@ -792,17 +782,6 @@ class usersService {
|
|||||||
return this.postAuxEnd("/pendingjobsendtome", postData);
|
return this.postAuxEnd("/pendingjobsendtome", postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingCancelOffer(reqData) {
|
|
||||||
var postData = {
|
|
||||||
uid: localStorage.getItem("uid"),
|
|
||||||
member_id: localStorage.getItem("member_id"),
|
|
||||||
sessionid: localStorage.getItem("session_token"),
|
|
||||||
action: 13043,
|
|
||||||
...reqData,
|
|
||||||
};
|
|
||||||
return this.postAuxEnd("/pendingjobcancel", postData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// FUNCTION TO GET ACTIVE JOB MESSAGE LIST
|
// FUNCTION TO GET ACTIVE JOB MESSAGE LIST
|
||||||
activeJobMesList(reqData) {
|
activeJobMesList(reqData) {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -1099,6 +1078,7 @@ class usersService {
|
|||||||
return this.postAuxEnd("/blogdata", postData);
|
return this.postAuxEnd("/blogdata", postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER
|
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER
|
||||||
suggestStatus(reqData) {
|
suggestStatus(reqData) {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -1257,10 +1237,6 @@ class usersService {
|
|||||||
console.log(response);
|
console.log(response);
|
||||||
// res = response;
|
// res = response;
|
||||||
console.log("~~~~~~~ Toks2 POST ~~~~~~~~");
|
console.log("~~~~~~~ Toks2 POST ~~~~~~~~");
|
||||||
if (response.data.internal_return == "-9999") {
|
|
||||||
localStorage.clear();
|
|
||||||
window.location.href = `/login?sessionExpired=true`;
|
|
||||||
}
|
|
||||||
return response;
|
return response;
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user