Compare commits

...

4 Commits

Author SHA1 Message Date
victorAnumudu bc6d8b7805 console log removal 2023-11-06 13:14:42 +01:00
victorAnumudu ca5923a7f8 Merge master into family-profile-image-upload 2023-11-06 12:43:20 +01:00
victorAnumudu 4f0d432176 family profile image upload API added 2023-11-06 12:42:10 +01:00
victorAnumudu 7020e6d4dc added family profile image upload 2023-11-06 04:10:03 +01:00
4 changed files with 91 additions and 23 deletions
+71 -14
View File
@@ -66,8 +66,10 @@ export default function FamilyManageTabs({
// State for family task popout
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
const [profileImg, setProfileImg] = useState(profile);
const [profileImg, setProfileImg] = useState(accountDetails.image ? accountDetails.image : profile);
// Ref for profile image input
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.
* 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 MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
// const profileImgChangeHandler = (e) => {
// const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
const file = e.target.files[0];
if (file && file.size > MAX_FILE_SIZE) {
alert("File size exceeds the limit.");
return;
// const file = e.target.files[0];
// if (file && file.size > MAX_FILE_SIZE) {
// alert("File size exceeds the limit.");
// 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) {
const imgReader = new FileReader();
imgReader.onload = () => {
const imageDataUrl = imgReader.result;
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)
}
// Set the profile image
setProfileImg(imageDataUrl);
if (e.target.value !== "") {
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}
browseProfileImg={browseProfileImg}
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]">
<button
+9 -5
View File
@@ -19,6 +19,7 @@ export default function FamilyTable({
familyList,
loader,
popUpHandler,
imageServer
}) {
const navigate = useNavigate();
const [currentPage, setCurrentPage] = useState(0);
@@ -54,12 +55,14 @@ export default function FamilyTable({
banner,
enable_traking,
profile_picture,
imageServer
}) => {
// Check for valid dates
const addedDate = added ? added.split(" ")[0] : "N/A";
const loginDate = last_login ? formatDateString(last_login) : "N/A";
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 =
enable_traking === "0"
? "Stopped"
@@ -76,8 +79,8 @@ export default function FamilyTable({
<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]">
<img
src={profile_picture}
// src={profile_picture || localImgLoad(`images/icons/${banner}`)}
// src={profile_picture}
src={image || profile_picture || localImgLoad(`images/icons/${banner}`)}
alt={`Avatar of ${firstname} ${lastname}`}
className="w-full h-full"
/>
@@ -133,6 +136,7 @@ export default function FamilyTable({
task_count,
family_uid,
banner,
image
})
}
type="button"
@@ -182,7 +186,7 @@ export default function FamilyTable({
</thead>
<tbody className="h-full">
{currentFamilyList?.map((familyMember, index) => {
return <FamilyRow key={index} {...familyMember} />;
return <FamilyRow key={index} {...familyMember} imageServer={imageServer} />;
})}
</tbody>
</table>
@@ -213,7 +217,7 @@ export default function FamilyTable({
<PaginatedList
onClick={handlePagination}
prev={currentPage == 0}
next={currentPage + itemsPerPage >= familyList.length}
next={currentPage + itemsPerPage >= familyList?.length}
data={familyList}
start={indexOfFirstItem}
stop={indexOfLastItem}
@@ -7,6 +7,7 @@ export default function ProfileInfo({
profileImgChangeHandler,
browseProfileImg,
accountDetails,
uploadStatus
}) {
// console.log(accountDetails.banner)
return (
@@ -52,6 +53,11 @@ export default function ProfileInfo({
</div>
</div>
</div>
{/* DISPLAYS PROFILE UPLOADING STATUS */}
<div className="w-full">
{uploadStatus.message && !uploadStatus.loading && <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 className="flex flex-col justify-center gap-3 items-center">
<h1 className="font-bold text-xl tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize">
{accountDetails?.firstname}
+5 -4
View File
@@ -17,7 +17,7 @@ export default function FamilyAcc() {
// State to store the selected year and month
const [selectedYear, setSelectedYear] = useState("");
const [selectedMonth, setSelectedMonth] = useState("");
const [familyList, setFamilyList] = useState([]);
const [familyList, setFamilyList] = useState({});
const [loader, setLoader] = useState(false);
const [popUp, setPopUp] = useState(false);
const [listReload, setListReload] = useState(false);
@@ -115,8 +115,8 @@ export default function FamilyAcc() {
const res = await apiCall.familyListings(reqData);
const { data } = res;
if (data?.internal_return >= 0 && data?.status === "OK") {
const { result_list } = data;
setFamilyList(result_list);
const { result_list, session_image_server } = data;
setFamilyList({result_list, session_image_server});
setLoader(false);
} else {
return;
@@ -172,9 +172,10 @@ export default function FamilyAcc() {
</div>
<Suspense fallback={<LoadingSpinner color="sky-blue" size="16" />}>
<FamilyTable
familyList={familyList}
familyList={familyList?.result_list}
loader={loader}
popUpHandler={popUpHandler}
imageServer={familyList?.session_image_server}
/>
</Suspense>
</div>