completed user listings functionality
This commit is contained in:
parent
5ec090f6ea
commit
06d1da277f
3 changed files with 61 additions and 4 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
import { FaRegTrashAlt } from "react-icons/fa";
|
||||||
|
import { BiEdit } from "react-icons/bi";
|
||||||
import {useSelector} from'react-redux'
|
import {useSelector} from'react-redux'
|
||||||
import { useEffect, useRef, useState } from 'react'
|
import { useEffect, useRef, useState } from 'react'
|
||||||
import {getDownloadURL, getStorage, ref, uploadBytesResumable} from 'firebase/storage'
|
import {getDownloadURL, getStorage, ref, uploadBytesResumable} from 'firebase/storage'
|
||||||
|
@ -14,6 +16,8 @@ export const Profile = () => {
|
||||||
const [fileUploadError, setFileUploadError] = useState(false)
|
const [fileUploadError, setFileUploadError] = useState(false)
|
||||||
const [formData, setFormData] = useState({})
|
const [formData, setFormData] = useState({})
|
||||||
const [updateSuccess, setUpdateSuccess] = useState(false);
|
const [updateSuccess, setUpdateSuccess] = useState(false);
|
||||||
|
const [userListings, setUserListings] = useState([]);
|
||||||
|
const [userListingsError, setUserListingsError] = useState(false);
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,7 +105,24 @@ export const Profile = () => {
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(deleteUserFailure(error.message))
|
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 (
|
return (
|
||||||
|
@ -129,6 +150,27 @@ export const Profile = () => {
|
||||||
</div>
|
</div>
|
||||||
<p className='text-red-700 mt-4'>{error ? error : ''}</p>
|
<p className='text-red-700 mt-4'>{error ? error : ''}</p>
|
||||||
<p className='text-green-900 mt-4'>{updateSuccess ? 'User profile is updated successfully' : ''}</p>
|
<p className='text-green-900 mt-4'>{updateSuccess ? 'User profile is updated successfully' : ''}</p>
|
||||||
|
{/*===== Show user listing =====*/}
|
||||||
|
<button onClick={handleUserListings} className='text-blue-900 w-full'>View listings</button>
|
||||||
|
<p className='text-red-700 text-sm'>{userListingsError ? 'Error showing listing' : ''}</p>
|
||||||
|
{userListings && userListings.length > 0 &&
|
||||||
|
<div className="flex flex-col gap-4">
|
||||||
|
<h1 className="text-center mt-12 text-md uppercase text-blue-800 font-semibold">Your listings</h1>
|
||||||
|
{userListings.map((listing) => (
|
||||||
|
<div key={listing._id} className="flex justify-between items-center border rounded-md p-2 gap-2">
|
||||||
|
<Link to={`/listing/${listing._id}`}>
|
||||||
|
<img src={listing.imageUrls[0]} alt="" className='h-14 w-14 object-contain'/>
|
||||||
|
</Link>
|
||||||
|
<Link to={`/listing/${listing._id}`} className='text-blue-900 font-semibold hover:underline truncate flex-1' >
|
||||||
|
<p>{listing.name}</p>
|
||||||
|
</Link>
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<button className='text-red-700'><FaRegTrashAlt/></button>
|
||||||
|
<button className='text-green-700'><BiEdit/></button>
|
||||||
</div>
|
</div>
|
||||||
)
|
</div>
|
||||||
|
))}
|
||||||
|
</div>}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import bcryptjs from 'bcryptjs';
|
import bcryptjs from 'bcryptjs';
|
||||||
import User from '../models/user.model.js';
|
import User from '../models/user.model.js';
|
||||||
import { errorHandler } from '../utils/error.js';
|
import { errorHandler } from '../utils/error.js';
|
||||||
|
import Listing from '../models/listing.model.js';
|
||||||
|
|
||||||
export const test = (req, res) => {
|
export const test = (req, res) => {
|
||||||
res.json({
|
res.json({
|
||||||
|
@ -39,4 +40,17 @@ export const deleteUser = async (req, res, next) => {
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error)
|
next(error)
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
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!'));
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,5 +1,5 @@
|
||||||
import express from 'express'
|
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';
|
import { verifyToken } from '../utils/verifyUser.js';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
@ -7,5 +7,6 @@ const router = express.Router();
|
||||||
router.get('/test', test)
|
router.get('/test', test)
|
||||||
router.post('/update/:id', verifyToken, updateUser)
|
router.post('/update/:id', verifyToken, updateUser)
|
||||||
router.delete('/delete/:id', verifyToken, deleteUser)
|
router.delete('/delete/:id', verifyToken, deleteUser)
|
||||||
|
router.get('/listings/:id', verifyToken, getUserListing)
|
||||||
|
|
||||||
export default router
|
export default router
|
Loading…
Add table
Reference in a new issue