Skip to content

Instantly share code, notes, and snippets.

@walidvb
Created April 2, 2020 21:06
Show Gist options
  • Save walidvb/466341261f0f9c8db931d237e1af43c5 to your computer and use it in GitHub Desktop.
Save walidvb/466341261f0f9c8db931d237e1af43c5 to your computer and use it in GitHub Desktop.
Resettable Searchable Dropdown – via Context
// this is an attempt at not adding redux just yet
import React, { createContext, useContext, useCallback, useEffect, useState } from 'react'
const Context = createContext({})
const Provider = React.memo(({ value, children }) => <Context.Provider value={value}>
{children}
</Context.Provider>)
export const SearchableProvider = (props) => {
const [value, setValue] = useState(initialState)
const reset = () => setValue('')
return <Provider {...props} value={{value, reset}}/>
}
export const useSearchableContext = () => useContext(Context)
export default SearchableDropdown = ({ onSelect }) => {
return <Context.Consumer>
({ value }) => (<SearchableInput value={value} />)
</Context.Consumer>
}
import React from 'react'
import { SearchableDropdown } from './SearchableContext'
export default UserManagement = ({ onSelect }) => {
const { reset } = useSearchableContext()
const onSearch = async (query) => {
const list = await fetchUsers(query)
reset()
}
return <SearchableDropdown onSelect={(user) => onSelect(user, { reset })}/>)
}
import React from 'react'
import { SearchableProvider } from './SearchableContext';
export default UserManagement = ({ onSelect }) => {
const onSelect = (user, { reset }) => {
handleUserSelected(user)
reset()
}
return <SearchableProvider>
<SearchableDropdown onSelect={onSelect} />
</SearchableProvider>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment