refactor(web): finding 9 - simplify useBuilderSidebar selector

Remove generic selector overload from useBuilderSidebar; callers
destructure the full return object instead of using a selector that
provides no meaningful benefit (state is rebuilt on every render).

Claude-Session: https://claude.ai/code/session_012Bnvt1MghwHj4qQRxuQUGa
This commit is contained in:
Amruth Pillai
2026-07-04 21:28:59 +02:00
parent 9b9d5c833c
commit 376977a9f7
5 changed files with 11 additions and 19 deletions
@@ -30,7 +30,7 @@ import {
DropdownMenuTrigger,
} from "@reactive-resume/ui/components/dropdown-menu";
import { useDialogStore } from "@/dialogs/store";
import { useCurrentResume, usePatchResume, useSaveStatus } from "@/features/resume/builder/draft";
import { useCurrentResume, usePatchResume, useResumeStore } from "@/features/resume/builder/draft";
import { useResumeExport } from "@/features/resume/export/use-resume-export";
import { useConfirm } from "@/hooks/use-confirm";
import { getResumeErrorMessage } from "@/libs/error-message";
@@ -43,7 +43,7 @@ export function BuilderHeader() {
const resume = useCurrentResume();
const name = resume.name;
const isLocked = resume.isLocked;
const toggleSidebar = useBuilderSidebar((state) => state.toggleSidebar);
const { toggleSidebar } = useBuilderSidebar();
// Equal-width flex-1 side groups keep the center title group truly centered regardless of the
// wider Download button on the right.
@@ -149,7 +149,7 @@ function ResumeDownloadButton() {
}
function SaveStatusIndicator() {
const status = useSaveStatus();
const status = useResumeStore((state) => state.saveStatus);
if (status === "idle") return null;
const { icon, label } = match(status)
@@ -123,7 +123,7 @@ function LockBanner() {
}
function SidebarEdge() {
const toggleSidebar = useBuilderSidebar((state) => state.toggleSidebar);
const { toggleSidebar } = useBuilderSidebar();
const scrollToSection = useCallback(
(section: LeftSidebarSection) => {
@@ -66,7 +66,7 @@ export function BuilderSidebarRight() {
}
function SidebarEdge() {
const toggleSidebar = useBuilderSidebar((state) => state.toggleSidebar);
const { toggleSidebar } = useBuilderSidebar();
const scrollToSection = useCallback(
(section: RightSidebarSection) => {
@@ -100,7 +100,7 @@ type UseBuilderSidebarReturn = {
toggleSidebar: (side: "left" | "right", forceState?: boolean) => void;
};
export function useBuilderSidebar<T = UseBuilderSidebarReturn>(selector?: (builder: UseBuilderSidebarReturn) => T): T {
export function useBuilderSidebar(): UseBuilderSidebarReturn {
const isMobile = useMediaQuery("(max-width: 767px)", { initializeWithValue: false });
const { width } = useWindowSize();
@@ -134,7 +134,8 @@ export function useBuilderSidebar<T = UseBuilderSidebarReturn>(selector?: (build
[expandSize],
);
const state = useMemo(() => {
// ponytail: memoized but callers destructure; selector removed (state rebuilt every render, zero benefit)
return useMemo(() => {
return {
maxSidebarSize,
minSidebarSize,
@@ -144,6 +145,4 @@ export function useBuilderSidebar<T = UseBuilderSidebarReturn>(selector?: (build
toggleSidebar,
};
}, [maxSidebarSize, minSidebarSize, collapsedSidebarSize, groupResizeBehavior, isCollapsed, toggleSidebar]);
return selector ? selector(state) : (state as T);
}
@@ -15,8 +15,6 @@ import { ResizableGroup, ResizablePanel, ResizableSeparator } from "@reactive-re
import { cn } from "@reactive-resume/utils/style";
import {
useBuilderResumeUpdateSubscription,
useInitializeResumeStore,
useMergeResumeMetadata,
usePreviewPausedStore,
useResumeCleanup,
useResumeStore,
@@ -61,8 +59,8 @@ function RouteComponent() {
const { resumeId } = Route.useParams();
const { data: resume } = useSuspenseQuery(orpc.resume.getById.queryOptions({ input: { id: resumeId } }));
const initializeResumeStore = useInitializeResumeStore();
const mergeResumeMetadata = useMergeResumeMetadata();
const initializeResumeStore = useResumeStore((state) => state.initialize);
const mergeResumeMetadata = useResumeStore((state) => state.mergeResumeMetadata);
const isReady = useResumeStore((state) => state.isReady);
const initializedResumeId = useResumeStore((state) => state.resumeId);
const isInitialized = isReady && initializedResumeId === resumeId;
@@ -118,12 +116,7 @@ function DesktopBuilderShell({ initialLayout }: BuilderLayoutShellProps) {
const setRightSidebar = useBuilderSidebarStore((state) => state.setRightSidebar);
const setLayout = useBuilderSidebarStore((state) => state.setLayout);
const { maxSidebarSize, minSidebarSize, collapsedSidebarSize, groupResizeBehavior } = useBuilderSidebar((state) => ({
maxSidebarSize: state.maxSidebarSize,
minSidebarSize: state.minSidebarSize,
collapsedSidebarSize: state.collapsedSidebarSize,
groupResizeBehavior: state.groupResizeBehavior,
}));
const { maxSidebarSize, minSidebarSize, collapsedSidebarSize, groupResizeBehavior } = useBuilderSidebar();
useEffect(() => {
setLayout(initialLayout);