fix: address log filter review feedback
This commit is contained in:
parent
421997c457
commit
5abd096c61
4 changed files with 54 additions and 17 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue