| | import React, { useCallback } from 'react'; |
| | import { useNavigate } from 'react-router-dom'; |
| | import { useQueryClient } from '@tanstack/react-query'; |
| | import { QueryKeys, Constants } from 'librechat-data-provider'; |
| | import { TooltipAnchor, NewChatIcon, MobileSidebar, Sidebar, Button } from '@librechat/client'; |
| | import type { TMessage } from 'librechat-data-provider'; |
| | import { useLocalize, useNewConvo } from '~/hooks'; |
| | import { clearMessagesCache } from '~/utils'; |
| | import store from '~/store'; |
| |
|
| | export default function NewChat({ |
| | index = 0, |
| | toggleNav, |
| | subHeaders, |
| | isSmallScreen, |
| | headerButtons, |
| | }: { |
| | index?: number; |
| | toggleNav: () => void; |
| | isSmallScreen?: boolean; |
| | subHeaders?: React.ReactNode; |
| | headerButtons?: React.ReactNode; |
| | }) { |
| | const queryClient = useQueryClient(); |
| | |
| | const { newConversation: newConvo } = useNewConvo(index); |
| | const navigate = useNavigate(); |
| | const localize = useLocalize(); |
| | const { conversation } = store.useCreateConversationAtom(index); |
| |
|
| | const clickHandler: React.MouseEventHandler<HTMLButtonElement> = useCallback( |
| | (e) => { |
| | if (e.button === 0 && (e.ctrlKey || e.metaKey)) { |
| | window.open('/c/new', '_blank'); |
| | return; |
| | } |
| | clearMessagesCache(queryClient, conversation?.conversationId); |
| | queryClient.invalidateQueries([QueryKeys.messages]); |
| | newConvo(); |
| | navigate('/c/new', { state: { focusChat: true } }); |
| | if (isSmallScreen) { |
| | toggleNav(); |
| | } |
| | }, |
| | [queryClient, conversation, newConvo, navigate, toggleNav, isSmallScreen], |
| | ); |
| |
|
| | return ( |
| | <> |
| | <div className="flex items-center justify-between py-[2px] md:py-2"> |
| | <TooltipAnchor |
| | description={localize('com_nav_close_sidebar')} |
| | render={ |
| | <Button |
| | size="icon" |
| | variant="outline" |
| | data-testid="close-sidebar-button" |
| | aria-label={localize('com_nav_close_sidebar')} |
| | className="rounded-full border-none bg-transparent p-2 hover:bg-surface-hover md:rounded-xl" |
| | onClick={toggleNav} |
| | > |
| | <Sidebar className="max-md:hidden" /> |
| | <MobileSidebar className="m-1 inline-flex size-10 items-center justify-center md:hidden" /> |
| | </Button> |
| | } |
| | /> |
| | <div className="flex gap-0.5"> |
| | {headerButtons} |
| | |
| | <TooltipAnchor |
| | description={localize('com_ui_new_chat')} |
| | render={ |
| | <Button |
| | size="icon" |
| | variant="outline" |
| | data-testid="nav-new-chat-button" |
| | aria-label={localize('com_ui_new_chat')} |
| | className="rounded-full border-none bg-transparent p-2 hover:bg-surface-hover md:rounded-xl" |
| | onClick={clickHandler} |
| | > |
| | <NewChatIcon className="icon-lg text-text-primary" /> |
| | </Button> |
| | } |
| | /> |
| | </div> |
| | </div> |
| | {subHeaders != null ? subHeaders : null} |
| | </> |
| | ); |
| | } |
| |
|