Ott 261 dropdown trigger click (#67)
parent
ee838f0e22
commit
2776f2fb0d
@ -1,49 +1,44 @@ |
||||
import React, { useState, useEffect } from 'react' |
||||
import { useState, useEffect } from 'react' |
||||
|
||||
import map from 'lodash/map' |
||||
import find from 'lodash/find' |
||||
|
||||
import type { SportList } from 'requests/getSportList' |
||||
import type { Option } from 'features/Combobox/types' |
||||
import { getSportList } from 'requests/getSportList' |
||||
import { useLexicsStore } from 'features/LexicsStore' |
||||
import { useHeaderFiltersStore } from 'features/HeaderFilters/store' |
||||
|
||||
import { CustomOption } from './styled' |
||||
import { useToggle } from 'hooks' |
||||
|
||||
export const useSportTypeFilter = () => { |
||||
const [sportList, setSportList] = useState<SportList>([]) |
||||
const { |
||||
setSelectedSportTypes, |
||||
selectedSportTypeId, |
||||
setSelectedSportTypeId, |
||||
setSelectedTournamentId, |
||||
} = useHeaderFiltersStore() |
||||
|
||||
const { |
||||
translate, |
||||
} = useLexicsStore() |
||||
close, |
||||
isOpen, |
||||
open, |
||||
} = useToggle() |
||||
|
||||
useEffect(() => { |
||||
getSportList().then(setSportList) |
||||
}, []) |
||||
|
||||
const options = map(sportList, ({ |
||||
id, |
||||
lexic, |
||||
name, |
||||
}) => ({ |
||||
children: <CustomOption t={lexic} image={name} />, |
||||
id, |
||||
name: translate(String(lexic)), |
||||
})) |
||||
|
||||
const onSelect = (option: Option | null) => { |
||||
if (option) { |
||||
setSelectedSportTypes(option.id) |
||||
setSelectedTournamentId(null) |
||||
} |
||||
const onSelect = (id: number) => { |
||||
setSelectedSportTypeId(id) |
||||
setSelectedTournamentId(null) |
||||
close() |
||||
} |
||||
|
||||
const selectedSportType = find(sportList, (sport) => sport.id === selectedSportTypeId) |
||||
|
||||
return { |
||||
close, |
||||
isOpen, |
||||
onSelect, |
||||
options, |
||||
open, |
||||
selectedSportType, |
||||
sportList, |
||||
} |
||||
} |
||||
|
||||
@ -1,28 +1,63 @@ |
||||
import React from 'react' |
||||
|
||||
import { Combobox } from 'features/Combobox' |
||||
import map from 'lodash/map' |
||||
|
||||
import { T9n } from 'features/T9n' |
||||
import { OutsideClick } from 'features/OutsideClick' |
||||
|
||||
import { useLexicsStore } from 'features/LexicsStore' |
||||
import { useSportTypeFilter } from './hooks' |
||||
import { Wrapper, customListStyles } from './styled' |
||||
import { |
||||
Wrapper, |
||||
SportList, |
||||
CustomOption, |
||||
} from './styled' |
||||
import { |
||||
DropdownButton, |
||||
ButtonTitle, |
||||
Arrows, |
||||
} from '../TournamentFilter/styled' |
||||
|
||||
export const SportTypeFilter = () => { |
||||
const { onSelect, options } = useSportTypeFilter() |
||||
const { translate } = useLexicsStore() |
||||
const { |
||||
close, |
||||
isOpen, |
||||
onSelect, |
||||
open, |
||||
selectedSportType, |
||||
sportList, |
||||
} = useSportTypeFilter() |
||||
|
||||
return ( |
||||
<Wrapper> |
||||
<Combobox |
||||
id='sportTypeFilter' |
||||
options={options} |
||||
placeholder={translate('sport')} |
||||
customListStyles={customListStyles} |
||||
filterOptions={false} |
||||
onSelect={onSelect} |
||||
openOnFocus |
||||
withArrow |
||||
readOnly |
||||
/> |
||||
<DropdownButton active={isOpen} onClick={open}> |
||||
<ButtonTitle> |
||||
<T9n t={selectedSportType?.lexic || 'sport'} /> |
||||
</ButtonTitle> |
||||
<Arrows active={isOpen} /> |
||||
</DropdownButton> |
||||
|
||||
{ |
||||
isOpen && ( |
||||
<OutsideClick onClick={close}> |
||||
<SportList> |
||||
{ |
||||
map(sportList, ({ |
||||
id, |
||||
lexic, |
||||
name, |
||||
}) => ( |
||||
<CustomOption |
||||
key={id} |
||||
t={lexic} |
||||
image={name} |
||||
onClick={() => onSelect(id)} |
||||
/> |
||||
)) |
||||
} |
||||
</SportList> |
||||
</OutsideClick> |
||||
) |
||||
} |
||||
</Wrapper> |
||||
) |
||||
} |
||||
|
||||
Loading…
Reference in new issue