diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 7a6c3fc6b78a65f583787962805fd5e85a103970..386bdd32346af80c06d31330d0643980e9c224c0 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -1,6 +1,7 @@ import React, { Suspense, lazy } from 'react' import { Route, Switch, Redirect } from 'react-router-dom' import { FluidType } from 'enum/fluid.enum' +import SeasonView from 'components/Seasons/SeasonView' const HomeView = lazy(() => import('components/Home/HomeView')) const SingleFluidView = lazy(() => @@ -79,7 +80,7 @@ const Routes = () => { path={`${url}/finished`} component={FinishedChallengeDetailsView} /> - <Route path={`${url}/`} component={ChallengeView} exact /> + <Route path={`${url}/`} component={SeasonView} exact /> </> )} /> diff --git a/src/components/Seasons/SeasonCard.tsx b/src/components/Seasons/SeasonCard.tsx index 30336e1fa20d5ea8524625ea7d36fe46aa9b75e5..5f918353a6fefc9efef3fdb84a8392966605d78c 100644 --- a/src/components/Seasons/SeasonCard.tsx +++ b/src/components/Seasons/SeasonCard.tsx @@ -1,7 +1,20 @@ import React from 'react' +import SeasonCardUnlocked from './SeasonCardUnlocked' -const SeasonCard: React.FC = () => { - return <></> +interface Season { + saison: number + name: string +} +interface SeasonCardProps { + season: Season + index: number +} +const SeasonCard = ({ season, index }: SeasonCardProps) => { + return ( + <div className={index === season.saison ? 'slide active' : 'slide'}> + <SeasonCardUnlocked season={season} /> + </div> + ) } export default SeasonCard diff --git a/src/components/Seasons/SeasonCardUnlocked.tsx b/src/components/Seasons/SeasonCardUnlocked.tsx index 047851c2aeff95e1cf89aee94f2e9c9ec1563e30..1b7e2ff5a05b4c0e6b9703dd8db44328aeb8d0ed 100644 --- a/src/components/Seasons/SeasonCardUnlocked.tsx +++ b/src/components/Seasons/SeasonCardUnlocked.tsx @@ -1,7 +1,19 @@ import React from 'react' -const SeasonCardUnlocked: React.FC = () => { - return <></> +interface Season { + saison: number + name: string +} +interface SeasonCardUnlockedProps { + season: Season +} +const SeasonCardUnlocked = ({ season }: SeasonCardUnlockedProps) => { + return ( + <div className="cardContent"> + <p className="title">Saison</p> + <span className="seasonTitle">{season.name}</span> + </div> + ) } export default SeasonCardUnlocked diff --git a/src/components/Seasons/SeasonView.tsx b/src/components/Seasons/SeasonView.tsx index 2e66e4971bb6c70cb2eef6312ef20850571c5efd..8c66ce98fabb0b5dabf93a0d870d97237b550d92 100644 --- a/src/components/Seasons/SeasonView.tsx +++ b/src/components/Seasons/SeasonView.tsx @@ -1,7 +1,100 @@ -import React from 'react' - +import React, { useEffect, useState } from 'react' +import SeasonCard from './SeasonCard' +import CozyBar from 'components/Header/CozyBar' +import Content from 'components/Content/Content' +import Header from 'components/Header/Header' const SeasonView: React.FC = () => { - return <></> + const [headerHeight, setHeaderHeight] = useState<number>(0) + const [touchStart, setTouchStart] = React.useState(0) + const [touchEnd, setTouchEnd] = React.useState(0) + const [index, setindex] = useState(0) + const [containerTranslation, setcontainerTranslation] = useState<any>(0) + + const cardWitdh = 285 + const marginPx = 16 + + const defineHeaderHeight = (height: number) => { + setHeaderHeight(height) + } + interface Season { + saison: number + name: string + } + + const [seasonList, setseasonList] = useState<Season[]>([ + { saison: 0, name: 'saison0' }, + { saison: 1, name: 'saison1' }, + { saison: 2, name: 'saison2' }, + { saison: 3, name: 'saison3' }, + { saison: 4, name: 'saison4' }, + { saison: 5, name: 'saison5' }, + ]) + + const moveSliderRight = () => { + if (index < seasonList.length - 1) { + if (index >= 1) + setcontainerTranslation((prev: number) => prev - cardWitdh - marginPx) + else setcontainerTranslation((prev: number) => prev - cardWitdh) + setindex(prev => prev + 1) + } + } + const moveSliderLeft = () => { + if (index > 0) { + if (index >= 1) + setcontainerTranslation((prev: number) => prev + cardWitdh + marginPx) + else setcontainerTranslation((prev: number) => prev + cardWitdh) + setindex(prev => prev - 1) + } + if (index <= 1) { + setcontainerTranslation(0) + } + } + const handleTouchStart = (e: React.TouchEvent) => { + setTouchStart(e.targetTouches[0].clientX) + } + + const handleTouchEnd = () => { + //Change the following value in order to change the swipe sensibilyy + if (touchStart - touchEnd > 75) { + //If swipe left move slider right and add positive translation + moveSliderRight() + } + if (touchStart - touchEnd < -75) { + //If swipe right move slider left and add negative translation + moveSliderLeft() + } + } + + const handleTouchMove = (e: React.TouchEvent) => { + setTouchEnd(e.targetTouches[0].clientX) + } + + return ( + <> + <CozyBar titleKey={'COMMON.APP_OPTIONS_TITLE'} /> + <Header + setHeaderHeight={defineHeaderHeight} + desktopTitleKey={'COMMON.APP_OPTIONS_TITLE'} + ></Header> + <Content height={headerHeight}> + <div + className="seasonSlider" + onTouchStart={handleTouchStart} + onTouchMove={handleTouchMove} + onTouchEnd={handleTouchEnd} + > + <div + className="container" + style={{ transform: `translateX(${containerTranslation}px)` }} + > + {seasonList.map(season => ( + <SeasonCard key={season.saison} season={season} index={index} /> + ))} + </div> + </div> + </Content> + </> + ) } export default SeasonView diff --git a/src/styles/components/_seasons.scss b/src/styles/components/_seasons.scss new file mode 100644 index 0000000000000000000000000000000000000000..fa6f6bc7c5ed66ad26885d7ed66e961fe8be6a38 --- /dev/null +++ b/src/styles/components/_seasons.scss @@ -0,0 +1,51 @@ +.seasonSlider { + min-height: inherit; + margin-top: -2rem; + overflow-x: hidden; + padding: 2rem; + position: relative; + .container { + min-height: inherit; + width: 100%; + display: flex; + transition: all 300ms ease; + .slide { + margin: auto; + height: 465px; + max-width: 285px; + min-width: 285px; + background: linear-gradient(180deg, #323339 0%, #25262b 100%); + box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); + border-radius: 4px; + margin-right: 1rem; + transition: all 300ms ease; + color: white; + display: flex; + flex-direction: column; + transform: scale(0.9); + + &.active { + transform: scale(1.08); + } + .cardContent { + margin: auto; + .title { + font-weight: 400; + text-align: center; + text-transform: uppercase; + font-family: $text-font; + font-size: 1rem; + margin-bottom: 0; + } + .seasonTitle { + display: block; + font-weight: 700; + text-align: center; + font-family: $text-font; + color: $grey-bright; + font-size: 1.2rem; + } + } + } + } +} diff --git a/src/styles/index.scss b/src/styles/index.scss index 669fed4245dd9ba9cc9afc53831d82ff1523481f..06daec7f0665ff62467335eb0e3fc111db8472e7 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -1,75 +1,76 @@ -/* Cozy UI utilities classes */ -@import '~cozy-ui/dist/cozy-ui.min.css'; -/* Cozy UI React components styles */ -@import '~cozy-ui/transpiled/react/stylesheet.css'; -/* App styles */ -@import 'base/layout'; -@import 'base/color'; -@import 'base/breakpoint'; -@import 'base/typography'; -@import 'components/card'; -@import 'components/form'; -// @import 'components/button'; -@import 'components/konnector'; -@import 'components/fluid'; -@import 'components/navigator'; -@import 'components/consumptionvisualizer'; -@import 'components/barchart'; -@import 'components/nav'; -@import 'components/indicators'; -@import 'components/challenges'; -@import 'components/ecogesture'; -@import 'components/modal'; -@import 'components/faq'; -@import 'components/legalnotice'; -@import 'components/splash'; -@import 'components/auth'; -@import 'components/feedback'; -@import 'components/version'; -@import 'components/report'; -@import 'components/oldDataModal'; - -@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); - -:root { - --blue: #{$blue}; - --blue40: #{$blue-40}; - --blueBackground: #{$blue-radial-gradient}; - --blueRadialGradient: #{$blue-radial-gradient}; - --blueRadialGradientTrans: #{$blue-radial-gradient-transparent}; - --elecColor: #{$elec-color}; - --elecColor40: #{$elec-color-40}; - --elecCompareColor: #{$elec-compare-color}; - --gasColor: #{$gas-color}; - --gasColor40: #{$gas-color-40}; - --gasCompareColor: #{$gas-compare-color}; - --waterColor: #{$water-color}; - --waterColor40: #{$water-color-40}; - --waterCompareColor: #{$water-compare-color}; - --multiColor: #{$multi-color}; - --multiCompareColor: #{$multi-compare-color}; - --redPrimary: #{$red-primary}; - --greyBright: #{$grey-bright}; - --greyDark: #{$grey-dark}; - --textWhite: #{$white}; - --softGrey: #{$soft-grey}; - --darkLight: #{$dark-light}; - --darkLight2: #{$dark-light-2}; - --textFont: #{$text-font}; - --greyLinearGradientBackground: #{$grey-linear-gradient-background}; - --multiColorRadialGradientTrans: #{$multi-color-radial-gradient-transparent}; - --elecColorRadialGradientTrans: #{$elec-color-radial-gradient-transparent}; - --waterColorRadialGradientTrans: #{$water-color-radial-gradient-transparent}; - --gasColorRadialGradientTrans: #{$multi-color-radial-gradient-transparent}; - --multiColorRadialGradient: #{$multi-color-radial-gradient}; - --elecColorRadialGradient: #{$elec-color-radial-gradient}; - --gasColorRadialGradient: #{$gas-color-radial-gradient}; - --waterColorRadialGradient: #{$water-color-radial-gradient}; -} - -.application { - @media #{$large-phone} { - min-height: 100vh; - } - overflow-x: hidden; -} +/* Cozy UI utilities classes */ +@import '~cozy-ui/dist/cozy-ui.min.css'; +/* Cozy UI React components styles */ +@import '~cozy-ui/transpiled/react/stylesheet.css'; +/* App styles */ +@import 'base/layout'; +@import 'base/color'; +@import 'base/breakpoint'; +@import 'base/typography'; +@import 'components/card'; +@import 'components/form'; +// @import 'components/button'; +@import 'components/konnector'; +@import 'components/fluid'; +@import 'components/navigator'; +@import 'components/consumptionvisualizer'; +@import 'components/barchart'; +@import 'components/nav'; +@import 'components/indicators'; +@import 'components/challenges'; +@import 'components/ecogesture'; +@import 'components/modal'; +@import 'components/faq'; +@import 'components/legalnotice'; +@import 'components/splash'; +@import 'components/seasons'; +@import 'components/auth'; +@import 'components/feedback'; +@import 'components/version'; +@import 'components/report'; +@import 'components/oldDataModal'; + +@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); + +:root { + --blue: #{$blue}; + --blue40: #{$blue-40}; + --blueBackground: #{$blue-radial-gradient}; + --blueRadialGradient: #{$blue-radial-gradient}; + --blueRadialGradientTrans: #{$blue-radial-gradient-transparent}; + --elecColor: #{$elec-color}; + --elecColor40: #{$elec-color-40}; + --elecCompareColor: #{$elec-compare-color}; + --gasColor: #{$gas-color}; + --gasColor40: #{$gas-color-40}; + --gasCompareColor: #{$gas-compare-color}; + --waterColor: #{$water-color}; + --waterColor40: #{$water-color-40}; + --waterCompareColor: #{$water-compare-color}; + --multiColor: #{$multi-color}; + --multiCompareColor: #{$multi-compare-color}; + --redPrimary: #{$red-primary}; + --greyBright: #{$grey-bright}; + --greyDark: #{$grey-dark}; + --textWhite: #{$white}; + --softGrey: #{$soft-grey}; + --darkLight: #{$dark-light}; + --darkLight2: #{$dark-light-2}; + --textFont: #{$text-font}; + --greyLinearGradientBackground: #{$grey-linear-gradient-background}; + --multiColorRadialGradientTrans: #{$multi-color-radial-gradient-transparent}; + --elecColorRadialGradientTrans: #{$elec-color-radial-gradient-transparent}; + --waterColorRadialGradientTrans: #{$water-color-radial-gradient-transparent}; + --gasColorRadialGradientTrans: #{$multi-color-radial-gradient-transparent}; + --multiColorRadialGradient: #{$multi-color-radial-gradient}; + --elecColorRadialGradient: #{$elec-color-radial-gradient}; + --gasColorRadialGradient: #{$gas-color-radial-gradient}; + --waterColorRadialGradient: #{$water-color-radial-gradient}; +} + +.application { + @media #{$large-phone} { + min-height: 100vh; + } + overflow-x: hidden; +}