ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Poster Component
    React 2019. 11. 21. 20:32
    • Poster.js
    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;
    
    • HomePresenter.js
    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;
    

     

    'React' 카테고리의 다른 글

    DetailPresenter.js 1  (0) 2019.11.23
    Rendering Poster Component  (0) 2019.11.21
    Children이란?  (0) 2019.11.19
    #6 Presenters  (0) 2019.11.19
    let으로 할당 제거(Destructuring assignment)  (0) 2019.11.19

    댓글

Designed by Tistory.