import React, { useState, useEffect, useRef } from 'react'; import NewChat from './NewChat'; import Spinner from '../svg/Spinner'; import Conversations from '../Conversations'; import NavLinks from './NavLinks'; import useDidMountEffect from '~/hooks/useDidMountEffect'; import { swr } from '~/utils/fetchers'; import { useDispatch, useSelector } from 'react-redux'; import { increasePage, decreasePage, setPage, setConvos, setPages } from '~/store/convoSlice'; export default function Nav({ navVisible, setNavVisible }) { const dispatch = useDispatch(); const [isHovering, setIsHovering] = useState(false); const { conversationId, convos, pages, pageNumber, refreshConvoHint } = useSelector((state) => state.convo); const onSuccess = (data) => { const { conversations, pages } = data; if (pageNumber > pages) dispatch(setPage(pages)); else dispatch(setConvos(conversations)); dispatch(setPages(pages)); }; const { data, isLoading, mutate } = swr( `/api/convos?pageNumber=${pageNumber}`, onSuccess, {revalidateOnMount: false} ); const containerRef = useRef(null); const scrollPositionRef = useRef(null); const moveToTop = () => { const container = containerRef.current; if (container) { scrollPositionRef.current = container.scrollTop; } } const nextPage = async () => { moveToTop() dispatch(increasePage()); await mutate(); }; const previousPage = async () => { moveToTop() dispatch(decreasePage()); await mutate(); }; useEffect(() => {mutate()}, [pageNumber, conversationId, refreshConvoHint]); useEffect(() => { const container = containerRef.current; if (container && scrollPositionRef.current !== null) { const { scrollHeight, clientHeight } = container; const maxScrollTop = scrollHeight - clientHeight; container.scrollTop = Math.min(maxScrollTop, scrollPositionRef.current); } }, [data]); useEffect(() => { setNavVisible(false) }, [conversationId, ]) const toggleNavVisible = () => { setNavVisible((prev) => { return !prev }) } const containerClasses = isLoading && pageNumber === 1 ? 'flex flex-col gap-2 text-gray-100 text-sm h-full justify-center items-center' : 'flex flex-col gap-2 text-gray-100 text-sm'; return ( <>
); }