Skip to content

Commit bf8e7b1

Browse files
committed
fix: force PageTitleInput reset on wiki URL change
Add key={wikiUrl.href} to PageTitleInput to force React to unmount and remount the component when the wiki site changes. This fixes three issues: 1. pageTitle state - now resets to searchState.pageTitle 2. debouncedTitle - debounce timer is cleared and restarted 3. ErrorBoundary - stale errors from the old wiki are cleared The key prop is React's documented pattern for "resetting all state when a prop changes" and requires no changes inside PageTitleInput. Co-Authored-By: Claude
1 parent 10b88a9 commit bf8e7b1

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/components/SearchForm.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function SearchForm({
2121
<WikiSelector selectedWiki={wikiUrl} onChange={setWikiUrl} />
2222

2323
<PageTitleInput
24+
key={wikiUrl.href}
2425
initialPageTitle={searchState.pageTitle}
2526
wikiUrl={wikiUrl}
2627
/>
@@ -328,6 +329,37 @@ if (import.meta.vitest) {
328329
expect(wikiSelector.value).toBe('https://ja.wikipedia.org/');
329330
});
330331

332+
it('resets page title input when wiki site changes', async () => {
333+
const { fireEvent } = await import('@testing-library/react');
334+
const user = userEvent.setup();
335+
await act(async () => renderWithQuery(<SearchForm {...defaultProps} />));
336+
const titleInput = screen.getByLabelText(
337+
/Wiki Article Title:/i
338+
) as HTMLInputElement;
339+
340+
// User types a different title
341+
await user.clear(titleInput);
342+
await user.type(titleInput, 'Albert Einstein');
343+
expect(titleInput.value).toBe('Albert Einstein');
344+
345+
// Switch wiki site
346+
const wikiSelector = screen.getByLabelText<HTMLSelectElement>(
347+
/Wiki Site:/i
348+
);
349+
await act(async () => {
350+
// use fireEvent due to warning of act unsupported
351+
fireEvent.change(wikiSelector, {
352+
target: { value: 'https://ja.wikipedia.org/' },
353+
});
354+
});
355+
356+
// PageTitleInput remounts → title resets to initialPageTitle
357+
const resetTitleInput = screen.getByLabelText(
358+
/Wiki Article Title:/i
359+
) as HTMLInputElement;
360+
expect(resetTitleInput.value).toBe('Initial Title');
361+
});
362+
331363
it('renders initial values from searchState', async () => {
332364
await act(async () =>
333365
renderWithQuery(

0 commit comments

Comments
 (0)