From 7e2d557f049c8c9e8947a19ea7094c5ac3824c59 Mon Sep 17 00:00:00 2001 From: Andrei Dekterev Date: Thu, 28 Apr 2022 19:38:00 +0700 Subject: [PATCH] feat(#2341): separate filter tournaments --- src/components/SelectFilter/index.tsx | 20 ++ src/components/SelectFilter/styled.tsx | 26 ++ .../HeaderFilters/store/hooks/index.tsx | 1 + src/features/HeaderMobile/index.tsx | 89 ++----- .../components/HeaderFilters/index.tsx | 20 ++ .../components/HeaderFilters/styled.tsx | 6 + src/features/HomePage/index.tsx | 2 + .../components/SelectSport/index.tsx | 20 ++ .../{ => components/SelectSport}/styled.tsx | 2 +- .../components/SelectSportPopup/index.tsx | 53 ++++ .../components/SelectSportPopup/styled.tsx | 226 ++++++++++++++++++ src/features/SportsFilter/index.tsx | 54 +++-- 12 files changed, 426 insertions(+), 93 deletions(-) create mode 100644 src/components/SelectFilter/index.tsx create mode 100644 src/components/SelectFilter/styled.tsx create mode 100644 src/features/HomePage/components/HeaderFilters/index.tsx create mode 100644 src/features/HomePage/components/HeaderFilters/styled.tsx create mode 100644 src/features/SportsFilter/components/SelectSport/index.tsx rename src/features/SportsFilter/{ => components/SelectSport}/styled.tsx (96%) create mode 100644 src/features/SportsFilter/components/SelectSportPopup/index.tsx create mode 100644 src/features/SportsFilter/components/SelectSportPopup/styled.tsx diff --git a/src/components/SelectFilter/index.tsx b/src/components/SelectFilter/index.tsx new file mode 100644 index 00000000..377e2af1 --- /dev/null +++ b/src/components/SelectFilter/index.tsx @@ -0,0 +1,20 @@ +import { T9n } from 'features/T9n' + +import { ScSelectFilter, ScArrow } from './styled' + +type SportsFilterProps = { + onModalOpen: () => void, + open: boolean, + selectItem: string, +} + +export const SelectFilter = ({ + onModalOpen, + open, + selectItem, +}: SportsFilterProps) => ( + + + + +) diff --git a/src/components/SelectFilter/styled.tsx b/src/components/SelectFilter/styled.tsx new file mode 100644 index 00000000..0b74e1d0 --- /dev/null +++ b/src/components/SelectFilter/styled.tsx @@ -0,0 +1,26 @@ +import styled, { css } from 'styled-components/macro' + +import { isMobileDevice } from 'config/userAgent' +import { Icon } from 'features/Icon' + +export const ScSelectFilter = styled.div` + display: flex; + color: white; + font-size: 14px; + width: 30%; + text-transform: uppercase; + font-weight: 700; + align-items: center; + cursor: pointer; + + ${isMobileDevice + ? css` + letter-spacing: 0.15rem; + font-size: 10px; + ` + : ''}; +` + +export const ScArrow = styled(Icon)` + margin-left: 14px; +` diff --git a/src/features/HeaderFilters/store/hooks/index.tsx b/src/features/HeaderFilters/store/hooks/index.tsx index 27479dfb..c2feba70 100644 --- a/src/features/HeaderFilters/store/hooks/index.tsx +++ b/src/features/HeaderFilters/store/hooks/index.tsx @@ -23,6 +23,7 @@ export const useFilters = () => { validator: isValidDate, }) const [selectedSport, setSelectedSport] = useState('all_sports') + const [selectedLeague, setSelectedLeague] = useState('all_leagues') const isTodaySelected = isToday(selectedDate) diff --git a/src/features/HeaderMobile/index.tsx b/src/features/HeaderMobile/index.tsx index 47a4512c..4e944ef0 100644 --- a/src/features/HeaderMobile/index.tsx +++ b/src/features/HeaderMobile/index.tsx @@ -1,78 +1,17 @@ -import { useState } from 'react' - -import { ScoreSwitch } from 'features/MatchSwitches' import { HeaderMenu } from 'features/HeaderMenu' -import { DateFilter, useHeaderFiltersStore } from 'features/HeaderFilters' +import { DateFilter } from 'features/HeaderFilters' +import { ScoreSwitch } from 'features/MatchSwitches' import { SportsFilter } from 'features/SportsFilter' -import { T9n } from 'features/T9n' - -import { - HeaderStyled, - ScBody, - ScSportsWrapper, - ScModal, - ScHeaderTitle, - ScHeaderGroup, - ScSport, -} from './styled' - -const sports = [ - 'all_sports', - 'basketball', - 'football_popup', - 'handball', - 'hockey_popup', - 'volleyball', -] - -export const HeaderMobile = () => { - const { selectedSport, setSelectedSport } = useHeaderFiltersStore() - const [isOpen, setIsOpen] = useState(false) - - const onSportClick = (sport: string) => { - setSelectedSport(sport) - setIsOpen(false) - } - - const onModalOpen = () => { - setIsOpen(true) - } - - const onModalClose = () => { - setIsOpen(false) - } - return ( - - - - - - - - - - - - - - - {sports.map((sport) => ( - onSportClick(sport)} - className={selectedSport === sport ? 'active' : ''} - active={selectedSport === sport} - > - - - ))} - - - - ) -} +import { HeaderStyled, ScSportsWrapper } from './styled' + +export const HeaderMobile = () => ( + + + + + + + + +) diff --git a/src/features/HomePage/components/HeaderFilters/index.tsx b/src/features/HomePage/components/HeaderFilters/index.tsx new file mode 100644 index 00000000..956d139d --- /dev/null +++ b/src/features/HomePage/components/HeaderFilters/index.tsx @@ -0,0 +1,20 @@ +import { SportsFilter } from 'features/SportsFilter' +import { useHeaderFiltersStore } from 'features/HeaderFilters' +import { SelectFilter } from 'components/SelectFilter' + +import { ScHeaderFilters } from './styled' + +export const HeaderFilters = () => { + const { selectedSport, setSelectedSport } = useHeaderFiltersStore() + + return ( + + + console.log(1)} + open={false} + selectItem='all_sports' + /> + + ) +} diff --git a/src/features/HomePage/components/HeaderFilters/styled.tsx b/src/features/HomePage/components/HeaderFilters/styled.tsx new file mode 100644 index 00000000..eb1526d4 --- /dev/null +++ b/src/features/HomePage/components/HeaderFilters/styled.tsx @@ -0,0 +1,6 @@ +import styled from 'styled-components/macro' + +export const ScHeaderFilters = styled.div` + display: flex; + flex-direction: row; +` diff --git a/src/features/HomePage/index.tsx b/src/features/HomePage/index.tsx index 5bc4254b..c6c9c2e8 100644 --- a/src/features/HomePage/index.tsx +++ b/src/features/HomePage/index.tsx @@ -18,6 +18,7 @@ import { UserFavorites } from 'features/UserFavorites' import { useHomePage } from './hooks' import { Header } from './components/Header' import { HeaderMobile } from '../HeaderMobile' +import { HeaderFilters } from './components/HeaderFilters' const Home = () => { usePageLogger(PAGES.home) @@ -28,6 +29,7 @@ const Home = () => {
+
diff --git a/src/features/SportsFilter/components/SelectSport/index.tsx b/src/features/SportsFilter/components/SelectSport/index.tsx new file mode 100644 index 00000000..ed162520 --- /dev/null +++ b/src/features/SportsFilter/components/SelectSport/index.tsx @@ -0,0 +1,20 @@ +import { T9n } from 'features/T9n' + +import { ScSportsFilter, ScArrow } from './styled' + +type SportsFilterProps = { + onModalOpen: () => void, + open: boolean, + sport: string, +} + +export const SelectSport = ({ + onModalOpen, + open, + sport, +}: SportsFilterProps) => ( + + + + +) diff --git a/src/features/SportsFilter/styled.tsx b/src/features/SportsFilter/components/SelectSport/styled.tsx similarity index 96% rename from src/features/SportsFilter/styled.tsx rename to src/features/SportsFilter/components/SelectSport/styled.tsx index f8d01241..9515ab38 100644 --- a/src/features/SportsFilter/styled.tsx +++ b/src/features/SportsFilter/components/SelectSport/styled.tsx @@ -10,7 +10,7 @@ export const ScSportsFilter = styled.div` width: 30%; text-transform: uppercase; font-weight: 700; - height: 100%; + cursor: pointer; align-items: center; ${isMobileDevice diff --git a/src/features/SportsFilter/components/SelectSportPopup/index.tsx b/src/features/SportsFilter/components/SelectSportPopup/index.tsx new file mode 100644 index 00000000..87a368af --- /dev/null +++ b/src/features/SportsFilter/components/SelectSportPopup/index.tsx @@ -0,0 +1,53 @@ +import { T9n } from 'features/T9n' + +import { + ScBody, + ScModal, + ScHeaderTitle, + ScHeaderGroup, + ScSport, +} from './styled' + +const sports = [ + 'all_sports', + 'basketball', + 'football_popup', + 'handball', + 'hockey_popup', + 'volleyball', +] + +type Props = { + isOpen: boolean, + onModalClose: () => void, + onSportClick: (sport: string) => void, + selectedSport: string, +} +export const SelectSportPopup = ({ + isOpen, + onModalClose, + onSportClick, + selectedSport, +}: Props) => ( + <> + + + + + + + + {sports.map((sport: string) => ( + onSportClick(sport)} + className={selectedSport === sport ? 'active' : ''} + active={selectedSport === sport} + > + + + ))} + + + +) diff --git a/src/features/SportsFilter/components/SelectSportPopup/styled.tsx b/src/features/SportsFilter/components/SelectSportPopup/styled.tsx new file mode 100644 index 00000000..63bed564 --- /dev/null +++ b/src/features/SportsFilter/components/SelectSportPopup/styled.tsx @@ -0,0 +1,226 @@ +import styled, { css } from 'styled-components/macro' + +import isUndefined from 'lodash/isUndefined' + +import { client } from 'config/clients' +import { isMobileDevice } from 'config/userAgent' + +import { Logo } from 'features/Logo' +import { ModalWindow } from 'features/Modal/styled' +import { Modal as BaseModal } from 'features/Modal' +import { customScrollbar } from 'features/Common' + +export const DEFAULT_HEADER_COLOR = 'rgba(53, 96, 225, 0.56)' + +export const defaultHeaderStyles = ( + color: string = DEFAULT_HEADER_COLOR, headerImage: string | undefined | null, +) => { + if (headerImage && client.name !== 'facr') { + return css`background: url(${headerImage}.png); + background-size: 100% 100%; + @media (max-width: 450px){ + background: url(${headerImage}_mobile.png); + background-size: 100% 100%; + } + ` + } + if (color.includes('linear-gradient')) { + return css` + background: ${color}; + z-index: 10; +` + } + return client.name === 'facr' ? client.styles.homePageHeader : css` + background: linear-gradient( + 236deg, + ${color} -4.49%, + #000000 50%), + #000000; + z-index: 10; +` +} + +type HeaderProps = { + color?: string, + headerImage?: string | null, + height?: number, +} + +export const HeaderStyled = styled.header` + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + height: ${({ height = 8.5 }) => height}rem; + ${isMobileDevice + ? css` + height: 124px + ` + : ''}; + + ${({ color, headerImage }) => defaultHeaderStyles(color, headerImage)} + + ${isMobileDevice + ? css` + padding: 8px; + ` + : ''} +` + +type Props = { + height?: number, + marginTop?: number, +} + +export const HeaderGroup = styled.div` + display: flex; + flex-direction: row; + align-items: center; + + ${({ height }) => (height ? `height: ${height}rem` : '')}; + ${({ marginTop }) => (marginTop ? `margin-top: ${marginTop}rem` : '')}; + + ${isMobileDevice + ? css` + position: relative; + justify-content: space-between; + width: 100%; + + :only-child { + flex-basis: 100px; + } + ` + : ''}; +` + +export const HeaderLogo = styled(Logo)` + ${({ isMatchPage }) => (isMatchPage ? css` + width: ${client.styles.matchLogoWidth}rem; + height: ${client.styles.matchLogoHeight}rem; + ` : '')} + + ${isMobileDevice + ? css` + width: 65px; + height: 15px; + ` + : ''} +` + +type PositionProps = { + isMatchPage?: boolean, + left?: number, + right?: number, + top?: number, +} + +export const Position = styled.div` + position: absolute; + + top: ${({ isMatchPage, top = 1.14 }) => ( + isMatchPage + ? client.styles.matchLogoTopMargin ?? top + : top + )}rem; + + ${({ left }) => (isUndefined(left) ? '' : `left: ${left}rem`)}; + ${({ right }) => (isUndefined(right) ? '' : `right: ${right}rem`)}; +` + +export const ScSportsWrapper = styled.div` + height: 80px; + display: flex; + flex-direction: row; + align-items: center; + position: absolute; + + ${isMobileDevice + ? css` + top: 110px; + padding: 10px; + justify-content: space-between; + width: 100%; + /* right: -10px; + width: 95vw; + bottom: -90px; */ + ` + : ''}; +` + +export const ScModal = styled(BaseModal)` + background-color: rgba(0, 0, 0, 0.7); + + ${ModalWindow} { + min-width: 286px; + max-height: 290px; + background-color: #333333; + border-radius: 0px; + padding: 0; + overflow-y: auto; + + ${customScrollbar} + + ${isMobileDevice + ? css` + min-width: 280px; + max-height: 250px; + height: auto; + top: -140px; + ` + : ''}; + } +` +export const ScHeaderTitle = styled.span` + font-weight: 700; + font-size: 10px; + line-height: 24px; + color: #FFFFFF; + ${isMobileDevice + ? css` + font-size: 10px; + line-height: 20px; + + @media (orientation: landscape) { + font-size: 10px; + } + ` + : ''}; +` + +export const ScHeaderGroup = styled.div` + display: flex; + flex-direction: row; + justify-content: center; + padding: 10px; + border-bottom: 1px solid #505050; + + ${isMobileDevice + ? css` + font-size: 10px; + line-height: 20px; + + @media (orientation: landscape) { + font-size: 10px; + } + ` + : ''}; +` +export const ScBody = styled.div` + display: flex; + flex-direction: column; + padding: 0 15px 23px 15px; +` + +type SportProps = { + active: boolean, +} +export const ScSport = styled.div` + display: flex; + justify-content: center; + text-transform: uppercase; + font-size: 10px; + font-weight: 700; + opacity: ${({ active }) => (active ? 1 : 0.5)}; + margin-top: 18px; + cursor: pointer; +` diff --git a/src/features/SportsFilter/index.tsx b/src/features/SportsFilter/index.tsx index 903b4fe4..16afd710 100644 --- a/src/features/SportsFilter/index.tsx +++ b/src/features/SportsFilter/index.tsx @@ -1,20 +1,40 @@ -import { T9n } from 'features/T9n' +import { useState } from 'react' -import { ScSportsFilter, ScArrow } from './styled' +import { useHeaderFiltersStore } from 'features/HeaderFilters' -type SportsFilterProps = { - onModalOpen: () => void, - open: boolean, - sport: string, -} +import { SelectSport } from './components/SelectSport' +import { SelectSportPopup } from './components/SelectSportPopup' + +export const SportsFilter = () => { + const { selectedSport, setSelectedSport } = useHeaderFiltersStore() + const [isOpen, setIsOpen] = useState(false) + + const onSportClick = (sport: string) => { + setSelectedSport(sport) + setIsOpen(false) + } -export const SportsFilter = ({ - onModalOpen, - open, - sport, -}: SportsFilterProps) => ( - - - - -) + const onModalOpen = () => { + setIsOpen(true) + } + + const onModalClose = () => { + setIsOpen(false) + } + + return ( + <> + + + + ) +}