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 });
|
||||
const id = window.setInterval(() => void fetchLogs(), POLL_MS);
|
||||
const id = window.setInterval(() => void fetchLogs({ queueIfBusy: true }), POLL_MS);
|
||||
return () => {
|
||||
cancelled = true;
|
||||
window.clearInterval(id);
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@ export const MemberSelect = ({
|
|||
size = 'sm',
|
||||
disabled = false,
|
||||
className,
|
||||
searchPlaceholder = 'Search members...',
|
||||
emptyMessage = 'No members found.',
|
||||
searchPlaceholder,
|
||||
emptyMessage,
|
||||
getMemberLabel,
|
||||
getMemberDescription,
|
||||
ariaLabel,
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ describe('useClaudeLogsController enabled option', () => {
|
|||
|
||||
afterEach(() => {
|
||||
document.body.innerHTML = '';
|
||||
vi.useRealTimers();
|
||||
vi.clearAllMocks();
|
||||
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 () => {
|
||||
const firstRequest = createDeferred<TeamClaudeLogsResponse>();
|
||||
controllerState.getClaudeLogs
|
||||
|
|
|
|||
|
|
@ -112,20 +112,16 @@ describe('MemberSelect', () => {
|
|||
searchPlaceholder="Search log sources..."
|
||||
emptyMessage="No log sources found."
|
||||
ariaLabel="Log source"
|
||||
getMemberLabel={(candidate) =>
|
||||
candidate.name === 'team-lead'
|
||||
? 'Lead'
|
||||
: candidate.removedAt
|
||||
? `${candidate.name} (removed)`
|
||||
: candidate.name
|
||||
}
|
||||
getMemberDescription={(candidate) =>
|
||||
candidate.name === 'team-lead'
|
||||
? 'Team Lead'
|
||||
: candidate.removedAt
|
||||
? 'Removed'
|
||||
: 'Reviewer'
|
||||
}
|
||||
getMemberLabel={(candidate) => {
|
||||
if (candidate.name === 'team-lead') return 'Lead';
|
||||
if (candidate.removedAt) return `${candidate.name} (removed)`;
|
||||
return candidate.name;
|
||||
}}
|
||||
getMemberDescription={(candidate) => {
|
||||
if (candidate.name === 'team-lead') return 'Team Lead';
|
||||
if (candidate.removedAt) return 'Removed';
|
||||
return 'Reviewer';
|
||||
}}
|
||||
/>
|
||||
);
|
||||
await flush();
|
||||
|
|
|
|||
Loading…
Reference in a new issue