Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WJ-14 - New: Movie component; #34

Merged
merged 1 commit into from
Aug 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 12 additions & 9 deletions src/components/Layout/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
import { Color } from 'shared/enums';
import styled, { css } from 'styled-components';

interface Props {
background?: string;
color?: string;
theme?: string;
}
import { Color } from 'shared/enums';
import DefaultProps from 'shared/dtos';

const BasicLayout = styled.div<Props>`
const BasicLayout = styled.div<DefaultProps>`
background: ${props => props.background || 'inherit'};
color: ${props => props.color || 'inherit'};

${props => {
if (props.theme === 'light') {
return css`
background: ${Color.Fill};
color: ${Color.Primary};
`;
}

if (props.theme === 'primary') {
return css`
background: ${Color.Primary};
Expand All @@ -33,15 +36,15 @@ const BasicLayout = styled.div<Props>`
export const ColumnLayout = styled(BasicLayout)`
position: absolute;
min-height: 100%;
min-width: 100%;
width: 100%;
display: flex;
flex-direction: column;
`;

export const RowLayout = styled(BasicLayout)`
position: absolute;
min-height: 100%;
min-width: 100%;
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
Expand Down
2 changes: 1 addition & 1 deletion src/containers/Footer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Link } from 'react-router-dom';

import { ReactComponent as Logo } from 'assets/logo.svg';
import { Color } from 'shared/enums';
import RouteEnum from 'routes/enums/Route';
import RouteEnum from 'routes/enums';

import { Wrapper } from 'components/Layout';
import { Container, LogoContainer, LinksContainer } from './styles';
Expand Down
2 changes: 1 addition & 1 deletion src/containers/Header/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { FiSearch } from 'react-icons/fi';
import { ReactComponent as Logo } from 'assets/logo.svg';

import { Color } from 'shared/enums';
import RouteEnum from 'routes/enums/Route';
import RouteEnum from 'routes/enums';
import { Wrapper } from 'components/Layout';
import Button from 'components/Button';
import { Container, MenuContainer, Link, ActionMenuContainer } from './styles';
Expand Down
5 changes: 5 additions & 0 deletions src/containers/Movie/dtos/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import PopularProps from 'domains/Movie/api/Popular/Response';

export default interface Props extends PopularProps {
isFavorite?: boolean;
}
32 changes: 32 additions & 0 deletions src/containers/Movie/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React, { useCallback, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { BsHeartFill } from 'react-icons/bs';

import Route from 'routes/enums';
import { Color } from 'shared/enums';
import { Container, IconButton, Poster } from './styles';

import Props from './dtos';

const Movie: React.FC<Props> = ({ ...movie }) => {
const history = useHistory();
const [isFavorite, setIsFavorite] = useState(false);

const handleFavorite = useCallback(() => {
setIsFavorite(!isFavorite);
}, [isFavorite]);

return (
<Container>
<IconButton onClick={handleFavorite}>
<BsHeartFill fill={isFavorite ? Color.Primary : Color.Empty} />
</IconButton>
<Poster
src={movie.poster}
onClick={() => history.push(`${Route.MOVIE}/${movie.id}`)}
/>
</Container>
);
};

export default Movie;
29 changes: 29 additions & 0 deletions src/containers/Movie/styles.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import styled from 'styled-components';
import { PosterHeight, PosterWidth, Size } from 'shared/enums';

export const Container = styled.div`
position: relative;
width: ${PosterWidth.Default};
height: ${PosterHeight.Default};
border-radius: ${Size.Smallest};
overflow: hidden;
`;

export const IconButton = styled.button`
position: absolute;
right: ${Size.Smallest};
top: ${Size.Smallest};
background: transparent;
border: none;

svg {
height: ${Size.Default};
width: ${Size.Default};
}
`;

export const Poster = styled.img`
width: 100%;
height: 100%;
object-fit: cover;
`;
6 changes: 6 additions & 0 deletions src/containers/MovieList/dtos/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import DefaultProps from 'shared/dtos';

export default interface Props extends DefaultProps {
title?: string;
data: any[];
}
32 changes: 32 additions & 0 deletions src/containers/MovieList/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React from 'react';

import { Wrapper } from 'components/Layout';
import Movie from 'containers/Movie';
import { Container, Title, ListContainer, ListContent } from './styles';

import Props from './dtos';

const MovieList: React.FC<Props> = ({
theme,
background,
color,
title,
data,
}) => {
return (
<Wrapper theme={theme} background={background} color={color}>
<Container>
{title && <Title>{title}</Title>}
<ListContainer>
<ListContent>
{data.map(movie => (
<Movie key={movie.id} {...movie} />
))}
</ListContent>
</ListContainer>
</Container>
</Wrapper>
);
};

export default MovieList;
51 changes: 51 additions & 0 deletions src/containers/MovieList/styles.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import styled from 'styled-components';

import { Container as DefaultContainer } from 'components/Layout';
import { Size } from 'shared/enums';

export const Container = styled(DefaultContainer)`
padding: ${Size.Medium} 0;
display: flex;
flex-direction: column;
`;

export const Title = styled.h2`
margin-bottom: ${Size.Small};
margin-left: ${Size.Medium};
`;

export const ListContainer = styled.div`
/* overflow-x: hidden;

&:hover { */
overflow-x: auto;
/* } */

scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;

-ms-overflow-style: none;
scrollbar-width: 10px;
&::-webkit-scrollbar {
/* visibility: visible; */
display: none;
}
`;

export const ListContent = styled.div`
display: inline-flex;
margin-left: ${Size.Medium};

& > div {
flex: 1 0 auto;
scroll-snap-align: start;
scroll-margin-left: ${Size.Large};
margin-right: ${Size.Medium};

@media (max-width: 915px) {
scroll-margin-left: ${Size.Medium};
margin-right: ${Size.Smallest};
}
}
`;
2 changes: 1 addition & 1 deletion src/routes/Route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
} from 'react-router-dom';

import { useAuth } from 'domains/Auth/hooks';
import RouteEnum from 'routes/enums/Route';
import RouteEnum from 'routes/enums';

interface RouteProps extends ReactDOMRouteProps {
isPrivate?: boolean;
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import { Switch } from 'react-router-dom';

import Route from 'routes/Route';
import RouteEnum from 'routes/enums/Route';
import RouteEnum from 'routes/enums';

import { Home, Movie, Login, Signup, Profile, Favorites } from 'screens';

Expand Down
20 changes: 18 additions & 2 deletions src/screens/Home/index.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
import React from 'react';
import React, { useEffect, useState } from 'react';

import Popular from 'domains/Movie/api/Popular';
import MovieResponse from 'domains/Movie/api/Popular/Response';
import { Color } from 'shared/enums';

import { ColumnLayout } from 'components/Layout';
import Header from 'containers/Header';
import MovieList from 'containers/MovieList';
import Footer from 'containers/Footer';
import { HeaderBackground } from './styles';

const Home: React.FC = () => {
const [movieList, setMovieList] = useState([] as MovieResponse[]);
useEffect(() => {
Popular().then(response => {
setMovieList(response);
});
}, []);

return (
<ColumnLayout>
<Header />
<div style={{ flex: 1 }}></div>
{/* <div style={{ flex: 1 }}> */}
<MovieList theme="light" title="Populares" data={movieList} />
<MovieList theme="primary" title="Favoritos" data={movieList} />
<MovieList theme="secondary" title="Lançamentos" data={movieList} />
{/* </div> */}
<Footer />
<HeaderBackground />
</ColumnLayout>
Expand Down
2 changes: 1 addition & 1 deletion src/screens/Login/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { FormHandles } from '@unform/core';
import * as Yup from 'yup';

import { useAuth } from 'domains/Auth/hooks';
import Route from 'routes/enums/Route';
import Route from 'routes/enums';
import LoginFormData from 'screens/Login/dtos/LoginFormData';
import getValidationErrors from 'shared/utils/getValidationErrors';

Expand Down
2 changes: 1 addition & 1 deletion src/screens/Signup/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { FiLock, FiMail, FiUser } from 'react-icons/fi';
import { FormHandles } from '@unform/core';
import * as Yup from 'yup';

import Route from 'routes/enums/Route';
import Route from 'routes/enums';
import SignupFormData from 'screens/Signup/dtos/SignupFormData';
import getValidationErrors from 'shared/utils/getValidationErrors';
import api from 'services/api';
Expand Down
5 changes: 5 additions & 0 deletions src/shared/dtos/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export default interface Props {
theme?: string;
background?: string;
color?: string;
}
1 change: 1 addition & 0 deletions src/shared/enums/Color.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ enum Color {
FillSecondary = '#EFEFEF',
Text = '#777',
Error = '#c53030',
Empty = '#0F0F0F',
}

export default Color;
6 changes: 6 additions & 0 deletions src/shared/enums/PosterHeight.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
enum PosterHeight {
Default = '25.3rem',
Large = '45.2rem',
}

export default PosterHeight;
6 changes: 6 additions & 0 deletions src/shared/enums/PosterWidth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
enum PosterWidth {
Default = '16.5rem',
Large = '29.5rem',
}

export default PosterWidth;
2 changes: 1 addition & 1 deletion src/shared/enums/Size.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
enum Size {
Smallest = '0.8rem',
Smallest = '1rem',
Small = '1.4rem',
Default = '1.8rem',
Medium = '2.4rem',
Expand Down
2 changes: 2 additions & 0 deletions src/shared/enums/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export { default as Color } from './Color';
export { default as PosterHeight } from './PosterHeight';
export { default as PosterWidth } from './PosterWidth';
export { default as Size } from './Size';
7 changes: 6 additions & 1 deletion src/shared/styles/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,14 @@ export default createGlobalStyle`
font-family: 'Ubuntu', -apple-system, system-ui, sans-serif;
font-weight: 100;
}
h1, h2, h3, h4, h5, h6, strong {
h1, strong {
font-weight: 400,
}

h2, h3, h4, h5, h6 {
font-weight: 100;
}

button {
cursor: pointer;
}
Expand Down