mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 15:25:46 +00:00
b8a9fe860e
* refactor(sidebar): H2.1 — extract helpers + constants * refactor(sidebar): H2.2 — extract useSidebarNewReleasesUnread hook * refactor(sidebar): H2.3 — extract useSidebarNavDnd hook * refactor(sidebar): H2.4 — extract 3 hooks (LibraryDropdown + ScrollVisible + PerfProbe) * refactor(sidebar): H2.5 — extract SidebarPerfProbeModal component * refactor(sidebar): H2.5–H2.8 — split JSX into per-block components Sidebar.tsx 938 → 271 LOC. All resulting files under the 400-LOC guideline: components/sidebar/SidebarLibraryPicker.tsx 96 components/sidebar/SidebarActiveJobs.tsx 58 components/sidebar/SidebarNavBody.tsx 293 components/sidebar/SidebarPerfProbeModal.tsx 259 components/sidebar/SidebarPerfProbePhase2.tsx 176
29 lines
930 B
TypeScript
29 lines
930 B
TypeScript
import { useEffect, useState } from 'react';
|
|
|
|
/** Adds .is-scrolling-on-scroll cue to the sidebar viewport for 180ms. */
|
|
export function useSidebarScrollVisible(sidebarViewportEl: HTMLDivElement | null): boolean {
|
|
const [isSidebarScrolling, setIsSidebarScrolling] = useState(false);
|
|
|
|
useEffect(() => {
|
|
if (!sidebarViewportEl) return;
|
|
let hideTimer: number | null = null;
|
|
|
|
const onScroll = () => {
|
|
setIsSidebarScrolling(true);
|
|
if (hideTimer != null) window.clearTimeout(hideTimer);
|
|
hideTimer = window.setTimeout(() => {
|
|
setIsSidebarScrolling(false);
|
|
hideTimer = null;
|
|
}, 180);
|
|
};
|
|
|
|
sidebarViewportEl.addEventListener('scroll', onScroll, { passive: true });
|
|
return () => {
|
|
sidebarViewportEl.removeEventListener('scroll', onScroll);
|
|
if (hideTimer != null) window.clearTimeout(hideTimer);
|
|
};
|
|
}, [sidebarViewportEl]);
|
|
|
|
return isSidebarScrolling;
|
|
}
|