import { useState, useEffect, useContext, useRef, useCallback } from 'react' import Link from 'next/link' import { UserContext } from '../../../contexts/UserContext' import CommentCard from '../CommentCard/CommentCard' import Loader from '../../Loader' import api from '../../../utils/api' import './FunctionComments.css' const FunctionComments = ({ functionId }) => { // State pour poster un commentaire const { isAuth, user } = useContext(UserContext) const [inputState, setInputState] = useState({}) // State pour afficher les commentaires const [commentsData, setCommentsData] = useState({ hasMore: true, rows: [] }) const [isLoadingComments, setLoadingComments] = useState(true) const [pageComments, setPageComments] = useState(1) // Récupère les commentaires si la page change useEffect(() => { getCommentsData().then((data) => setCommentsData({ hasMore: data.hasMore, rows: [...commentsData.rows, ...data.rows] })) }, [pageComments]) // Permet la pagination au scroll const observer = useRef() const lastCommentCardRef = useCallback((node) => { if (isLoadingComments) return if (observer.current) observer.current.disconnect() observer.current = new window.IntersectionObserver((entries) => { if (entries[0].isIntersecting && commentsData.hasMore) { setPageComments(pageComments + 1) } }, { threshold: 1 }) if (node) observer.current.observe(node) }, [isLoadingComments, commentsData.hasMore]) const getCommentsData = async () => { setLoadingComments(true) const { data } = await api.get(`/comments/${functionId}/?page=${pageComments}&limit=10`) setLoadingComments(false) return data } const handleChange = (event) => { const inputStateNew = { ...inputState } inputStateNew[event.target.name] = event.target.value setInputState(inputStateNew) } const handleSubmit = async (event) => { setLoadingComments(true) event.preventDefault() const token = user.token if (isAuth && token != null && inputState.commentPost != null) { try { const response = await api.post(`/comments/${functionId}`, { message: inputState.commentPost }, { headers: { Authorization: token } }) const comment = { ...response.data, user: { name: user.name, logo: user.logo } } setCommentsData({ hasMore: commentsData.hasMore, rows: [comment, ...commentsData.rows] }) setInputState({ commentPost: '' }) } catch { } } setLoadingComments(false) } return ( <>
{ (isAuth) ? (