From 39a2383b8cb89c90040745d19cae447cde7318be Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Mon, 15 Jul 2024 12:51:48 +0800 Subject: [PATCH] feat: sidebar on the right side --- src/components/ResizeHandler.tsx | 8 +- src/components/SideBar.tsx | 32 +++++-- src/components/SideBarResizeHandler.tsx | 10 +- src/components/ToggleShowButton.tsx | 7 +- src/components/settings/SidebarSettings.tsx | 20 ++++ src/styles/gitee.scss | 8 +- src/styles/github.scss | 10 +- src/styles/index.scss | 101 ++++++++++++++++---- src/utils/DOMHelper.ts | 16 +++- src/utils/config/helper.ts | 3 + src/utils/hooks/useResizeHandler.ts | 22 +++-- 11 files changed, 190 insertions(+), 47 deletions(-) diff --git a/src/components/ResizeHandler.tsx b/src/components/ResizeHandler.tsx index 76be3b6..521338f 100644 --- a/src/components/ResizeHandler.tsx +++ b/src/components/ResizeHandler.tsx @@ -1,19 +1,19 @@ import { GrabberIcon } from '@primer/octicons-react' import { Icon } from 'components/Icon' import * as React from 'react' -import { ResizeState, useResizeHandler } from '../utils/hooks/useResizeHandler' +import { ResizeHandlerOptions, useResizeHandler } from '../utils/hooks/useResizeHandler' import { Size2D } from './Size' type Props = { size: Size2D onResize(size: Size2D): void onResetSize?(): void - onResizeStateChange?(state: ResizeState): void + options?: ResizeHandlerOptions style?: React.CSSProperties } -export function ResizeHandler({ onResize, onResetSize, onResizeStateChange, size, style }: Props) { - const { onPointerDown } = useResizeHandler(size, onResize, { onResizeStateChange }) +export function ResizeHandler({ onResize, onResetSize, options, size, style }: Props) { + const { onPointerDown } = useResizeHandler(size, onResize, options) return (
({ pendingFocusTarget }), [pendingFocusTarget]) + const placement = configContext.value.sidebarPlacement + return (
{ if (blockLeaveRef.current) return if (sidebarToggleMode === 'float') setShouldExpand(false) }} > + {features.resize && placement === 'right' && ( + + )}
@@ -156,7 +166,9 @@ export function SideBar() { }}
- {features.resize && } + {features.resize && placement === 'left' && ( + + )}
@@ -220,17 +232,17 @@ function useLogoContainerElement() { } function useUpdateBodyIndentOnStateUpdate(shouldExpand: boolean) { - const { sidebarToggleMode } = useConfigs().value + const { sidebarToggleMode, sidebarPlacement } = useConfigs().value React.useEffect(() => { if (!(sidebarToggleMode === 'persistent' && shouldExpand)) return const detach = DOMHelper.attachStickyBodyIndent() - DOMHelper.setBodyIndent(true) + DOMHelper.setBodyIndent(sidebarPlacement) return () => { detach() DOMHelper.setBodyIndent(false) } - }, [sidebarToggleMode, shouldExpand]) + }, [sidebarToggleMode, shouldExpand, sidebarPlacement]) } const getDerivedExpansion = ({ @@ -252,7 +264,7 @@ function useGetDerivedExpansion() { } function useUpdateBodyIndentAfterRedirect(update: (shouldExpand: boolean) => void) { - const { intelligentToggle, sidebarToggleMode } = useConfigs().value + const { intelligentToggle, sidebarToggleMode, sidebarPlacement } = useConfigs().value useAfterRedirect( React.useCallback(() => { // check and update expand state if pinned and auto-expand checked @@ -260,9 +272,9 @@ function useUpdateBodyIndentAfterRedirect(update: (shouldExpand: boolean) => voi const shouldExpand = getDerivedExpansion({ intelligentToggle, sidebarToggleMode }) update(shouldExpand) // Below DOM mutation cannot be omitted, if do, body indent may get lost when shouldExpand is true for both before & after redirecting - DOMHelper.setBodyIndent(shouldExpand) + DOMHelper.setBodyIndent(sidebarPlacement) } - }, [update, sidebarToggleMode, intelligentToggle]), + }, [update, sidebarToggleMode, intelligentToggle, sidebarPlacement]), ) } diff --git a/src/components/SideBarResizeHandler.tsx b/src/components/SideBarResizeHandler.tsx index 4d91b2a..a876be2 100644 --- a/src/components/SideBarResizeHandler.tsx +++ b/src/components/SideBarResizeHandler.tsx @@ -4,6 +4,7 @@ import { useDebounce, useLatest, useWindowSize } from 'react-use' import { getDefaultConfigs } from 'utils/config/helper' import * as DOMHelper from 'utils/DOMHelper' import { useAfterRedirect } from 'utils/hooks/useFastRedirect' +import { ResizeHandlerOptions } from 'utils/hooks/useResizeHandler' import { getSafeWidth } from '../utils/getSafeWidth' import { ResizeHandler } from './ResizeHandler' import { Size, Size2D } from './Size' @@ -41,7 +42,7 @@ function useSidebarWidth() { export function SideBarResizeHandler({ onResizeStateChange, -}: Pick, 'onResizeStateChange'>) { +}: Pick) { const [width, setWidth] = useSidebarWidth() const { width: windowWidth } = useWindowSize() const onResize = React.useMemo(() => { @@ -71,11 +72,16 @@ export function SideBarResizeHandler({ const dummySize: Size2D = React.useMemo(() => [width, 0], [width]) + const placement = useConfigs().value.sidebarPlacement + return ( ) diff --git a/src/components/ToggleShowButton.tsx b/src/components/ToggleShowButton.tsx index 11f83b4..0b563ec 100644 --- a/src/components/ToggleShowButton.tsx +++ b/src/components/ToggleShowButton.tsx @@ -63,8 +63,13 @@ export function ToggleShowButton({ className, onClick, onHover }: Props) { { onClick }, ) + const placement = config.value.sidebarPlacement + return ( -
+