/* eslint-disable react-hooks/exhaustive-deps */ import { useState, useEffect, useRef, useContext } from 'react'; import NewChat from './NewChat'; import Panel from '../svg/Panel'; import Spinner from '../svg/Spinner'; import Pages from '../Conversations/Pages'; import Conversations from '../Conversations'; import NavLinks from './NavLinks'; import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useGetConversationsQuery, useSearchQuery } from '~/data-provider'; import useDebounce from '~/hooks/useDebounce'; import store from '~/store'; import { useAuthContext } from '~/hooks/AuthContext'; import { ThemeContext } from '~/hooks/ThemeContext'; import { cn } from '~/utils/'; // import resolveConfig from 'tailwindcss/resolveConfig'; // const tailwindConfig = import('../../../tailwind.config.cjs'); // const fullConfig = resolveConfig(tailwindConfig); // export const getBreakpointValue = (value) => // +fullConfig.theme.screens[value].slice(0, fullConfig.theme.screens[value].indexOf('px')); // export const getCurrentBreakpoint = () => { // let currentBreakpoint; // let biggestBreakpointValue = 0; // for (const breakpoint of Object.keys(fullConfig.theme.screens)) { // const breakpointValue = getBreakpointValue(breakpoint); // if (breakpointValue > biggestBreakpointValue && window.innerWidth >= breakpointValue) { // biggestBreakpointValue = breakpointValue; // currentBreakpoint = breakpoint; // } // } // return currentBreakpoint; // }; export default function Nav({ navVisible, setNavVisible }) { const [isHovering, setIsHovering] = useState(false); const { isAuthenticated } = useAuthContext(); const { theme, } = useContext(ThemeContext); const containerRef = useRef(null); const scrollPositionRef = useRef(null); const [conversations, setConversations] = useState([]); // current page const [pageNumber, setPageNumber] = useState(1); // total pages const [pages, setPages] = useState(1); // data provider const getConversationsQuery = useGetConversationsQuery(pageNumber, { enabled: isAuthenticated }); // search const searchQuery = useRecoilValue(store.searchQuery); const isSearchEnabled = useRecoilValue(store.isSearchEnabled); const isSearching = useRecoilValue(store.isSearching); const { newConversation, searchPlaceholderConversation } = store.useConversation(); // current conversation const conversation = useRecoilValue(store.conversation); const { conversationId } = conversation || {}; const setSearchResultMessages = useSetRecoilState(store.searchResultMessages); const refreshConversationsHint = useRecoilValue(store.refreshConversationsHint); const { refreshConversations } = store.useConversations(); const [isFetching, setIsFetching] = useState(false); const debouncedSearchTerm = useDebounce(searchQuery, 750); const searchQueryFn = useSearchQuery(debouncedSearchTerm, pageNumber, { enabled: !!debouncedSearchTerm && debouncedSearchTerm.length > 0 && isSearchEnabled && isSearching }); const onSearchSuccess = (data, expectedPage) => { const res = data; setConversations(res.conversations); if (expectedPage) { setPageNumber(expectedPage); } setPages(res.pages); setIsFetching(false); searchPlaceholderConversation(); setSearchResultMessages(res.messages); }; useEffect(() => { //we use isInitialLoading here instead of isLoading because query is disabled by default if (searchQueryFn.isInitialLoading) { setIsFetching(true); } else if (searchQueryFn.data) { onSearchSuccess(searchQueryFn.data); } }, [searchQueryFn.data, searchQueryFn.isInitialLoading]); const clearSearch = () => { setPageNumber(1); refreshConversations(); if (conversationId == 'search') { newConversation(); } }; const moveToTop = () => { const container = containerRef.current; if (container) { scrollPositionRef.current = container.scrollTop; } }; const nextPage = async () => { moveToTop(); setPageNumber(pageNumber + 1); }; const previousPage = async () => { moveToTop(); setPageNumber(pageNumber - 1); }; useEffect(() => { if (getConversationsQuery.data) { if (isSearching) { return; } let { conversations, pages } = getConversationsQuery.data; if (pageNumber > pages) { setPageNumber(pages); } else { if (!isSearching) { conversations = conversations.sort( (a, b) => new Date(b.createdAt) - new Date(a.createdAt) ); } setConversations(conversations); setPages(pages); } } }, [getConversationsQuery.isSuccess, getConversationsQuery.data, isSearching, pageNumber]); useEffect(() => { if (!isSearching) { getConversationsQuery.refetch(); } }, [pageNumber, conversationId, refreshConversationsHint]); const toggleNavVisible = () => { setNavVisible((prev) => !prev); }; // useEffect(() => { // let currentBreakpoint = getCurrentBreakpoint(); // if (currentBreakpoint === 'sm') { // setNavVisible(false); // } else { // setNavVisible(true); // } // }, [conversationId, setNavVisible]); const isMobile = () => { const userAgent = typeof window.navigator === 'undefined' ? '' : navigator.userAgent; const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i; return mobileRegex.test(userAgent); }; useEffect(() => { if (isMobile()) { setNavVisible(false); } else { setNavVisible(true); } }, [conversationId, setNavVisible]); const containerClasses = getConversationsQuery.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 ( <>