import { useEffect, useMemo, useRef, useState, type CSSProperties, type RefObject } from 'react'; import { useCallbackToWatchResize } from '~/hooks'; import { useExplorerContext } from '../Context'; export function useSize(ref: RefObject) { const explorerSettings = useExplorerContext({ suspense: false })?.useSettingsSnapshot(); const initialized = useRef(false); const [size, setSize] = useState({ width: 0, height: 0 }); useEffect(() => { initialized.current = false; }, [explorerSettings?.gridItemSize, explorerSettings?.listViewIconSize]); useCallbackToWatchResize( ({ width, height }) => { if (initialized.current || (!width && !height)) return; setSize({ width, height }); initialized.current = true; }, [], ref ); return size; } export function useBlackBars(videoSize: { width: number; height: number }, blackBarsSize?: number) { return useMemo(() => { const { width, height } = videoSize; const orientation = height > width ? 'vertical' : 'horizontal'; const barSize = blackBarsSize || Math.floor(Math.ceil(orientation === 'vertical' ? height : width) / 10); const xBarSize = orientation === 'vertical' ? barSize : 0; const yBarSize = orientation === 'horizontal' ? barSize : 0; return { size: { x: xBarSize, y: yBarSize }, style: { borderLeftWidth: xBarSize, borderRightWidth: xBarSize, borderTopWidth: yBarSize, borderBottomWidth: yBarSize, borderColor: 'black', borderRadius: 4 } satisfies CSSProperties }; }, [videoSize, blackBarsSize]); }