From d8f1e99192020d5f1632acf4956e52e9776412db Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 28 Apr 2023 17:14:47 +0800 Subject: [PATCH] refactor: move conversation list into component --- src/components/ConnectionSidebar.tsx | 103 +--------------- src/components/Sidebar/ConversationList.tsx | 123 ++++++++++++++++++++ 2 files changed, 127 insertions(+), 99 deletions(-) create mode 100644 src/components/Sidebar/ConversationList.tsx diff --git a/src/components/ConnectionSidebar.tsx b/src/components/ConnectionSidebar.tsx index 0ffd70e..e01749b 100644 --- a/src/components/ConnectionSidebar.tsx +++ b/src/components/ConnectionSidebar.tsx @@ -2,17 +2,16 @@ import { Drawer } from "@mui/material"; import { head } from "lodash-es"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useConversationStore, useConnectionStore, useLayoutStore, ResponsiveWidth } from "@/store"; -import { Conversation, Connection } from "@/types"; +import { useConnectionStore, useLayoutStore, ResponsiveWidth } from "@/store"; +import { Connection } from "@/types"; import Select from "./kit/Select"; import Tooltip from "./kit/Tooltip"; -import Dropdown, { DropdownItem } from "./kit/Dropdown"; import Icon from "./Icon"; import EngineIcon from "./EngineIcon"; import DarkModeSwitch from "./DarkModeSwitch"; import CreateConnectionModal from "./CreateConnectionModal"; import SettingModal from "./SettingModal"; -import UpdateConversationModal from "./UpdateConversationModal"; +import ConversationList from "./Sidebar/ConversationList"; interface State { showCreateConnectionModal: boolean; @@ -24,23 +23,16 @@ const ConnectionSidebar = () => { const { t } = useTranslation(); const layoutStore = useLayoutStore(); const connectionStore = useConnectionStore(); - const conversationStore = useConversationStore(); const [state, setState] = useState({ showCreateConnectionModal: false, showSettingModal: false, showUpdateConversationModal: false, }); const [editConnectionModalContext, setEditConnectionModalContext] = useState(); - const [updateConversationModalContext, setUpdateConversationModalContext] = useState(); const [isRequestingDatabase, setIsRequestingDatabase] = useState(false); const connectionList = connectionStore.connectionList; const currentConnectionCtx = connectionStore.currentConnectionCtx; const databaseList = connectionStore.databaseList.filter((database) => database.connectionId === currentConnectionCtx?.connection.id); - const conversationList = conversationStore.conversationList.filter( - (conversation) => - conversation.connectionId === currentConnectionCtx?.connection.id && - conversation.databaseName === currentConnectionCtx?.database?.name - ); useEffect(() => { const handleWindowResize = () => { @@ -87,13 +79,6 @@ const ConnectionSidebar = () => { }); }; - const toggleUpdateConversationModal = (show = true) => { - setState({ - ...state, - showUpdateConversationModal: show, - }); - }; - const handleConnectionSelect = async (connection: Connection) => { const databaseList = await connectionStore.getOrFetchDatabaseList(connection); connectionStore.setCurrentConnectionCtx({ @@ -123,36 +108,6 @@ const ConnectionSidebar = () => { }); }; - const handleCreateConversation = () => { - if (!currentConnectionCtx) { - conversationStore.createConversation(); - } else { - conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name); - } - }; - - const handleConversationSelect = (conversation: Conversation) => { - conversationStore.setCurrentConversationId(conversation.id); - if (layoutStore.isMobileView) { - layoutStore.toggleSidebar(false); - } - }; - - const handleEditConversation = (conversation: Conversation) => { - setUpdateConversationModalContext(conversation); - setState({ - ...state, - showUpdateConversationModal: true, - }); - }; - - const handleDeleteConversation = (conversation: Conversation) => { - conversationStore.clearConversation((item) => item.id !== conversation.id); - if (conversationStore.currentConversationId === conversation.id) { - conversationStore.setCurrentConversationId(undefined); - } - }; - return ( <> { /> )} - {conversationList.map((conversation) => ( -
handleConversationSelect(conversation)} - > - {conversation.id === conversationStore.currentConversationId ? ( - - ) : ( - - )} - {conversation.title || "SQL Chat"} - - - - } - > -
- handleEditConversation(conversation)} - > - - {t("common.edit")} - - handleDeleteConversation(conversation)} - > - - {t("common.delete")} - -
-
-
- ))} - +
{ )} {state.showSettingModal && toggleSettingModal(false)} />} - - {updateConversationModalContext && state.showUpdateConversationModal && ( - toggleUpdateConversationModal(false)} conversation={updateConversationModalContext} /> - )} ); }; diff --git a/src/components/Sidebar/ConversationList.tsx b/src/components/Sidebar/ConversationList.tsx new file mode 100644 index 0000000..eb99b38 --- /dev/null +++ b/src/components/Sidebar/ConversationList.tsx @@ -0,0 +1,123 @@ +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useConversationStore, useConnectionStore, useLayoutStore } from "@/store"; +import { Conversation } from "@/types"; +import Dropdown, { DropdownItem } from "../kit/Dropdown"; +import Icon from "../Icon"; +import UpdateConversationModal from "../UpdateConversationModal"; + +interface State { + showUpdateConversationModal: boolean; +} + +const ConversationList = () => { + const { t } = useTranslation(); + const layoutStore = useLayoutStore(); + const connectionStore = useConnectionStore(); + const conversationStore = useConversationStore(); + const [state, setState] = useState({ + showUpdateConversationModal: false, + }); + const [updateConversationModalContext, setUpdateConversationModalContext] = useState(); + const currentConnectionCtx = connectionStore.currentConnectionCtx; + const conversationList = conversationStore.conversationList.filter( + (conversation) => + conversation.connectionId === currentConnectionCtx?.connection.id && + conversation.databaseName === currentConnectionCtx?.database?.name + ); + + const toggleUpdateConversationModal = (show = true) => { + setState({ + ...state, + showUpdateConversationModal: show, + }); + }; + + const handleCreateConversation = () => { + if (!currentConnectionCtx) { + conversationStore.createConversation(); + } else { + conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name); + } + }; + + const handleConversationSelect = (conversation: Conversation) => { + conversationStore.setCurrentConversationId(conversation.id); + if (layoutStore.isMobileView) { + layoutStore.toggleSidebar(false); + } + }; + + const handleEditConversation = (conversation: Conversation) => { + setUpdateConversationModalContext(conversation); + setState({ + ...state, + showUpdateConversationModal: true, + }); + }; + + const handleDeleteConversation = (conversation: Conversation) => { + conversationStore.clearConversation((item) => item.id !== conversation.id); + if (conversationStore.currentConversationId === conversation.id) { + conversationStore.setCurrentConversationId(undefined); + } + }; + + return ( + <> + {conversationList.map((conversation) => ( +
handleConversationSelect(conversation)} + > + {conversation.id === conversationStore.currentConversationId ? ( + + ) : ( + + )} + {conversation.title || "SQL Chat"} + + + + } + > +
+ handleEditConversation(conversation)} + > + + {t("common.edit")} + + handleDeleteConversation(conversation)} + > + + {t("common.delete")} + +
+
+
+ ))} + + + {updateConversationModalContext && state.showUpdateConversationModal && ( + toggleUpdateConversationModal(false)} conversation={updateConversationModalContext} /> + )} + + ); +}; + +export default ConversationList;