diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx
index 9033af52..6ac062ec 100644
--- a/src/renderer/src/App.tsx
+++ b/src/renderer/src/App.tsx
@@ -13,7 +13,6 @@ import { ThemeProvider } from './context/ThemeProvider'
import AgentsPage from './pages/agents/AgentsPage'
import AppsPage from './pages/apps/AppsPage'
import FilesPage from './pages/files/FilesPage'
-import HistoryPage from './pages/history/HistoryPage'
import HomePage from './pages/home/HomePage'
import PaintingsPage from './pages/paintings/PaintingsPage'
import SettingsPage from './pages/settings/SettingsPage'
@@ -36,7 +35,6 @@ function App(): JSX.Element {
} />
} />
} />
- } />
} />
diff --git a/src/renderer/src/components/Popups/SearchPopup.tsx b/src/renderer/src/components/Popups/SearchPopup.tsx
new file mode 100644
index 00000000..fbe9872f
--- /dev/null
+++ b/src/renderer/src/components/Popups/SearchPopup.tsx
@@ -0,0 +1,65 @@
+import HistoryPage from '@renderer/pages/history/HistoryPage'
+import { Modal } from 'antd'
+import { useState } from 'react'
+
+import { TopView } from '../TopView'
+
+interface Props {
+ resolve: (data: any) => void
+}
+
+const PopupContainer: React.FC = ({ resolve }) => {
+ const [open, setOpen] = useState(true)
+
+ const onOk = () => {
+ setOpen(false)
+ }
+
+ const onCancel = () => {
+ setOpen(false)
+ }
+
+ const onClose = () => {
+ resolve({})
+ }
+
+ SearchPopup.hide = onCancel
+
+ return (
+
+
+
+ )
+}
+
+export default class SearchPopup {
+ static topviewId = 0
+ static hide() {
+ TopView.hide('SearchPopup')
+ }
+ static show() {
+ return new Promise((resolve) => {
+ TopView.show(
+ {
+ resolve(v)
+ TopView.hide('SearchPopup')
+ }}
+ />,
+ 'SearchPopup'
+ )
+ })
+ }
+}
diff --git a/src/renderer/src/components/Popups/TemplatePopup.tsx b/src/renderer/src/components/Popups/TemplatePopup.tsx
index 9b961648..c25827b6 100644
--- a/src/renderer/src/components/Popups/TemplatePopup.tsx
+++ b/src/renderer/src/components/Popups/TemplatePopup.tsx
@@ -27,17 +27,27 @@ const PopupContainer: React.FC = ({ title, resolve }) => {
resolve({})
}
+ TemplatePopup.hide = onCancel
+
return (
-
+
Name
)
}
+const TopViewKey = 'TemplatePopup'
+
export default class TemplatePopup {
static topviewId = 0
static hide() {
- TopView.hide('TemplatePopup')
+ TopView.hide(TopViewKey)
}
static show(props: ShowParams) {
return new Promise((resolve) => {
@@ -46,10 +56,10 @@ export default class TemplatePopup {
{...props}
resolve={(v) => {
resolve(v)
- this.hide()
+ TopView.hide(TopViewKey)
}}
/>,
- 'TemplatePopup'
+ TopViewKey
)
})
}
diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx
index f05ba782..e7794452 100644
--- a/src/renderer/src/components/app/Sidebar.tsx
+++ b/src/renderer/src/components/app/Sidebar.tsx
@@ -1,4 +1,4 @@
-import { FileSearchOutlined, FolderOutlined, PictureOutlined, TranslationOutlined } from '@ant-design/icons'
+import { FolderOutlined, PictureOutlined, TranslationOutlined } from '@ant-design/icons'
import { isMac } from '@renderer/config/constant'
import { isLocalAi, UserAvatar } from '@renderer/config/env'
import { useTheme } from '@renderer/context/ThemeProvider'
@@ -93,13 +93,6 @@ const Sidebar: FC = () => {
-
- to('/messages')}>
-
-
-
-
-
diff --git a/src/renderer/src/context/AntdProvider.tsx b/src/renderer/src/context/AntdProvider.tsx
index a9266bb9..1e6410f0 100644
--- a/src/renderer/src/context/AntdProvider.tsx
+++ b/src/renderer/src/context/AntdProvider.tsx
@@ -31,6 +31,9 @@ const AntdProvider: FC = ({ children }) => {
Menu: {
activeBarBorderWidth: 0,
darkItemBg: 'transparent'
+ },
+ Modal: {
+ colorBgMask: isDarkTheme ? 'rgba(0, 0, 0, 0.85)' : 'rgba(255, 255, 255, 0.9)'
}
},
token: {
diff --git a/src/renderer/src/pages/history/HistoryPage.tsx b/src/renderer/src/pages/history/HistoryPage.tsx
index 405770e4..53191b6b 100644
--- a/src/renderer/src/pages/history/HistoryPage.tsx
+++ b/src/renderer/src/pages/history/HistoryPage.tsx
@@ -1,7 +1,6 @@
import { ArrowLeftOutlined, EnterOutlined, SearchOutlined } from '@ant-design/icons'
-import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
import { Message, Topic } from '@renderer/types'
-import { Divider, Input } from 'antd'
+import { Input } from 'antd'
import { last } from 'lodash'
import { FC, useState } from 'react'
import { useTranslation } from 'react-i18next'
@@ -59,44 +58,38 @@ const TopicsPage: FC = () => {
return (
-
- {t('history.title')}
-
-
-
- {stack.length > 1 && (
-
-
-
-
-
- )}
- setSearch(e.target.value.trimStart())}
- suffix={search.length >= 2 ? : }
- onPressEnter={onSearch}
- />
-
-
-
+ {stack.length > 1 && (
+
+
+
+
+
+ )}
+ setSearch(e.target.value.trimStart())}
+ suffix={search.length >= 2 ? : }
+ onPressEnter={onSearch}
/>
-
-
-
-
+
+
+
+
+
)
}
@@ -108,24 +101,17 @@ const Container = styled.div`
height: 100%;
`
-const ContentContainer = styled.div`
- display: flex;
- flex: 1;
- flex-direction: column;
- align-items: center;
- height: 100%;
- overflow-y: scroll;
-`
-
const Header = styled.div`
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
- padding: 8px 20px;
- padding-top: 10px;
+ padding: 10px 0;
width: 100%;
position: relative;
+ background-color: var(--color-background-mute);
+ border-top-left-radius: 8px;
+ border-top-right-radius: 8px;
`
const HeaderLeft = styled.div`
diff --git a/src/renderer/src/pages/history/components/SearchMessage.tsx b/src/renderer/src/pages/history/components/SearchMessage.tsx
index e69a6fe7..5422ab57 100644
--- a/src/renderer/src/pages/history/components/SearchMessage.tsx
+++ b/src/renderer/src/pages/history/components/SearchMessage.tsx
@@ -2,11 +2,11 @@ import { ArrowRightOutlined } from '@ant-design/icons'
import { HStack } from '@renderer/components/Layout'
import { default as MessageItem } from '@renderer/pages/home/Messages/Message'
import { locateToMessage } from '@renderer/services/MessagesService'
+import NavigationService from '@renderer/services/NavigationService'
import { Message } from '@renderer/types'
import { Button } from 'antd'
import { FC } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNavigate } from 'react-router'
import styled from 'styled-components'
interface Props extends React.HTMLAttributes {
@@ -14,7 +14,7 @@ interface Props extends React.HTMLAttributes {
}
const SearchMessage: FC = ({ message, ...props }) => {
- const navigate = useNavigate()
+ const navigate = NavigationService.navigate!
const { t } = useTranslation()
if (!message) {
diff --git a/src/renderer/src/pages/history/components/TopicMessages.tsx b/src/renderer/src/pages/history/components/TopicMessages.tsx
index 33bd7902..d1f54911 100644
--- a/src/renderer/src/pages/history/components/TopicMessages.tsx
+++ b/src/renderer/src/pages/history/components/TopicMessages.tsx
@@ -1,15 +1,16 @@
import { ArrowRightOutlined, MessageOutlined } from '@ant-design/icons'
import { HStack } from '@renderer/components/Layout'
+import SearchPopup from '@renderer/components/Popups/SearchPopup'
import useScrollPosition from '@renderer/hooks/useScrollPosition'
import { useSettings } from '@renderer/hooks/useSettings'
import { getAssistantById } from '@renderer/services/AssistantService'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { locateToMessage } from '@renderer/services/MessagesService'
+import NavigationService from '@renderer/services/NavigationService'
import { Topic } from '@renderer/types'
import { Button, Divider, Empty } from 'antd'
import { t } from 'i18next'
import { FC } from 'react'
-import { useNavigate } from 'react-router'
import styled from 'styled-components'
import { default as MessageItem } from '../../home/Messages/Message'
@@ -19,7 +20,7 @@ interface Props extends React.HTMLAttributes {
}
const TopicMessages: FC = ({ topic, ...props }) => {
- const navigate = useNavigate()
+ const navigate = NavigationService.navigate!
const { handleScroll, containerRef } = useScrollPosition('TopicMessages')
const { messageStyle } = useSettings()
@@ -30,6 +31,7 @@ const TopicMessages: FC = ({ topic, ...props }) => {
}
const onContinueChat = (topic: Topic) => {
+ SearchPopup.hide()
const assistant = getAssistantById(topic.assistantId)
navigate('/', { state: { assistant, topic } })
setTimeout(() => EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR), 100)
diff --git a/src/renderer/src/pages/home/HomePage.tsx b/src/renderer/src/pages/home/HomePage.tsx
index fd15acab..5343bc64 100644
--- a/src/renderer/src/pages/home/HomePage.tsx
+++ b/src/renderer/src/pages/home/HomePage.tsx
@@ -1,9 +1,10 @@
import { useAssistants } from '@renderer/hooks/useAssistant'
import { useShowAssistants } from '@renderer/hooks/useStore'
import { useActiveTopic } from '@renderer/hooks/useTopic'
+import NavigationService from '@renderer/services/NavigationService'
import { Assistant } from '@renderer/types'
-import { FC, useState } from 'react'
-import { useLocation } from 'react-router-dom'
+import { FC, useEffect, useState } from 'react'
+import { useLocation, useNavigate } from 'react-router-dom'
import styled from 'styled-components'
import Chat from './Chat'
@@ -14,6 +15,7 @@ let _activeAssistant: Assistant
const HomePage: FC = () => {
const { assistants } = useAssistants()
+ const navigate = useNavigate()
const location = useLocation()
const state = location.state
@@ -24,6 +26,15 @@ const HomePage: FC = () => {
_activeAssistant = activeAssistant
+ useEffect(() => {
+ NavigationService.setNavigate(navigate)
+ }, [navigate])
+
+ useEffect(() => {
+ state?.assistant && setActiveAssistant(state?.assistant)
+ state?.topic && setActiveTopic(state?.topic)
+ }, [state])
+
return (
diff --git a/src/renderer/src/pages/home/Navbar.tsx b/src/renderer/src/pages/home/Navbar.tsx
index 32a1f74a..bae7a057 100644
--- a/src/renderer/src/pages/home/Navbar.tsx
+++ b/src/renderer/src/pages/home/Navbar.tsx
@@ -1,12 +1,12 @@
-import { FormOutlined } from '@ant-design/icons'
+import { SearchOutlined } from '@ant-design/icons'
import { Navbar, NavbarLeft, NavbarRight } from '@renderer/components/app/Navbar'
import AssistantSettingsPopup from '@renderer/components/AssistantSettings'
import { HStack } from '@renderer/components/Layout'
+import SearchPopup from '@renderer/components/Popups/SearchPopup'
import { isMac, isWindows } from '@renderer/config/constant'
import { useAssistant } from '@renderer/hooks/useAssistant'
import { useSettings } from '@renderer/hooks/useSettings'
import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore'
-import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { Assistant, Topic } from '@renderer/types'
import { FC } from 'react'
import styled from 'styled-components'
@@ -25,8 +25,6 @@ const HeaderNavbar: FC = ({ activeAssistant }) => {
const { topicPosition } = useSettings()
const { showTopics, toggleShowTopics } = useShowTopics()
- const addNewTopic = () => EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)
-
return (
{showAssistants && (
@@ -34,8 +32,8 @@ const HeaderNavbar: FC = ({ activeAssistant }) => {
-
-
+ SearchPopup.show()}>
+
)}
diff --git a/src/renderer/src/pages/settings/ProviderSettings/ApiCheckPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ApiCheckPopup.tsx
index b9f6c7d9..67d54c37 100644
--- a/src/renderer/src/pages/settings/ProviderSettings/ApiCheckPopup.tsx
+++ b/src/renderer/src/pages/settings/ProviderSettings/ApiCheckPopup.tsx
@@ -1,7 +1,6 @@
import { CheckCircleFilled, CloseCircleFilled, LoadingOutlined } from '@ant-design/icons'
import Scrollbar from '@renderer/components/Scrollbar'
import { TopView } from '@renderer/components/TopView'
-import { useTheme } from '@renderer/context/ThemeProvider'
import { checkApi } from '@renderer/services/ApiService'
import { Button, List, Modal, Space, Spin, Typography } from 'antd'
import { useState } from 'react'
@@ -30,7 +29,6 @@ const PopupContainer: React.FC = ({ title, provider, apiKeys, resolve })
return Array.from(uniqueKeys).map((key) => ({ key }))
})
const { t } = useTranslation()
- const { theme } = useTheme()
const [isChecking, setIsChecking] = useState(false)
const checkAllKeys = async () => {
@@ -79,11 +77,6 @@ const PopupContainer: React.FC = ({ title, provider, apiKeys, resolve })
afterClose={onClose}
centered
maskClosable={false}
- maskProps={{
- style: {
- backgroundColor: theme === 'dark' ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)'
- }
- }}
footer={
diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts
index 0fe7351b..2844be8b 100644
--- a/src/renderer/src/services/MessagesService.ts
+++ b/src/renderer/src/services/MessagesService.ts
@@ -1,3 +1,4 @@
+import SearchPopup from '@renderer/components/Popups/SearchPopup'
import { DEFAULT_CONTEXTCOUNT } from '@renderer/config/constant'
import { getTopicById } from '@renderer/hooks/useTopic'
import { Assistant, Message, Topic } from '@renderer/types'
@@ -43,6 +44,7 @@ export function deleteMessageFiles(message: Message) {
}
export async function locateToMessage(navigate: NavigateFunction, message: Message) {
+ SearchPopup.hide()
const assistant = getAssistantById(message.assistantId)
const topic = await getTopicById(message.topicId)
navigate('/', { state: { assistant, topic } })
diff --git a/src/renderer/src/services/NavigationService.ts b/src/renderer/src/services/NavigationService.ts
new file mode 100644
index 00000000..67e6f67c
--- /dev/null
+++ b/src/renderer/src/services/NavigationService.ts
@@ -0,0 +1,16 @@
+import { NavigateFunction } from 'react-router-dom'
+
+interface INavigationService {
+ navigate: NavigateFunction | null
+ setNavigate: (navigateFunc: NavigateFunction) => void
+}
+
+const NavigationService: INavigationService = {
+ navigate: null,
+
+ setNavigate: (navigateFunc: NavigateFunction): void => {
+ NavigationService.navigate = navigateFunc
+ }
+}
+
+export default NavigationService