From 784784f3a3c93ff3793771a0781cfb977baa5363 Mon Sep 17 00:00:00 2001 From: DirkSchlossmacher <62424946+DirkSchlossmacher@users.noreply.github.com> Date: Wed, 31 Jul 2024 16:50:36 +0200 Subject: [PATCH] x --- app/components/sidebar.tsx | 102 +++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 5 deletions(-) diff --git a/app/components/sidebar.tsx b/app/components/sidebar.tsx index 40f4e2135..ccb60b46a 100644 --- a/app/components/sidebar.tsx +++ b/app/components/sidebar.tsx @@ -17,8 +17,6 @@ import Locale from "../locales"; import { useAppConfig, useChatStore } from "../store"; - - import { DEFAULT_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH, @@ -30,13 +28,12 @@ import { } from "../constant"; import { signOut } from "next-auth/react"; + import { Link, useNavigate } from "react-router-dom"; import { isIOS, useMobileScreen } from "../utils"; import dynamic from "next/dynamic"; import { showConfirm, Selector } from "./ui-lib"; - - const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, { loading: () => null, }); @@ -78,6 +75,101 @@ export function useDragSideBar() { }); }; + 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; + } + lastUpdateTime.current = Date.now(); + const d = e.clientX - startX.current; + const nextWidth = limit(startDragWidth.current + d); + config.update((config) => { + if (nextWidth < MIN_SIDEBAR_WIDTH) { + config.sidebarWidth = NARROW_SIDEBAR_WIDTH; + } else { + config.sidebarWidth = nextWidth; + } + }); + }; + + 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 shouldNarrow = + !isMobileScreen && config.sidebarWidth < MIN_SIDEBAR_WIDTH; + + useEffect(() => { + const barWidth = shouldNarrow + ? NARROW_SIDEBAR_WIDTH + : limit(config.sidebarWidth ?? DEFAULT_SIDEBAR_WIDTH); + const sideBarWidth = isMobileScreen ? "100vw" : `${barWidth}px`; + document.documentElement.style.setProperty("--sidebar-width", sideBarWidth); + }, [config.sidebarWidth, isMobileScreen, shouldNarrow]); + + return { + onDragStart, + shouldNarrow, + }; +} +export function SideBarContainer(props: { + children: React.ReactNode; + onDragStart: (e: MouseEvent) => void; + shouldNarrow: boolean; + className?: string; +}) { + const isMobileScreen = useMobileScreen(); + const isIOSMobile = useMemo( + () => isIOS() && isMobileScreen, + [isMobileScreen], + ); + const { children, className, onDragStart, shouldNarrow } = props; + return ( +