From 06d1da277f37968b8562897a7b38c2d7ffe68310 Mon Sep 17 00:00:00 2001 From: Juthatip McDevitt Date: Wed, 13 Mar 2024 15:55:08 -0500 Subject: [PATCH] completed user listings functionality --- real_estate/client/src/pages/Profile.jsx | 46 ++++++++++++++++++- .../server/controllers/user.controller.js | 16 ++++++- real_estate/server/routes/user.route.js | 3 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/real_estate/client/src/pages/Profile.jsx b/real_estate/client/src/pages/Profile.jsx index f3ac7f4..de9858f 100644 --- a/real_estate/client/src/pages/Profile.jsx +++ b/real_estate/client/src/pages/Profile.jsx @@ -1,3 +1,5 @@ +import { FaRegTrashAlt } from "react-icons/fa"; +import { BiEdit } from "react-icons/bi"; import {useSelector} from'react-redux' import { useEffect, useRef, useState } from 'react' import {getDownloadURL, getStorage, ref, uploadBytesResumable} from 'firebase/storage' @@ -14,6 +16,8 @@ export const Profile = () => { const [fileUploadError, setFileUploadError] = useState(false) const [formData, setFormData] = useState({}) const [updateSuccess, setUpdateSuccess] = useState(false); + const [userListings, setUserListings] = useState([]); + const [userListingsError, setUserListingsError] = useState(false); const dispatch = useDispatch(); @@ -101,7 +105,24 @@ export const Profile = () => { } catch (error) { dispatch(deleteUserFailure(error.message)) } - } + }; + //show user listing functionality + const handleUserListings = async () => { + try { + setUserListingsError(false); + const res = await fetch(`/server/user/listings/${currentUser._id}`) + const data = await res.json(); + if(data.success === false){ + setUserListingsError(true); + return; + } + setUserListings(data) + + } catch (error) { + setUserListingsError(true); + } + }; + return ( @@ -129,6 +150,27 @@ export const Profile = () => {

{error ? error : ''}

{updateSuccess ? 'User profile is updated successfully' : ''}

+ {/*===== Show user listing =====*/} + +

{userListingsError ? 'Error showing listing' : ''}

+ {userListings && userListings.length > 0 && +
+

Your listings

+ {userListings.map((listing) => ( +
+ + + + +

{listing.name}

+ +
+ + +
+
+ ))} +
} - ) + ); } diff --git a/real_estate/server/controllers/user.controller.js b/real_estate/server/controllers/user.controller.js index 5337912..f412696 100644 --- a/real_estate/server/controllers/user.controller.js +++ b/real_estate/server/controllers/user.controller.js @@ -1,6 +1,7 @@ import bcryptjs from 'bcryptjs'; import User from '../models/user.model.js'; import { errorHandler } from '../utils/error.js'; +import Listing from '../models/listing.model.js'; export const test = (req, res) => { res.json({ @@ -39,4 +40,17 @@ export const deleteUser = async (req, res, next) => { } catch (error) { next(error) } -} \ No newline at end of file +}; + +export const getUserListing = async (req, res, next) => { + if (req.user.id === req.params.id) { + try{ + const listings = await Listing.find({ userRef: req.params.id }); + res.status(200).json(listings); + }catch (error) { + next(error); + } + }else { + return next(errorHandler(401, 'You can only view your own listings!')); + } +}; \ No newline at end of file diff --git a/real_estate/server/routes/user.route.js b/real_estate/server/routes/user.route.js index 728df3b..e0fb862 100644 --- a/real_estate/server/routes/user.route.js +++ b/real_estate/server/routes/user.route.js @@ -1,5 +1,5 @@ import express from 'express' -import { deleteUser, test, updateUser } from '../controllers/user.controller.js'; +import { deleteUser, test, updateUser, getUserListing } from '../controllers/user.controller.js'; import { verifyToken } from '../utils/verifyUser.js'; const router = express.Router(); @@ -7,5 +7,6 @@ const router = express.Router(); router.get('/test', test) router.post('/update/:id', verifyToken, updateUser) router.delete('/delete/:id', verifyToken, deleteUser) +router.get('/listings/:id', verifyToken, getUserListing) export default router \ No newline at end of file