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.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-16 22:53:08 -04:00
1 parent 12279005fe
commit 4838750009
2 files changed
+28 -51

No files matched your search

+12 -24
View File
@@ -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<CompanyRecord | null>(() => {
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<Record<string, string>>({});
+16 -27
View File
@@ -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<ReturnType<typeof useAppStore.getState>["setBadges"]>[0]) => void,
setInboxItems: (items: Parameters<ReturnType<typeof useAppStore.getState>["setInboxItems"]>[0]) => void,
setSocialAccounts: (accounts: Parameters<ReturnType<typeof useAppStore.getState>["setSocialAccounts"]>[0]) => void,
setBrowserActions: (actions: Parameters<ReturnType<typeof useAppStore.getState>["setBrowserActions"]>[0]) => void,
setCompanyMetrics: (metrics: Parameters<ReturnType<typeof useAppStore.getState>["setCompanyMetrics"]>[0]) => void,
setStandupReport: (report: Parameters<ReturnType<typeof useAppStore.getState>["setStandupReport"]>[0]) => void,
) {
const refresh = useCallback(async () => {
const store = useAppStore.getState();
try {
const next = unwrap<ProfileSnapshot>(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 };