Darius BERTRAND 2 years ago
commit 7165065378

@ -13,20 +13,6 @@ export const getUser = (uid) => {
};
};
export const getNotif = (uid) => {
console.log("loadNotif3");
return (dispatch)=> {
return axios
.get(`${process.env.REACT_APP_API_URL}api/user/notif/${uid}`)
.then((res) => {
dispatch(setUserData(res.data))
})
.catch((err) => console.log(err));
};
};
export const uploadPicture = (data, id) => {
return (dispatch) => {
return axios

@ -19,7 +19,7 @@ const AjoutLien = () => {
dispatch(getPosts());
cancelPost();
setDisplayAdd(false);
/*window.location.reload();*/
window.location.reload();
}else {
alert("Veuillez compléter tous les champs.")
}
@ -70,7 +70,7 @@ const AjoutLien = () => {
}
</div>
{displayAdd && (
<div className="popup-ajout-container">
<div className="popup-profil-container">
<div className="modal">
<h3>Ajout d'un lien</h3>
<span className="cross" onClick={() => setDisplayAdd(false)}>

@ -10,7 +10,6 @@ import { uploadPicture } from '../../actions/user.actions';
const ConfigurationDuProfil = ()=>{
const userData = useSelector((state) => state.user.user);
const [pseudo, setPseudo] = useState(userData.pseudo);
const[userPicture, setUserPicture] = useState(userData.picture);

@ -6,21 +6,19 @@ const PolitiqueDeConfidentialite =()=>{
return(
<div className='PolitiqueDeConfidentialiteText'>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. </p>
<p>La politique de confidentialité de notre réseau social est conçue pour vous informer sur les types d'informations que nous collectons, comment elles sont utilisées et protégées, et les choix que vous pouvez faire en ce qui concerne la collecte, l'utilisation et la divulgation de vos informations.</p>
<p>Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
<p>Nous collectons des informations vous concernant lorsque vous utilisez notre réseau social, y compris les informations de compte, les informations de profil, les informations de contenu, les informations de localisation, les informations de connexion et les informations de communication. Nous utilisons ces informations pour fournir et améliorer nos services, personnaliser votre expérience, communiquer avec vous, et pour d'autres fins autorisées par la loi.</p>
<p>Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. </p>
<p>Nous ne vendons ni ne partageons vos informations personnelles avec des tiers à des fins commerciales sans votre consentement. Nous pouvons cependant partager des informations avec des partenaires de confiance pour des raisons telles que la fourniture de services, la conformité aux exigences légales, et la protection de nos utilisateurs et de notre réseau social.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin massa. Cras metus. </p>
<p>Vous pouvez contrôler les informations que vous partagez sur notre réseau social en modifiant les paramètres de votre compte. Vous pouvez également choisir de ne pas recevoir de communications marketing de notre part en suivant les instructions de désinscription incluses dans ces communications.</p>
<p>Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante. Nulla quam. Aenean laoreet. Vestibulum nisi lectus, commodo ac, facilisis ac, ultricies eu, pede. Ut orci risus, accumsan porttitor, cursus quis, aliquet eget, justo. Sed pretium blandit orci. Ut eu diam at pede suscipit sodales. Aenean lectus elit, fermentum non, convallis id, sagittis at, neque. </p>
<p>Nous prenons des mesures pour protéger vos informations contre l'accès non autorisé, l'utilisation, la modification, la divulgation ou la destruction. Ces mesures comprennent des contrôles physiques, électroniques et administratifs pour protéger les informations stockées sur nos systèmes.</p>
<p>Nullam mauris orci, aliquet et, iaculis et, viverra vitae, ligula. Nulla ut felis in purus aliquam imperdiet. Maecenas aliquet mollis lectus. Vivamus consectetuer risus et tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. </p>
<p>Si vous avez des questions ou des préoccupations concernant notre politique de confidentialité, veuillez nous contacter à l'adresse e-mail indiquée sur notre site web. Nous nous réservons le droit de modifier cette politique de temps à autre et vous invite à consulter régulièrement cette page pour rester informé de tout changement.</p>
<p>Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. </p>
<p>Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. </p>
<p>En utilisant notre réseau social, vous acceptez les termes de cette politique de confidentialité.</p>
</div>
)

@ -10,6 +10,7 @@ const Inscription = () => {
const [password, setPassword] = useState('');
const [controlPassword, setControlPassword] = useState('');
const handleRegister = async (e) => {
e.preventDefault();
const terms = document.getElementById("terms");

@ -1,33 +0,0 @@
#suivreAussi{
font-size: 8px;
text-align: center;
border: 2px solid;
border-radius: 30px;
width: 200px;
}
#listeCompteASuivre{
border-top: 2px solid;
}
.infoPersonne{
display: flex;
}
.name{
font-size: 12px;
}
.arobase{
color:gray;
}
.PhotoProfile{
margin: 10px 15px 0px 20px;
width: 40px;
height:40px;
border-radius: 20px;
border: 2px solid #555;
}

@ -1,36 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ma page de test</title>
<link rel="stylesheet" href="SuivreAussi.css" />
</head>
<body>
<div id="suivreAussi">
<h1>Suivre aussi</h1>
<div id="listeCompteASuivre">
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

@ -1,165 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Titre du document</title>
<style>
#likeCommentaire{
background-color: white;
position:fixed;
margin-left:33%;
margin-right: 33%;
border: 2px solid #666;
border-radius:10px;
width: 33%;
}
#divButton{
display:flex;
justify-content: space-between;
}
#divButton > div{
width:50%;
}
#buttonLike,#buttonCommentaire {
margin-top:10px;
background-color: white;
border:none;
width:100%;
height:25px;
}
#buttonLike{
border-bottom:solid 5px black;
}
#like{
display: block;
}
#buttonCommentaire{
border-bottom: none;
}
#commentaire{
display: none;
}
/*like et commentaire*/
#like, #commentaire{
font-size: 8px;
text-align: center;
}
#listeCompteASuivre{
border-top: 2px solid;
}
.infoPersonne{
display: flex;
}
.name{
font-size: 12px;
}
.arobase{
color:gray;
}
.PhotoProfile{
margin: 10px 15px 0px 20px;
width: 40px;
height:40px;
border-radius: 20px;
border: 2px solid #555;
}
</style>
</head>
<body>
<div id="likeCommentaire">
<div id="divButton">
<div><button type="button" id="buttonLike" onclick="openLike()">like</button></div>
<div><button type="button" id="buttonCommentaire" onclick="openCommentaire()">commentaire</button></div>
</div>
<div id="like">
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
</div>
</div>
</div>
<div id="commentaire">
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
<h4>texte du commantaire</h4>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
<h4>texte du commantaire</h4>
</div>
</div>
<div class="infoPersonne">
<img class="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<div class="cadreName">
<h2 class="name">personne 1</h2>
<h3 class="arobase">@personne1</h3>
<h4>texte du commantaire</h4>
</div>
</div>
</div>
</div>
</body>
<script>
function openLike() {
document.getElementById("like").style.display = "block";
document.getElementById("buttonLike").style.borderBottom = "solid 5px black";
document.getElementById("commentaire").style.display = "none";
document.getElementById("buttonCommentaire").style.borderBottom = "none";
}
function openCommentaire() {
document.getElementById("like").style.display = "none";
document.getElementById("buttonLike").style.borderBottom = "none";
document.getElementById("commentaire").style.display = "block";
document.getElementById("buttonCommentaire").style.borderBottom = "solid 5px black";
}
</script>
</html>

@ -1,111 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Titre du document</title>
<style>
* {
box-sizing: border-box;
}
body {
font-family: Roboto, Helvetica, sans-serif;
}
.form-popup {
background-color: white;
display: none;
position:fixed;
margin-left:33%;
margin-right: 33%;
border: 2px solid #666;
border-radius:10px;
width: 33%;
}
/* Largeur complète pour les champs de saisie */
.form-container input[name="lien"],
.form-container textarea[name="description"],
.form-container label{
width: 80%;
margin: 10px 10% 50px 10%;
}
textarea{
resize: none;
height: 100px;
}
input[name="lien"],
textarea[name="description"]{
margin-left: 100px;
border: none;
background: #D9D9D9;
}
.input{
margin-top:20px;
}
#buttonForm{
margin-left:10%;
margin-right:10%;
margin-bottom:10px;
display:flex;
justify-content: space-between;
}
</style>
</head>
<body>
<h2>Forme Popup</h2>
<p>Cliquez sur le bouton "Ouvrir la forme" pour ouvrir la fdbjfndbfhbdbnfhdbfnbdhbfhbdhbfhdbfhdhbfhdbhfforme Popup.</p>
<div class="open-btn">
<button class="open-button" onclick="openForm()"><strong>Ouvrir la forme</strong></button>
</div>
<div>
<div class="form-popup" id="popupFormulaireCreationPoste">
<form action="/action_page.php" class="form-container">
<div class="input">
<label for="lien">Lien:</label>
<input type="text" name="lien" required />
</div>
<div class="input">
<label for="description">Description:</label>
<textarea name="description" row =250></textarea>
</div>
<div id="buttonForm">
<div>
<button type="button" class="btn cancel" onclick="closeForm()">retour</button>
</div>
<div>
<button type="submit" class="btn">Poster</button>
</div>
</div>
</form>
</div>
</div>
<script>
function openForm() {
document.getElementById("popupFormulaireCreationPoste").style.display = "block";
}
function closeForm() {
document.getElementById("popupFormulaireCreationPoste").style.display = "none";
}
</script>
</body>
</html>

@ -1,32 +0,0 @@
#PhotoProfile{
display: block;
margin-left: auto;
margin-right: auto;
width: 150px;
height:150px;
border-radius: 80px;
border: 2px solid #555;
}
#blocAbonnement{
display: flex;
justify-content: center;
}
#blocAbonnement div{
margin-left: 80px;
margin-right: 80px;
}
#blocName{
text-align: center;
}
.nombre{
color:black;
}
.texteNombre{
color:grey;
}

@ -1,28 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ma page de test</title>
<link rel="stylesheet" href="pagePerso.css" />
</head>
<body>
<div id="image">
<img id="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
</div>
<div id="blocName">
<h1>Lena 1er</h1>
<h2 class="subdo">@Lena1er</h2>
<div>
<div id="blocAbonnement">
<div>
<div class="nombre">10k</div>
<div class="texteNombre">Abonnement</div>
</div>
<div>
<div class="nombre">10k</div>
<div class="texteNombre">Abonnée</div>
</div>
</div>
</body>
</html>

@ -1,74 +0,0 @@
body{
background: green;
}
#cadrePoste{
background: white;
border-radius: 5px;
width: 40%;
margin-left: auto;
margin-right: auto;
}
/*haut du poste*/
/*
#cadreInfoPoste{
display: flex;
align-items:center;
}
#PhotoProfile{
margin: 10px 15px 0px 20px;
width: 40px;
height:40px;
border-radius: 20px;
border: 2px solid #555;
}
#NomProfile{
font-family: arial;
font-size: 18px;
}*/
#hautPoste{
display: flex;
align-items:center;
justify-content: space-between;
margin-right: 15px;
}
#cadreInfoPoste{
display: flex;
align-items:center;
}
#PhotoProfile{
margin: 10px 15px 0px 20px;
width: 40px;
height:40px;
border-radius: 20px;
border: 2px solid #555;
}
#NomProfile{
font-family: arial;
font-size: 18px;
}
/*bas poste*/
#basPoste{
display: flex;
align-items:center;
justify-content: space-between;
margin-left: 10px;
margin-right: 10px;
}
#like, #commentaire{
display: flex;
align-items:center;
}

@ -1,43 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ma page de test</title>
<link rel="stylesheet" href="poste.css" />
</head>
<body>
<!--<div id="cadrePoste">
<div id="cadreInfoPoste">
<img id="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<h6 id="NomProfile">Lena 1er</h6>
</div>
</div>-->
<div id="cadrePoste">
<div id="hautPoste">
<div id="cadreInfoPoste">
<img id="PhotoProfile" src="https://i.pinimg.com/originals/5c/a0/cf/5ca0cf624647dced23ec5329ed0cde6f.png"/>
<h6 id="NomProfile">Lena 1er</h6>
</div>
<div>6 jours</div>
</div>
<div id="contenuePoste">
/*utliser leakpreview*/
</div>
<div id="basPoste">
<div id="like">
<img src="coeurs.png">
<div>10k</div>
</div>
<div id="commentaire"> </>
<img src="commentaire.png">
<div>10k</div>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,37 @@
import React, {useEffect,useState} from 'react';
import {useDispatch, useSelector} from "react-redux";
import {getPosts} from "../actions/post.actions";
import {getUserTemp} from "../actions/user.actions";
import {useParams} from "react-router-dom";
import {isEmpty} from "./Utils";
import FollowHandler from "./UserProfil/FollowHandler";
const MiniProfil = ({uid} ) => {
const [userData, setUserData] = useState(null);
useEffect(() => {
async function fetchData() {
const response = await fetch(`${process.env.REACT_APP_API_URL}api/user/${uid}`);
const data = await response.json();
setUserData(data);
}
fetchData();
}, [uid]);
if (!userData) {
return <p>Loading...</p>;
}
return (
<div className="ListReco">
<div className="UtiReco">
<img className="image" src={userData.picture}/>
<a href={`/Profil/${uid}`}>{userData.pseudo}</a>
</div>
</div>
);
};
export default MiniProfil;

@ -23,7 +23,7 @@ const Navbar = () => {
data.append('postedId', userData._id);
data.append('message', description);
data.append('lien', lien);
console.log(data);
//console.log("test",data);
putData(data);
console.log(data);
cancelPost();
@ -78,7 +78,6 @@ const Navbar = () => {
window.location = "/";
}
return (
<div>
{uid ? (
@ -110,11 +109,17 @@ const Navbar = () => {
</NavLink>
</li>
<li className="navbar-item">
<NavLink to="/Profil" className="navbar-link">
<NavLink to={`/Profil/${uid}`} className="navbar-link">
<i className="fas fa-user navbar-icon"></i>
<span className="navbar-title">Me</span>
</NavLink>
</li>
<li className="navbar-item">
<NavLink to="/SearchBar" className="navbar-link">
<i className="fas fa-search navbar-icon"></i>
<span className="navbar-title">Recherche</span>
</NavLink>
</li>
<li className="navbar-item">
<NavLink to="/Configuration" className="navbar-link">
<i className="fas fa-cog navbar-icon"></i>

@ -1,30 +1,30 @@
import React from 'react';
import {isEmpty} from "./Utils";
import React, {useEffect,useState} from 'react';
import {useDispatch, useSelector} from "react-redux";
import {getPosts} from "../actions/post.actions";
import {getUserTemp} from "../actions/user.actions";
import MiniProfil from "./MiniProfil";
const Notif = ({notification} ) => {
const messageNotif = (typeNotif) =>{
if(typeNotif == 'like') {
return "a like";
const Notif = ({notification} ) => {
console.log('notification',notification)
const MessageNotif = (notification) =>{
if(notification.typeNotif == 'like') {
return "a like votre post";
}
return 'a commenter'
else if(notification.typeNotif == 'commente') {
return "a commenter votre post";
}
return 'vous follow'
}
return (
<div className='conteneur_notif'>
<div className='conteneur_notif' key={notification._id}>
<MiniProfil uid={notification.id_user}></MiniProfil>
<div className={'contenue_notif'}>
<img id="PhotoProfile" alt="" src="lien" />
</div>
<div className={'contenue_notif'} >
<h6 id="NomProfile">
{notification.typeNotif}
</h6>
</div>
<div className={'contenue_notif'}>
{
messageNotif(notification.typeNotif)
}
{ MessageNotif(notification) }
</div>
</div>
);
};

@ -0,0 +1,45 @@
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { getPosts } from '../../actions/post.actions';
import { isEmpty } from "../Utils";
import Post from './PostNouvelleAffichage';
const NouveauDisplayPosts = () => {
const [loadPost, setLoadPost] = useState(true);
const [count , setCount] = useState(5);
const dispatch = useDispatch();
const postsData = useSelector((state) => state.post.post);
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])
if (!loadPost) {
return <p>Loading...</p>;
}
return (
<div>
<ul>
{!isEmpty(postsData[0]) &&
postsData.map((post) => {
return <Post post={post} key={post._id}/>
})}
</ul>
</div>
);
};
export default NouveauDisplayPosts;

@ -6,6 +6,7 @@ import { dateParser, isEmpty } from '../Utils';
import ButtonLike from './ButtonLike';
import Comment from './Comment';
import Commentaire from '../../assets/img/commentaire.png';
import MiniProfil from "../MiniProfil";
const LinkPreview = ({ link }) => {
const [preview, setPreview] = useState({ image: '', title: '', description: '' });
@ -63,24 +64,8 @@ const Post = ( { post } ) => {
<div id="postContenu">
<div id="hautPoste">
<div id="cadreInfoPoste">
<img id="PhotoProfile" alt="" src={
!isEmpty(usersData[0]) &&
usersData.map((user) => {
if (user._id === post.postedId) return user.picture;
else return null;
}).join('')
}/>
<h6 id="NomProfile">
{
!isEmpty(usersData[0]) &&
usersData.map((user) => {
if(user._id === post.postedId) return user.pseudo;
else return null;
}).join('')
}
</h6>
{post.postedId !== userData._id &&
(<FollowHandler idToFollow={post.postedId} type={'suggest'}/>)}
<MiniProfil uid={post.postedId}/>
{post.postedId !== userData._id && (<FollowHandler idToFollow={post.postedId} type={'suggest'}/>)}
</div>
<div>{dateParser(post.createdAt)}</div>
</div>

@ -6,6 +6,7 @@ import Trends from '../../pages/Trends.js';
import Discover from '../../pages/Discover.js';
import Profil from '../../pages/Profil.js';
import Configuration from '../../pages/Configuration.js';
import SearchBar from '../../pages/SearchBar.js';
const index = () => {
return (
@ -15,8 +16,9 @@ const index = () => {
<Route path="/Home" element={<Home/>} />
<Route path="/Trends" element={<Trends/>} />
<Route path="/Discover" element={<Discover/>} />
<Route path="/SearchBar" element={<SearchBar/>} />
{/* <Route path="*" element={<HomeNavigation/>} /> */}
<Route path="/Profil" element={<Profil />} />
<Route path="/Profil/:uid" element={<Profil/>} />
<Route path="/Configuration" element={<Configuration/>}/>
</Routes>
</BrowserRouter>

@ -1,25 +1,36 @@
import {React, useState} from 'react';
import React,{useEffect, useState} from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useParams } from 'react-router-dom'
import Navbar from '../components/Navbar';
import { dateParser } from '../components/Utils';
import {dateParser, isEmpty} from '../components/Utils';
import FollowHandler from '../components/UserProfil/FollowHandler';
import LesPostPersonnels from '../components/UserProfil/NavigationProfil/PostsPersonnels';
import LesDossierPersonnels from '../components/UserProfil/NavigationProfil/DossiersPersonnels';
import LesPostsLikes from '../components/UserProfil/NavigationProfil/PostsLikes';
import PostPersonnels from '../components/UserProfil/NavigationProfil/PostsPersonnels';
import DossierPersonnels from '../components/UserProfil/NavigationProfil/DossiersPersonnels';
import PostsLikes from '../components/UserProfil/NavigationProfil/PostsLikes';
import MiniProfil from "../components/MiniProfil";
const Profil = () => {
const userData = useSelector((state) => state.user.user);
const usersData = useSelector((state) => state.users.users);
const dispatch = useDispatch();
const [followingPopup, setFollowingPopup] = useState(false);
const [followerPopup, setFollowerPopup] = useState(false);
const { uid } = useParams();
const [userData, setUserData] = useState(null);
useEffect(() => {
async function fetchData() {
const response = await fetch(`${process.env.REACT_APP_API_URL}api/user/${uid}`);
const data = await response.json();
setUserData(data);
}
fetchData();
}, [uid]);
const [dossierPersonnel,setdossierPersonnels ] = useState(true);
const [postPersonnel,setpostPersonnels ] = useState(false);
const [postLike,setpostLikes ] =useState(false);
const [followingPopup, setFollowingPopup] = useState(false);
const [followerPopup, setFollowerPopup] = useState(false);
const [dossierPersonnels,setdossierPersonnels ] = useState(false);
const [postPersonnels,setpostPersonnels ] = useState(true);
const [postLikes,setpostLikes ] = useState(false)
const handleModalsProfil = (e) => {
const handleModals = (e) => {
if (e.target.id === "DossierPersonnels") {
setdossierPersonnels(true);
setpostPersonnels(false);
@ -35,35 +46,37 @@ const Profil = () => {
}
};
if (!userData) {
return <p>Loading...</p>;
}
return (
<>
<Navbar />
{/* <main>
<div id="bandeauProfil">
<h1 className='affichage-date'>Compte créé le : {dateParser(userData.createdAt)}</h1>
<h1 classNameName='affichage-date'>Compte créé le : {dateParser(userData.createdAt)}</h1>
<div id="image">
<img id="PhotoProfile" alt="Profil" src={userData.picture}/>
</div>
<div id="blocName">
<h1>{userData.pseudo}</h1>
<h2 className="subdo">@{userData.pseudo}</h2>
<h2 classNameName="subdo">@{userData.pseudo}</h2>
<div>
<div id="blocAbonnement">
<div onClick={() => setFollowingPopup(true)} className="bloc-aboonnements-abonner">
<div className="nombre">{userData.following.length}</div>
<div className="texteNombre">Abonnement</div>
<div onClick={() => setFollowingPopup(true)} classNameName="bloc-aboonnements-abonner">
<div classNameName="nombre">{userData.following.length}</div>
<div classNameName="texteNombre">Abonnement</div>
</div>
<div onClick={() => setFollowerPopup(true)} className="bloc-aboonnements-abonner">
<div className="nombre">{userData.followers.length}</div>
<div className="texteNombre">Abonnée</div>
<div onClick={() => setFollowerPopup(true)} classNameName="bloc-aboonnements-abonner">
<div classNameName="nombre">{userData.followers.length}</div>
<div classNameName="texteNombre">Abonnée</div>
</div>
{followingPopup && (
<div className="popup-profil-container">
<div className="modal">
<div classNameName="popup-profil-container">
<div classNameName="modal">
<h3>Abonnements</h3>
<span className="cross" onClick={() => setFollowingPopup(false)}>
<span classNameName="cross" onClick={() => setFollowingPopup(false)}>
&#10005;
</span>
<ul>
@ -74,7 +87,7 @@ const Profil = () => {
<li key={user._id}>
<img src={user.picture} alt="user-pic" />
<h4>{user.pseudo}</h4>
<div className="follow-handler">
<div classNameName="follow-handler">
<FollowHandler idToFollow={user._id} type={'card'}/>
</div>
</li>
@ -88,10 +101,10 @@ const Profil = () => {
</div>
)}
{followerPopup && (
<div className="popup-profil-container">
<div className="modal">
<div classNameName="popup-profil-container">
<div classNameName="modal">
<h3>Abonnés</h3>
<span className="cross" onClick={() => setFollowerPopup(false)}>
<span classNameName="cross" onClick={() => setFollowerPopup(false)}>
&#10005;
</span>
<ul>
@ -102,7 +115,7 @@ const Profil = () => {
<li key={user._id}>
<img src={user.picture} alt="user-pic" />
<h4>{user.pseudo}</h4>
<div className="follow-handler">
<div classNameName="follow-handler">
<FollowHandler idToFollow={user._id} type={'card'} />
</div>
</li>
@ -125,24 +138,24 @@ const Profil = () => {
<main>
<div>
<div>
<div class="imageProfil">
<img class="image" src={userData.picture}/>
<div className="imageProfil">
<img className="image" src={userData.picture}/>
</div>
<div class="divPseudo">
<h3 class="pseudo">{userData.pseudo}</h3>
<div className="divPseudo">
<h3 className="pseudo">{userData.pseudo}</h3>
{/* <h3>suuu</h3> */}
</div>
<div class="divSuivreFollowing">
<a href="#" class="button" id="button">Suivre +</a>
<div className="divSuivreFollowing">
<a href="#" className="button" id="button">Suivre +</a>
</div>
<div class="divSuivreFollowing">
<div class="nbFollow" onClick={() => setFollowingPopup(true)}>
<div className="divSuivreFollowing">
<div className="nbFollow" onClick={() => setFollowingPopup(true)}>
<h4>{userData.following.length}</h4>
<h4 class="txtFollower">Abonnements</h4>
<h4 className="txtFollower">Abonnements</h4>
</div>
<div class="nbFollow" onClick={() => setFollowerPopup(true)}>
<div className="nbFollow" onClick={() => setFollowerPopup(true)}>
<h4>{userData.followers.length}</h4>
<h4 class="txtFollower">Abonnés</h4>
<h4 className="txtFollower">Abonnés</h4>
</div>
</div>
{followingPopup && (
@ -153,50 +166,42 @@ const Profil = () => {
&#10005;
</span>
<ul>
{usersData.map((user) => {
for (let i = 0; i < userData.following.length; i++) {
if (user._id === userData.following[i]) {
return (
<li key={user._id}>
<img src={user.picture} alt="user-pic" />
<h4>{user.pseudo}</h4>
<div className="follow-handler">
<FollowHandler idToFollow={user._id} type={'card'}/>
</div>
</li>
);
}
{
userData.following.map((follower, i) => {
return (
<li key={i}>
<MiniProfil uid={follower}/>
<div classNameName="follow-handler">
<FollowHandler idToFollow={uid} type={'card'}/>
</div>
</li>
)
})
}
return null;
})}
</ul>
</div>
</div>
)}
)}
{followerPopup && (
<div className="popup-profil-container">
<div className="modal">
<div classNameName="popup-profil-container">
<div classNameName="modal">
<h3>Abonnés</h3>
<span className="cross" onClick={() => setFollowerPopup(false)}>
<span classNameName="cross" onClick={() => setFollowerPopup(false)}>
&#10005;
</span>
<ul>
{usersData.map((user) => {
for (let i = 0; i < userData.followers.length; i++) {
if (user._id === userData.followers[i]) {
return (
<li key={user._id}>
<img src={user.picture} alt="user-pic" />
<h4>{user.pseudo}</h4>
<div className="follow-handler">
<FollowHandler idToFollow={user._id} type={'card'} />
</div>
</li>
);
{
userData.followers.map((follower, i) => {
return (
<li key={i}>
<MiniProfil uid={follower}/>
<div classNameName="follow-handler">
<FollowHandler idToFollow={uid} type={'card'}/>
</div>
</li>
)
})
}
}
return null;
})}
</ul>
</div>
</div>
@ -206,52 +211,53 @@ const Profil = () => {
</div>
<div class="basDePage">
<div class="divMenu">
<div className="basDePage">
<div className="divMenu">
<div>
<nav role="navigation" class="navProfil">
<ul class="navItemsProfil">
<li class="navItemProfil">
<a class="navLinkProfil" onClick={handleModalsProfil} id="DossierPersonnels" >Dossier Personnel</a>
<nav role="navigation" className="navProfil">
<ul className="navItemsProfil">
<li className="navItemProfil">
<a className="navLinkProfil" id='DossierPersonnels' onClick={handleModals}><span>Dossier Personnel</span></a>
</li>
<li class="navItemProfil">
<a class="navLinkProfil" onClick={handleModalsProfil} id="PostsPersonnels">Posts</a>
<li className="navItemProfil">
<a className="navLinkProfil" id='PostsPersonnels' onClick={handleModals}><span>Posts</span></a>
</li>
<li class="navItemProfil">
<a class="navLinkProfil" onClick={handleModalsProfil} id="PostsLikes" >Posts likés</a>
<li className="navItemProfil">
<a className="navLinkProfil" id='PostLikes' onClick={handleModals}><span>Posts likés</span></a>
</li>
</ul>
</nav>
</div>
<div class="menuContent listContent">
{dossierPersonnel &&<LesDossierPersonnels/>}
{postPersonnel &&<LesPostPersonnels/>}
{postLike &&<LesPostsLikes/>}
<div className="menuContent">
<div className="listContent">
{dossierPersonnels &&<DossierPersonnels/>}
{postPersonnels &&<PostPersonnels/>}
{postLikes &&<PostsLikes/>}
</div>
</div>
</div>
<div class="recoDiv">
<div class="reco">
<div className="recoDiv">
<div className="reco">
<span>Vous pourriez suivre</span>
<hr/>
<div class="ListReco">
<div class="UtiReco">
<img class="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<div className="ListReco">
<div className="UtiReco">
<img className="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<span>UtiT</span>
<a href="#" class="buttonReco" id="button">Suivre</a>
<a href="#" className="buttonReco" id="button">Suivre</a>
</div>
<div class="UtiReco">
<img class="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<div className="UtiReco">
<img className="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<span>UtiT</span>
<a href="#" class="buttonReco" id="button">Suivre</a>
<a href="#" className="buttonReco" id="button">Suivre</a>
</div>
<div class="UtiReco">
<img class="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<div className="UtiReco">
<img className="image" src="https://ionicframework.com/docs/img/demos/avatar.svg"/>
<span>UtiT</span>
<a href="#" class="buttonReco" id="button">Suivre</a>
<a href="#" className="buttonReco" id="button">Suivre</a>
</div>
</div>

@ -0,0 +1,83 @@
import React, { useState } from 'react';
import { useSelector } from 'react-redux';
import Navbar from '../components/Navbar';
const SearchBar = () => {
const [searchValue, setSearchValue] = useState("");
const [searchUsers, setSearchUsers] = useState(true);
const [searchPosts, setSearchPosts] = useState(false);
const [searchResults, setSearchResults] = useState([]);
const postsData = useSelector((state) => state.post.post);
const usersData = useSelector((state) => state.users.users);
function handleSearch() {
const input = searchValue.toLowerCase();
console.log("Recherche pour : " + input);
const filteredResultsUsers = usersData.filter(function(item) {
return item.pseudo.toLowerCase().indexOf(input) !== -1;
});
const filteredResultsPosts = postsData.filter(function(item) {
return item.message.toLowerCase().indexOf(input) !== -1;
});
if(searchUsers)
setSearchResults(filteredResultsUsers);
if(searchPosts)
setSearchResults(filteredResultsPosts);
console.log(searchResults);
}
const handleModals = (e) => {
if (e.target.id === "Users") {
setSearchUsers(true);
setSearchPosts(false);
} else {
setSearchPosts(true);
setSearchUsers(false);
}
};
return (
<div>
<Navbar />
<main>
<form>
<input type="text" value={searchValue} onChange={(e) => setSearchValue(e.target.value)} placeholder="Rechercher..." />
<button type="button" onClick={handleSearch}>Rechercher</button>
</form>
<div class="divMenu">
<nav role="navigation" class="navProfil">
<ul class="navItemsProfil">
<li class="navItemProfil">
<a class="navLinkProfil" onClick={handleModals} id="Users" >Utilisateur</a>
</li>
<li class="navItemProfil">
<a class="navLinkProfil" onClick={handleModals} id="Posts" >Postes</a>
</li>
</ul>
</nav>
</div>
{ searchUsers &&
<ul>
{searchResults.map((result) => (
<li key={result.pseudo}>{result.pseudo}</li>
))}
</ul>
}
{ searchPosts &&
<ul>
{searchResults.map((result) => (
<li key={result.message}>{result.message}</li>
))}
</ul>
}
</main>
</div>
);
};
export default SearchBar;

@ -1,80 +1,29 @@
import React, {useEffect, useState} from 'react';
import React, {useState} from 'react';
import Navbar from '../components/Navbar';
import Notif from '../components/Notif';
import {useDispatch, useSelector} from "react-redux";
import {getNotif, getUser} from '../actions/user.actions';
import {isEmpty} from "../components/Utils";
import axios from "axios";
import FollowHandler from "../components/UserProfil/FollowHandler";
import Post from "../components/Post/Post";
import {useSelector} from "react-redux";
const Trends = () => {
console.log('test');
const [loadNotif, setLoadNotif] = useState(true);
const [count , setCount] = useState(5);
const dispatch = useDispatch();
const [setLoadNotif] = useState(true);
const userData = useSelector((state) => state.user.user);
const usersData = useSelector((state) => state.users.users);
const loadMore = () => {
if (window.innerHeight + document.documentElement.scrollTop + 1 > document.scrollingElement.scrollHeight){
setLoadNotif(true);
}
}
console.log("userData",userData,userData.notif, userData.notif.length);
return (
<div id={'listeNotif'}>
<Navbar />
<h1>Notification</h1>
{ /*userData.notif.length ? userData.notif.filter(notif => notif._id === userData.notif._id).map((notif) => <Notif message="dfdf"/>)
: <h3>Aucune Notification</h3>*/
{
userData.notif != null && userData.notif.map((notif) => {
return <Notif notification={notif}/>
return (
<li>
<Notif key={notif._id} notification={notif}/>
</li>
);
})
}
</div>
);
/*
return (
<div id={'listeNotif'}>
<Navbar />
<h1>Notification</h1>
{
return(<h3>Aucune Notification</h3>);
userData.notif.map((notif) => {
for (let i = 0; i < userData.notif.length; i++) {
if (notif._id === userData.notif[i]) {
return (
<Notif message="dfdf"/>
);
}
}
return <h3>Aucune Notification</h3>;
})
}
</div>
);*/
// return (
// <div id={'listeNotif'}>
// <Navbar />
// <h1>Notification</h1>
// <Notif message="a like"/>
// <Notif message="a like"/>
// <Notif message="a like"/>
// <Notif message="a like"/>
// <Notif message="a like"/>
// <Notif message="a commenter votre poste"/>
// </div>);
};
export default Trends;

@ -1,7 +1,7 @@
const UserModel = require('../models/user.model');
const jwt = require('jsonwebtoken');
const { signUpErrors, signInErrors } = require('../utils/errors.utils');
//const nodemailer = require('nodemailer');
const maxAge = 3 * 24 * 60 * 60 * 1000;
//expiresIn temps avant l'expiration du token
@ -12,6 +12,63 @@ const createToken = (id) => {
}
// // Définir les informations de connexion pour le service d'envoi d'e-mails
// const transporter = nodemailer.createTransport({
// service: 'gmail',
// auth: {
// user: 'mixmox07340@gmail.com',
// pass: 'Appwow07'
// }
// });
// module.exports.signUp = async (req, res) => {
// console.log(req.body);
// const {pseudo, email, password} = req.body
// try {
// const user = await UserModel.create({pseudo, email, password});
// // Générer un jeton de vérification
// const verificationToken = jwt.sign({ email }, 'secret-key', { expiresIn: '24h' });
// // Préparer l'e-mail de vérification
// const mailOptions = {
// from: 'your-email@gmail.com',
// to: email,
// subject: 'Vérifiez votre adresse e-mail',
// html: `
// <p>Veuillez cliquer sur le lien ci-dessous pour vérifier votre adresse e-mail :</p>
// <a href="http://your-website.com/verify-email?token=${verificationToken}">Cliquez ici pour vérifier</a>
// `
// };
// // Envoyer l'e-mail de vérification
// await transporter.sendMail(mailOptions);
// // Stocker le jeton de vérification associé à l'utilisateur dans la base de données
// await UserModel.updateOne({ _id: user._id }, { verificationToken });
// res.status(200).json({ user: user._id});
// }
// catch(err) {
// const errors = signUpErrors(err);
// res.status(200).send({ errors })
// }
// }
// module.exports.verifyEmail = async (req, res) => {
// const { email, token } = req.body;
// try {
// // Vérifier le jeton de vérification
// jwt.verify(token, 'secret-key', async (err, decoded) => {
// if (err) {
// return res.status(401).json({ error: 'Jeton de vérification non valide' });
// }
// if (decoded.email){
// }
// })
// }catch(err){
// }
// };
//gestion des erreurs
module.exports.signUp = async (req, res) => {
console.log(req.body);
@ -22,7 +79,7 @@ module.exports.signUp = async (req, res) => {
try {
const user = await UserModel.create({pseudo, email, password});
res.status(201).json({ user: user._id});
res.status(200).json({ user: user._id});
}
catch(err) {
const errors = signUpErrors(err);

@ -165,7 +165,9 @@ module.exports.unlikePost = async (req, res) => {
// }
// };
module.exports.commentPost = (req, res) => {
module.exports.commentPost = async (req, res) => {
const idUser = await PostModel.findOne({ _id: ObjectID( req.params.id) });
if (!ObjectID.isValid(req.params.id))
return res.status(400).send("ID unknown : " + req.params.id);
@ -183,7 +185,14 @@ module.exports.commentPost = (req, res) => {
},
},
{ new: true })
.then((data) => res.send(data))
.then((data) => {
addNotification.addNotification(idUser.postedId, {
typeNotif: "commente",
id_user: req.body.commenterId,
id_post1: req.params.id,
id_post2: data.comments.slice(-1)[0]._id
});
res.send(data);})
.catch((err) => res.status(500).send({ message: err }));
} catch (err) {
return res.status(400).send(err);

@ -8,9 +8,7 @@ module.exports.getAllUsers = async (req, res) => {
};
module.exports.getNotif = async (req, res) => {
const users = await UserModel.find().select("-password");
console.log('api get notif',users);
res.status(200).json(users);
};
@ -18,10 +16,15 @@ module.exports.getNotif = async (req, res) => {
module.exports.userInfo = (req, res) => {
if (!ObjectID.isValid(req.params.id))
return res.status(400).send("ID unknown : " + req.params.id);
console.log('userinfo:',req.params.id)
UserModel.findById(req.params.id, (err, docs) => {
if (!err) res.send(docs);
else console.log("ID unknown : " + err);
if (!err) {
console.log('doc:',docs)
res.send(docs);
}
else
console.log("ID unknown : " + err);
}).select("-password");
};

@ -21,6 +21,7 @@
"jsonwebtoken": "^8.5.1",
"mongoose": "^6.6.6",
"multer": "^1.4.5-lts.1",
"nodemailer": "^6.9.0",
"nodemon": "^2.0.20",
"react-dom": "^18.2.0",
"react-redux": "^8.0.5",
@ -13520,6 +13521,14 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
"integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A=="
},
"node_modules/nodemailer": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.0.tgz",
"integrity": "sha512-jFaCEGTeT3E/m/5R2MHWiyQH3pSARECRUDM+1hokOYc3lQAAG7ASuy+2jIsYVf+RVa9zePopSQwKNVFH8DKUpA==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/nodemon": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
@ -28646,6 +28655,11 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
"integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A=="
},
"nodemailer": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.0.tgz",
"integrity": "sha512-jFaCEGTeT3E/m/5R2MHWiyQH3pSARECRUDM+1hokOYc3lQAAG7ASuy+2jIsYVf+RVa9zePopSQwKNVFH8DKUpA=="
},
"nodemon": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",

@ -22,6 +22,7 @@
"jsonwebtoken": "^8.5.1",
"mongoose": "^6.6.6",
"multer": "^1.4.5-lts.1",
"nodemailer": "^6.9.0",
"nodemon": "^2.0.20",
"react-dom": "^18.2.0",
"react-redux": "^8.0.5",

@ -9,6 +9,7 @@ const upload = multer();
//controlleur d'authentification
router.post('/register', authController.signUp);
router.post('/login', authController.signIn);
//router.post('/send-verification-email', authController.verifEmail);
//retirer le token (cookie)
router.get('/logout', authController.logout);

Loading…
Cancel
Save