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