From 4838750009af8232e541fe913713214a9df30225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 16 Apr 2026 22:53:08 -0400 Subject: [PATCH] refactor(useDataLoader): drop 16 positional setters, use getState() (P1-22) Function signature reduced from 16 args to 4; setters sourced from useAppStore.getState() inside callbacks (stable refs, no deps needed). useCompanyController no longer has to thread 14 setters through. --- src/renderer/hooks/useCompanyController.ts | 36 ++++++------------ src/renderer/hooks/useDataLoader.ts | 43 ++++++++-------------- 2 files changed, 28 insertions(+), 51 deletions(-) diff --git a/src/renderer/hooks/useCompanyController.ts b/src/renderer/hooks/useCompanyController.ts index 22ba4b77..25e0ea6b 100644 --- a/src/renderer/hooks/useCompanyController.ts +++ b/src/renderer/hooks/useCompanyController.ts @@ -9,28 +9,22 @@ import { useCompanyData } from "./useCompanyData"; export function useCompanyController() { const snapshot = useAppStore((s) => s.snapshot); - const setSnapshot = useAppStore((s) => s.setSnapshot); const section = useAppStore((s) => s.section); - const setError = useAppStore((s) => s.setError); - const setInitialOnboardingLocked = useAppStore((s) => s.setInitialOnboardingLocked); - const setSection = useAppStore((s) => s.setSection); - const setShowOnboarding = useAppStore((s) => s.setShowOnboarding); - const setSelectedRunId = useAppStore((s) => s.setSelectedRunId); - const setSelectedAgentId = useAppStore((s) => s.setSelectedAgentId); - const setSelectedConnectorId = useAppStore((s) => s.setSelectedConnectorId); const selectedConnectorId = useAppStore((s) => s.selectedConnectorId); const selectedRunId = useAppStore((s) => s.selectedRunId); - const setBadges = useAppStore((s) => s.setBadges); - const setInboxItems = useAppStore((s) => s.setInboxItems); - const setSocialAccounts = useAppStore((s) => s.setSocialAccounts); - const setBrowserActions = useAppStore((s) => s.setBrowserActions); - const setCompanyMetrics = useAppStore((s) => s.setCompanyMetrics); - const setStandupReport = useAppStore((s) => s.setStandupReport); - const setConfirmDeleteCompanyId = useAppStore((s) => s.setConfirmDeleteCompanyId); - const setCompanySwitcherOpen = useAppStore((s) => s.setCompanySwitcherOpen); const locale = useAppStore((s) => s.locale); - const setLocale = useAppStore((s) => s.setLocale); const incrementLogRevision = useAppStore((s) => s.incrementLogRevision); + const { + setError, + setInitialOnboardingLocked, + setSection, + setShowOnboarding, + setSelectedRunId, + setSelectedAgentId, + setConfirmDeleteCompanyId, + setCompanySwitcherOpen, + setLocale, + } = useAppStore.getState(); const currentCompany = useMemo(() => { if (!snapshot) return null; @@ -56,13 +50,7 @@ export function useCompanyController() { store.setSkillImportModalOpen(false); }, []); - const { refresh } = useDataLoader( - snapshot, section, selectedConnectorId, selectedRunId, - setSnapshot, setError, setInitialOnboardingLocked, - setSelectedConnectorId, setSelectedRunId, - setBadges, setInboxItems, setSocialAccounts, setBrowserActions, - setCompanyMetrics, setStandupReport, - ); + const { refresh } = useDataLoader(snapshot, section, selectedConnectorId, selectedRunId); const logBufferRef = useRef>({}); diff --git a/src/renderer/hooks/useDataLoader.ts b/src/renderer/hooks/useDataLoader.ts index 2ed7bba2..a9fac459 100644 --- a/src/renderer/hooks/useDataLoader.ts +++ b/src/renderer/hooks/useDataLoader.ts @@ -8,43 +8,32 @@ export function useDataLoader( section: SectionId, selectedConnectorId: string | null, selectedRunId: string | null, - setSnapshot: (snapshot: ProfileSnapshot) => void, - setError: (error: string | null) => void, - setInitialOnboardingLocked: (locked: boolean) => void, - setSelectedConnectorId: (id: string | null) => void, - setSelectedRunId: (id: string | null) => void, - setBadges: (badges: Parameters["setBadges"]>[0]) => void, - setInboxItems: (items: Parameters["setInboxItems"]>[0]) => void, - setSocialAccounts: (accounts: Parameters["setSocialAccounts"]>[0]) => void, - setBrowserActions: (actions: Parameters["setBrowserActions"]>[0]) => void, - setCompanyMetrics: (metrics: Parameters["setCompanyMetrics"]>[0]) => void, - setStandupReport: (report: Parameters["setStandupReport"]>[0]) => void, ) { const refresh = useCallback(async () => { + const store = useAppStore.getState(); try { const next = unwrap(await window.agentCompany.loadSnapshot()); - setSnapshot(next); + store.setSnapshot(next); if (next.companies.length === 0) { - setInitialOnboardingLocked(true); + store.setInitialOnboardingLocked(true); } - if (!selectedConnectorId && next.connectors[0]) setSelectedConnectorId(next.connectors[0].id); - if (!selectedRunId && next.runs[0]) setSelectedRunId(next.runs[0].id); + if (!selectedConnectorId && next.connectors[0]) store.setSelectedConnectorId(next.connectors[0].id); + if (!selectedRunId && next.runs[0]) store.setSelectedRunId(next.runs[0].id); if (next.currentCompanyId) { const badgeResult = await window.agentCompany.getSidebarBadges(next.currentCompanyId); - if (badgeResult.ok) setBadges(badgeResult.data); + if (badgeResult.ok) store.setBadges(badgeResult.data); const inboxResult = await window.agentCompany.getInbox(next.currentCompanyId); - if (inboxResult.ok) setInboxItems(inboxResult.data); - setSocialAccounts(next.socialAccounts?.filter(a => a.companyId === next.currentCompanyId) ?? []); + if (inboxResult.ok) store.setInboxItems(inboxResult.data); + store.setSocialAccounts(next.socialAccounts?.filter((a) => a.companyId === next.currentCompanyId) ?? []); const browserActionResult = await window.agentCompany.listBrowserActions({ companyId: next.currentCompanyId, limit: 50 }); if (browserActionResult.ok) { - setBrowserActions(browserActionResult.data); + store.setBrowserActions(browserActionResult.data); } } - setError(null); + store.setError(null); } catch (nextError) { - setError(nextError instanceof Error ? nextError.message : String(nextError)); + store.setError(nextError instanceof Error ? nextError.message : String(nextError)); } - // eslint-disable-next-line react-hooks/exhaustive-deps -- Zustand setters are stable references }, [selectedConnectorId, selectedRunId]); // Section-based data loading @@ -52,33 +41,33 @@ export function useDataLoader( if (!snapshot?.currentCompanyId) return; const companyId = snapshot.currentCompanyId; let cancelled = false; + const store = useAppStore.getState(); if (section === "inbox") { void window.agentCompany.getInbox(companyId).then((result) => { - if (!cancelled && result.ok) setInboxItems(result.data); + if (!cancelled && result.ok) store.setInboxItems(result.data); }); } if (section === "performance") { void window.agentCompany.getCompanyMetrics({ companyId, days: 30 }).then((result) => { - if (!cancelled && result.ok) setCompanyMetrics(result.data); + if (!cancelled && result.ok) store.setCompanyMetrics(result.data); }); } if (section === "standup") { void window.agentCompany.getStandupReport(companyId).then((result) => { - if (!cancelled && result.ok) setStandupReport(result.data); + if (!cancelled && result.ok) store.setStandupReport(result.data); }); } if (section === "social") { - setSocialAccounts(snapshot.socialAccounts?.filter((a) => a.companyId === companyId) ?? []); + store.setSocialAccounts(snapshot.socialAccounts?.filter((a) => a.companyId === companyId) ?? []); } return () => { cancelled = true; }; - // eslint-disable-next-line react-hooks/exhaustive-deps -- Zustand setters are stable references }, [section, snapshot]); return { refresh };