11import { useAuth } from '@/contexts/AuthContext' ;
2- import { useState , useEffect } from 'react' ;
2+ import { useState , useEffect , useRef } from 'react' ;
33import { ChatHistory as History } from '@/types/chat' ;
44import { useRouter } from 'next/navigation' ;
55import Image from 'next/image' ;
66import Spinner from '../Spinner' ;
77import ModelModal from '../modals/ModelModal' ;
88import EmbedModal from '../modals/EmbedModal' ;
99import Modal from '../modals/Modal' ;
10- import ChatMenu from './ChatMenu ' ;
10+ import ChatMenu from './ChatHistoryEntry ' ;
1111
1212export default function ChatMenuNavbar ( ) {
1313 const { user, signOut } = useAuth ( ) ;
@@ -17,6 +17,7 @@ export default function ChatMenuNavbar() {
1717 const router = useRouter ( ) ;
1818 const [ chatHistory , setChatHistory ] = useState < History > ( { chats : [ ] } ) ;
1919 const [ loadingHistory , setLoadingHistory ] = useState ( true ) ;
20+ const menuRef = useRef < HTMLDivElement > ( null ) ;
2021
2122 // TODO: Fetch chat history from the server
2223 console . log ( setChatHistory ) ;
@@ -25,6 +26,23 @@ export default function ChatMenuNavbar() {
2526 setIsNavbarOpen ( ! isNavbarOpen ) ;
2627 } ;
2728
29+ const handleClickOutside = ( event : MouseEvent ) => {
30+ if (
31+ window . innerWidth < 768 &&
32+ menuRef . current &&
33+ ! menuRef . current . contains ( event . target as Node )
34+ ) {
35+ setIsNavbarOpen ( false ) ;
36+ }
37+ } ;
38+
39+ useEffect ( ( ) => {
40+ document . addEventListener ( 'mousedown' , handleClickOutside ) ;
41+ return ( ) => {
42+ document . removeEventListener ( 'mousedown' , handleClickOutside ) ;
43+ } ;
44+ } ) ;
45+
2846 useEffect ( ( ) => {
2947 const fetchChatHistory = async ( ) => {
3048 setLoadingHistory ( false ) ;
@@ -35,6 +53,7 @@ export default function ChatMenuNavbar() {
3553 return (
3654 < >
3755 < div
56+ ref = { menuRef }
3857 className = { `flex-shrink-0 overscroll-none bg-black transition-all duration-300 ${ isNavbarOpen ? 'w-64' : 'w-0' } ` }
3958 >
4059 < div className = "flex h-full flex-col justify-between" >
@@ -123,7 +142,7 @@ export default function ChatMenuNavbar() {
123142 < Spinner width = "5" height = "5" />
124143 </ div >
125144 ) : (
126- < ChatMenu chats = { chatHistory . chats } />
145+ chatHistory . chats . map ( ( chat ) => < ChatMenu key = { chat . id } chat = { chat } /> )
127146 ) ) }
128147
129148 { isNavbarOpen && (
0 commit comments