import React from "react";
import PropTypes from "prop-types";
import { Link } from "react-router-dom";
import styled from "styled-components";
const Container = styled.div`
font-size: 12px;
`;
const Image = styled.div`
background-image: url(${props => props.bgUrl});
height: 180px;
background-size: cover;
border-radius: 4px;
background-position: center center;
transition: opacity 0.1s linear;
`;
const Rating = styled.span`
bottom: 5px;
right: 5px;
position: absolute;
opacity: 0;
transition: opacity 0.1s linear;
`;
const ImageContainer = styled.div`
margin-bottom: 5px;
position: relative;
&:hover {
${Image} {
opacity: 0.3;
}
${Rating} {
opacity: 1;
}
}
`;
const Title = styled.span`
display: block;
margin-bottom: 3px;
`;
const Year = styled.span`
font-size: 10px;
color: rgba(255, 255, 255, 0.5);
`;
const Poster = ({ id, imageUrl, title, rating, year, isMovie = false }) => (
<Link to={isMovie ? `/movie/${id}` : `/show/${id}`}>
<Container>
<ImageContainer>
<Image
bgUrl={
imageUrl
? `https://image.tmdb.org/t/p/w300${imageUrl}`
: require("../assets/noPosterSmall.png")
}
/>
<Rating>
<span role="img" aria-label="rating">
⭐️
</span>{" "}
{rating}/10
</Rating>
</ImageContainer>
<Title>
{title.length > 18 ? `${title.substring(0, 18)}...` : title}
</Title>
<Year>{year}</Year>
</Container>
</Link>
);
Poster.propTypes = {
id: PropTypes.number.isRequired,
imageUrl: PropTypes.string,
title: PropTypes.string.isRequired,
rating: PropTypes.number,
year: PropTypes.string,
isMovie: PropTypes.bool
};
export default Poster;
import React from "react";
import PropTypes from "prop-types";
import styled from "styled-components";
import Section from "Components/Section";
import Loader from "../../Components/Loader";
import Message from "../../Components/Message";
import Poster from "../../Components/Poster";
const Container = styled.div`
padding: 0px 20px;
`;
const HomePresenter = ({ nowPlaying, popular, upcoming, loading, error }) =>
loading ? (
<Loader />
) : (
<Container>
{nowPlaying && nowPlaying.length > 0 && (
<Section title="Now Playing">
{nowPlaying.map(movie => (
<Poster />
))}
</Section>
)}
{upcoming && upcoming.length > 0 && (
<Section title="Upcoming Movies">
{upcoming.map(movie => (
<Poster />
))}
</Section>
)}
{popular && popular.length > 0 && (
<Section title="Popular Movies">
{popular.map(movie => (
<Poster />
))}
</Section>
)}
{error && <Message color="#e74c3c" text={error} />}
</Container>
);
HomePresenter.propTypes = {
nowPlaying: PropTypes.array,
popular: PropTypes.array,
upcoming: PropTypes.array,
loading: PropTypes.bool.isRequired,
error: PropTypes.string
};
export default HomePresenter;