diff --git a/src/components/Resizable.tsx b/src/components/Resizable.tsx index 29a8acc..2c31bf5 100644 --- a/src/components/Resizable.tsx +++ b/src/components/Resizable.tsx @@ -1,10 +1,11 @@ import { HorizontalResizeHandler } from 'components/ResizeHandler' import { useConfigs } from 'containers/ConfigsContext' import * as React from 'react' -import { useWindowSize } from 'react-use' +import { useDebounce, useWindowSize } from 'react-use' import { cx } from 'utils/cx' import { setResizingState } from 'utils/DOMHelper' import * as features from 'utils/features' +import { useCSSVariable } from './useCSSVariable' export type Size = number type Props = { @@ -34,10 +35,8 @@ export function Resizable({ baseSize, className, children }: React.PropsWithChil return () => clearTimeout(timer) }, [width, size]) - React.useEffect(() => { - document.documentElement.style.setProperty('--gitako-width', size + 'px') - configContext.set({ sideBarWidth: size }) - }, [size]) + useCSSVariable('--gitako-width', `${size}px`) + useDebounce(() => configContext.set({ sideBarWidth: size }), 100, [size]) const onResize = React.useCallback((size: number) => { if (size < window.innerWidth - MINIMAL_CONTENT_VIEWPORT_WIDTH) setSize(size) diff --git a/src/components/useCSSVariable.tsx b/src/components/useCSSVariable.tsx new file mode 100644 index 0000000..889a774 --- /dev/null +++ b/src/components/useCSSVariable.tsx @@ -0,0 +1,11 @@ +import { useLayoutEffect } from 'react' + +export function useCSSVariable( + name: string, + value: string, + element: HTMLElement = document.documentElement, +) { + useLayoutEffect(() => { + element.style.setProperty(name, value) + }, [name, value, element]) +}