|
@@ -12,14 +12,20 @@ import Locale from "../locales";
|
|
|
|
|
|
import { useChatStore } from "../store";
|
|
|
|
|
|
-import { Path, REPO_URL } from "../constant";
|
|
|
+import {
|
|
|
+ MAX_SIDEBAR_WIDTH,
|
|
|
+ MIN_SIDEBAR_WIDTH,
|
|
|
+ NARROW_SIDEBAR_WIDTH,
|
|
|
+ Path,
|
|
|
+ REPO_URL,
|
|
|
+} from "../constant";
|
|
|
|
|
|
import { HashRouter as Router, Link, useNavigate } from "react-router-dom";
|
|
|
import { useMobileScreen } from "../utils";
|
|
|
import { ChatList } from "./chat-list";
|
|
|
|
|
|
function useDragSideBar() {
|
|
|
- const limit = (x: number) => Math.min(500, Math.max(220, x));
|
|
|
+ const limit = (x: number) => Math.min(MAX_SIDEBAR_WIDTH, x);
|
|
|
|
|
|
const chatStore = useChatStore();
|
|
|
const startX = useRef(0);
|
|
@@ -27,7 +33,7 @@ function useDragSideBar() {
|
|
|
const lastUpdateTime = useRef(Date.now());
|
|
|
|
|
|
const handleMouseMove = useRef((e: MouseEvent) => {
|
|
|
- if (Date.now() < lastUpdateTime.current + 100) {
|
|
|
+ if (Date.now() < lastUpdateTime.current + 50) {
|
|
|
return;
|
|
|
}
|
|
|
lastUpdateTime.current = Date.now();
|
|
@@ -49,29 +55,36 @@ function useDragSideBar() {
|
|
|
window.addEventListener("mouseup", handleMouseUp.current);
|
|
|
};
|
|
|
const isMobileScreen = useMobileScreen();
|
|
|
+ const shouldNarrow =
|
|
|
+ !isMobileScreen && chatStore.config.sidebarWidth < MIN_SIDEBAR_WIDTH;
|
|
|
|
|
|
useEffect(() => {
|
|
|
- const sideBarWidth = isMobileScreen
|
|
|
- ? "100vw"
|
|
|
- : `${limit(chatStore.config.sidebarWidth ?? 300)}px`;
|
|
|
+ const barWidth = shouldNarrow
|
|
|
+ ? NARROW_SIDEBAR_WIDTH
|
|
|
+ : limit(chatStore.config.sidebarWidth ?? 300);
|
|
|
+ const sideBarWidth = isMobileScreen ? "100vw" : `${barWidth}px`;
|
|
|
document.documentElement.style.setProperty("--sidebar-width", sideBarWidth);
|
|
|
- }, [chatStore.config.sidebarWidth, isMobileScreen]);
|
|
|
+ }, [chatStore.config.sidebarWidth, isMobileScreen, shouldNarrow]);
|
|
|
|
|
|
return {
|
|
|
onDragMouseDown,
|
|
|
+ shouldNarrow,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-export function SideBar(props: { setShowSideBar?: (_: boolean) => void }) {
|
|
|
+export function SideBar(props: { className?: string }) {
|
|
|
const chatStore = useChatStore();
|
|
|
|
|
|
// drag side bar
|
|
|
- const { onDragMouseDown } = useDragSideBar();
|
|
|
+ const { onDragMouseDown, shouldNarrow } = useDragSideBar();
|
|
|
const navigate = useNavigate();
|
|
|
- const isMobileScreen = useMobileScreen();
|
|
|
|
|
|
return (
|
|
|
- <>
|
|
|
+ <div
|
|
|
+ className={`${styles.sidebar} ${props.className} ${
|
|
|
+ shouldNarrow && styles["narrow-sidebar"]
|
|
|
+ }`}
|
|
|
+ >
|
|
|
<div className={styles["sidebar-header"]}>
|
|
|
<div className={styles["sidebar-title"]}>ChatGPT Next</div>
|
|
|
<div className={styles["sidebar-sub-title"]}>
|
|
@@ -88,10 +101,9 @@ export function SideBar(props: { setShowSideBar?: (_: boolean) => void }) {
|
|
|
if (e.target === e.currentTarget) {
|
|
|
navigate(Path.Home);
|
|
|
}
|
|
|
- props.setShowSideBar?.(false);
|
|
|
}}
|
|
|
>
|
|
|
- <ChatList />
|
|
|
+ <ChatList narrow={shouldNarrow} />
|
|
|
</div>
|
|
|
|
|
|
<div className={styles["sidebar-tail"]}>
|
|
@@ -116,10 +128,9 @@ export function SideBar(props: { setShowSideBar?: (_: boolean) => void }) {
|
|
|
<div>
|
|
|
<IconButton
|
|
|
icon={<AddIcon />}
|
|
|
- text={Locale.Home.NewChat}
|
|
|
+ text={shouldNarrow ? undefined : Locale.Home.NewChat}
|
|
|
onClick={() => {
|
|
|
chatStore.newSession();
|
|
|
- props.setShowSideBar?.(false);
|
|
|
}}
|
|
|
shadow
|
|
|
/>
|
|
@@ -130,6 +141,6 @@ export function SideBar(props: { setShowSideBar?: (_: boolean) => void }) {
|
|
|
className={styles["sidebar-drag"]}
|
|
|
onMouseDown={(e) => onDragMouseDown(e as any)}
|
|
|
></div>
|
|
|
- </>
|
|
|
+ </div>
|
|
|
);
|
|
|
}
|