Abort serch requests on unmount

This commit is contained in:
Jack Kingsman
2026-03-11 19:26:27 -07:00
parent 4363fd2a73
commit 2e705538fd
2 changed files with 37 additions and 0 deletions

View File

@@ -123,6 +123,12 @@ export function SearchView({
inputRef.current?.focus();
}, [prefillRequest]);
useEffect(() => {
return () => {
abortRef.current?.abort();
};
}, []);
// Fetch search results
useEffect(() => {
if (!debouncedQuery) {

View File

@@ -283,4 +283,35 @@ describe('SearchView', () => {
expect.any(AbortSignal)
);
});
it('aborts the load-more request on unmount', async () => {
const pageResults = Array.from({ length: 50 }, (_, i) =>
createSearchResult({ id: i + 1, text: `result ${i}` })
);
let resolveLoadMore: ((value: Message[]) => void) | null = null;
mockGetMessages.mockResolvedValueOnce(pageResults).mockImplementationOnce(
() =>
new Promise<Message[]>((resolve) => {
resolveLoadMore = resolve;
})
);
const { unmount } = render(<SearchView {...defaultProps} />);
await typeAndWaitForResults('result');
fireEvent.click(screen.getByText('Load more results'));
const loadMoreSignal = mockGetMessages.mock.calls[1]?.[1] as AbortSignal | undefined;
expect(loadMoreSignal).toBeInstanceOf(AbortSignal);
expect(loadMoreSignal?.aborted).toBe(false);
unmount();
expect(loadMoreSignal?.aborted).toBe(true);
await act(async () => {
resolveLoadMore?.([createSearchResult({ id: 99, text: 'late result' })]);
await Promise.resolve();
});
});
});