Skip to content

Commit

Permalink
Refactor searchable select
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidTranDucVL committed Jun 8, 2021
1 parent 83dd51d commit bca4044
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 11 deletions.
26 changes: 17 additions & 9 deletions app/frontend/components/common/searchableSelect.tsx
Expand Up @@ -8,15 +8,16 @@ import onSubTreeBlur from '../../../frontend/helpers/onSubTreeBlur'
interface Props<T> {
wrapperClassName?: string
label?: string
labelClassName?: string
defaultItem: T
items: T[]
displaySelectedItem: (t: T) => string | h.JSX.Element
displaySelectedItemClassName?: string
displayItem: (t: T) => string | h.JSX.Element
onSelect: (t: T) => void
showSearch: boolean
searchPredicate: (query: string, t: T) => boolean
searchPlaceholder: string
searchPredicate?: (query: string, t: T) => boolean
searchPlaceholder?: string
dropdownClassName?: string
getDropdownWidth?: () => string
}
Expand All @@ -25,7 +26,8 @@ interface Props<T> {
const SearchableSelect = <T extends {}>({
wrapperClassName,
label,
defaultItem, // TODO: do we need this, should default item by in state of the parent component?
labelClassName,
defaultItem,
items,
displaySelectedItem,
displaySelectedItemClassName,
Expand All @@ -41,9 +43,10 @@ const SearchableSelect = <T extends {}>({
const dropdownEl = useRef<HTMLDivElement>(null)
const wrapperEl = useRef<HTMLDivElement>(null)
const [visible, setVisible] = useState(false)
const [dropdownWidth, setDropdownWidth] = useState(getDropdownWidth())
const [dropdownWidth, setDropdownWidth] = useState(getDropdownWidth ? getDropdownWidth() : '')
const [search, setSearch] = useState('')
const shouldShowItem = (item: T) => searchPredicate(search, item)
const [selectedItem, setSelectedItem] = useState(defaultItem)
const shouldShowItem = (item: T) => (searchPredicate ? searchPredicate(search, item) : true)
const showDropdown = (bool: boolean) => {
setVisible(bool)
setSearch('')
Expand Down Expand Up @@ -78,14 +81,18 @@ const SearchableSelect = <T extends {}>({
// @ts-ignore
onfocusout={(e) => onSubTreeBlur(e, wrapperEl, () => showDropdown(false))}
>
{label && <div className="searchable-select-label">{label}</div>}
{label && (
<div className={`searchable-select-label ${optionalClassName(labelClassName)}`}>
{label}
</div>
)}
<div
className={`searchable-select ${visible ? 'focus ' : ''}${optionalClassName(
displaySelectedItemClassName
)}`}
onClick={() => showDropdown(!visible)}
>
{displaySelectedItem(defaultItem)}
{displaySelectedItem(selectedItem)}
</div>
<div
ref={dropdownEl}
Expand All @@ -101,7 +108,7 @@ const SearchableSelect = <T extends {}>({
className="searchable-select-input"
value={search}
onInput={(event: any) => setSearch(event.target.value)}
placeholder={searchPlaceholder}
placeholder={searchPlaceholder != null ? searchPlaceholder : ''}
/>
)}
<div>
Expand All @@ -113,6 +120,7 @@ const SearchableSelect = <T extends {}>({
onClick={() => {
setVisible(false)
onSelect(item)
setSelectedItem(item)
}}
>
{displayItem(item)}
Expand All @@ -124,4 +132,4 @@ const SearchableSelect = <T extends {}>({
)
}

export default connect((state: State) => ({}), actions)(SearchableSelect)
export default SearchableSelect
4 changes: 2 additions & 2 deletions app/frontend/components/pages/sendAda/sendAdaPage.tsx
Expand Up @@ -231,10 +231,10 @@ const SendAdaPage = ({
[updateAmount]
)

const displayDropdownSelectedItem = ({assetName, policyId}: DropdownAssetItem) => (
const displayDropdownSelectedItem = ({assetName, policyId, type}: DropdownAssetItem) => (
<div className="wrapper">
{assetName}
{selectedAsset.type === AssetFamily.TOKEN && (
{type === AssetFamily.TOKEN && (
<div className="hash">
(<div className="ellipsis">{policyId}</div>)
</div>
Expand Down

0 comments on commit bca4044

Please sign in to comment.