From 60fa192fda1df63007333e373658465875b06fe4 Mon Sep 17 00:00:00 2001 From: Darius BERTRAND Date: Mon, 16 Jan 2023 18:49:45 +0100 Subject: [PATCH] avancement changement d'image --- .../public/uploads/profil/undefined.jpg | 0 Site Web/client/src/actions/user.actions.js | 4 +- Site Web/client/src/components/AjoutLien.js | 2 +- .../Configurations/ConfigurationDuProfil.js | 42 +++++++++-------- .../client/src/components/Log/Inscription.js | 2 +- .../Post/DisplayPost/DiplayPostDossier.js | 32 +++++++++++++ .../Post/DisplayPost/DisplayPostLikeProfil.js | 33 +++++++++++++ .../Post/DisplayPost/NouveauDisplayPosts.js | 31 ++++++++++++ .../components/Post/NouveauDisplayPosts.js | 47 ------------------- .../components/Post/PostNouvelleAffichage.js | 1 - .../NavigationProfil/DossiersPersonnels.js | 4 +- .../UserProfil/NavigationProfil/PostsLikes.js | 4 +- .../NavigationProfil/PostsPersonnels.js | 4 +- Site Web/client/src/reducers/user.reducer.js | 1 + .../src/styles/component/_ajoutLien.scss | 23 +++++---- Site Web/controllers/upload.controller.js | 35 ++++++++------ Site Web/controllers/user.controller.js | 18 +++++++ Site Web/models/user.model.js | 2 +- Site Web/utils/errors.utils.js | 5 +- 19 files changed, 188 insertions(+), 102 deletions(-) create mode 100644 Site Web/client/public/uploads/profil/undefined.jpg create mode 100644 Site Web/client/src/components/Post/DisplayPost/DiplayPostDossier.js create mode 100644 Site Web/client/src/components/Post/DisplayPost/DisplayPostLikeProfil.js create mode 100644 Site Web/client/src/components/Post/DisplayPost/NouveauDisplayPosts.js delete mode 100644 Site Web/client/src/components/Post/NouveauDisplayPosts.js diff --git a/Site Web/client/public/uploads/profil/undefined.jpg b/Site Web/client/public/uploads/profil/undefined.jpg new file mode 100644 index 00000000..e69de29b diff --git a/Site Web/client/src/actions/user.actions.js b/Site Web/client/src/actions/user.actions.js index 8b0f42fd..c208c591 100644 --- a/Site Web/client/src/actions/user.actions.js +++ b/Site Web/client/src/actions/user.actions.js @@ -34,8 +34,8 @@ export const uploadPicture = (data, id) => { .then((res) => { return axios .get(`${process.env.REACT_APP_API_URL}api/user/${id}`) - .then((res) => { - /*dispatch(setUserDataImg(res.data.picture));*/ + .then((res) => { + dispatch(setUserDataImg(res.data.picture)); }) }) .catch((err) => console.log(err)); diff --git a/Site Web/client/src/components/AjoutLien.js b/Site Web/client/src/components/AjoutLien.js index 28834887..ea76df87 100644 --- a/Site Web/client/src/components/AjoutLien.js +++ b/Site Web/client/src/components/AjoutLien.js @@ -70,7 +70,7 @@ const AjoutLien = () => { } {displayAdd && ( -
+

Ajout d'un lien

setDisplayAdd(false)}> diff --git a/Site Web/client/src/components/Configurations/ConfigurationDuProfil.js b/Site Web/client/src/components/Configurations/ConfigurationDuProfil.js index 62bc15f3..9fb9a88a 100644 --- a/Site Web/client/src/components/Configurations/ConfigurationDuProfil.js +++ b/Site Web/client/src/components/Configurations/ConfigurationDuProfil.js @@ -4,6 +4,7 @@ import PP from "../../assets/img/unknown.png"; import PLUS from "../../assets/img/plus.png"; import { NavLink } from "react-router-dom"; import axios from "axios"; +import { uploadPicture } from '../../actions/user.actions'; @@ -12,11 +13,12 @@ const ConfigurationDuProfil = ()=>{ const userData = useSelector((state) => state.user.user); const [pseudo, setPseudo] = useState(userData.pseudo); - const [nomUtilisateur, setNomUtilisateur] = useState(userData.pseudo); const[userPicture, setUserPicture] = useState(userData.picture) const [tmpImage, setTmpImage] =useState('') const [displayAdd, setDisplayAdd] = useState(false); - const handlevalidationPopup =(e)=>{ + const dispatch = useDispatch(); + + const handleValidationPopup =(e)=>{ setUserPicture(tmpImage); setDisplayAdd(false); } @@ -27,26 +29,34 @@ const ConfigurationDuProfil = ()=>{ }; const handleUpdate = async (e) => { + console.log(userPicture) e.preventDefault(); - //const pseudoError = document.querySelector(".pseudo.error"); - const pictureError =document.querySelector(".picture.error"); + const data = new FormData(); + data.append("pseudo", pseudo); + data.append("userId", userData._id); + data.append("file",userPicture); + dispatch(uploadPicture(data,userData._id)); + //const pseudoError = document.querySelector(".pseudo.error"); + /* const pictureError =document.querySelector(".picture.error"); await axios({ method: "post", url: `${process.env.REACT_APP_API_URL}api/user/upload`, data: { - //pseudo, + // pseudo, userPicture, - }, + + } + , }) .then((res) => { console.log(res); if (res.data.errors) { - // pseudoError.innerHTML = res.data.errors.pseudo; - pictureError.innerHTML = res.data.errors.picture; + //pseudoError.innerHTML = res.data.errors.pseudo; + pictureError.innerHTML = res.data.errors.picture; } }) - .catch((err) => console.log(err)); + .catch((err) => console.log(err));*/ }; @@ -69,22 +79,14 @@ const ConfigurationDuProfil = ()=>{ setDisplayAdd(true)}/> - {/*
*/} +
Pseudo: - Nom d'utilisateur:
- setNomUtilisateur (e.target.value)} - value={nomUtilisateur} - /> { Changer - + {/* onChange={(e)=> setTmpImage(e.target.files[0].name)} */}
- +
diff --git a/Site Web/client/src/components/Log/Inscription.js b/Site Web/client/src/components/Log/Inscription.js index afc04514..9712e195 100644 --- a/Site Web/client/src/components/Log/Inscription.js +++ b/Site Web/client/src/components/Log/Inscription.js @@ -84,7 +84,7 @@ const Inscription = () => { id="email" onChange={(e) => setEmail(e.target.value)} value={email}/> -
+

diff --git a/Site Web/client/src/components/Post/DisplayPost/DiplayPostDossier.js b/Site Web/client/src/components/Post/DisplayPost/DiplayPostDossier.js new file mode 100644 index 00000000..30bbe569 --- /dev/null +++ b/Site Web/client/src/components/Post/DisplayPost/DiplayPostDossier.js @@ -0,0 +1,32 @@ +import { current } from '@reduxjs/toolkit'; +import React, { useEffect, useState, useContext } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { getPosts } from '../../../actions/post.actions'; +import { isEmpty } from "../../Utils"; +import Post from '../PostNouvelleAffichage'; +import { UidContext } from '../../AppContext'; + +const DiplayPostDossier = () => { + const postsData = useSelector((state) => state.post.post); + const uid = useContext(UidContext); + const dispatch = useDispatch(); + useEffect(() => { + dispatch(getPosts()); + },[dispatch]) + + + return ( +
+
    + {!isEmpty(postsData[0]) && + postsData.map((post) => { + if(post.postedId === uid){ + return + } + })} +
+
+ ); +}; + +export default DiplayPostDossier; \ No newline at end of file diff --git a/Site Web/client/src/components/Post/DisplayPost/DisplayPostLikeProfil.js b/Site Web/client/src/components/Post/DisplayPost/DisplayPostLikeProfil.js new file mode 100644 index 00000000..60b6f9fa --- /dev/null +++ b/Site Web/client/src/components/Post/DisplayPost/DisplayPostLikeProfil.js @@ -0,0 +1,33 @@ +import { current } from '@reduxjs/toolkit'; +import React, { useEffect, useState, useContext } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { getPosts } from '../../../actions/post.actions'; +import { isEmpty } from "../../Utils"; +import Post from '../PostNouvelleAffichage'; +import { UidContext } from '../../AppContext'; + +const DisplayPostLikeProfil = () => { + const postsData = useSelector((state) => state.post.post); + const uid = useContext(UidContext); + const dispatch = useDispatch(); + useEffect(() => { + dispatch(getPosts()); + },[dispatch]) + + + return ( +
+
    + {!isEmpty(postsData[0]) && + postsData.filter(post => post.likers.includes(uid)) + .map((post) => { + return + }) +} + +
+
+ ); +}; + +export default DisplayPostLikeProfil; \ No newline at end of file diff --git a/Site Web/client/src/components/Post/DisplayPost/NouveauDisplayPosts.js b/Site Web/client/src/components/Post/DisplayPost/NouveauDisplayPosts.js new file mode 100644 index 00000000..5cceea77 --- /dev/null +++ b/Site Web/client/src/components/Post/DisplayPost/NouveauDisplayPosts.js @@ -0,0 +1,31 @@ +import { current } from '@reduxjs/toolkit'; +import React, { useEffect, useState, useContext } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { getPosts } from '../../../actions/post.actions'; +import { isEmpty } from "../../Utils"; +import Post from '../PostNouvelleAffichage'; +import { UidContext } from '../../AppContext'; + +const NouveauDisplayPosts = () => { + const postsData = useSelector((state) => state.post.post); + const uid = useContext(UidContext); + const dispatch = useDispatch(); + useEffect(() => { + dispatch(getPosts()); + },[dispatch]) + + return ( +
+
    + {!isEmpty(postsData[0]) && + postsData.map((post) => { + if(post.postedId === uid){ + return + } + })} +
+
+ ); +}; + +export default NouveauDisplayPosts; \ No newline at end of file diff --git a/Site Web/client/src/components/Post/NouveauDisplayPosts.js b/Site Web/client/src/components/Post/NouveauDisplayPosts.js deleted file mode 100644 index f5642e4b..00000000 --- a/Site Web/client/src/components/Post/NouveauDisplayPosts.js +++ /dev/null @@ -1,47 +0,0 @@ -import { current } from '@reduxjs/toolkit'; -import React, { useEffect, useState, useContext } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { getPosts } from '../../actions/post.actions'; -import { isEmpty } from "../Utils"; -import Post from './PostNouvelleAffichage'; -import { UidContext } from './../AppContext'; - -const NouveauDisplayPosts = () => { - const [loadPost, setLoadPost] = useState(true); - const [count , setCount] = useState(5); - const dispatch = useDispatch(); - const postsData = useSelector((state) => state.post.post); - const uid = useContext(UidContext); - const loadMore = () => { - if (window.innerHeight + document.documentElement.scrollTop + 1 > document.scrollingElement.scrollHeight){ - setLoadPost(true); - } - } - - useEffect(() => { - if (loadPost) { - dispatch(getPosts(count)); - setLoadPost(false); - setCount(count + 5); - } - window.addEventListener('scroll', loadMore); - return () => window.removeEventListener('scroll',loadMore); - }, [loadPost,dispatch,count]) - - return ( -
-
    - {!isEmpty(postsData[0]) && - postsData.map((post) => { - if(post.postedId === uid){ - return - } - else return null; - - })} -
-
- ); -}; - -export default NouveauDisplayPosts; \ No newline at end of file diff --git a/Site Web/client/src/components/Post/PostNouvelleAffichage.js b/Site Web/client/src/components/Post/PostNouvelleAffichage.js index 7ead740f..4e4d8d0a 100644 --- a/Site Web/client/src/components/Post/PostNouvelleAffichage.js +++ b/Site Web/client/src/components/Post/PostNouvelleAffichage.js @@ -40,7 +40,6 @@ const LinkPreview = ({ link }) => { const PostNouvelleAffichage = ( { post } ) => { const [isLoading, setIsLoading] = useState(true); const usersData = useSelector((state) => state.users.users); - const userData = useSelector((state) => state.user.user); const [updated,setUpdate] = useState(false); const [message, setMessage] = useState(null); const [comments, setComments] = useState(false); diff --git a/Site Web/client/src/components/UserProfil/NavigationProfil/DossiersPersonnels.js b/Site Web/client/src/components/UserProfil/NavigationProfil/DossiersPersonnels.js index 6fce1b96..f1b7b7fd 100644 --- a/Site Web/client/src/components/UserProfil/NavigationProfil/DossiersPersonnels.js +++ b/Site Web/client/src/components/UserProfil/NavigationProfil/DossiersPersonnels.js @@ -1,4 +1,4 @@ -import NouveauDisplayPosts from "../../Post/NouveauDisplayPosts"; +import DiplayPostDossier from "../../Post/DisplayPost/DiplayPostDossier"; @@ -8,7 +8,7 @@ const DossiersPersonnels=()=>{ return(
- +
) diff --git a/Site Web/client/src/components/UserProfil/NavigationProfil/PostsLikes.js b/Site Web/client/src/components/UserProfil/NavigationProfil/PostsLikes.js index c0e37cdd..bfa79115 100644 --- a/Site Web/client/src/components/UserProfil/NavigationProfil/PostsLikes.js +++ b/Site Web/client/src/components/UserProfil/NavigationProfil/PostsLikes.js @@ -1,4 +1,4 @@ -import NouveauDisplayPosts from "../../Post/NouveauDisplayPosts"; +import DisplayPostLikeProfil from "../../Post/DisplayPost/DisplayPostLikeProfil"; @@ -10,7 +10,7 @@ const PostLikes=()=>{ return(
- +
) diff --git a/Site Web/client/src/components/UserProfil/NavigationProfil/PostsPersonnels.js b/Site Web/client/src/components/UserProfil/NavigationProfil/PostsPersonnels.js index 9f0caff6..1b412518 100644 --- a/Site Web/client/src/components/UserProfil/NavigationProfil/PostsPersonnels.js +++ b/Site Web/client/src/components/UserProfil/NavigationProfil/PostsPersonnels.js @@ -1,4 +1,4 @@ -import NouveauDisplayPosts from "../../Post/NouveauDisplayPosts"; +import NouveauDisplayPosts from "../../Post/DisplayPost/NouveauDisplayPosts"; @@ -8,7 +8,7 @@ const PostPersonnels=()=>{ return(
- +
) } diff --git a/Site Web/client/src/reducers/user.reducer.js b/Site Web/client/src/reducers/user.reducer.js index f76bb3b9..4ecf0d6d 100644 --- a/Site Web/client/src/reducers/user.reducer.js +++ b/Site Web/client/src/reducers/user.reducer.js @@ -22,6 +22,7 @@ export const userSlice = createSlice({ (id) => id !== action.payload.idToUnfollow ),}; }, + }, }); diff --git a/Site Web/client/src/styles/component/_ajoutLien.scss b/Site Web/client/src/styles/component/_ajoutLien.scss index a48f7f88..09903901 100644 --- a/Site Web/client/src/styles/component/_ajoutLien.scss +++ b/Site Web/client/src/styles/component/_ajoutLien.scss @@ -8,16 +8,18 @@ cursor: pointer; } -.popup-profil-container { - z-index: 100; - width: 100%; - top: 0; - left: 0; - height: 100%; - position: fixed; - animation: popup 1s forwards; + +.popup-ajout-container { + position: fixed; + animation: popup 1s forwards; + z-index: 100; + left: 50%; + @keyframes popup { + from{ + backdrop-filter: none; + } to { backdrop-filter: blur(2px); } @@ -49,6 +51,7 @@ top: 25px; right: 25px; transition: 0.1s; + cursor: pointer; &:hover { @@ -57,8 +60,12 @@ } ul { + min-width: 250px; + max-width: 300px; margin: 20px 0 0; max-height: 500px; + min-height: 200px; + li { display: grid; diff --git a/Site Web/controllers/upload.controller.js b/Site Web/controllers/upload.controller.js index 8e453b2f..184bc28e 100644 --- a/Site Web/controllers/upload.controller.js +++ b/Site Web/controllers/upload.controller.js @@ -6,23 +6,30 @@ const { uploadErrors } = require('../utils/errors.utils'); module.exports.uploadProfil = async (req, res) => { - try { + console.log(req.body.file); + try { + + console.log(req.body.file); if ( - req.file.detectedMimeType != "image/jpg" && - req.file.detectedMimeType != "image/png" && - req.file.detectedMimeType != "image/jpeg" + req.body.file.detectedMimeType != "image/jpg" && + req.body.file.detectedMimeType != "image/png" && + req.body.file.detectedMimeType != "image/jpeg" ) - throw Error("invalid file"); - - if (req.file.size > 500000) throw Error("max size"); - } catch (err) { - const errors = uploadErrors(err); - return res.status(201).json({ errors }); - } - const fileName = req.body.name + ".jpg"; + throw Error("Invalid file format. Only jpg, jpeg, png formats are allowed."); + + if (req.body.file.size > 500000) throw Error("File size exceeded the maximum limit of 500KB."); + if(req.body.file.size === 0) throw Error("Empty file"); + } catch (err) { + + console.log("File upload failed.") + console.log(err) + return res.status(400).json({ message: err.message }); + + } + const fileName = req.body.file.name + ".jpg"; await pipeline( - req.file.stream, + req.body.file.stream, fs.createWriteStream( `${__dirname}/../client/public/uploads/profil/${fileName}` ) @@ -30,7 +37,7 @@ module.exports.uploadProfil = async (req, res) => { try { await UserModel.findByIdAndUpdate( - req.body.userId, + req.body.file.userId, { $set: { picture: "./uploads/profil/" + fileName } }, { new: true, upsert: true, setDefaultsOnInsert: true }) .then((data) => res.send(data)) diff --git a/Site Web/controllers/user.controller.js b/Site Web/controllers/user.controller.js index c762ea97..cb8d2057 100644 --- a/Site Web/controllers/user.controller.js +++ b/Site Web/controllers/user.controller.js @@ -45,6 +45,24 @@ module.exports.updateUser = async (req, res) => { } }; +// module.exports.compteUpdate = async (req,res)=>{ + +// const{email, password}=req.body + +// try{ +// await UserModel.findOneAndUpdate{ +// {_id: req.params.id} +// {set:{ +// email: req.body.email +// }} +// } +// } + +// } + + + + module.exports.deleteUser = async (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); diff --git a/Site Web/models/user.model.js b/Site Web/models/user.model.js index 15873c16..5cabeadd 100644 --- a/Site Web/models/user.model.js +++ b/Site Web/models/user.model.js @@ -51,7 +51,7 @@ const userSchema = new mongoose.Schema( }, picture: { type: String, - default: "/random-user.png" + default: "./random-user.png" }, bio :{ type: String, diff --git a/Site Web/utils/errors.utils.js b/Site Web/utils/errors.utils.js index 27264635..dfdb9eb0 100644 --- a/Site Web/utils/errors.utils.js +++ b/Site Web/utils/errors.utils.js @@ -32,13 +32,16 @@ module.exports.signInErrors = (err) => { } module.exports.uploadErrors = (err) => { - let errors = { format: '', maxSize: ""}; + let errors = { format: '', maxSize: "",empty:""}; if (err.message.includes('invalid file')) errors.format = "Format incompatabile"; if (err.message.includes('max size')) errors.maxSize = "Le fichier dépasse 500ko"; + + if(err.message.includes('empty file')) + errors.empty ="Le fichier est vide"; return errors }