From 7f2568fd0802e609be72ad67ffd305673b53d2db Mon Sep 17 00:00:00 2001 From: steven Date: Thu, 13 Apr 2023 11:22:40 +0800 Subject: [PATCH] feat: add dark mode switch in sidebar --- src/components/ConnectionSidebar.tsx | 2 ++ src/components/ConversationView/Header.tsx | 4 ++- src/components/DarkModeSwitch.tsx | 29 ++++++++++++++++++++++ src/components/EmptyView.tsx | 4 ++- src/hooks/useDarkmode.ts | 17 +++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/components/DarkModeSwitch.tsx create mode 100644 src/hooks/useDarkmode.ts diff --git a/src/components/ConnectionSidebar.tsx b/src/components/ConnectionSidebar.tsx index 8352a6a..8524088 100644 --- a/src/components/ConnectionSidebar.tsx +++ b/src/components/ConnectionSidebar.tsx @@ -9,6 +9,7 @@ import Tooltip from "./kit/Tooltip"; import Icon from "./Icon"; import EngineIcon from "./EngineIcon"; import LocaleSwitch from "./LocaleSwitch"; +import DarkModeSwitch from "./DarkModeSwitch"; import CreateConnectionModal from "./CreateConnectionModal"; import SettingModal from "./SettingModal"; import EditConversationTitleModal from "./EditConversationTitleModal"; @@ -202,6 +203,7 @@ const ConnectionSidebar = () => {
+
diff --git a/src/components/DarkModeSwitch.tsx b/src/components/DarkModeSwitch.tsx new file mode 100644 index 0000000..9064c28 --- /dev/null +++ b/src/components/DarkModeSwitch.tsx @@ -0,0 +1,29 @@ +import { useSettingStore } from "@/store"; +import useDarkMode from "@/hooks/useDarkmode"; +import Icon from "./Icon"; + +const DarkModeSwitch = () => { + const settingStore = useSettingStore(); + const isDarkMode = useDarkMode(); + + const switchDarkMode = () => { + if (isDarkMode) { + settingStore.setTheme("light"); + } else { + settingStore.setTheme("dark"); + } + }; + + const ModeIcon = isDarkMode ? Icon.IoMdMoon : Icon.IoMdSunny; + + return ( + + ); +}; + +export default DarkModeSwitch; diff --git a/src/components/EmptyView.tsx b/src/components/EmptyView.tsx index 13aa65e..9078698 100644 --- a/src/components/EmptyView.tsx +++ b/src/components/EmptyView.tsx @@ -1,6 +1,7 @@ import { useConversationStore, useConnectionStore, useMessageStore, useUserStore } from "@/store"; import { CreatorRole } from "@/types"; import { generateUUID } from "@/utils"; +import useDarkMode from "@/hooks/useDarkmode"; import Icon from "./Icon"; // examples are used to show some examples to the user. @@ -17,6 +18,7 @@ const EmptyView = (props: Props) => { const conversationStore = useConversationStore(); const userStore = useUserStore(); const messageStore = useMessageStore(); + const isDarkMode = useDarkMode(); const handleExampleClick = async (content: string) => { let conversation = conversationStore.currentConversation; @@ -44,7 +46,7 @@ const EmptyView = (props: Props) => { return (
- sql-chat-logo + sql-chat-logo
diff --git a/src/hooks/useDarkmode.ts b/src/hooks/useDarkmode.ts new file mode 100644 index 0000000..d9f615a --- /dev/null +++ b/src/hooks/useDarkmode.ts @@ -0,0 +1,17 @@ +import { useSettingStore } from "@/store"; +import { useEffect, useState } from "react"; + +const useDarkMode = () => { + const settingStore = useSettingStore(); + const [isDarkMode, setIsDarkMode] = useState(false); + + useEffect(() => { + setTimeout(() => { + setIsDarkMode(document.documentElement.classList.contains("dark")); + }); + }, [settingStore.setting.theme]); + + return isDarkMode; +}; + +export default useDarkMode;