feat(#2818): add favourite team popup for espan primera tournament
parent
b214ac7012
commit
19317a7608
@ -0,0 +1,28 @@ |
|||||||
|
import { ProfileTypes, PROFILE_NAMES } from 'config' |
||||||
|
|
||||||
|
import { |
||||||
|
ScWrapper, |
||||||
|
ScLogo, |
||||||
|
ScName, |
||||||
|
} from './styled' |
||||||
|
|
||||||
|
type ItemInfoType = { |
||||||
|
active?: boolean, |
||||||
|
id: number, |
||||||
|
name: string, |
||||||
|
onClick: (val: any) => void, |
||||||
|
type: ProfileTypes, |
||||||
|
} |
||||||
|
|
||||||
|
export const ItemInfo = ({ |
||||||
|
active, |
||||||
|
id, |
||||||
|
name, |
||||||
|
onClick, |
||||||
|
type, |
||||||
|
}: ItemInfoType) => ( |
||||||
|
<ScWrapper onClick={onClick}> |
||||||
|
<ScLogo src={`https://instatscout.com/images/${PROFILE_NAMES[type]}/180/${id}.png`} /> |
||||||
|
<ScName active={active}>{name}</ScName> |
||||||
|
</ScWrapper> |
||||||
|
) |
||||||
@ -0,0 +1,56 @@ |
|||||||
|
import styled, { css } from 'styled-components/macro' |
||||||
|
|
||||||
|
import { isMobileDevice } from 'config/userAgent' |
||||||
|
|
||||||
|
export const ScLogo = styled.img` |
||||||
|
width: 24px; |
||||||
|
object-fit: cover; |
||||||
|
margin-right: 10px; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
width: 15px; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScName = styled.span<{active?: boolean}>` |
||||||
|
font-weight: 400; |
||||||
|
font-size: 17px; |
||||||
|
line-height: 21px; |
||||||
|
|
||||||
|
${({ active }) => (active |
||||||
|
? css` |
||||||
|
font-weight: 700; |
||||||
|
font-size: 17px; |
||||||
|
line-height: 21px; |
||||||
|
` |
||||||
|
: '')}; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
font-size: 12px; |
||||||
|
line-height: 15px |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScWrapper = styled.div` |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
padding: 5px 10px; |
||||||
|
max-width: 300px; |
||||||
|
|
||||||
|
:hover { |
||||||
|
background: rgba(255, 255, 255, 0.2); |
||||||
|
border-radius: 2px; |
||||||
|
cursor: pointer; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
font-size: 12px; |
||||||
|
line-height: 15px |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
} |
||||||
|
` |
||||||
@ -0,0 +1,108 @@ |
|||||||
|
import { useEffect, useState } from 'react' |
||||||
|
|
||||||
|
import { |
||||||
|
getFavouriteTeam, |
||||||
|
FavouriteTeams, |
||||||
|
ResponseType, |
||||||
|
} from 'requests/getFavouriteTeam' |
||||||
|
import { saveFavouriteTeam } from 'requests/saveFavouriteTeam' |
||||||
|
|
||||||
|
/* eslint-disable */ |
||||||
|
const groupTeams = { |
||||||
|
1086: 'group_1', |
||||||
|
7032: 'group_1', |
||||||
|
6132: 'group_1', |
||||||
|
7321: 'group_1', |
||||||
|
62: 'group_1', |
||||||
|
7329: 'group_1', |
||||||
|
17958: 'group_1', |
||||||
|
1076: 'group_1', |
||||||
|
6337: 'group_1', |
||||||
|
9114: 'group_1', |
||||||
|
9143: 'group_1', |
||||||
|
7011: 'group_1', |
||||||
|
6996: 'group_1', |
||||||
|
3945: 'group_1', |
||||||
|
6330: 'group_1', |
||||||
|
7346: 'group_1', |
||||||
|
6331: 'group_1', |
||||||
|
31608: 'group_1', |
||||||
|
6335: 'group_1', |
||||||
|
6332: 'group_1', |
||||||
|
9108: 'group_1', |
||||||
|
1089: 'group_2', |
||||||
|
7102: 'group_2', |
||||||
|
7018: 'group_2', |
||||||
|
6549: 'group_2', |
||||||
|
3965: 'group_2', |
||||||
|
2103: 'group_2', |
||||||
|
167340: 'group_2', |
||||||
|
6606: 'group_2', |
||||||
|
7016: 'group_2', |
||||||
|
7015: 'group_2', |
||||||
|
7288: 'group_2', |
||||||
|
1093: 'group_2', |
||||||
|
1092: 'group_2', |
||||||
|
1085: 'group_2', |
||||||
|
3882: 'group_2', |
||||||
|
7307: 'group_2', |
||||||
|
7306: 'group_2', |
||||||
|
7108: 'group_2', |
||||||
|
1088: 'group_2', |
||||||
|
1077: 'group_2', |
||||||
|
} |
||||||
|
|
||||||
|
export const useFavouriteTeam = () => { |
||||||
|
const [teams, setTeams] = useState<Array<FavouriteTeams>>([]) |
||||||
|
const [active, setActive] = useState<number | null>(null) |
||||||
|
const [isOpen, setIsOpen] = useState<boolean>(false) |
||||||
|
const [group1, setGroup1] = useState<Array<FavouriteTeams>>([]) |
||||||
|
const [group2, setGroup2] = useState<Array<FavouriteTeams>>([]) |
||||||
|
|
||||||
|
const changeActive = (team: FavouriteTeams) => { |
||||||
|
setActive((prev) => (prev === team.id ? null : team.id)) |
||||||
|
} |
||||||
|
|
||||||
|
const onSaveFavouriteTeam = () => { |
||||||
|
active && saveFavouriteTeam( |
||||||
|
{ |
||||||
|
answer_id: active, |
||||||
|
survey_id: 1, |
||||||
|
}) |
||||||
|
setIsOpen(false) |
||||||
|
} |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
getFavouriteTeam({ |
||||||
|
country_id: 77, |
||||||
|
season: 30, |
||||||
|
sport_id: 1, |
||||||
|
tournament_id: 131, |
||||||
|
}).then(({ data, status }: ResponseType) => { |
||||||
|
if(!status) { |
||||||
|
setTeams(data) |
||||||
|
setIsOpen(true) |
||||||
|
}else{ |
||||||
|
return |
||||||
|
} |
||||||
|
}) |
||||||
|
}, []) |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
setGroup1(teams?.filter( |
||||||
|
(team: FavouriteTeams) => groupTeams[team.id as keyof typeof groupTeams] === 'group_1', |
||||||
|
)) |
||||||
|
setGroup2(teams?.filter( |
||||||
|
(team: FavouriteTeams) => groupTeams[team.id as keyof typeof groupTeams] === 'group_2', |
||||||
|
)) |
||||||
|
}, [teams]) |
||||||
|
|
||||||
|
return { |
||||||
|
active, |
||||||
|
changeActive, |
||||||
|
group1, |
||||||
|
group2, |
||||||
|
isOpen, |
||||||
|
onSaveFavouriteTeam, |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,85 @@ |
|||||||
|
import { T9n } from 'features/T9n' |
||||||
|
|
||||||
|
import { Wrapper } from 'features/PreferencesPopup/styled' |
||||||
|
|
||||||
|
import { ItemInfo } from 'components/ItemInfo/ItemInfo' |
||||||
|
|
||||||
|
import type { FavouriteTeams } from 'requests/getFavouriteTeam' |
||||||
|
|
||||||
|
import { useFavouriteTeam } from './hooks' |
||||||
|
|
||||||
|
import { |
||||||
|
Button, |
||||||
|
ButtonsBlock, |
||||||
|
ScBody, |
||||||
|
ScGroup, |
||||||
|
ScGroupName, |
||||||
|
ScGroups, |
||||||
|
ScHeaderTitle, |
||||||
|
ScModalContainer, |
||||||
|
ScTeamsList, |
||||||
|
} from './styled' |
||||||
|
|
||||||
|
export const FavouriteTeamPopup = () => { |
||||||
|
const { |
||||||
|
active, |
||||||
|
changeActive, |
||||||
|
group1, |
||||||
|
group2, |
||||||
|
isOpen, |
||||||
|
onSaveFavouriteTeam, |
||||||
|
} = useFavouriteTeam() |
||||||
|
|
||||||
|
return ( |
||||||
|
<ScModalContainer isOpen={isOpen} withCloseButton={false}> |
||||||
|
<Wrapper> |
||||||
|
<ScBody> |
||||||
|
<ScHeaderTitle> |
||||||
|
<T9n t='choose_fav_team' /> |
||||||
|
</ScHeaderTitle> |
||||||
|
<ScGroups> |
||||||
|
<ScGroup> |
||||||
|
<ScGroupName> |
||||||
|
<T9n t='group' /> 1 |
||||||
|
</ScGroupName> |
||||||
|
<ScTeamsList> |
||||||
|
{group1?.map((team: FavouriteTeams) => ( |
||||||
|
<ItemInfo |
||||||
|
active={team.id === active} |
||||||
|
key={team.id} |
||||||
|
id={team.id} |
||||||
|
name={team.name_en} |
||||||
|
type={2} |
||||||
|
onClick={() => changeActive(team)} |
||||||
|
/> |
||||||
|
))} |
||||||
|
</ScTeamsList> |
||||||
|
</ScGroup> |
||||||
|
<ScGroup> |
||||||
|
<ScGroupName> |
||||||
|
<T9n t='group' /> 2 |
||||||
|
</ScGroupName> |
||||||
|
<ScTeamsList> |
||||||
|
{group2?.map((team: FavouriteTeams) => ( |
||||||
|
<ItemInfo |
||||||
|
active={team.id === active} |
||||||
|
key={team.id} |
||||||
|
id={team.id} |
||||||
|
name={team.name_en} |
||||||
|
type={2} |
||||||
|
onClick={() => changeActive(team)} |
||||||
|
/> |
||||||
|
))} |
||||||
|
</ScTeamsList> |
||||||
|
</ScGroup> |
||||||
|
</ScGroups> |
||||||
|
<ButtonsBlock> |
||||||
|
<Button disabled={!active} onClick={onSaveFavouriteTeam}> |
||||||
|
Ok |
||||||
|
</Button> |
||||||
|
</ButtonsBlock> |
||||||
|
</ScBody> |
||||||
|
</Wrapper> |
||||||
|
</ScModalContainer> |
||||||
|
) |
||||||
|
} |
||||||
@ -0,0 +1,140 @@ |
|||||||
|
import styled, { css } from 'styled-components/macro' |
||||||
|
|
||||||
|
import { isMobileDevice } from 'config/userAgent' |
||||||
|
|
||||||
|
import { ModalWindow } from 'features/Modal/styled' |
||||||
|
import { Modal as BaseModal } from 'features/Modal' |
||||||
|
import { customScrollbar, ButtonSolid } from 'features/Common' |
||||||
|
import { HeaderTitle } from 'features/PreferencesPopup/styled' |
||||||
|
|
||||||
|
export const ScModalContainer = styled(BaseModal)` |
||||||
|
${ModalWindow} { |
||||||
|
width: 1446px; |
||||||
|
height: 670px; |
||||||
|
padding: 0; |
||||||
|
background: #333333; |
||||||
|
border-radius: 5px; |
||||||
|
${customScrollbar} |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
width: 95vw; |
||||||
|
height: 95vh; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
} |
||||||
|
` |
||||||
|
|
||||||
|
export const ScBody = styled.div` |
||||||
|
padding: 30px 0px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
padding: 20px 0; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScHeaderTitle = styled(HeaderTitle)` |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
width: 100%; |
||||||
|
font-weight: 700; |
||||||
|
font-size: 24px; |
||||||
|
line-height: 34px; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
font-size: 15px; |
||||||
|
line-height: 18px; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScGroups = styled.div` |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
margin: 50px 70px; |
||||||
|
width: 100%; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
margin: 0; |
||||||
|
margin-top: 20px; |
||||||
|
width: auto;
|
||||||
|
overflow-y: auto; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScGroup = styled.div` |
||||||
|
width: 100%; |
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
height: 75vh; |
||||||
|
|
||||||
|
@media screen and (orientation: landscape){ |
||||||
|
height: 60vh; |
||||||
|
} |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScGroupName = styled.span` |
||||||
|
display: block; |
||||||
|
font-weight: 500; |
||||||
|
font-size: 24px; |
||||||
|
line-height: 28px; |
||||||
|
margin-left: 10px; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
font-size: 15px; |
||||||
|
line-height: 17px; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ScTeamsList = styled.div` |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
flex-wrap: wrap; |
||||||
|
|
||||||
|
max-height: 389px; |
||||||
|
margin-top: 20px; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
flex-wrap: unset; |
||||||
|
max-height: unset; |
||||||
|
|
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const ButtonsBlock = styled.div` |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
margin-top: 15px; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
|
|
||||||
|
export const Button = styled(ButtonSolid)` |
||||||
|
width: 134px; |
||||||
|
height: 50px; |
||||||
|
background: #294FC4; |
||||||
|
border-radius: 5px; |
||||||
|
|
||||||
|
${isMobileDevice |
||||||
|
? css` |
||||||
|
width: 300px; |
||||||
|
height: 40px; |
||||||
|
` |
||||||
|
: ''}; |
||||||
|
` |
||||||
@ -0,0 +1,39 @@ |
|||||||
|
import { API_ROOT } from 'config' |
||||||
|
|
||||||
|
import { callApi } from 'helpers' |
||||||
|
|
||||||
|
export type FavouriteTeamType = { |
||||||
|
country_id?: number, |
||||||
|
season: number, |
||||||
|
sport_id: number, |
||||||
|
tournament_id: number, |
||||||
|
} |
||||||
|
|
||||||
|
export type FavouriteTeams = { |
||||||
|
active?: boolean, |
||||||
|
group?: string, |
||||||
|
id: number, |
||||||
|
name_en: string, |
||||||
|
name_ru: string, |
||||||
|
} |
||||||
|
|
||||||
|
export type ResponseType = { |
||||||
|
data: Array<FavouriteTeams>, |
||||||
|
msg: string, |
||||||
|
status: string, |
||||||
|
} |
||||||
|
|
||||||
|
export const getFavouriteTeam = async ({ |
||||||
|
season, |
||||||
|
sport_id, |
||||||
|
tournament_id, |
||||||
|
}: FavouriteTeamType): Promise<ResponseType> => { |
||||||
|
const config = { |
||||||
|
method: 'GET', |
||||||
|
} |
||||||
|
|
||||||
|
return callApi({ |
||||||
|
config, |
||||||
|
url: `${API_ROOT}/v1/survey/teams/${sport_id}/${tournament_id}/${season}`, |
||||||
|
}) |
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
import { API_ROOT } from 'config' |
||||||
|
import { callApi } from 'helpers' |
||||||
|
|
||||||
|
type SaveFavouriteTeamType = { |
||||||
|
answer_id: number, |
||||||
|
survey_id: number, |
||||||
|
} |
||||||
|
|
||||||
|
export const saveFavouriteTeam = async ({ |
||||||
|
answer_id, |
||||||
|
survey_id, |
||||||
|
}: SaveFavouriteTeamType): Promise<{status: string}> => { |
||||||
|
const config = { |
||||||
|
body: { |
||||||
|
answer_id, |
||||||
|
survey_id, |
||||||
|
}, |
||||||
|
method: 'POST', |
||||||
|
} |
||||||
|
|
||||||
|
return callApi({ |
||||||
|
config, |
||||||
|
url: `${API_ROOT}/v1/survey/answer`, |
||||||
|
}) |
||||||
|
} |
||||||
Loading…
Reference in new issue