From f3ee5da6f4729333a2a135edd44ce722edd24f9c Mon Sep 17 00:00:00 2001 From: Guillaume Dorce Date: Fri, 7 Oct 2022 12:26:26 +0200 Subject: [PATCH] like post and update button if true --- client/src/components/Like.tsx | 34 ++++++++++++++++++++++ client/src/components/Message.tsx | 15 +++------- client/src/controllers/LikeController.ts | 37 ++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 client/src/components/Like.tsx create mode 100644 client/src/controllers/LikeController.ts diff --git a/client/src/components/Like.tsx b/client/src/components/Like.tsx new file mode 100644 index 0000000..144984c --- /dev/null +++ b/client/src/components/Like.tsx @@ -0,0 +1,34 @@ +import { FaThumbsUp } from 'react-icons/fa'; +import { likePost, unlikePost } from '@controllers/LikeController'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { toastError, toastSuccess } from '@controllers/Toasts'; + +const Like = ({ messageId, isLiked }: { messageId: string; isLiked: boolean }) => { + const queryClient = useQueryClient(); + + const mutateLike = useMutation(likePost, { + onSuccess: (data) => { + queryClient.invalidateQueries(['messages']); + toastSuccess('Message aimé'); + }, + onError: (error) => { + toastError(error as string); + }, + }); + + const like = () => { + if (!isLiked) { + console.log('like'); + + mutateLike.mutate(messageId); + } + }; + + return ( + + ); +}; + +export default Like; diff --git a/client/src/components/Message.tsx b/client/src/components/Message.tsx index 6e4919c..a288bb4 100644 --- a/client/src/components/Message.tsx +++ b/client/src/components/Message.tsx @@ -1,9 +1,10 @@ -import { FaThumbsUp } from 'react-icons/fa'; import Avatar from '@components/Avatar'; -import PopupMenu from './PopupMenu'; +import PopupMenu from '@components/PopupMenu'; +import Like from '@components/Like'; import { getMeInfo } from '@controllers/UserController'; import { useQuery } from '@tanstack/react-query'; import { toastError } from '@controllers/Toasts'; +import { useState } from 'react'; const Image = ({ image }: { image: string }) => { if (image === '' || image === null) { @@ -24,14 +25,6 @@ const Text = ({ text }: { text: string }) => { return
{text}
; }; -const Likes = ({ likes }: { likes: number }) => { - return ( -
- -
- ); -}; - const Message = ({ message }: any) => { const me = useQuery(['me'], getMeInfo, { onSuccess: (data) => { @@ -69,7 +62,7 @@ const Message = ({ message }: any) => { minute: 'numeric', })} - + 0 && message.likedBy.find((like: any) => like.userId === me.data?.id)) ? true : false} /> diff --git a/client/src/controllers/LikeController.ts b/client/src/controllers/LikeController.ts new file mode 100644 index 0000000..00f4639 --- /dev/null +++ b/client/src/controllers/LikeController.ts @@ -0,0 +1,37 @@ +import { Cookies } from "react-cookie"; + +const likePost = async (id: string) => { + const token = new Cookies().get('token'); + const response = await fetch(`/api/posts/like/${id}`, { + method: 'PUT', + mode: 'cors', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + }); + const data = await response.json(); + if (data.error) { + throw data.error; + } + return data; +}; + +const unlikePost = async (id: string) => { + const token = new Cookies().get('token'); + const response = await fetch(`/api/posts/unlike/${id}`, { + method: 'PUT', + mode: 'cors', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + }); + const data = await response.json(); + if (data.error) { + throw data.error; + } + return data; +}; + +export { likePost, unlikePost }; \ No newline at end of file