From 06a60c4871830a262f4ea574440bd1f8aac3bbb7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 9 Jun 2025 12:05:41 +0800 Subject: [PATCH] feat: implement ChatNavbar component and enhance MainNavbar with search functionality --- .../src/components/app/MainNavbar.tsx | 22 +++++- .../pages/home/{Navbar.tsx => ChatNavbar.tsx} | 76 ++++--------------- src/renderer/src/pages/home/HomePage.tsx | 10 +-- .../src/pages/home/Tabs/AssistantsTab.tsx | 4 +- 4 files changed, 39 insertions(+), 73 deletions(-) rename src/renderer/src/pages/home/{Navbar.tsx => ChatNavbar.tsx} (63%) diff --git a/src/renderer/src/components/app/MainNavbar.tsx b/src/renderer/src/components/app/MainNavbar.tsx index 3a8eb23f72..8ec6bd06a5 100644 --- a/src/renderer/src/components/app/MainNavbar.tsx +++ b/src/renderer/src/components/app/MainNavbar.tsx @@ -1,16 +1,27 @@ +import { isMac } from '@renderer/config/constant' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { Tooltip } from 'antd' import { t } from 'i18next' -import { MessageSquareDiff } from 'lucide-react' +import { MessageSquareDiff, Search } from 'lucide-react' import { FC } from 'react' import styled from 'styled-components' +import SearchPopup from '../Popups/SearchPopup' + interface Props {} const HeaderNavbar: FC = () => { return ( -
+
+ {!isMac && ( + + SearchPopup.show()}> + + + + )} +
EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)} style={{ marginRight: 5 }}> @@ -32,6 +43,7 @@ const Container = styled.div` min-height: var(--navbar-height); background-color: transparent; -webkit-app-region: drag; + padding-left: ${isMac ? '75px' : '0'}; ` export const NavbarIcon = styled.div` @@ -69,4 +81,10 @@ export const NavbarIcon = styled.div` } ` +const NarrowIcon = styled(NavbarIcon)` + @media (max-width: 1000px) { + display: none; + } +` + export default HeaderNavbar diff --git a/src/renderer/src/pages/home/Navbar.tsx b/src/renderer/src/pages/home/ChatNavbar.tsx similarity index 63% rename from src/renderer/src/pages/home/Navbar.tsx rename to src/renderer/src/pages/home/ChatNavbar.tsx index 858664085c..fec6864ac2 100644 --- a/src/renderer/src/pages/home/Navbar.tsx +++ b/src/renderer/src/pages/home/ChatNavbar.tsx @@ -1,6 +1,5 @@ import { Navbar } from '@renderer/components/app/Navbar' import { HStack } from '@renderer/components/Layout' -import FloatingSidebar from '@renderer/components/Popups/FloatingSidebar' import MinAppsPopover from '@renderer/components/Popups/MinAppsPopover' import SearchPopup from '@renderer/components/Popups/SearchPopup' import { isLinux, isMac, isWindows } from '@renderer/config/constant' @@ -13,11 +12,11 @@ import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setNarrowMode } from '@renderer/store/settings' -import { Assistant, Topic } from '@renderer/types' +import { Assistant } from '@renderer/types' import { Tooltip } from 'antd' import { t } from 'i18next' -import { LayoutGrid, PanelLeftClose, PanelRightClose, Search } from 'lucide-react' -import { FC, useCallback, useState } from 'react' +import { LayoutGrid, PanelLeft, PanelRight, Search } from 'lucide-react' +import { FC, useCallback } from 'react' import styled from 'styled-components' import SelectModelButton from './components/SelectModelButton' @@ -25,27 +24,22 @@ import UpdateAppButton from './components/UpdateAppButton' interface Props { activeAssistant: Assistant - activeTopic: Topic - setActiveTopic: (topic: Topic) => void - setActiveAssistant: (assistant: Assistant) => void position: 'left' | 'right' } -const HeaderNavbar: FC = ({ activeAssistant, setActiveAssistant, activeTopic, setActiveTopic }) => { +const ChatNavbar: FC = ({ activeAssistant }) => { const { assistant } = useAssistant(activeAssistant.id) const { showAssistants, toggleShowAssistants } = useShowAssistants() const isFullscreen = useFullscreen() const { topicPosition, sidebarIcons, narrowMode } = useSettings() - const { showTopics, toggleShowTopics } = useShowTopics() + const { toggleShowTopics } = useShowTopics() const dispatch = useAppDispatch() - const [sidebarHideCooldown, setSidebarHideCooldown] = useState(false) // Function to toggle assistants with cooldown const handleToggleShowAssistants = useCallback(() => { if (showAssistants) { // When hiding sidebar, set cooldown toggleShowAssistants() - setSidebarHideCooldown(true) // setTimeout(() => { // setSidebarHideCooldown(false) // }, 10000) // 10 seconds cooldown @@ -55,20 +49,6 @@ const HeaderNavbar: FC = ({ activeAssistant, setActiveAssistant, activeTo } }, [showAssistants, toggleShowAssistants]) - const handleToggleShowTopics = useCallback(() => { - if (showTopics) { - // When hiding sidebar, set cooldown - toggleShowTopics() - setSidebarHideCooldown(true) - // setTimeout(() => { - // setSidebarHideCooldown(false) - // }, 10000) // 10 seconds cooldown - } else { - // When showing sidebar, no cooldown needed - toggleShowTopics() - } - }, [showTopics, toggleShowTopics]) - useShortcut('toggle_show_assistants', handleToggleShowAssistants) useShortcut('toggle_show_topics', () => { @@ -95,17 +75,19 @@ const HeaderNavbar: FC = ({ activeAssistant, setActiveAssistant, activeTo toggleShowAssistants()} style={{ marginRight: 8, marginLeft: isMac && !isFullscreen ? 4 : -12 }}> - {showAssistants ? : } + {showAssistants ? : } - - SearchPopup.show()}> - - - + {isMac && ( + + SearchPopup.show()}> + + + + )} @@ -120,34 +102,6 @@ const HeaderNavbar: FC = ({ activeAssistant, setActiveAssistant, activeTo )} - {topicPosition === 'right' && !showTopics && !sidebarHideCooldown && ( - - - toggleShowTopics()}> - - - - - )} - {topicPosition === 'right' && !showTopics && sidebarHideCooldown && ( - - toggleShowTopics()} onMouseOut={() => setSidebarHideCooldown(false)}> - - - - )} - {topicPosition === 'right' && showTopics && ( - - handleToggleShowTopics()}> - - - - )} @@ -163,7 +117,7 @@ const NavbarContainer = styled.div<{ $isFullscreen: boolean; $showSidebar: boole max-height: var(--navbar-height); min-height: var(--navbar-height); justify-content: space-between; - padding-left: ${({ $showSidebar }) => (isMac && !$showSidebar ? '70px' : '20px')}; + padding-left: ${({ $showSidebar }) => (isMac ? ($showSidebar ? '10px' : '75px') : '15px')}; font-weight: bold; color: var(--color-text-1); padding-right: ${({ $isFullscreen }) => ($isFullscreen ? '12px' : isWindows ? '140px' : isLinux ? '120px' : '12px')}; @@ -210,4 +164,4 @@ const NarrowIcon = styled(NavbarIcon)` } ` -export default HeaderNavbar +export default ChatNavbar diff --git a/src/renderer/src/pages/home/HomePage.tsx b/src/renderer/src/pages/home/HomePage.tsx index 5d46ee9219..cbac6b5816 100644 --- a/src/renderer/src/pages/home/HomePage.tsx +++ b/src/renderer/src/pages/home/HomePage.tsx @@ -8,7 +8,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' import Chat from './Chat' -import Navbar from './Navbar' +import ChatNavbar from './ChatNavbar' const HomePage: FC = () => { const { assistants } = useAssistants() @@ -54,13 +54,7 @@ const HomePage: FC = () => { return ( - + = ({ if (assistantsTabSortType === 'tags') { return ( -
+
{getGroupedAssistants.map((group) => ( {group.tag !== t('assistants.tags.untagged') && ( @@ -228,7 +228,7 @@ const GroupTitleName = styled.div` color: var(--color-text); font-size: 13px; line-height: 24px; - margin-right: 2px; + margin-right: 5px; display: flex; `