diff --git a/src/components/SportIcon/SportIcon.tsx b/src/components/SportIcon/SportIcon.tsx
index b752e497..ce735a89 100644
--- a/src/components/SportIcon/SportIcon.tsx
+++ b/src/components/SportIcon/SportIcon.tsx
@@ -59,7 +59,7 @@ export const SportIcon = ({
)
diff --git a/src/features/HeaderFilters/components/DateFilter/styled.tsx b/src/features/HeaderFilters/components/DateFilter/styled.tsx
index e96f107f..e7cd87e7 100644
--- a/src/features/HeaderFilters/components/DateFilter/styled.tsx
+++ b/src/features/HeaderFilters/components/DateFilter/styled.tsx
@@ -206,8 +206,8 @@ export const Arrow = styled.span`
width: 0.65rem;
height: 0.65rem;
position: absolute;
- border-left: 0.3rem solid #fff;
- border-bottom: 0.3rem solid #fff;
+ border-left: 0.15rem solid #fff;
+ border-bottom: 0.15rem solid #fff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
@@ -217,6 +217,7 @@ export const Arrow = styled.span`
? 'transform: translate(-50%, -50%) rotate(45deg);'
: 'transform: translate(-50%, -50%) rotate(225deg);'
)}
+
${isMobileDevice
? css`
padding: 5px;
diff --git a/src/features/MatchCard/CardFrontside/MatchCardMobile/index.tsx b/src/features/MatchCard/CardFrontside/MatchCardMobile/index.tsx
new file mode 100644
index 00000000..abc358fc
--- /dev/null
+++ b/src/features/MatchCard/CardFrontside/MatchCardMobile/index.tsx
@@ -0,0 +1,147 @@
+import type { KeyboardEvent } from 'react'
+import { useRouteMatch } from 'react-router'
+
+import getUnixTime from 'date-fns/getUnixTime'
+
+import { ProfileTypes, PAGES } from 'config'
+
+import type { Match } from 'features/Matches'
+import { useMatchSwitchesStore } from 'features/MatchSwitches'
+import { useName } from 'features/Name'
+import { T9n } from 'features/T9n'
+import { MatchAccess } from 'features/Matches/helpers/getMatchClickAction'
+import { useUserFavoritesStore } from 'features/UserFavorites/store'
+
+import { NoAccessMessage } from '../../NoAccessMessage'
+import {
+ CardWrapperOuter,
+ CardWrapper,
+ Info,
+ LiveSign,
+ MatchDate,
+ MatchTimeInfo,
+ Preview,
+ PreviewWrapper,
+ Score,
+ Team,
+ TeamName,
+ Teams,
+ Time,
+ TeamLogos,
+ TeamLogo,
+ BuyMatchBadge,
+ SecondaryInfo,
+ FavoriteSign,
+ NameSignWrapper,
+ HoverFrame,
+ ScDollar,
+} from './styled'
+import { useCardPreview } from '../hooks'
+
+type Props = {
+ match: Match,
+ onClick: () => void,
+ onKeyPress: (e: KeyboardEvent) => void,
+}
+
+export const CardFrontsideMobile = ({
+ match,
+ onClick,
+ onKeyPress,
+}: Props) => {
+ const {
+ access,
+ date,
+ formattedDate,
+ live,
+ preview,
+ previewURL,
+ sportType,
+ team1,
+ team2,
+ time,
+ tournament,
+ } = match
+ const isHomePage = useRouteMatch(PAGES.home)?.isExact
+ const tournamentName = useName(tournament)
+ const { isInFavorites } = useUserFavoritesStore()
+ const { isScoreHidden } = useMatchSwitchesStore()
+ const isInFuture = getUnixTime(date) > getUnixTime(new Date())
+ const showScore = !(isInFuture || isScoreHidden) || (live && !isScoreHidden)
+ const team1InFavorites = isInFavorites(ProfileTypes.TEAMS, team1.id)
+ const team2InFavorites = isInFavorites(ProfileTypes.TEAMS, team2.id)
+
+ const { previewImage } = useCardPreview({
+ preview,
+ previewURL,
+ })
+
+ return (
+
+
+
+
+ {previewImage && (
+
+ )}
+ {access === MatchAccess.NoCountryAccess ? (
+
+ ) : (
+
+
+
+
+ )}
+
+
+ {isHomePage ? null : formattedDate}
+ {live && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ {team1InFavorites && }
+
+ {showScore && {team1.score}}
+
+
+
+
+ {team2InFavorites && }
+
+ {showScore && {team2.score}}
+
+
+
+
+ {access === MatchAccess.CanBuyMatch && (
+
+
+
+ )}
+
+
+
+
+ )
+}
diff --git a/src/features/MatchCard/CardFrontside/MatchCardMobile/styled.tsx b/src/features/MatchCard/CardFrontside/MatchCardMobile/styled.tsx
new file mode 100644
index 00000000..d253f88d
--- /dev/null
+++ b/src/features/MatchCard/CardFrontside/MatchCardMobile/styled.tsx
@@ -0,0 +1,350 @@
+import styled, { css } from 'styled-components/macro'
+
+import { devices } from 'config/devices'
+import { isMobileDevice } from 'config/userAgent'
+
+import { Name } from 'features/Name'
+import { Icon } from 'features/Icon'
+import { ProfileLogo } from 'features/ProfileLogo'
+
+export const CardWrapperOuter = styled.li.attrs({
+ tabIndex: 0,
+})`
+ padding-top: 100%;
+ position: relative;
+ ${isMobileDevice
+ ? css`
+ width: 100%;
+ padding-top: 0;
+ margin-top: 6px;
+
+ @media screen and (orientation: landscape) {
+ width: 100%;
+ :nth-child(odd) {
+ margin-right: 10px;
+ }
+ }
+ `
+ : ''};
+`
+
+export const CardWrapper = styled.div`
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ padding-bottom: 0.75rem;
+ border-radius: 2px;
+ background-color: #3F3F3F;
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.4);
+ cursor: pointer;
+ ${isMobileDevice
+ ? css`
+ position: static;
+ display: flex;
+ width: 100%;
+ height: 75px;
+ padding-bottom: 0;
+ `
+ : ''};
+`
+
+export const HoverFrame = styled.div`
+ position: absolute;
+ min-width: 100%;
+ min-height: 100%;
+ border-radius: 2px;
+ border: 2px solid transparent;
+ transition: border 0.5s ease-out;
+ z-index: 2;
+
+ &:hover {
+ border: 2px solid #fff
+ }
+`
+
+export const PreviewWrapper = styled.div`
+ position: relative;
+ display: flex;
+ width: 100%;
+ height: 60%;
+ ${isMobileDevice
+ ? css`
+ width: 40%;
+ height: 100%;
+ `
+ : ''};
+`
+
+export const Preview = styled.img`
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ opacity: 0.4;
+
+ ${isMobileDevice
+ ? css`
+ opacity: 0.2;
+ `
+ : ''};
+`
+
+export const MatchTimeInfo = styled.div`
+ width: 100%;
+ position: absolute;
+ top: 0.519rem;
+ padding: 0 0.519rem;
+ display: flex;
+ flex-direction: row;
+`
+
+type MatchDateProps = {
+ isHomePage?: boolean,
+}
+
+export const MatchDate = styled.div`
+ width: fit-content;
+ height: 0.9rem;
+ border-radius: 2px;
+ padding: ${({ isHomePage }) => (!isHomePage ? '0 0.27rem' : '')};
+ font-weight: bold;
+ font-size: 0.472rem;
+ line-height: 0.567rem;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ white-space: nowrap;
+ color: white;
+ background-color: #6D6D6D;
+
+ @media ${devices.tablet} {
+ padding: ${({ isHomePage }) => (!isHomePage ? '0.27rem 0.36rem' : '')};
+ }
+ ${isMobileDevice
+ ? css`
+ background-color: transparent;
+ margin-left: 4px;
+ height: 15px;
+ width: 22px;
+ font-size: 7px;
+ `
+ : ''};
+`
+
+type LiveType = {
+ color?: string,
+}
+
+export const LiveSign = styled(MatchDate)`
+ background-color: ${({ color }) => color ?? '#CC0000'};
+ margin-left: auto;
+
+ ${isMobileDevice
+ ? css`
+ font-size: 7px;
+ padding: 3px;
+ `
+ : ''};
+`
+
+export const Time = styled.span`
+ margin: 0 0.2rem;
+ ${isMobileDevice
+ ? css`
+ font-size: 10px;
+ `
+ : ''};
+`
+
+export const Info = styled.div`
+ display: flex;
+ flex-direction: column;
+ padding: 0.85rem 0.472rem 0 0.519rem;
+ color: #fff;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ ${isMobileDevice
+ ? css`
+ /* position: absolute;
+ top: 0;
+ left: 45%; */
+ width: 60%;
+ height: 100%;
+ padding: 9px;
+ `
+ : ''};
+`
+
+export const SecondaryInfo = styled.div`
+ display: flex;
+ align-items: center;
+
+ ${isMobileDevice
+ ? css`
+ justify-content: space-between;
+ `
+ : ''};
+`
+
+export const CountryFlag = styled.img`
+ width: 0.71rem;
+ height: 0.75rem;
+ margin-left: 0.567rem;
+ object-fit: contain;
+ ${isMobileDevice
+ ? css`
+ object-fit: cover;
+ width: 12px;
+ height: 100%;
+ margin-left: 8px;
+ `
+ : ''};
+`
+
+type FavoriteSignProps = {
+ color?: string,
+ marginLeft?: number,
+}
+
+export const FavoriteSign = styled.span`
+ display: inline-block;
+ margin-left: ${({ marginLeft = 9 }) => marginLeft}px;
+ color: ${({ color }) => color};
+ ${isMobileDevice
+ ? css`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 8px;
+ height: 8px;
+ `
+ : ''};
+`
+
+const nameStyles = css`
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+`
+
+export const TournamentName = styled.span`
+ max-width: 95%;
+ color: rgba(255, 255, 255, 0.7);
+ font-size: 0.567rem;
+ line-height: 0.95rem;
+ margin-left: 0.567rem;
+ ${isMobileDevice
+ ? css`
+ font-size: 10px;
+ line-height: 100%;
+ max-width: 100%;
+ `
+ : ''};
+
+ ${nameStyles}
+`
+
+export const Teams = styled.div`
+ margin-bottom: 0.567rem;
+`
+
+export const Team = styled.span`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-weight: 600;
+ font-size: 0.85rem;
+ line-height: 1.14rem;
+ color: #fff;
+ ${isMobileDevice
+ ? css`
+ font-size: 14px;
+ line-height: 20px;
+ `
+ : ''};
+`
+
+export const NameSignWrapper = styled.div`
+ display: flex;
+ max-width: 90%;
+ align-items: center;
+`
+
+export const TeamName = styled(Name)`
+ ${nameStyles}
+`
+
+export const Score = styled.div`
+
+${isMobileDevice
+ ? css`
+ display: flex;
+ justify-content: center;
+ width: 15px;
+ `
+ : ''};
+
+`
+
+export const TeamLogos = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: 0.71rem auto 0 auto;
+ z-index: 1;
+`
+
+export const TeamLogo = styled(ProfileLogo)`
+ width: 33%;
+ max-height: 100%;
+
+ :last-child {
+ margin-left: 0.8rem;
+ }
+ ${isMobileDevice
+ ? css`
+ width: 30%;
+ `
+ : ''};
+`
+
+export const BuyMatchBadge = styled.span`
+ position: absolute;
+ left: 0.472rem;
+ bottom: 0.519rem;
+ width: 1.18rem;
+ height: 1.18rem;
+ cursor: pointer;
+
+ /* background-image: url(/images/dollar-sign.svg); */
+ color: rgba(255, 255, 255, 0.7);
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: 0.472rem 0.71rem;
+ background-color: rgba(255, 255, 255, 0.19);
+ border-radius: 50%;
+ box-shadow: 0px 0.08rem 0.283rem rgba(0, 0, 0, 0.5);
+
+ ${isMobileDevice
+ ? css`
+ position: static;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15px;
+ height: 15px;
+ /* background-size: 40%; */
+ `
+ : ''};
+`
+
+export const ScDollar = styled(Icon)`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`
diff --git a/src/features/MatchCard/CardFrontside/index.tsx b/src/features/MatchCard/CardFrontside/index.tsx
index aaefcd93..18518766 100644
--- a/src/features/MatchCard/CardFrontside/index.tsx
+++ b/src/features/MatchCard/CardFrontside/index.tsx
@@ -6,6 +6,7 @@ import getUnixTime from 'date-fns/getUnixTime'
import { ProfileTypes, PAGES } from 'config'
import type { Match } from 'features/Matches'
+import { SportIcon } from 'components/SportIcon/SportIcon'
import { useMatchSwitchesStore } from 'features/MatchSwitches'
import { useName } from 'features/Name'
import { T9n } from 'features/T9n'
@@ -27,14 +28,15 @@ import {
TeamName,
Teams,
Time,
+ TournamentName,
TeamLogos,
TeamLogo,
BuyMatchBadge,
+ CountryFlag,
SecondaryInfo,
FavoriteSign,
NameSignWrapper,
HoverFrame,
- ScDollar,
} from '../styled'
import { useCardPreview } from './hooks'
@@ -67,7 +69,11 @@ export const CardFrontside = ({
const { isInFavorites } = useUserFavoritesStore()
const { isScoreHidden } = useMatchSwitchesStore()
const isInFuture = getUnixTime(date) > getUnixTime(new Date())
- const showScore = !(isInFuture || isScoreHidden) || (live && !isScoreHidden)
+ const showScore = !(
+ isInFuture
+ || isScoreHidden
+ ) || (live && !isScoreHidden)
+ const tournamentInFavorites = isInFavorites(ProfileTypes.TOURNAMENTS, tournament.id)
const team1InFavorites = isInFavorites(ProfileTypes.TEAMS, team1.id)
const team2InFavorites = isInFavorites(ProfileTypes.TEAMS, team2.id)
@@ -77,42 +83,50 @@ export const CardFrontside = ({
})
return (
-
+
{previewImage && (
-
- )}
- {access === MatchAccess.NoCountryAccess ? (
-
- ) : (
-
-
-
-
+
)}
+ {access === MatchAccess.NoCountryAccess
+ ?
+ : (
+
+
+
+
+ )}
+ {access === MatchAccess.CanBuyMatch && }
{isHomePage ? null : formattedDate}
- {live && (
-
-
-
- )}
+
+ {live && (
+
+
+
+ )}
@@ -133,11 +147,15 @@ export const CardFrontside = ({
-
- {access === MatchAccess.CanBuyMatch && (
-
-
-
+
+
+ {tournament && (
+
+
+ {tournamentName}
+
+ {tournamentInFavorites && }
+
)}
diff --git a/src/features/MatchCard/index.tsx b/src/features/MatchCard/index.tsx
index e25721d9..9f466b16 100644
--- a/src/features/MatchCard/index.tsx
+++ b/src/features/MatchCard/index.tsx
@@ -1,6 +1,9 @@
import type { Match } from 'features/Matches'
+import { isMobileDevice } from 'config/userAgent'
+
import { CardFrontside } from './CardFrontside'
+import { CardFrontsideMobile } from './CardFrontside/MatchCardMobile'
import { useCard } from './hooks'
type Props = {
@@ -8,13 +11,12 @@ type Props = {
}
export const MatchCard = ({ match }: Props) => {
- const {
- onKeyPress,
- onMatchClick,
- } = useCard(match)
+ const { onKeyPress, onMatchClick } = useCard(match)
+
+ const CurrentComponent = isMobileDevice ? CardFrontsideMobile : CardFrontside
return (
- `
}
${isMobileDevice
? css`
- background-color: transparent;
- margin-left: 4px;
- height: 15px;
- width: 22px;
- font-size: 7px;
- `
+ height: 15px;
+ font-size: 8px;
+ `
: ''};
`
-type LiveType = {
- color?: string,
-}
-
-export const LiveSign = styled(MatchDate)`
- background-color: ${({ color }) => color ?? '#CC0000'};
+export const LiveSign = styled(MatchDate)`
+ background-color: #CC0000;
margin-left: auto;
-
- ${isMobileDevice
- ? css`
- font-size: 7px;
- padding: 3px;
- `
- : ''};
`
export const Time = styled.span`
margin: 0 0.2rem;
- ${isMobileDevice
- ? css`
- font-size: 10px;
- `
- : ''};
`
export const Info = styled.div`
@@ -170,25 +143,19 @@ export const Info = styled.div`
white-space: nowrap;
${isMobileDevice
? css`
- /* position: absolute;
- top: 0;
- left: 45%; */
- width: 60%;
- height: 100%;
- padding: 9px;
- `
+ position: absolute;
+ top: 0;
+ left: 50%;
+ width: 50%;
+ height: 100%;
+ padding: 13px 12px 13px 10px;
+ `
: ''};
`
export const SecondaryInfo = styled.div`
display: flex;
align-items: center;
-
- ${isMobileDevice
- ? css`
- justify-content: space-between;
- `
- : ''};
`
export const CountryFlag = styled.img`
@@ -196,34 +163,32 @@ export const CountryFlag = styled.img`
height: 0.75rem;
margin-left: 0.567rem;
object-fit: contain;
+ object-position: bottom;
${isMobileDevice
? css`
- object-fit: cover;
- width: 12px;
- height: 100%;
- margin-left: 8px;
- `
+ width: 12px;
+ height: 8px;
+ margin-left: 3.5px;
+ `
: ''};
`
type FavoriteSignProps = {
- color?: string,
marginLeft?: number,
}
export const FavoriteSign = styled.span`
display: inline-block;
+ width: 0.472rem;
+ height: 0.472rem;
margin-top: 0.08rem;
margin-left: ${({ marginLeft = 9 }) => marginLeft}px;
- color: ${({ color }) => color};
+ background: url('/images/sportFavStar.png') no-repeat center / 100% 100%;
${isMobileDevice
? css`
- display: flex;
- justify-content: center;
- align-items: center;
- width: 8px;
- height: 8px;
- `
+ width: 10px;
+ height: 10px;
+ `
: ''};
`
@@ -241,10 +206,10 @@ export const TournamentName = styled.span`
margin-left: 0.567rem;
${isMobileDevice
? css`
- font-size: 10px;
- line-height: 100%;
- max-width: 100%;
- `
+ font-size: 10px;
+ line-height: 100%;
+ max-width: 100%;
+ `
: ''};
${nameStyles}
@@ -252,6 +217,11 @@ export const TournamentName = styled.span`
export const Teams = styled.div`
margin-bottom: 0.567rem;
+ ${isMobileDevice
+ ? css`
+ margin-bottom: 15px;
+ `
+ : ''};
`
export const Team = styled.span`
@@ -264,9 +234,9 @@ export const Team = styled.span`
color: #fff;
${isMobileDevice
? css`
- font-size: 14px;
- line-height: 20px;
- `
+ font-size: 14px;
+ line-height: 20px;
+ `
: ''};
`
@@ -280,17 +250,7 @@ export const TeamName = styled(Name)`
${nameStyles}
`
-export const Score = styled.div`
-
-${isMobileDevice
- ? css`
- display: flex;
- justify-content: center;
- width: 15px;
- `
- : ''};
-
-`
+export const Score = styled.div``
export const TeamLogos = styled.div`
display: flex;
@@ -306,11 +266,12 @@ export const TeamLogo = styled(ProfileLogo)`
:last-child {
margin-left: 0.8rem;
+
}
${isMobileDevice
? css`
- width: 30%;
- `
+ width: 30%;
+ `
: ''};
`
@@ -322,30 +283,20 @@ export const BuyMatchBadge = styled.span`
height: 1.18rem;
cursor: pointer;
- /* background-image: url(/images/dollar-sign.svg); */
- color: rgba(255, 255, 255, 0.7);
+ background-image: url(/images/dollar-sign.svg);
background-position: center;
background-repeat: no-repeat;
background-size: 0.472rem 0.71rem;
- background-color: rgba(255, 255, 255, 0.19);
+ background-color: #fff;
border-radius: 50%;
+ border: 0.5px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0.08rem 0.283rem rgba(0, 0, 0, 0.5);
${isMobileDevice
? css`
- position: static;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 15px;
- height: 15px;
- /* background-size: 40%; */
- `
+ width: 19px;
+ height: 17px;
+ background-size: 40%;
+ `
: ''};
`
-
-export const ScDollar = styled(Icon)`
- display: flex;
- justify-content: center;
- align-items: center;
-`
diff --git a/src/features/TournamentList/components/Tournament/index.tsx b/src/features/TournamentList/components/Tournament/index.tsx
index 0ffd9b15..c0093e31 100644
--- a/src/features/TournamentList/components/Tournament/index.tsx
+++ b/src/features/TournamentList/components/Tournament/index.tsx
@@ -11,7 +11,7 @@ import {
CountryFlag,
FavoriteSign,
LiveSign,
-} from 'features/MatchCard/styled'
+} from 'features/MatchCard/CardFrontside/MatchCardMobile/styled'
import { useUserFavoritesStore } from 'features/UserFavorites/store'
import type { TournamentType } from 'requests/getMatches/types'
diff --git a/src/libs/objects/Calendar.tsx b/src/libs/objects/Calendar.tsx
index 3be87dcc..2ee5776c 100644
--- a/src/libs/objects/Calendar.tsx
+++ b/src/libs/objects/Calendar.tsx
@@ -1,8 +1,6 @@
export const Calendar = (): JSX.Element => (