parent
b7982ff0f0
commit
29c32b2203
@ -0,0 +1 @@
|
||||
/node_modules
|
@ -0,0 +1,134 @@
|
||||
import axios from "axios";
|
||||
import { setPostError } from "../reducers/error.reducer";
|
||||
import { setPostData, setPostLikeData, setPostUnLikeData } from "../reducers/post.reducer";
|
||||
|
||||
export const getPosts = () => {
|
||||
return (dispatch) => {
|
||||
return axios
|
||||
.get(`${process.env.REACT_APP_API_URL}api/post/`)
|
||||
.then((res) => {
|
||||
dispatch(setPostData(res.data));
|
||||
})
|
||||
.catch((err) => console.log(err))
|
||||
}
|
||||
}
|
||||
|
||||
export const likePost = (postId, userId) => {
|
||||
return (dispatch) => {
|
||||
return axios({
|
||||
method: 'patch',
|
||||
url: `${process.env.REACT_APP_API_URL}api/post/like-post/` + postId,
|
||||
data: { id: userId },
|
||||
})
|
||||
.then((res) => {
|
||||
dispatch(setPostLikeData({payload:{ postId, userId }}));
|
||||
})
|
||||
.catch((err) => console.log(err))
|
||||
}
|
||||
}
|
||||
|
||||
export const unlikePost = (postId, userId) => {
|
||||
return (dispatch) => {
|
||||
return axios({
|
||||
method: 'patch',
|
||||
url: `${process.env.REACT_APP_API_URL}api/post/unlike-post/` + postId,
|
||||
data: { id: userId },
|
||||
})
|
||||
.then((res) => {
|
||||
//dispatch(setPostUnLikeData({ postId, userId }));
|
||||
})
|
||||
.catch((err) => console.log(err))
|
||||
}
|
||||
}
|
||||
|
||||
export const addPost = (data) => {
|
||||
console.log(data,"test")
|
||||
return (dispatch) => {
|
||||
return axios
|
||||
.post(`${process.env.REACT_APP_API_URL}api/post/`, data)
|
||||
.then((res) => {
|
||||
console.log(data,"test");
|
||||
// if (res.data.errors) {
|
||||
// dispatch(setPostError({payload: res.data.errors }));
|
||||
// } else {
|
||||
// dispatch(setPostError({payload: "" }));
|
||||
// }
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// // export const updatePost = (postId, message) => {
|
||||
// // return (dispatch) => {
|
||||
// // return axios({
|
||||
// // method: "put",
|
||||
// // url: `${process.env.REACT_APP_API_URL}api/post/${postId}`,
|
||||
// // data: { message },
|
||||
// // })
|
||||
// // .then((res) => {
|
||||
// // dispatch({ type: UPDATE_POST, payload: { message, postId } });
|
||||
// // })
|
||||
// // .catch((err) => console.log(err));
|
||||
// // };
|
||||
// // };
|
||||
|
||||
// export const deletePost = (postId) => {
|
||||
// return (dispatch) => {
|
||||
// return axios({
|
||||
// method: "delete",
|
||||
// url: `${process.env.REACT_APP_API_URL}api/post/${postId}`,
|
||||
// })
|
||||
// .then((res) => {
|
||||
// dispatch({ type: DELETE_POST, payload: { postId } });
|
||||
// })
|
||||
// .catch((err) => console.log(err));
|
||||
// };
|
||||
// };
|
||||
|
||||
// export const addComment = (postId, commenterId, text, commenterPseudo) => {
|
||||
// return (dispatch) => {
|
||||
// return axios({
|
||||
// method: "patch",
|
||||
// url: `${process.env.REACT_APP_API_URL}api/post/comment-post/${postId}`,
|
||||
// data: { commenterId, text, commenterPseudo },
|
||||
// })
|
||||
// .then((res) => {
|
||||
// dispatch({ type: ADD_COMMENT, payload: { postId } });
|
||||
// })
|
||||
// .catch((err) => console.log(err));
|
||||
// };
|
||||
// };
|
||||
|
||||
// export const editComment = (postId, commentId, text) => {
|
||||
// return (dispatch) => {
|
||||
// return axios({
|
||||
// method: "patch",
|
||||
// url: `${process.env.REACT_APP_API_URL}api/post/edit-comment-post/${postId}`,
|
||||
// data: { commentId, text },
|
||||
// })
|
||||
// .then((res) => {
|
||||
// dispatch({ type: EDIT_COMMENT, payload: { postId, commentId, text } });
|
||||
// })
|
||||
// .catch((err) => console.log(err));
|
||||
// };
|
||||
// };
|
||||
|
||||
// export const deleteComment = (postId, commentId) => {
|
||||
// return (dispatch) => {
|
||||
// return axios({
|
||||
// method: "patch",
|
||||
// url: `${process.env.REACT_APP_API_URL}api/post/delete-comment-post/${postId}`,
|
||||
// data: { commentId },
|
||||
// })
|
||||
// .then((res) => {
|
||||
// dispatch({ type: DELETE_COMMENT, payload: { postId, commentId } });
|
||||
// })
|
||||
// .catch((err) => console.log(err));
|
||||
// };
|
||||
// };
|
||||
|
||||
// export const getTrends = (sortedArray) => {
|
||||
// return (dispatch) => {
|
||||
// dispatch({ type: GET_TRENDS, payload: sortedArray });
|
||||
// };
|
||||
// };
|
@ -0,0 +1,61 @@
|
||||
import axios from "axios";
|
||||
import { setUserData, setUserDataImg, setUserToFollowData, setUserToUnFollowData } from "../reducers/user.reducer";
|
||||
|
||||
|
||||
export const getUser = (uid) => {
|
||||
return (dispatch)=> {
|
||||
return axios
|
||||
.get(`${process.env.REACT_APP_API_URL}api/user/${uid}`)
|
||||
.then((res) => {
|
||||
dispatch(setUserData(res.data))
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
export const uploadPicture = (data, id) => {
|
||||
return (dispatch) => {
|
||||
return axios
|
||||
.post(`${process.env.REACT_APP_API_URL}api/user/upload`,data)
|
||||
.then((res) => {
|
||||
return axios
|
||||
.get(`${process.env.REACT_APP_API_URL}api/user/${id}`)
|
||||
.then((res) => {
|
||||
dispatch(setUserDataImg(res.data.picture));
|
||||
})
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
export const followUser = (followerId, idToFollow) => {
|
||||
return async (dispatch) => {
|
||||
try {
|
||||
const res = await axios({
|
||||
method: "patch",
|
||||
url: `${process.env.REACT_APP_API_URL}api/user/follow/` + followerId,
|
||||
data: { idToFollow },
|
||||
});
|
||||
dispatch(setUserToFollowData({payload: { idToFollow }}));
|
||||
} catch (err) {
|
||||
return console.log(err);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
export const unFollowUser = (followerId, idToUnFollow) => {
|
||||
return (dispatch) => {
|
||||
return axios({
|
||||
method: "patch",
|
||||
url: `${process.env.REACT_APP_API_URL}api/user/unfollow/` + followerId,
|
||||
data: { idToUnFollow },
|
||||
})
|
||||
.then((res) => {
|
||||
dispatch(setUserToUnFollowData({payload: {idToUnFollow}}));
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
};
|
||||
};
|
@ -0,0 +1,14 @@
|
||||
import axios from "axios";
|
||||
import { setUsersData } from "../reducers/users.reducer";
|
||||
|
||||
|
||||
export const getUsers = () => {
|
||||
return (dispatch) => {
|
||||
return axios
|
||||
.get(`${process.env.REACT_APP_API_URL}api/user`)
|
||||
.then((res) => {
|
||||
dispatch(setUsersData(res.data));
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
};
|
||||
};
|
@ -1,18 +1,115 @@
|
||||
import React, {useState} from 'react';
|
||||
import NewPoste from "./NewPoste";
|
||||
import axios from 'axios';
|
||||
import React, {useContext, useState} from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { addPost, getPosts } from '../actions/post.actions';
|
||||
import { UidContext } from './AppContext';
|
||||
|
||||
const AjoutLien = () => {
|
||||
const uid = useContext(UidContext);
|
||||
const userData = useSelector((state) => state.user.user);
|
||||
const [displayAdd, setDisplayAdd] = useState(false);
|
||||
const [lien, setLien] = useState("");
|
||||
const [description, setDescription] = useState("");
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const handleModals = (e) => {
|
||||
<NewPoste/>
|
||||
const handlePost = async () => {
|
||||
if(isValidUrl(lien))
|
||||
if ((description || lien) ){
|
||||
putData();
|
||||
dispatch(getPosts());
|
||||
cancelPost();
|
||||
setDisplayAdd(false);
|
||||
window.location.reload();
|
||||
}else {
|
||||
alert("Veuillez compléter tous les champs.")
|
||||
}
|
||||
else{
|
||||
alert("Ce n'est pas lien!")
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const cancelPost = () => {
|
||||
setDescription("");
|
||||
setLien("");
|
||||
};
|
||||
|
||||
const putData = async() => {
|
||||
axios
|
||||
.post(`${process.env.REACT_APP_API_URL}api/post/`, { postedId: userData._id, message: description, lien: lien}
|
||||
)
|
||||
.then((res) => {
|
||||
// if (res.data.errors) {
|
||||
// dispatch(setPostError({payload: res.data.errors }));
|
||||
// } else {
|
||||
// dispatch(setPostError({payload: "" }));
|
||||
// }
|
||||
})};
|
||||
|
||||
const isValidUrl = (url) => {
|
||||
try {
|
||||
new URL(url);
|
||||
return true;
|
||||
}catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className='ajoutLien'>
|
||||
<button className="bouttonAjoutLien" id="display" type='bouton' onClick={handleModals}>
|
||||
{uid === null &&
|
||||
<button className="bouttonAjoutLien" id="display" type='bouton'>
|
||||
Se connecter
|
||||
</button>
|
||||
}
|
||||
{uid !== null &&
|
||||
<button className='button-add-link' onClick={() => setDisplayAdd(true)} >
|
||||
Poster un lien
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
{displayAdd && (
|
||||
<div className="popup-profil-container">
|
||||
<div className="modal">
|
||||
<h3>Ajout d'un lien</h3>
|
||||
<span className="cross" onClick={() => setDisplayAdd(false)}>
|
||||
✕
|
||||
</span>
|
||||
<ul>
|
||||
<form className="newPoste-form-container">
|
||||
<div className="newPoste-input">
|
||||
<input type="text"
|
||||
placeholder="Votre lien!"
|
||||
onChange={(e) => setLien(e.target.value)}
|
||||
value={lien}
|
||||
required />
|
||||
</div>
|
||||
<div className="newPoste-input">
|
||||
<textarea type="text"
|
||||
row="250"
|
||||
placeholder="Description de votre post"
|
||||
onChange={(e) => setDescription(e.target.value)}
|
||||
value={description}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="newPoste-buttonForm">
|
||||
<div>
|
||||
<button onClick={() => setDisplayAdd(false)} className="newPoste-btn-cancel" >retour</button>
|
||||
</div>
|
||||
<div>
|
||||
<button onClick={handlePost} className="newPoste-btn">Poster</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -0,0 +1,40 @@
|
||||
import React, { useContext, useEffect, useState } from 'react';
|
||||
import { UidContext } from "../AppContext";
|
||||
import { useDispatch } from 'react-redux';
|
||||
import Coeur from '../../assets/img/coeurs.png';
|
||||
import CoeurPlein from '../../assets/img/coeursPlein.png';
|
||||
import { likePost, unlikePost } from '../../actions/post.actions';
|
||||
|
||||
const ButtonLike = ( { post } ) => {
|
||||
const [liked, setLiked] = useState(false);
|
||||
const uid = useContext(UidContext);
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const like = () => {
|
||||
dispatch(likePost(post._id, uid))
|
||||
setLiked(true);
|
||||
};
|
||||
|
||||
const unlike = () => {
|
||||
dispatch(unlikePost(post._id, uid))
|
||||
setLiked(false);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (post.likers.includes(uid)) setLiked(true);
|
||||
else setLiked(false);
|
||||
}, [uid, post.likers, liked]);
|
||||
|
||||
return (
|
||||
<div>
|
||||
{uid && liked === false && (
|
||||
<img src={Coeur} onClick={like} alt="like" />
|
||||
)}
|
||||
{uid && liked && (
|
||||
<img src={CoeurPlein} onClick={unlike} alt="unlike" />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ButtonLike;
|
@ -0,0 +1,33 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { getPosts } from '../../actions/post.actions';
|
||||
import NewPoste from '../NewPoste';
|
||||
import { isEmpty } from "../Utils";
|
||||
import Post from './Post';
|
||||
|
||||
const DisplayPosts = () => {
|
||||
const [loadPost, setLoadPost] = useState(true);
|
||||
const [count , setCount] = useState(5);
|
||||
const dispatch = useDispatch();
|
||||
const postsData = useSelector((state) => state.post.post);
|
||||
|
||||
useEffect(() => {
|
||||
if (loadPost) {
|
||||
dispatch(getPosts());
|
||||
setLoadPost(false);
|
||||
}
|
||||
}, [loadPost,dispatch])
|
||||
|
||||
return (
|
||||
<div>
|
||||
<ul>
|
||||
{!isEmpty(postsData[0]) &&
|
||||
postsData.map((post) => {
|
||||
return <Post post={post} key={post._id}/>
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DisplayPosts;
|
@ -0,0 +1,76 @@
|
||||
import axios from 'axios';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import FollowHandler from '../UserProfil/FollowHandler';
|
||||
import { dateParser, isEmpty } from '../Utils';
|
||||
import ButtonLike from './ButtonLike';
|
||||
|
||||
|
||||
//e.preventDefaul(); pour ne pas recharcher la page
|
||||
const Post = ( { post } ) => {
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const usersData = useSelector((state) => state.users.users);
|
||||
const userData = useSelector((state) => state.user.user);
|
||||
|
||||
useEffect(() => {
|
||||
!isEmpty(usersData[0]) && setIsLoading(false)
|
||||
})
|
||||
|
||||
return (
|
||||
<li className='conteneur_postes' key={post._id}>
|
||||
{isLoading ? (
|
||||
<i className='fas fa-spinner fa-spin'></i>
|
||||
):(
|
||||
<div id="cadrePoste">
|
||||
<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'}/>)} */}
|
||||
</div>
|
||||
<div>{dateParser(post.createdAt)}</div>
|
||||
</div>
|
||||
|
||||
<div id="contenuePoste">
|
||||
/*utliser leakpreview*/
|
||||
</div>
|
||||
|
||||
<div id="contenuePoste">
|
||||
<p>{post.message}</p>
|
||||
</div>
|
||||
|
||||
<div id="basPoste">
|
||||
<div id="like">
|
||||
<ButtonLike post={post}/>
|
||||
{/* <img src="coeurs.png"/> */}
|
||||
<div>{post.likers.length}</div>
|
||||
</div>
|
||||
<div id="commentaire">
|
||||
<img src="commentaire.png"/>
|
||||
<div>{post.comments.length}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>) }
|
||||
</li>
|
||||
);
|
||||
};
|
||||
|
||||
//ce qui écrit dans le input est récuperé par le state
|
||||
export default Post;
|
@ -1,36 +0,0 @@
|
||||
import axios from 'axios';
|
||||
import React, { useState } from 'react';
|
||||
|
||||
|
||||
//e.preventDefaul(); pour ne pas recharcher la page
|
||||
const Poste = (props) => {
|
||||
return (
|
||||
<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>
|
||||
);
|
||||
};
|
||||
|
||||
//ce qui écrit dans le input est récuperé par le state
|
||||
export default Poste;
|
@ -0,0 +1,71 @@
|
||||
import axios from 'axios';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { followUser, unFollowUser } from '../../actions/user.actions';
|
||||
import { setUserToFollowData, setUserToUnFollowData } from '../../reducers/user.reducer';
|
||||
import { isEmpty } from '../Utils';
|
||||
|
||||
const FollowHandler = ( { idToFollow , type } ) => {
|
||||
const userData = useSelector((state) => state.user.user);
|
||||
const [isFollowed, setIsFollowed] = useState(false);
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const handleFollow = () => {
|
||||
|
||||
axios.patch(`${process.env.REACT_APP_API_URL}api/user/follow/` + userData._id, {params: {idToFollow: idToFollow}} )
|
||||
.then((res) => {
|
||||
//dispatch(setUserToFollowData({payload: {idToFollow}}));
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
setIsFollowed(false);
|
||||
};
|
||||
|
||||
const handleUnFollow = () => {
|
||||
|
||||
axios.patch(`${process.env.REACT_APP_API_URL}api/user/unfollow/` + userData._id, {params: {idToFollow: idToFollow}} )
|
||||
.then((res) => {
|
||||
// dispatch(setUserToUnFollowData({payload: {idToFollow}}));
|
||||
})
|
||||
.catch((err) => console.log(err));
|
||||
setIsFollowed(false);
|
||||
};
|
||||
|
||||
|
||||
// const handleFollow = () => {
|
||||
// dispatch(followUser(userData._id, idToFollow))
|
||||
// setIsFollowed(true);
|
||||
// }
|
||||
|
||||
// const handleUnFollow = () => {
|
||||
// dispatch(unFollowUser(userData._id, idToFollow))
|
||||
// setIsFollowed(false);
|
||||
// }
|
||||
|
||||
useEffect(() => {
|
||||
if(!isEmpty(userData.following)) {
|
||||
if(userData.following.includes(idToFollow)) {
|
||||
setIsFollowed(true);
|
||||
} else setIsFollowed(false);
|
||||
}
|
||||
|
||||
}, [userData,idToFollow])
|
||||
|
||||
return (
|
||||
<>
|
||||
{isFollowed && !isEmpty(userData) && (
|
||||
<span onClick={handleUnFollow}>
|
||||
{type === "card" && <button className="unfollow-btn">Abonné</button>}
|
||||
{type === "suggest" && <i className="fas fa-check-circle navbar-icon"></i>}
|
||||
</span>
|
||||
)}
|
||||
{isFollowed === false && !isEmpty(userData) && (
|
||||
<span onClick={handleFollow}>
|
||||
{type === "card" && <button className="follow-btn">Suivre</button>}
|
||||
{type === "suggest" && <i className="far fa-check-circle navbar-icon"></i>}
|
||||
</span>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default FollowHandler;
|
@ -0,0 +1,29 @@
|
||||
import React, { useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
|
||||
const UploadImage = () => {
|
||||
const [file,setFile] =useState();
|
||||
//pour envoyer l'image
|
||||
const dispatch = useDispatch();
|
||||
const userData = useSelector((state) => state.user.user)
|
||||
|
||||
const handlePicture = (e) => {
|
||||
e.preventDefault();
|
||||
const data = new FormData();
|
||||
data.append("name", userData.pseudo);
|
||||
data.append("userId", userData._id);
|
||||
data.append("file",file);
|
||||
|
||||
dispatch(uploadPicture(data, userData._id));
|
||||
}
|
||||
return (
|
||||
<form action="" onSubmit={handlePicture} className="">
|
||||
<label htmlFor='file'>Changer d'image</label>
|
||||
<input type="file" id="file" accept='.jpg, .jpeg, .png' onChange={(e) => setFile(e.target.files[0])}/>
|
||||
<br/>
|
||||
<input type="submit" value="Send"/>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default UploadImage;
|
@ -0,0 +1,39 @@
|
||||
export const isEmpty = (value) => {
|
||||
return ( value === 'string ' || value === null ||
|
||||
(typeof value === "object" && Object.keys(value).length === 0) ||
|
||||
(typeof value === "string" && value.trim().length === 0) );
|
||||
};
|
||||
|
||||
export const dateParser = (num) => {
|
||||
let options = {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
weekday: "long",
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
};
|
||||
|
||||
let timestamp = Date.parse(num);
|
||||
|
||||
let date = new Date(timestamp).toLocaleDateString("fr-FR", options);
|
||||
|
||||
return date.toString();
|
||||
};
|
||||
|
||||
export const timestampParser = (num) => {
|
||||
let options = {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
weekday: "long",
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
};
|
||||
|
||||
let date = new Date(num).toLocaleDateString("fr-FR", options);
|
||||
|
||||
return date.toString();
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
export const picturesSlice = createSlice({
|
||||
name: "pictures",
|
||||
initialState: {
|
||||
pictures: null,
|
||||
},
|
||||
reducers: {
|
||||
setPictureData: (state,action) => {
|
||||
state.pictures = action.payload;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const {setPictureData} = picturesSlice.actions;
|
||||
export default picturesSlice.reducer;
|
||||
|
||||
|
@ -1,9 +1,21 @@
|
||||
import React from 'react';
|
||||
import AjoutLien from '../components/AjoutLien';
|
||||
import Navbar from '../components/Navbar';
|
||||
import DisplayPosts from '../components/Post/DisplayPosts';
|
||||
|
||||
const Discover = () => {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main >
|
||||
<div className='postInMain'>
|
||||
<DisplayPosts/>
|
||||
</div>
|
||||
<div className="RightBar">
|
||||
<AjoutLien/>
|
||||
</div>
|
||||
</main>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -0,0 +1,23 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
export const errorSlice = createSlice({
|
||||
name: "error",
|
||||
initialState: {
|
||||
postError: [],
|
||||
userError: []
|
||||
},
|
||||
reducers: {
|
||||
setPostError: (state,action) => {
|
||||
state.postError = action.payload;
|
||||
state.postUser = [];
|
||||
},
|
||||
setUserError: (state,action) => {
|
||||
state.postUser = action.payload;
|
||||
state.userError = [];
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
export const {setPostError} = errorSlice.actions;
|
||||
export const {setUserError} = errorSlice.actions;
|
||||
export default errorSlice.reducer;
|
@ -0,0 +1,21 @@
|
||||
//import { combineReducers } from "redux";
|
||||
import { configureStore } from "@reduxjs/toolkit";
|
||||
import errorReducer from "./error.reducer";
|
||||
import postReducer from "./post.reducer";
|
||||
import userReducer from "./user.reducer";
|
||||
import usersReducer from "./users.reducer";
|
||||
|
||||
/*export default combineReducers({
|
||||
userReducer,
|
||||
})*/
|
||||
|
||||
//import picturesReducer from "../feature/pictures.slice";
|
||||
|
||||
export default configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
users: usersReducer,
|
||||
post: postReducer,
|
||||
error: errorReducer,
|
||||
},
|
||||
});
|
@ -0,0 +1,33 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
export const postSlice = createSlice({
|
||||
name: "post",
|
||||
initialState: {
|
||||
post : null,
|
||||
},
|
||||
reducers: {
|
||||
setPostData: (state,action) => {
|
||||
state.post = action.payload;
|
||||
console.log(state.post)
|
||||
},
|
||||
setPostLikeData: (state,action) => {
|
||||
console.log(...state.post);
|
||||
if (state.post._id === action.payload.postId) {
|
||||
return {
|
||||
...state.post,
|
||||
likers: [action.payload.userId, ...state.post.likers],
|
||||
};
|
||||
}
|
||||
return state.post;
|
||||
},
|
||||
setPostUnLikeData: (state,action) => {
|
||||
console.log(state);
|
||||
console.log(action);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const {setPostUnLikeData} = postSlice.actions;
|
||||
export const {setPostLikeData} = postSlice.actions;
|
||||
export const {setPostData} = postSlice.actions;
|
||||
export default postSlice.reducer;
|
@ -0,0 +1,35 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
export const userSlice = createSlice({
|
||||
name: "user",
|
||||
initialState: {
|
||||
user: null,
|
||||
},
|
||||
reducers: {
|
||||
setUserData: (state,action) => {
|
||||
state.user = action.payload;
|
||||
},
|
||||
setUserDataImg: (state,action) => {
|
||||
state.user = {...state, picture: action.payload};
|
||||
},
|
||||
setUserToFollowData: (state,action) => {
|
||||
state.user = {...state,
|
||||
following: [action.payload.idToFollow, ...state.following],}
|
||||
},
|
||||
setUserToUnFollowData: (state,action) => {
|
||||
state.user = {...state,
|
||||
following: state.following.filter(
|
||||
(id) => id !== action.payload.idToUnfollow
|
||||
),};
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const { setUserToFollowData} = userSlice.actions;
|
||||
export const {setUserToUnFollowData} = userSlice.actions;
|
||||
export const {setUserData} = userSlice.actions;
|
||||
export const {setUserDataImg} = userSlice.actions;
|
||||
export default userSlice.reducer;
|
||||
|
||||
|
||||
|
@ -0,0 +1,16 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
export const usersSlice = createSlice({
|
||||
name: "users",
|
||||
initialState: {
|
||||
users: null,
|
||||
},
|
||||
reducers: {
|
||||
setUsersData: (state,action) => {
|
||||
state.users = action.payload;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const {setUsersData} = usersSlice.actions;
|
||||
export default usersSlice.reducer;
|
@ -1,10 +1,114 @@
|
||||
.ajoutLien{
|
||||
.button-add-link{
|
||||
border: solid black 2px;
|
||||
background-color: beige;
|
||||
border-radius: 10px;
|
||||
width: 140px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.popup-profil-container {
|
||||
z-index: 100;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
animation: popup 1s forwards;
|
||||
|
||||
@keyframes popup {
|
||||
to {
|
||||
backdrop-filter: blur(2px);
|
||||
}
|
||||
}
|
||||
|
||||
.modal {
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 50%;
|
||||
transform: translate(-100%);
|
||||
background: $color-2;
|
||||
padding: 25px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 0 2px rgba(131, 130, 130, 0.356);
|
||||
overflow: auto;
|
||||
transform: scaleY(0);
|
||||
transform-origin: center;
|
||||
animation: modal .5s forwards;
|
||||
|
||||
h3 {
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
@keyframes modal {
|
||||
to {
|
||||
transform: scale(1) translate(-50%);
|
||||
}
|
||||
}
|
||||
|
||||
.cross {
|
||||
position: absolute;
|
||||
top: 100px;
|
||||
right: 50px;
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
transition: 0.1s;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.07);
|
||||
}
|
||||
}
|
||||
|
||||
ul {
|
||||
margin: 20px 0 0;
|
||||
max-height: 500px;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
}
|
||||
&::-webkit-scrollbar-track {
|
||||
background: $color-4;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: $color-1;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb:hover {
|
||||
background: #555;
|
||||
}
|
||||
|
||||
li {
|
||||
display: grid;
|
||||
grid-template-columns: 64px 1fr 114px;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
|
||||
img {
|
||||
height: 50px;
|
||||
width: 50px;
|
||||
border-radius: 20px;
|
||||
object-fit: cover;
|
||||
box-shadow: 0 0 2px rgba(51, 51, 51, 0.376);
|
||||
}
|
||||
h4 {
|
||||
text-align: left;
|
||||
min-width: 210px;
|
||||
}
|
||||
.follow-handler {
|
||||
text-align: left;
|
||||
|
||||
button {
|
||||
background: $color-4;
|
||||
border-radius: 20px;
|
||||
margin-right: 6px;
|
||||
|
||||
.bouttonAjoutLien{
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
&:hover {
|
||||
color: $color-3;
|
||||
transform: translateX(2px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,142 +1,157 @@
|
||||
|
||||
:root {
|
||||
--navbar-background-color: #f2f2f2;
|
||||
--navbar-item-hovered-color:white;
|
||||
--navbar-separator-color:#ececec;
|
||||
--navbar-icon-color:#646c79;
|
||||
--navbar-text-color:black;
|
||||
--navbar-transition-speed: .2s;
|
||||
--primary-color:#7C4DFF;
|
||||
--navbar-logo-background-color:#e2dfe4;
|
||||
}
|
||||
|
||||
html, body {
|
||||
margin:0;
|
||||
font-family: 'Source Sans Pro';
|
||||
font-size:16px;
|
||||
}
|
||||
main {
|
||||
padding: 1rem 4rem;
|
||||
margin-left: 5rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: row;
|
||||
|
||||
}
|
||||
.postInMain{
|
||||
width: 80%;
|
||||
}
|
||||
.RightBar{
|
||||
width: 20%;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
header {
|
||||
height: 50px;
|
||||
background-color: $color-2;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
text-transform: uppercase;
|
||||
color: #b9b9b9;
|
||||
.navbar {
|
||||
width:5rem;
|
||||
position:fixed;
|
||||
top:0px;
|
||||
left:0px;
|
||||
bottom:0px;
|
||||
background:var(--navbar-background-color);
|
||||
box-shadow: rgba(12,43, 30, 0.2) 0 4px 14px;
|
||||
transition: width var(--navbar-transition-speed) ease;
|
||||
}
|
||||
|
||||
.navbar:hover {
|
||||
width:15rem;
|
||||
}
|
||||
|
||||
nav{
|
||||
.navbar-menu {
|
||||
list-style: none;
|
||||
padding:0;
|
||||
margin:0;
|
||||
display:flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
height:100%;
|
||||
}
|
||||
|
||||
.logo{
|
||||
//margin-right: 250px;
|
||||
.navbar-item {
|
||||
width: 100%;
|
||||
border-bottom:solid 1px var(--navbar-separator-color);
|
||||
transition: background-color var(--navbar-transition-speed);
|
||||
}
|
||||
|
||||
|
||||
|
||||
.partie-droit-nav,.partie-gauche-nav{
|
||||
width: 20%;
|
||||
.navbar-item:hover {
|
||||
background-color:var(--navbar-item-hovered-color);
|
||||
}
|
||||
|
||||
.navbar-item:last-child {
|
||||
margin-top:auto;
|
||||
}
|
||||
|
||||
.svg-home{
|
||||
height: 45px;
|
||||
width: 45px;
|
||||
.navbar-link {
|
||||
display:flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
height:5rem;
|
||||
width:100%;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.svg-param{
|
||||
height: 42px;
|
||||
width: 42px;
|
||||
.navbar-icon {
|
||||
text-align: center;
|
||||
font-size: 1.5rem;
|
||||
min-width: 2rem;
|
||||
margin: 0 1.5rem;
|
||||
color:var(--navbar-icon-color);
|
||||
transition:var(--navbar-transition-speed);
|
||||
}
|
||||
|
||||
.navbar-item:hover .navbar-icon {
|
||||
color:var(--primary-color);
|
||||
}
|
||||
|
||||
.navbar-title {
|
||||
color:var(--navbar-text-color);
|
||||
}
|
||||
|
||||
.ul-navBar{
|
||||
display: flex;
|
||||
li{
|
||||
list-style-type: none;
|
||||
padding-left: 1rem;
|
||||
align-self: center;
|
||||
.navbar:not(:hover) .navbar-title {
|
||||
display:none;
|
||||
}
|
||||
|
||||
.nav-active-menu {
|
||||
padding-top: 50px;
|
||||
.logo {
|
||||
background:var(--navbar-logo-background-color);
|
||||
}
|
||||
|
||||
.nav-active-tendances-decouvrir {
|
||||
padding-bottom: 0.75rem;
|
||||
.logo .navbar-title {
|
||||
font-size:1.5rem;
|
||||
font-weight:bold;
|
||||
margin-left:1.5rem;
|
||||
}
|
||||
|
||||
.nav-active {
|
||||
position: relative;
|
||||
.navbar:hover .logo .navbar-icon {
|
||||
transform:rotate(180deg);
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
height: 4px;
|
||||
background: violet;
|
||||
position: absolute;
|
||||
border-radius: 10px;
|
||||
bottom: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
-webkit-animation: anim 0.3s ease forwards;
|
||||
animation: anim 0.6s ease forwards;
|
||||
/*
|
||||
** RESPONSIVE
|
||||
*/
|
||||
|
||||
@-webkit-keyframes anim {
|
||||
to {
|
||||
@media only screen and (max-width:1024px) {
|
||||
.navbar {
|
||||
top:auto;
|
||||
width:100%;
|
||||
}
|
||||
}
|
||||
@keyframes anim {
|
||||
to {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bottom:0px;
|
||||
}
|
||||
|
||||
.img-profile{
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
border-radius: 20px;
|
||||
.navbar:hover {
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.b{
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
.navbar-menu {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.n{
|
||||
height: 0.95rem;
|
||||
width: 0.95rem;
|
||||
padding-top: 0.15rem;
|
||||
overflow: hidden;
|
||||
fill: #b9b9b9;
|
||||
.logo {
|
||||
display:none;
|
||||
}
|
||||
|
||||
|
||||
.more .menu-deroulant {
|
||||
font-size: 20px;
|
||||
outline: none;
|
||||
color: white;
|
||||
background-color: inherit;
|
||||
font-family: inherit;
|
||||
margin-left: 60px;
|
||||
main {
|
||||
margin-left:0;
|
||||
margin-bottom:5rem;
|
||||
}
|
||||
|
||||
.more-menu {
|
||||
.navbar:hover .navbar-title {
|
||||
display:none;
|
||||
position: absolute;
|
||||
background-color: #f9f9f9;
|
||||
min-width: 200px;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.more-menu .element-menu-deroulant {
|
||||
float: none;
|
||||
color: black;
|
||||
padding: 12px 16px;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
text-align: left;
|
||||
.navbar-icon {
|
||||
min-width:auto;
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.dropdown-menu .element-menu-deroulant:hover {
|
||||
background-color: #cccccc;
|
||||
color: black;
|
||||
.navbar-link {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.more:hover .more-menu {
|
||||
display: block;
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
.ligneVertical{
|
||||
border-right: thick solid #000;
|
||||
height:85%;
|
||||
}
|
||||
.ligneHorizontal{
|
||||
border-top: thick solid #000;
|
||||
width: 78%;
|
||||
}
|
@ -0,0 +1,360 @@
|
||||
{
|
||||
"name": "Favor",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"multer": "^1.4.5-lts.1"
|
||||
}
|
||||
},
|
||||
"node_modules/append-field": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
|
||||
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
|
||||
},
|
||||
"node_modules/buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
|
||||
},
|
||||
"node_modules/busboy": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
|
||||
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
|
||||
"dependencies": {
|
||||
"streamsearch": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.16.0"
|
||||
}
|
||||
},
|
||||
"node_modules/concat-stream": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
||||
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
||||
"engines": [
|
||||
"node >= 0.8"
|
||||
],
|
||||
"dependencies": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^2.2.2",
|
||||
"typedarray": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"node_modules/isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
|
||||
},
|
||||
"node_modules/media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
|
||||
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/mkdirp": {
|
||||
"version": "0.5.6",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.6"
|
||||
},
|
||||
"bin": {
|
||||
"mkdirp": "bin/cmd.js"
|
||||
}
|
||||
},
|
||||
"node_modules/multer": {
|
||||
"version": "1.4.5-lts.1",
|
||||
"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
|
||||
"integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
|
||||
"dependencies": {
|
||||
"append-field": "^1.0.0",
|
||||
"busboy": "^1.0.0",
|
||||
"concat-stream": "^1.5.2",
|
||||
"mkdirp": "^0.5.4",
|
||||
"object-assign": "^4.1.1",
|
||||
"type-is": "^1.6.4",
|
||||
"xtend": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.7",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
||||
"dependencies": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"node_modules/streamsearch": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
|
||||
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/type-is": {
|
||||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"dependencies": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/typedarray": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"node_modules/xtend": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
|
||||
"engines": {
|
||||
"node": ">=0.4"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"append-field": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
|
||||
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
|
||||
},
|
||||
"busboy": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
|
||||
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
|
||||
"requires": {
|
||||
"streamsearch": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"concat-stream": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
||||
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^2.2.2",
|
||||
"typedarray": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"requires": {
|
||||
"mime-db": "1.52.0"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
|
||||
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.6",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.6"
|
||||
}
|
||||
},
|
||||
"multer": {
|
||||
"version": "1.4.5-lts.1",
|
||||
"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
|
||||
"integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
|
||||
"requires": {
|
||||
"append-field": "^1.0.0",
|
||||
"busboy": "^1.0.0",
|
||||
"concat-stream": "^1.5.2",
|
||||
"mkdirp": "^0.5.4",
|
||||
"object-assign": "^4.1.1",
|
||||
"type-is": "^1.6.4",
|
||||
"xtend": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.7",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"streamsearch": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
|
||||
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
}
|
||||
},
|
||||
"typedarray": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"xtend": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"multer": "^1.4.5-lts.1"
|
||||
}
|
||||
}
|
Loading…
Reference in new issue