fix: address log filter review feedback

This commit is contained in:
777genius 2026-05-24 16:05:57 +03:00
parent 421997c457
commit 5abd096c61
4 changed files with 54 additions and 17 deletions

View file

@ -514,7 +514,7 @@ export function useClaudeLogsController(
}; };
void fetchLogs({ queueIfBusy: true }); void fetchLogs({ queueIfBusy: true });
const id = window.setInterval(() => void fetchLogs(), POLL_MS); const id = window.setInterval(() => void fetchLogs({ queueIfBusy: true }), POLL_MS);
return () => { return () => {
cancelled = true; cancelled = true;
window.clearInterval(id); window.clearInterval(id);

View file

@ -46,8 +46,8 @@ export const MemberSelect = ({
size = 'sm', size = 'sm',
disabled = false, disabled = false,
className, className,
searchPlaceholder = 'Search members...', searchPlaceholder,
emptyMessage = 'No members found.', emptyMessage,
getMemberLabel, getMemberLabel,
getMemberDescription, getMemberDescription,
ariaLabel, ariaLabel,

View file

@ -92,6 +92,7 @@ describe('useClaudeLogsController enabled option', () => {
afterEach(() => { afterEach(() => {
document.body.innerHTML = ''; document.body.innerHTML = '';
vi.useRealTimers();
vi.clearAllMocks(); vi.clearAllMocks();
vi.unstubAllGlobals(); vi.unstubAllGlobals();
}); });
@ -170,6 +171,46 @@ describe('useClaudeLogsController enabled option', () => {
}); });
}); });
it('queues interval-driven polls when the current request is still in flight', async () => {
vi.useFakeTimers();
const firstRequest = createDeferred<TeamClaudeLogsResponse>();
controllerState.getClaudeLogs
.mockReturnValueOnce(firstRequest.promise)
.mockResolvedValue(createLogsResponse('interval fresh lead'));
const host = document.createElement('div');
document.body.appendChild(host);
const root = createRoot(host);
await act(async () => {
root.render(React.createElement(ControllerHarness, { enabled: true }));
await Promise.resolve();
});
expect(controllerState.getClaudeLogs).toHaveBeenCalledTimes(1);
await act(async () => {
vi.advanceTimersByTime(2000);
await Promise.resolve();
});
expect(controllerState.getClaudeLogs).toHaveBeenCalledTimes(1);
await act(async () => {
firstRequest.resolve(createLogsResponse('stale lead'));
await Promise.resolve();
await Promise.resolve();
});
expect(controllerState.getClaudeLogs).toHaveBeenCalledTimes(2);
expect(controllerState.getClaudeLogs).toHaveBeenLastCalledWith('demo-team', {
offset: 0,
limit: 100,
});
await act(async () => {
root.unmount();
await Promise.resolve();
});
});
it('does not run a queued lead fetch after being disabled again', async () => { it('does not run a queued lead fetch after being disabled again', async () => {
const firstRequest = createDeferred<TeamClaudeLogsResponse>(); const firstRequest = createDeferred<TeamClaudeLogsResponse>();
controllerState.getClaudeLogs controllerState.getClaudeLogs

View file

@ -112,20 +112,16 @@ describe('MemberSelect', () => {
searchPlaceholder="Search log sources..." searchPlaceholder="Search log sources..."
emptyMessage="No log sources found." emptyMessage="No log sources found."
ariaLabel="Log source" ariaLabel="Log source"
getMemberLabel={(candidate) => getMemberLabel={(candidate) => {
candidate.name === 'team-lead' if (candidate.name === 'team-lead') return 'Lead';
? 'Lead' if (candidate.removedAt) return `${candidate.name} (removed)`;
: candidate.removedAt return candidate.name;
? `${candidate.name} (removed)` }}
: candidate.name getMemberDescription={(candidate) => {
} if (candidate.name === 'team-lead') return 'Team Lead';
getMemberDescription={(candidate) => if (candidate.removedAt) return 'Removed';
candidate.name === 'team-lead' return 'Reviewer';
? 'Team Lead' }}
: candidate.removedAt
? 'Removed'
: 'Reviewer'
}
/> />
); );
await flush(); await flush();