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

[6주차] Hooking 미션 제출합니다. #13

Open
wants to merge 109 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
174e4b2
initial commit
moong23 May 10, 2023
3d6cf7a
initializing project
moong23 May 10, 2023
bb1d51a
initializing project: directory 구조 세팅 및 styledcomponent 세팅
moong23 May 10, 2023
0ac915e
feat: svg file 사용 위한 모듈과 setting 변경
moong23 May 10, 2023
17db110
feat: navbar 완료
moong23 May 10, 2023
9da0af9
refactor: removing non-using props
moong23 May 10, 2023
4b60080
Merge pull request #1 from Hooking-CEOS/feature/navbar
moong23 May 10, 2023
5f18ea1
initialize: initializing genreList structure and branch
moong23 May 10, 2023
6e21bbf
feat: scrollbar view disabled
moong23 May 10, 2023
bb9448e
feat: genreList hard coding on index.js
moong23 May 10, 2023
d9962ba
feat: genreList itself content
moong23 May 10, 2023
c45291e
chore: item added for test
moong23 May 10, 2023
bbad972
Merge pull request #2 from Hooking-CEOS/feature/genre_list
moong23 May 10, 2023
f6766ce
initialize: initializing landing_page structure and branch
moong23 May 10, 2023
60219de
feat: landing page 끗
moong23 May 10, 2023
1fcba9a
Merge pull request #3 from Hooking-CEOS/feature/landing_page
moong23 May 10, 2023
0fa8c76
feat: 헤더 추가
May 10, 2023
2919a71
feat: mainContent 컴포넌트 추가
May 10, 2023
bac6805
style: global-style, theme 추가
May 10, 2023
b4de2d4
Merge pull request #4 from Hooking-CEOS/feature/header
hyosin-Jang May 10, 2023
1975baf
feat: controlPanel 컴포넌트 추가
May 10, 2023
695c3f0
feat: index.js에 상단 컴포넌트들 추가
May 10, 2023
cac7e00
fix: z-index 쌓임 스택 어긋나는 에러 수정
May 10, 2023
b76fd37
Merge pull request #5 from Hooking-CEOS/feature/controlPanel
hyosin-Jang May 10, 2023
a9d1e02
chore: 색상 theme으로 분리
May 11, 2023
a2a306b
chore: 색상 수정
May 11, 2023
cc406ed
feat: api_connection wwith img datas
moong23 May 11, 2023
f70915a
Merge pull request #6 from Hooking-CEOS/feature/api_connection
moong23 May 11, 2023
b016110
Merge pull request #7 from Hooking-CEOS/dev
moong23 May 11, 2023
1ecbabf
fix: api https issue fixed
moong23 May 11, 2023
a05a152
Merge pull request #8 from Hooking-CEOS/fix/api_issue
moong23 May 11, 2023
cd086bb
Merge pull request #9 from Hooking-CEOS/dev
moong23 May 11, 2023
7ff8609
fix: api index page modified
moong23 May 11, 2023
97834b8
Merge pull request #10 from Hooking-CEOS/fix/api_issue
moong23 May 11, 2023
1c36ec0
refactor: img 태그 Next/Image 태그로 변경 및 css 수정
moong23 May 12, 2023
ee65dc1
Merge pull request #11 from Hooking-CEOS/refactor/image
moong23 May 12, 2023
fb9defb
refactor: panel width 수정 및 panel 자식에 flex-basis 설정
moong23 May 12, 2023
7ae08ac
WIP: scroll function adding in progress
moong23 May 12, 2023
095890d
Merge pull request #12 from Hooking-CEOS/refactor/panel
moong23 May 12, 2023
82ccab4
Merge pull request #13 from Hooking-CEOS/dev
moong23 May 12, 2023
f743fa2
feat: scroll시 위 헤더 invisible
moong23 May 12, 2023
4ba3670
Merge pull request #14 from Hooking-CEOS/feature/header_vanish
moong23 May 12, 2023
2447432
chore: play버튼 가운데정렬 / navbar 호버 해제 css
moong23 May 12, 2023
d2b4229
Merge pull request #15 from Hooking-CEOS/chore/minor_bug_fix
moong23 May 12, 2023
299ce68
Merge pull request #16 from Hooking-CEOS/dev
moong23 May 12, 2023
01f5078
refactor: index.js 반복되는 코드 정리및 minor bug fix
moong23 May 12, 2023
fb29777
Merge pull request #17 from Hooking-CEOS/chore/minor_bug_fix
moong23 May 12, 2023
b04c523
Merge pull request #18 from Hooking-CEOS/dev
moong23 May 12, 2023
34321ed
refactor: html부분 정리
moong23 May 12, 2023
8b7e85a
refactor: css정리및 중복코드 제거
moong23 May 12, 2023
4ad656e
Merge pull request #19 from Hooking-CEOS/dev
moong23 May 12, 2023
84ca1a3
feat: url rewrites를 통해 api_key 숨기기
moong23 May 12, 2023
83f1690
feat: uuid의 v1()을 통해 recoil id 중복 방지
moong23 May 12, 2023
1f3d0f1
Merge pull request #20 from Hooking-CEOS/refactor
moong23 May 12, 2023
ec3720d
Merge pull request #21 from Hooking-CEOS/dev
moong23 May 12, 2023
417e9d5
fix: opacity 적용한 timeout함수 로직 수정
moong23 May 12, 2023
a062b17
Merge pull request #22 from Hooking-CEOS/dev
moong23 May 12, 2023
c646cc9
docs: Update README.md
moong23 May 12, 2023
1b76b78
Merge pull request #23 from Hooking-CEOS/master
moong23 May 12, 2023
987b782
[chore]: 불필요한 파일 삭제
moong23 May 15, 2023
89e53cd
fix: mainContent에 type 부여해서 확장
moong23 May 15, 2023
b40ecad
Merge pull request #24 from Hooking-CEOS/fix/mainContent
moong23 May 15, 2023
3b39660
[etc]: 주석 작성
moong23 May 16, 2023
3a72d50
[refactor]: navbar에 필요없는 state제거, render 로직 수정
moong23 May 16, 2023
2cf62d2
[WIP] - Merge pull request #25 from Hooking-CEOS/fix/mainContent
moong23 May 16, 2023
2fdf249
feat: react-query 세팅
May 18, 2023
598669d
feat: searchbar 컴포넌트 추가
May 18, 2023
cde8301
feat: 키워드 검색, 검색 페이지 리스트 무한스크롤 쿼리 추가
May 18, 2023
d779bea
feat: movieCard 컴포넌트 추가
May 18, 2023
6c44ee9
feat: spacing, layout 컴포넌트 추가
May 18, 2023
39a139e
feat: 스켈레톤 추가
May 18, 2023
5dba080
feat: status에 따라 ui 분기처리
May 18, 2023
8f02b09
feat: target 위치 감지하는 useObserver훅 추가
May 18, 2023
ddc42a9
fix: 불필요한 스타일 제거
May 18, 2023
ca144c1
style: input 기본 스타일, 말줄임 스타일 추가
May 18, 2023
71c0b2c
feat: useInput 훅 추가
May 18, 2023
65a62dc
feat: constants 추가
May 18, 2023
13133dd
fix: navbar 충돌 해결
May 18, 2023
99283dd
[feat]: playButton 컴포넌트화
moong23 May 19, 2023
6d16d7e
[feat]: navigation 기능 추가
moong23 May 19, 2023
6d96ef8
[style]: style.css수정 및 사소한 style 수정
moong23 May 19, 2023
dd2345d
[feat]: mainContent 로직 수정
moong23 May 19, 2023
4773b52
[feat]: movieData 컴포넌트 추가
moong23 May 19, 2023
61eeab5
[WIP]: 주석 추가 및 TODO 정리
moong23 May 19, 2023
7f88498
[feat]: [id].js로 동적 라우팅 및 컴포넌트 렌더링
moong23 May 19, 2023
32fe444
Merge pull request #26 from Hooking-CEOS/fix/mainContent
moong23 May 19, 2023
5a24aed
fix: movie search api rewrites 추가
May 19, 2023
faa256d
fix: api url 수정
May 19, 2023
3b0646c
chore: layout head 태그 추가
May 19, 2023
1cc320f
fix: 상세페이지 detail/:id로 이동
May 19, 2023
a855ddc
feat: nav link 추가
May 19, 2023
2347ef5
chore: imgSrc constants로 분리
May 19, 2023
d87401f
[refactor]: index.js에 ISR적용 (24시간)
moong23 May 19, 2023
20f9b50
feat: ssr 적용 (진행중)
May 19, 2023
b5da87b
Merge pull request #27 from Hooking-CEOS/refactor/SSR,ISR
moong23 May 19, 2023
8c8508f
Merge branch 'feature/search' of https://github.com/Hooking-CEOS/next…
moong23 May 19, 2023
6a5b0ce
Merge pull request #28 from Hooking-CEOS/feature/search
moong23 May 19, 2023
dd63197
[WIP]: test
moong23 May 19, 2023
67525ee
Merge pull request #29 from Hooking-CEOS/test/ssr_test
moong23 May 19, 2023
7826082
fix: ssr 적용
May 19, 2023
5f494d4
fix: 같은 데이터만 불러오는 에러 수정
May 19, 2023
e18deb1
[feat]: ISR added to [id].js
moong23 May 19, 2023
cd53782
[feat]: skeleton structure added to movieData and mainContent
moong23 May 19, 2023
95281ca
Merge pull request #30 from Hooking-CEOS/feature/search
moong23 May 19, 2023
7c9c8ed
[Comment]: Added Annotations on Code
moong23 May 19, 2023
7faf032
[fix]: URL encoding via rewrites
moong23 May 19, 2023
afa1b1f
[fix]: Fixed randomizing poster logic
moong23 May 19, 2023
44e24a2
[fix]: Replacing Image on Error (404)
moong23 May 19, 2023
c3d63c8
Merge pull request #31 from Hooking-CEOS/dev
moong23 May 19, 2023
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
3 changes: 3 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
36 changes: 36 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local
.env

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
114 changes: 98 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
# 5주차 미션: Next-Netflix

## 서론

안녕하세요, 프론트 운영진 **강나연**입니다 😸

이번주부터는 새 프로젝트인 **Netflix 클론코딩**을 진행합니다. 이번 미션은 Next.js를 사용해 보며 SSR을 학습하고 Figma로 주어지는 디자인을 활용해 스타일링 하는 방법을 이해하는 것을 목표로 합니다.

또한 이번주부터는 프론트 페어와 함께하는 과제인 만큼 각 팀별로 미리 호흡을 맞춰 보는 좋은 기회가 될 것 같습니다. 모두 화이팅입니다🔥
HOOKING팀이 최고입니다.

## 미션

Expand Down Expand Up @@ -35,13 +30,100 @@

## Key Questions

- Server Side Rendering과 Client Side Rendering의 차이
- SEO란
- 전반적인 협업 과정

## 링크 및 참고자료

- [Next.js Docs](https://beta.nextjs.org/docs)
- [Next.js 13에서 변한 것들](https://velog.io/@hang_kem_0531/Next.js-13%EC%9D%B4-%EB%82%98%EC%99%80%EB%B2%84%EB%A0%B8%EB%8B%A4)
- [Git 협업 가이드](https://velog.io/@jinuku/Git-%ED%98%91%EC%97%85-%EA%B0%80%EC%9D%B4%EB%93%9C)
- [디자이너와 개발자가 협업하기 위한 피그마 기본 기능](https://chingguhl.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%ED%94%BC%EA%B7%B8%EB%A7%88-10%EA%B0%80%EC%A7%80-%EA%B8%B0%EB%8A%A5-%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88%EC%99%80-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%ED%94%BC%EA%B7%B8%EB%A7%88-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5)
### Server Side Rendering과 Client Side Rendering의 차이

- 둘의 차이는 렌더링(웹페이지를 그리는 일)을 어디에서 하느냐인데요, SSR은 서버측, CSR은 클라이언트측에서 담당합니다.

CSR

![image](https://github.com/CEOS-Developers/next-netflix-17th/assets/77270547/aa1f0abe-030c-4e14-a639-8b64f1f2da0d)

SSR

![image](https://github.com/CEOS-Developers/next-netflix-17th/assets/77270547/767d93f6-f6bf-4d3d-be31-9d0d994abdfe)

초기 로딩 속도

- CSR의 경우 서버에서 빈 body 태그를 보내고, 어플리케이션 로직은 스크립트 파일 안에 담겨 있습니다. 그래서 브라우저에서는 스크립트 파일을 다운로드 받아야하므로 초기 로딩 속도가 비교적 느립니다.
- SSR의 경우 서버에서 완성된 html 파일과 이를 조작할 수 있는 약간의 스크립트를 클라이언트한테 보내기 때문에 CSR에 비해 초기 로딩 속도가 빠릅니다.

TTV와 TVI의 공백시간

- SSR의 경우 html을 먼저 가져오기 때문에 볼 수 있지만 스크립트를 받아 오기 전에는 사용자가 클릭해도 동작하지 않습니다. 그래서 사용자가 볼 수 있는 시간과 (`TTV: time to view`) 실제로 인터렉션 가능한 시간(`TVI: time to interaction`) 사이에 공백이 길다는 단점이 있습니다.

### SEO란

![image](https://github.com/CEOS-Developers/next-netflix-17th/assets/77270547/c97e43e3-4780-4afd-b0df-d07c06c79d8e)


- SEO는 Search Engine Optimization의 약자로 검색 엔진 사이트의 검색 결과에서 웹 페이지를 상위 노출시키는 개념을 의미함.
- 검색엔진은 크게 크롤링 → 인덱싱 → 랭킹 3단계의 프로세스를 통해 검색 결과 내 가장 랭킹이 높은 페이지를 상위노출시킴.
1. 크롤링: 구글봇(웹 크롤러)가 웹 페이지 내 콘텐츠를 복사해서 모든 정보를 수집하고 수집한 정보는 검색 엔진의 DB에 저장함.
2. 인덱싱: DB에 저장된 콘텐츠를 주제별로 색인해서 데이터를 보관함. 이때 어떤 컨텐츠가 중요한지를 판별할 때 시멘틱 태그가 사용됨.
3. 랭킹: 검색어에 맞춰서 인덱싱된 콘텐츠에 순위를 부여한 다음, 랭킹 순서대로 결과 반환.

- SEO하는 8가지 방법
1. http가 아닌 https 사용: 구글은 보안 프로토콜을 더 선호함.
2. url 최적화: 서브 도메인보다 서브폴더 형식을 사용해야 함. 서브도메인 형식을 사용하면 검색엔진은 사이트가 여러 개 있다고 인식해서 도메인 점수가 분산됨.
- 서브도메인 예)image.blog.com
- 서브폴더 예)blog.com/image
3. robots.txt 정리하고 사이트 루트에 위치해둠
- robots.txt는 사이트맵 위치, 접근 가능한 파일과 그렇지 않은 파일 등의 정보를 알려주는 중요한 역할을 하는 파일임. 그래서 robots.txt를 잘 정리해두고, `www.example.com/robots.txt`처럼 사이트 루트에 위치시켜둠.
4. title 태그와 meta description 태그: 기본적으로 웹사이트를 HTML 문법에 맞게 작성해야 함. 타이틀 태그는 페이지 제목을 의미하는데 이는 검색 결과에 표시되는 내용임
5. canonical 태그 사용: 캐노니컬 태그는 head 안에 삽입하는 코드로 페이지 대표 url을 검색엔진한테 알려주는 역할로, 상위노출시키는데 중요한 역할을 함.
- ex. 애플 공식 사이트의 캐노니컬 태그
```
<link rel="canonical" href="https://www.apple.com/au/">
```
6. 이미지 alt 속성: 구글봇은 이미지를 alt에 기재된 텍스트를 통해 이해하기 때문에 어떤 이미지인지 alt에 기재해서 구글봇한테 알려줘야 함.
7. 페이지 로딩 속도: SEO를 결정하는 여러 요소 중 매우 중요한 부분 차지함. 구글은 로딩 속도가 짧은 웹사이트에 더 높은 SEO 점수를 줌.
- 로딩속도: 서버 속도와 데이터가 영향을 줌. 트래픽이 많아질수록 더 많은 메모리와 CPU 자원이 필요함. 따라서 호스팅 서버 자원이 충분한지 주기적으로 확인해야하며 자원이 부족한 경우 자원 추가해야 함. (AWS를 통해 배포를 한 경우 인스턴스를 더 구입하거나, 더 높은 용량의 서버를 구입해야함)

8. 모바일 친화성 갖추기: 구글 SEO는 모바일 중심으로 인덱스 생성함. 따라서 콘텐츠 만들 때 모바일 중점으로 만들어야 함. 모바일 친화성 여부 확인하려면 [구글의 모바일 친화성 도구](https://search.google.com/test/mobile-friendly)를 통해서 확인할 수 있음.

### 전반적인 협업 과정

- 협업 프로세스
1. 주어진 피그마를 보고 컴포넌트화 합니다. 이때 중복 사용가능한 컴포넌트의 여부를 중점으로 두고 컴포넌트화 하였습니다.
2. api연동을 제외한 정적인 데이터들로 컴포넌트별 프로세싱을 먼저 진행하였습니다.
3. 컴포넌트들을 하나의 페이지에 모아서 렌더링하며 z-index나 position과 같은 요소들을 조정합니다.
4. api를 통해 데이터를 서버에서 받아오고, 받아온 데이터를 렌더링합니다.
5. 반복되는 코드가 있는지 확인하고, 리펙토링을 통해 코드를 정리합니다.
- 진행하는 과정에서 발생한 에러나, 공유해야할 내용은 notion페이지를 통해 공유합니다.
- 컨벤션
- 코드 컨벤션 : 동일한 코드 컨벤션을 적용하여 IDE의 불필요한 formatter동작을 방지하였습니다.
- 커밋 컨벤션 : [커밋타입] : [커밋 내용]의 포맷을 사용하였습니다.
- 브랜치 컨벤션 : [브랜치타입] / [작업내용]의 포맷의 브랜치를 사용하였습니다. 전체적인 브랜치는 아래의 구조로 작업하였습니다.

---
## 컴포넌트별 특징 설명
먼저, 주어진 피그마에서 구현 범위에서의 컴포넌트를 다음과 같이 나누었습니다. (랜딩 페이지의 splash page제외)

<img src='https://github.com/CEOS-Developers/next-netflix-17th/assets/77270547/d54075ae-158d-496d-9bbc-0e87867e8ee5' width="300" height="450"/>

### Landing Page
웹사이트에 처음 접속했을 때 나올 splash page의 기능을 하는 페이지인 만큼, 페이지의 애니메이션이 렌더링되는 동안 서버에서 데이터가 받아오고 있도록 설계했습니다. 이를 위해 `Recoil`과 `CSR`을 선택하였고, 고려한 사항은 아래와 같습니다.
- 따로 라우팅을 진행하지 않고 메인 페이지에 같이 렌더링합니다.
- 메인페이지에 접속할 때 마다 나오면 안되고, 웹사이트에 처음 접속한 경우(페이지를 닫았다 열거나, 새로고침하는경우)에만 렌더링합니다.
- 렌더링을 하는 동안 영화 데이터를 받아오고, 이미지 데이터 파일도 받아옵니다.

### Header
- 메인 페이지의 최상단에 렌더링되는 컴포넌트, 로고와 탭의 버튼들은 마우스와 상호작용하도록 구현하였습니다.
- Header위에 렌더링이 감지되는 기능을 가진 `<div>`태그를 통해 페이지의 가장 위에서만 Header가 보이고, 스크롤을 내리면 Header가 보이지 않도록 구현하였습니다. (Next에서는 scrollHeight을 가지기 어렵더라고요 ㅠ)

### MainContent
- 접속시 랜덤한 이미지가 렌더링 되도록 하였습니다. (서버와 클라이언트측에서 생성한 random값이 같도록 설정)
- 10초에 한번씩 이미지가 바뀌도록 구현했습니다.
- 하단의 Control Panel과 자연스럽게 이어지도록 `Overlay`를 구현했습니다.

### GenreList
- 동그란 이미지를 보여주는 Previews 영역와 네모난 이미지를 보여주는 나머지 영역을 type값을 props로 받아 처리할 수 있도록 하나의 컴포넌트로 제작하였습니다.
- 가로로 스크롤이 가능하도록 하였고, 미관상의 이유로 스크롤바는 보이지 않게 하였습니다.

### Navbar
- 다섯개의 버튼이 자식 컴포넌트의 길이에 상관없이 각각 같은 영역을 가지도록 구현하였습니다.
- 마우스를 hover하는 경우 아이콘이 확대되고 글씨가 사라지게 구현하여 사용자 UX를 고려했습니다.
- 현재 페이지에 해당하는 Navbar의 아이콘과 글씨는 흰색으로, 나머지는 회색으로 구현하였습니다.

## 배포 페이지
[Hooking_Netflix](https://hookingnetflix.netlify.app/)
41 changes: 41 additions & 0 deletions components/MovieData/movieData.element.js
Copy link

Choose a reason for hiding this comment

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

이 파일의 코드에 대한 코멘트는 아닌데,, components폴더와 hooks폴더를 src폴더 안에 넣지 않고 밖으로 따로 빼신 이유가 있으신가요??

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import styled from "styled-components";

export const MovieDataContainer = styled.div`
width: 100%;
margin-top: 1rem;
overflow-y: scroll;
background-color: black;
color: white;
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 1rem;
gap: 1rem;
`;

export const MovieDataTitle = styled.div`
font-size: 1.5rem;
font-weight: 700;
${(props) => (props.adult ? '&:after { content: " 🔞"; }' : "")}
Copy link

Choose a reason for hiding this comment

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

디테일 대박.....👍

`;

export const MovieDataContent = styled.div`
font-size: 0.75rem;
font-weight: 400;
width: calc(100%);
`;

export const MovieDataTitleFB = styled.div`
background: #dedede;
width: 40%;
height: 1.5rem;
border-radius: 0.25rem;
`;

export const MovieDataContentFB = styled.div`
background: #dedede;
width: 100%;
height: 0.75rem;
border-radius: 0.25rem;
margin-bottom: -0.5rem;
`;
30 changes: 30 additions & 0 deletions components/MovieData/movieData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const {
MovieDataContainer,
MovieDataTitle,
MovieDataContent,
MovieDataTitleFB,
MovieDataContentFB,
} = require("./movieData.element");

// 상위 컴포넌트인 [id].js에서 호출됨
// data: 서버에서 받아온 데이터 영화 제목 / 청불 여부 / 줄거리
const MovieData = ({ data, fallback }) => {
if (fallback) {
return (
<MovieDataContainer>
<MovieDataTitleFB />
<MovieDataContentFB />
<MovieDataContentFB />
<MovieDataContentFB />
</MovieDataContainer>
);
}
return (
<MovieDataContainer>
<MovieDataTitle adult={data.adult ? 1 : 0}>{data.title}</MovieDataTitle>
<MovieDataContent>{data.overview}</MovieDataContent>
</MovieDataContainer>
);
};

export default MovieData;
85 changes: 85 additions & 0 deletions components/controlPanel/controlPanel.element.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import styled from "styled-components";
import { flexCenter, theme } from "../../src/styles/theme";

export const TopRank = styled.div`
${flexCenter}
`;
export const TopRankBox = styled.div`
${flexCenter}
flex-direction: column;

border: 2px solid ${theme.color.white};
width: 20px;
height: 20px;
color: white;
span {
font-size: 4px;
}
span:first-child {
font-size: 0.3px;
}
`;

export const PlayButton = styled.button`
${flexCenter}
border-radius: 5.6px;
width: 100%;
height: 45px;
gap: 10px;
cursor: pointer;
border: 0;

&:hover {
background-color: #e5e5e5;
transition: all 0.5s ease-in-out;
}

&:not(:hover) {
background-color: ${theme.color.gray};
transition: all 0.3s ease-in-out;
}
span {
font-weight: 600;
font-size: 20px;
}
`;

export const IconWithText = styled.div`
${flexCenter}
flex-direction: column;
gap: 0.2rem;
color: white;
cursor: pointer;
&:hover {
transform: scale(1.05);
font-weight: 600;
transition: all 0.2s ease-in-out;
}
`;

export const Panel = styled.div`
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
& > span {
flex-basis: 33.3%;
display: flex;
justify-content: center;
}
`;
export const TopRankText = styled.div`
color: white;
font-size: 13px;
font-weight: 700;
line-height: 2rem;
text-align: center;
`;

export const Wrapper = styled.div`
${flexCenter}
flex-direction: column;
gap: 11px;
padding: 10px 43px 43px 43px;
width: max(46.2vh, 24.44rem);
`;
47 changes: 47 additions & 0 deletions components/controlPanel/controlPanel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { AiOutlinePlus, AiOutlineInfoCircle } from "react-icons/ai";
import { BsFillPlayFill } from "react-icons/bs";
import {
Wrapper,
TopRank,
TopRankText,
Panel,
IconWithText,
PlayButton,
} from "./controlPanel.element";

export const CustomPlayButton = () => {
return (
<PlayButton>
<BsFillPlayFill size={27} /> <span>Play</span>
</PlayButton>
);
};

const ControlPanel = () => {
return (
<Wrapper>
<TopRank>
<TopRankText>#2 in Nigeria Today</TopRankText>
</TopRank>
<Panel>
<span>
<IconWithText>
<AiOutlinePlus size={24} />
<span>My List</span>
</IconWithText>
</span>
<span>
<CustomPlayButton />
</span>
<span>
<IconWithText>
<AiOutlineInfoCircle size={24} />
<span>Info</span>
</IconWithText>
</span>
</Panel>
</Wrapper>
);
};

export default ControlPanel;
Loading