LikeBlock.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
  2. import FavoriteIcon from '@mui/icons-material/Favorite';
  3. import {useEffect, useState} from "react";
  4. import {connect} from "react-redux";
  5. import styled from 'styled-components';
  6. import {gqlAddLike, gqlDeleteLike} from "../shared/services&utilits/gqlRequest";
  7. import ModalWindow from "./ModalWindow";
  8. import UserList from "./UserList";
  9. const LikesWrapper = styled.div`
  10. display: flex;
  11. align-items: center;
  12. `
  13. const TextStyled = styled.p`
  14. margin-left: 10px`
  15. const UserListWrapper = styled.div`
  16. width: 30vw;
  17. height: 50vh;
  18. display: flex;
  19. `
  20. function LikeBlock({likes, ownerId, postId, updatePostData}) {
  21. const [isLiked, setIsLiked] = useState(false)
  22. const [isModal, setModal] = useState(false);
  23. useEffect(() => {
  24. if (likes && likes.length && likes.find((item) => item.owner._id === ownerId)) {
  25. if (!isLiked) {
  26. setIsLiked(true)
  27. }
  28. }
  29. }, [])
  30. function toggleModalWindow() {
  31. setModal(!isModal)
  32. }
  33. const addLikeHandler = async () => {
  34. await gqlAddLike(postId);
  35. setIsLiked(true)
  36. updatePostData();
  37. }
  38. const deleteLike = async () => {
  39. const myLike = likes.find((item) => item.owner._id === ownerId);
  40. myLike && await gqlDeleteLike(myLike._id, postId);
  41. setIsLiked(false)
  42. updatePostData();
  43. }
  44. return (<LikesWrapper>
  45. {isLiked ? <FavoriteIcon onClick={deleteLike} style={{color: "red"}}/> :
  46. <FavoriteBorderIcon onClick={addLikeHandler}/>}
  47. <TextStyled onClick={toggleModalWindow}>{likes && likes.length || "0"} likes</TextStyled>
  48. {isModal && <ModalWindow closeModal={toggleModalWindow}>
  49. <UserListWrapper>
  50. <UserList users={likes} closeModal={toggleModalWindow}/>
  51. </UserListWrapper>
  52. </ModalWindow>}
  53. </LikesWrapper>)
  54. }
  55. const mapStateToProps = (state) => {
  56. return {
  57. ownerId: state.auth.user.sub.id,
  58. }
  59. }
  60. export default connect(mapStateToProps)(LikeBlock);