Skip to content
Open
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
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
49 changes: 29 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,37 @@
# 멋쟁이사자처럼 프론트엔드 스쿨 7기 - 코드리뷰 스터디
<h1> 제주코딩베이스캠프 파이널 코딩테스트 정글 시네마 </h1>

## 🛠 Branch name 컨벤션

**branch 목록을 볼 때 가독성을 위하여 컨벤션을 지정합니다.**

```
branch 이름은 '이슈 번호-본인 이름' 으로 작성합니다.
본인 이름은 카멜 케이스로 작성합니다.
카멜 케이스
- 첫 글자는 소문자
- 중간 글자는 대문자
예시) 1-byeongMin
```

## ⭐️ Pull request title 컨벤션
## 💡 프로젝트 실행 방법

```
pull request의 제목은 '이슈 이름-본인 이름' 으로 작성합니다.
예시) 구현 과제 - 로그인/회원가입 모달 - 병민
git clone https://github.com/merrybmc/jungleCinema.git
npm install
npm start
```
<br/>

## ✏ Commit 컨벤션
## 📌 배포 링크
http://junglecinema.s3-website-us-east-1.amazonaws.com/
<br />
<br />

## 📜 폴더 구조
```
Commit을 할 때 '[이슈 번호] 구현 내용' 으로 작성합니다.
예시) [#1] 로그인 모달 및 기능 구현
📄 src
├── components
│   ├── footer
│   │   ├── footer.jsx
│   │   └── footer.scss
│   ├── main
│   │   ├── main
│   │   │   ├── main.jsx
│   │   │   └── main.scss
│   │   ├── Article
│   │   │   ├── article.jsx
│   │   │   └── article.scss
├── pages
│   ├── Mainpage.jsx
│   └── Mainpage.scss
├── App.js
├── index.js
└── index.scss
```
39 changes: 39 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"name": "junglecinema",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"sass": "^1.64.1",
"web-vitals": "^2.1.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
Binary file added public/favicon.ico
Binary file not shown.
43 changes: 43 additions & 0 deletions public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.

Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.

You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.

To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
Binary file added public/logo192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/logo512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions public/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
3 changes: 3 additions & 0 deletions public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
11 changes: 11 additions & 0 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Mainpage from './pages/Mainpage';

function App() {
return (
<>
<Mainpage />
</>
);
}

export default App;
57 changes: 57 additions & 0 deletions src/components/footer/Footer.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import React from 'react';
import './Footer.scss';
import line from '../../images/footerLine.svg';
import twitterSVG from '../../images/icon-twitter.svg';
import instagramSVG from '../../images/icon-instagram.svg';
import facebookSVG from '../../images/icon-facebook.svg';

export default function Footer() {
const moveSite = (site) => {
if (site === 'blog') window.open('https://blog.naver.com/paul-lab', '_blank');
if (site === 'instagram') window.open('https://www.instagram.com/weniv_official/', '_blank');
if (site === 'facebook') window.open('https://www.facebook.com/Jejucoding', '_blank');
};

return (
<footer>
<div className='wrapperTop'>
<div className='top'>
<h2>Jungle Cinema</h2>
<div className='imgGroup'>
<img
className='footerSVG'
src={twitterSVG}
alt='twitter'
onClick={() => {
moveSite('blog');
}}
/>
<img
className='footerSVG'
src={instagramSVG}
alt='instagram'
onClick={() => {
moveSite('instagram');
}}
/>
<img
className='footerSVG'
src={facebookSVG}
alt='facebook'
onClick={() => {
moveSite('facebook');
}}
/>
</div>
</div>
</div>
<img src={line} alt='' />
<div className='wrapperBottom'>
<p className='footerInfo'>
<span>(주) 정글 시네마</span> | <span>대표</span> 라이언 | <span>사업자 번호</span> 000-0000-0000 | 광고 영화 및 비디오물 제작업 | 주소 서울특별시
</p>
<p className='footerLogo'>ⓒ The Jungle</p>
</div>
</footer>
);
}
63 changes: 63 additions & 0 deletions src/components/footer/Footer.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
footer {
width: 100%;
height: 13.3125rem;

background-color: #f2f2f2;

display: flex;
flex-direction: column;
align-items: center;
}

.wrapperTop,
.wrapperBottom {
width: 74.3125rem;
}

.wrapperBottom {
display: flex;
padding-top: 2.25rem;
}

.footerLogo {
margin-left: auto;
color: #4f4f4f;
font-family: Noto Sans KR;
font-size: 0.875rem;
font-weight: 700;
}

.top {
display: flex;
padding-top: 3.31rem;
padding-bottom: 2.63rem;
justify-content: space-between;
}

.imgGroup {
display: flex;
}

.footerInfo {
color: #4f4f4f;
font-family: Noto Sans KR;
font-size: 0.875rem;
font-weight: 400;
}

.footerInfo > span {
font-weight: 700;
}

.footerSVG:hover {
transform: scale(1.3);
}
Comment on lines +52 to +54
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍
trasition도 사용해보면 더 멋있을거 같아요


h2 {
color: #000;
font-family: Roboto;
font-size: 1.375rem;
font-style: normal;
font-weight: 700;
line-height: normal;
}
58 changes: 58 additions & 0 deletions src/components/main/Article/Article.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import React from 'react';
import './Article.scss';
import play from '../../../images/icon-play.svg';
import movieData from './data.json';

export default function Article() {
const moveSite = (site) => {
if (site !== 'none') {
window.open(site, '_blank');
} else {
alert('준비중...');
}
};

return (
<article className='cardArticle'>
{movieData?.map((data) => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

데이터가 정적으로 들어오기 때문에 데이터가 없는 경우가 고려되어 있지 않는데, 통신으로 받아오는 프로젝트는 값이 비어있을 경우가 있기 때문에 레이아웃이 깨지지 않게 설정해주시거나 데이터가 없다는 것을 알 수 있도록 구현해주시면 더 좋을 것 같아요!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning: Each child in a list should have a unique "key" prop.

Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕습니다. key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 합니다.

https://ko.legacy.reactjs.org/docs/lists-and-keys.html

return (
<section className='card'>
<div className='textGroup'>
<img className='poster' alt='poster' src={require(`${data.image}`)}></img>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

img의 alt 속성은 h3 태그로 영화의 제목 정보를 주고 있기 때문에 비워두셔도 괜찮을 것 같습니다.

<h3 className='title'>{data.title}</h3>
<ol className='info'>
<div className='subjectGroup'>
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ol,ul 직계자식은 li만 사용한다고해요!

<li>
<span className='infoPadding type'>개요</span>
<span className='content subject'>{data.summary}</span>
</li>
<li>
<span className='infoPadding type'>평점</span>
<span className='content'>{data.score}</span>
</li>
</div>
<li>
<span className='infoPadding type'>개봉</span>
<span className='content'>{data.open}</span>
</li>
<li>
<span className='infoPadding type'>출연</span>
<span className='content'>{data.character}</span>
</li>
</ol>
</div>
<div className='btnGroup'>
<button className='btnTicketing' onClick={() => moveSite(data.link)}>
예매하기
</button>
<button className='btnPreview' disabled>
<img src={play} alt='playBtn' />
예고편
</button>
</div>
</section>
);
})}
</article>
);
}
Loading