[TIL/React] 2023/10/05

์›๋ฏผ๊ด€ยท2023๋…„ 10์›” 5์ผ

[TIL]

๋ชฉ๋ก ๋ณด๊ธฐ
119/208

๋ฐ˜์‘ํ˜• ๐ŸŸข

px(ํ”ฝ์…€)๊ณผ ๊ฐ™์€ ๊ณ ์ • ๋‹จ์œ„๋ฅผ ์“ฐ๋ฉด ์œ„์™€ ๊ฐ™์ด ์ฒ˜์ฐธํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

import React from "react";
import { useParams, useLocation, useNavigate } from "react-router-dom";
import styled from "@emotion/styled";
import { shoppingData } from "../data/ShoppingCategory_Pork";
import ComponentWrapper from "../components/common/ComponentWrapper";
import { useSelector } from "react-redux";

const ProductDetailPageBackgroundStyle = styled.div`
  background-color: #181818;
  width: 100%;
  /* height: 100vh; */
`;

const AllContentWrapper = styled.div`
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100vh;
  /* flex-grow: 1; */
  /* background-color: white; */
  @media (max-width: 900px) {
    flex-wrap: wrap;
    column-gap: 20px;
  }
`;

const ProductDetailPageImgWrapper = styled.div`
  /* height: 70%;
  width: 50%; */
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: white;
`;

const ProductImg = styled.img`
  width: 80%;
  height: 80%;
`;

const ProductDetailPageInfoWrapper = styled.div`
  /* width: 50%;
  height: 70%; */
  display: flex;
  flex-direction: column;
  background-color: blue;
`;

const ProductDetailPageInfoDataWrapper = styled.div`
  height: 30%;
`;

const InfoDataTitle = styled.p`
  font-size: 30px;
  color: white;
  font-weight: bolder;
`;

const InfoDataEtc = styled.p`
  font-size: 20px;
  color: white;
  font-weight: bolder;
`;

const OptionWrapper = styled.div`
  display: flex;
  align-items: center;
  column-gap: 20px;
  height: 20%;
  color: white;
`;

const AmountWrapper = styled.div`
  display: flex;
  align-items: center;
  column-gap: 20px;
  height: 20%;
  color: white;
`;

const ButtonWrapper = styled.div`
  width: 100%;
  background-color: orange;
  display: flex;
  height: 30%;
  justify-content: space-evenly;
  align-items: center;
`;

const ProductDetailPage = () => {
  const navigate = useNavigate();
  const { id } = useParams();
  const location = useLocation();
  const category = location?.state;
  const check = useSelector((state) => state.auth);
  console.log(check);

  const handleDirectClick = () => {
    if (check.isAuthenticated) {
      console.log("๊ฒฐ์ œํ™”๋ฉด์œผ๋กœ");
    } else {
      navigate("/login");
    }
  };

  const MapData = shoppingData[category];
  const DetailData = MapData.find((elem) => elem?.id === id);
  const ImgSrc = DetailData.image;

  console.log(location);
  console.log(DetailData);
  console.log(ImgSrc);

  return (
    <>
      <ProductDetailPageBackgroundStyle>
        {/*  */}
        <ComponentWrapper style={{ height: "100%" }}>
          <AllContentWrapper>
            {/* image area */}
            <ProductDetailPageImgWrapper>
              <ProductImg src={ImgSrc} />
            </ProductDetailPageImgWrapper>
            {/* info area */}
            <ProductDetailPageInfoWrapper>
              <ProductDetailPageInfoDataWrapper>
                <InfoDataTitle>{DetailData?.subtitle}</InfoDataTitle>
                <InfoDataEtc>
                  {DetailData?.price} ({DetailData?.weight})
                </InfoDataEtc>
                <p></p>
              </ProductDetailPageInfoDataWrapper>

              <OptionWrapper>
                <span style={{ color: "white", fontWeight: "bolder" }}>
                  ์˜ต์…˜
                </span>
                <div style={{ border: "2px solid orange" }}>
                  fdsagfagfdagfdgfda
                </div>
              </OptionWrapper>
              <AmountWrapper>
                <span style={{ color: "white", fontWeight: "bolder" }}>
                  ์ˆ˜๋Ÿ‰
                </span>
                <div style={{ border: "2px solid orange" }}>
                  fdsagfagfdagfdgfda
                </div>
              </AmountWrapper>

              <ButtonWrapper>
                <button
                  style={{
                    backgroundColor: "#7f7776",
                    color: "white",
                    width: "200px",
                    height: "60px",
                    border: "none",
                  }}
                  onClick={handleDirectClick}
                >
                  ๋ฐ”๋กœ๊ตฌ๋งค
                </button>
                <button
                  style={{
                    backgroundColor: "#c50f22",
                    color: "white",
                    width: "200px",
                    height: "60px",
                    border: "none",
                  }}
                >
                  ์žฅ๋ฐ”๊ตฌ๋‹ˆ
                </button>
              </ButtonWrapper>
            </ProductDetailPageInfoWrapper>
          </AllContentWrapper>
        </ComponentWrapper>
      </ProductDetailPageBackgroundStyle>
    </>
  );
};

export default ProductDetailPage;

์ˆ˜์ • ํ›„ ๋ชจ์Šต ๐ŸŸข

์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•œ๋ฐ, ์˜ค๋Š˜์€ ๋„์ €ํžˆ ํž˜์ด ๋‚˜์ง€ ์•Š๋Š”๋‹ค. handleDirectClick ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด, ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด login page๋กœ ์ด๋™ํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

ํšŒ๊ณ  ๐ŸŸข

1) ์ƒ๋Œ€์ ์ธ ๋‹จ์œ„๋ฅผ ์จ์•ผ ๋ด‰๋ณ€์„ ๋ฉดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค.
2) 1๋ฒˆ์€ ์‚ฌ์‹ค ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, container ๋‹จ์œ„๋กœ ์ƒ๋Œ€ ๋‹จ์œ„๋ฅผ ์จ์•ผ ํ•จ์„ ๋‹ค์‹œ๊ธˆ ๊นจ๋‹ฌ์•˜๋‹ค.
3) ๋ฌธ์ œ๋Š” 2๋ฒˆ์—์„œ ๋А๋‚€ ์ ์ด ๋งž๋Š” ๊ฒƒ์ธ์ง€ ์˜๋ฌธ์ด๋‹ค.
4) ๊ทธ๋ž˜๋„ ๋Œ€๊ฐ• ๊ตฌ์กฐ๋ฅผ ์žก์•˜์œผ๋‹ˆ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์Šฌ์Šฌ ๋งŒ๋“ค๋„๋ก ํ•˜์ž.

profile
Write a little every day, without hope, without despair โœ๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€