agent-ecosystem/src/renderer/components/team/LeadSessionDetailGate.tsx
2026-05-03 10:52:38 +03:00

73 lines
2 KiB
TypeScript

import { memo, useEffect, useRef } from 'react';
import { useStore } from '@renderer/store';
import { useShallow } from 'zustand/react/shallow';
import {
buildLeadSessionDetailRequestKey,
shouldFetchLeadSessionDetail,
shouldLoadLeadSessionDetail,
} from './leadContextLoadGuards';
interface LeadSessionDetailGateProps {
tabId: string | null;
projectId: string | null;
leadSessionId: string | null;
enabled: boolean;
}
export const LeadSessionDetailGate = memo(function LeadSessionDetailGate({
tabId,
projectId,
leadSessionId,
enabled,
}: LeadSessionDetailGateProps): null {
const fetchSessionDetail = useStore((s) => s.fetchSessionDetail);
const { loadedSessionId, loading } = useStore(
useShallow((s) => {
const tabData = tabId ? (s.tabSessionData[tabId] ?? null) : null;
return {
loadedSessionId: tabData?.sessionDetail?.session?.id ?? null,
loading: tabData?.sessionDetailLoading ?? false,
};
})
);
const startedRequestKeyRef = useRef<string | null>(null);
useEffect(() => {
if (!enabled) {
startedRequestKeyRef.current = null;
}
}, [enabled]);
useEffect(() => {
const input = { tabId, projectId, leadSessionId, enabled };
if (!shouldLoadLeadSessionDetail(input)) {
return;
}
const requestKey = buildLeadSessionDetailRequestKey(input);
if (
!shouldFetchLeadSessionDetail({
requestedSessionId: input.leadSessionId,
loadedSessionId,
loading,
inFlightOrAttemptedRequestKey: startedRequestKeyRef.current,
nextRequestKey: requestKey,
})
) {
return;
}
startedRequestKeyRef.current = requestKey;
void fetchSessionDetail(input.projectId, input.leadSessionId, input.tabId, { silent: false });
}, [enabled, fetchSessionDetail, leadSessionId, loadedSessionId, loading, projectId, tabId]);
useEffect(() => {
if (loadedSessionId === leadSessionId) {
startedRequestKeyRef.current = null;
}
}, [leadSessionId, loadedSessionId]);
return null;
});