From 99121b952fd002cb6dae52af41f08beed8f6c3e2 Mon Sep 17 00:00:00 2001 From: Sarah Dayan <5370675+sarahdayan@users.noreply.github.com> Date: Mon, 22 Aug 2022 15:51:46 +0200 Subject: [PATCH] feat(SearchBox): introduce `autoFocus` prop (#3599) --- examples/hooks/App.tsx | 2 +- .../src/ui/SearchBox.tsx | 7 ++++++- .../src/ui/__tests__/SearchBox.test.tsx | 13 ++++++++++++- .../src/widgets/SearchBox.tsx | 3 ++- .../src/widgets/__tests__/SearchBox.test.tsx | 16 +++++++++++++++- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/examples/hooks/App.tsx b/examples/hooks/App.tsx index d47550f13e..617259ba33 100644 --- a/examples/hooks/App.tsx +++ b/examples/hooks/App.tsx @@ -107,7 +107,7 @@ export function App() { ]} /> - +
diff --git a/packages/react-instantsearch-hooks-web/src/ui/SearchBox.tsx b/packages/react-instantsearch-hooks-web/src/ui/SearchBox.tsx index 399b5395ef..e270fd4dda 100644 --- a/packages/react-instantsearch-hooks-web/src/ui/SearchBox.tsx +++ b/packages/react-instantsearch-hooks-web/src/ui/SearchBox.tsx @@ -62,7 +62,10 @@ export type SearchBoxProps = Omit< > & Pick, 'onSubmit'> & Required, 'onReset'>> & - Pick, 'placeholder' | 'onChange'> & { + Pick< + React.ComponentProps<'input'>, + 'placeholder' | 'onChange' | 'autoFocus' + > & { inputRef: React.RefObject; isSearchStalled: boolean; value: string; @@ -135,6 +138,7 @@ export function SearchBox({ onSubmit, placeholder, value, + autoFocus, resetIconComponent: ResetIcon = DefaultResetIcon, submitIconComponent: SubmitIcon = DefaultSubmitIcon, loadingIconComponent: LoadingIcon = DefaultLoadingIcon, @@ -190,6 +194,7 @@ export function SearchBox({ type="search" value={value} onChange={onChange} + autoFocus={autoFocus} />
`); + + expect(within(container).getByRole('searchbox')).not.toHaveFocus(); }); test('renders with translations', () => { @@ -322,6 +325,14 @@ describe('SearchBox', () => { ); }); + test('forwards the `autoFocus` prop to the input', () => { + const props = createProps({ autoFocus: true }); + + const { container } = render(); + + expect(within(container).getByRole('searchbox')).toHaveFocus(); + }); + test('with input value shows the reset button', () => { const props = createProps({ value: 'query' }); diff --git a/packages/react-instantsearch-hooks-web/src/widgets/SearchBox.tsx b/packages/react-instantsearch-hooks-web/src/widgets/SearchBox.tsx index 04d8682215..f46b2dea00 100644 --- a/packages/react-instantsearch-hooks-web/src/widgets/SearchBox.tsx +++ b/packages/react-instantsearch-hooks-web/src/widgets/SearchBox.tsx @@ -14,12 +14,13 @@ type UiProps = Pick< | 'onReset' | 'onSubmit' | 'value' + | 'autoFocus' | 'translations' >; export type SearchBoxProps = Omit< SearchBoxUiComponentProps, - Exclude + Exclude > & UseSearchBoxProps & { /** diff --git a/packages/react-instantsearch-hooks-web/src/widgets/__tests__/SearchBox.test.tsx b/packages/react-instantsearch-hooks-web/src/widgets/__tests__/SearchBox.test.tsx index 6a2b10c34b..6be1393117 100644 --- a/packages/react-instantsearch-hooks-web/src/widgets/__tests__/SearchBox.test.tsx +++ b/packages/react-instantsearch-hooks-web/src/widgets/__tests__/SearchBox.test.tsx @@ -1,4 +1,4 @@ -import { act, render, waitFor } from '@testing-library/react'; +import { act, render, waitFor, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; @@ -113,6 +113,8 @@ describe('SearchBox', () => { `); }); + + expect(within(container).getByRole('searchbox')).not.toHaveFocus(); }); test('forwards placeholder prop', async () => { @@ -130,6 +132,18 @@ describe('SearchBox', () => { }); }); + test('forwards `autoFocus` prop', async () => { + const { container } = render( + + + + ); + + await waitFor(() => { + expect(within(container).getByRole('searchbox')).toHaveFocus(); + }); + }); + test('sets query on change event', async () => { let lastUiState: UiState = {};