feat: close #2848 click drag icon to toggle sidebar width

This commit is contained in:
Yidadaa 2023-09-19 01:47:15 +08:00
parent 372ea0f845
commit d713d01600
3 changed files with 57 additions and 32 deletions

View File

@ -17,6 +17,7 @@ import Locale from "../locales";
import { useAppConfig, useChatStore } from "../store"; import { useAppConfig, useChatStore } from "../store";
import { import {
DEFAULT_SIDEBAR_WIDTH,
MAX_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH,
MIN_SIDEBAR_WIDTH, MIN_SIDEBAR_WIDTH,
NARROW_SIDEBAR_WIDTH, NARROW_SIDEBAR_WIDTH,
@ -57,11 +58,27 @@ function useDragSideBar() {
const config = useAppConfig(); const config = useAppConfig();
const startX = useRef(0); const startX = useRef(0);
const startDragWidth = useRef(config.sidebarWidth ?? 300); const startDragWidth = useRef(config.sidebarWidth ?? DEFAULT_SIDEBAR_WIDTH);
const lastUpdateTime = useRef(Date.now()); const lastUpdateTime = useRef(Date.now());
const handleMouseMove = useRef((e: MouseEvent) => { const toggleSideBar = () => {
if (Date.now() < lastUpdateTime.current + 50) { config.update((config) => {
if (config.sidebarWidth < MIN_SIDEBAR_WIDTH) {
config.sidebarWidth = DEFAULT_SIDEBAR_WIDTH;
} else {
config.sidebarWidth = NARROW_SIDEBAR_WIDTH;
}
});
};
const onDragStart = (e: MouseEvent) => {
// Remembers the initial width each time the mouse is pressed
startX.current = e.clientX;
startDragWidth.current = config.sidebarWidth;
const dragStartTime = Date.now();
const handleDragMove = (e: MouseEvent) => {
if (Date.now() < lastUpdateTime.current + 20) {
return; return;
} }
lastUpdateTime.current = Date.now(); lastUpdateTime.current = Date.now();
@ -74,22 +91,24 @@ function useDragSideBar() {
config.sidebarWidth = nextWidth; config.sidebarWidth = nextWidth;
} }
}); });
});
const handleMouseUp = useRef(() => {
// In useRef the data is non-responsive, so `config.sidebarWidth` can't get the dynamic sidebarWidth
// startDragWidth.current = config.sidebarWidth ?? 300;
window.removeEventListener("mousemove", handleMouseMove.current);
window.removeEventListener("mouseup", handleMouseUp.current);
});
const onDragMouseDown = (e: MouseEvent) => {
startX.current = e.clientX;
// Remembers the initial width each time the mouse is pressed
startDragWidth.current = config.sidebarWidth;
window.addEventListener("mousemove", handleMouseMove.current);
window.addEventListener("mouseup", handleMouseUp.current);
}; };
const handleDragEnd = () => {
// In useRef the data is non-responsive, so `config.sidebarWidth` can't get the dynamic sidebarWidth
window.removeEventListener("pointermove", handleDragMove);
window.removeEventListener("pointerup", handleDragEnd);
// if user click the drag icon, should toggle the sidebar
const shouldFireClick = Date.now() - dragStartTime < 300;
if (shouldFireClick) {
toggleSideBar();
}
};
window.addEventListener("pointermove", handleDragMove);
window.addEventListener("pointerup", handleDragEnd);
};
const isMobileScreen = useMobileScreen(); const isMobileScreen = useMobileScreen();
const shouldNarrow = const shouldNarrow =
!isMobileScreen && config.sidebarWidth < MIN_SIDEBAR_WIDTH; !isMobileScreen && config.sidebarWidth < MIN_SIDEBAR_WIDTH;
@ -97,13 +116,13 @@ function useDragSideBar() {
useEffect(() => { useEffect(() => {
const barWidth = shouldNarrow const barWidth = shouldNarrow
? NARROW_SIDEBAR_WIDTH ? NARROW_SIDEBAR_WIDTH
: limit(config.sidebarWidth ?? 300); : limit(config.sidebarWidth ?? DEFAULT_SIDEBAR_WIDTH);
const sideBarWidth = isMobileScreen ? "100vw" : `${barWidth}px`; const sideBarWidth = isMobileScreen ? "100vw" : `${barWidth}px`;
document.documentElement.style.setProperty("--sidebar-width", sideBarWidth); document.documentElement.style.setProperty("--sidebar-width", sideBarWidth);
}, [config.sidebarWidth, isMobileScreen, shouldNarrow]); }, [config.sidebarWidth, isMobileScreen, shouldNarrow]);
return { return {
onDragMouseDown, onDragStart,
shouldNarrow, shouldNarrow,
}; };
} }
@ -112,7 +131,7 @@ export function SideBar(props: { className?: string }) {
const chatStore = useChatStore(); const chatStore = useChatStore();
// drag side bar // drag side bar
const { onDragMouseDown, shouldNarrow } = useDragSideBar(); const { onDragStart, shouldNarrow } = useDragSideBar();
const navigate = useNavigate(); const navigate = useNavigate();
const config = useAppConfig(); const config = useAppConfig();
@ -206,7 +225,7 @@ export function SideBar(props: { className?: string }) {
<div <div
className={styles["sidebar-drag"]} className={styles["sidebar-drag"]}
onMouseDown={(e) => onDragMouseDown(e as any)} onPointerDown={(e) => onDragStart(e as any)}
> >
<DragIcon /> <DragIcon />
</div> </div>

View File

@ -43,6 +43,7 @@ export enum StoreKey {
Sync = "sync", Sync = "sync",
} }
export const DEFAULT_SIDEBAR_WIDTH = 300;
export const MAX_SIDEBAR_WIDTH = 500; export const MAX_SIDEBAR_WIDTH = 500;
export const MIN_SIDEBAR_WIDTH = 230; export const MIN_SIDEBAR_WIDTH = 230;
export const NARROW_SIDEBAR_WIDTH = 100; export const NARROW_SIDEBAR_WIDTH = 100;

View File

@ -1,6 +1,11 @@
import { LLMModel } from "../client/api"; import { LLMModel } from "../client/api";
import { getClientConfig } from "../config/client"; import { getClientConfig } from "../config/client";
import { DEFAULT_INPUT_TEMPLATE, DEFAULT_MODELS, StoreKey } from "../constant"; import {
DEFAULT_INPUT_TEMPLATE,
DEFAULT_MODELS,
DEFAULT_SIDEBAR_WIDTH,
StoreKey,
} from "../constant";
import { createPersistStore } from "../utils/store"; import { createPersistStore } from "../utils/store";
export type ModelType = (typeof DEFAULT_MODELS)[number]["name"]; export type ModelType = (typeof DEFAULT_MODELS)[number]["name"];
@ -29,7 +34,7 @@ export const DEFAULT_CONFIG = {
tightBorder: !!getClientConfig()?.isApp, tightBorder: !!getClientConfig()?.isApp,
sendPreviewBubble: true, sendPreviewBubble: true,
enableAutoGenerateTitle: true, enableAutoGenerateTitle: true,
sidebarWidth: 300, sidebarWidth: DEFAULT_SIDEBAR_WIDTH,
disablePromptHint: false, disablePromptHint: false,