react-bootstrap-typeahead

Keep two react-bootstrap-typeahead inputs in sync


So I have an application with a dashboard and a main page that has a header. Both of them have a react-bootstrap-typeahead input to perform the same action - a search to open something on a map.

What I would like to achieve is:

  1. when the user search something on the dashboard, the main page opens with the search result and on the header, the search input there shows what was searched on the other component.

  2. on the other hand, when the user search something on the search input on the main page header, and then goes back to the dashboard, the dashboard search input should be prefilled with the value previously searched on the main page.

What I have tried so far:

So when the user picks a search item result, that string is saved on the application state using redux. I also clear it manually when the user clicks on the clear search button. The RBT component is defined to use this variable, as in:

<AsyncTypeahead defaultInputValue={props.currentSearchValue} ... />

This seams to work on the first time, i.e. when the user has not interacted with the other input yet. For example, with the application on a fresh state (just loaded) if on the dashboard I pick a search item, when going to the main page because that search input has not been touched yet. Then, when I pick a search item on the main page and go back to the dashboard, I wouldn't see it because setting defaultInputValue is not enough, as that input is not in its default state anymore.

Any tips? I have been running in circles so far. Tried the key/setKey workaround as described in another answer, but that wasn't enough to cover the case described on the previous paragraph. I also tried comparing the input value to the recorded value, but naturally when starting to typing with the input field the values would be different and therefore I cannot trigger a component reload based on that.

Thanks in advance.


Solution

  • Unless I'm missing something about your use case, the selected prop should do what you need. You can save the selected item(s) in your redux store and populate the typeahead with the value on the given page.

    // Get the initial value from the store. This should be an array.
    const typeaheadSelections = useSelector(...);
    
    <Typeahead
      ...
      onChange={(selected) => {
        // Update the value in the store when the selection changes.
        dispatch({
          type: 'set-typeahead',
          value: selected,
        });
      }}
      selected={typeaheadSelections}
    />