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

[1단계 - 나만의 유튜브 강의실] 심바(임선빈) 미션 제출합니다. #6

Merged
merged 57 commits into from
Mar 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
0faa8c6
chore: eslint, prettier, cypress 세팅
zigsong Mar 2, 2021
81bffc1
docs: todo 작성
zigsong Mar 2, 2021
66d31bb
chore: cypress 세팅
zigsong Mar 3, 2021
ef30ca7
test: 클릭한 탭의 색 변경 테스트 작성
zigsong Mar 3, 2021
fdb1c47
feat: dom 조작 라이브러리, View 기본 클래스 작성
zigsong Mar 3, 2021
e982074
feat: dom 조작 라이브러리, View 기본 클래스 작성
0imbean0 Mar 3, 2021
b648495
refactor: dom 라이브러리, View 클래스 수정
zigsong Mar 3, 2021
0efc462
feat: 네비게이션 탭 이동 시 버튼 색상 변경 기능 구현
zigsong Mar 3, 2021
d707c4c
test: 동영상 검색 버튼 클릭 시 검색 모달 창 열리는 테스트 작성
zigsong Mar 3, 2021
e28318d
feat: 동영상 검색 버튼을 누르면 검색 모달 창이 열림
zigsong Mar 3, 2021
9eab8f9
test: 검색 모달 창의 x 버튼 클릭 시 모달이 닫히고, 볼 영상 목록으로 돌아가는 테스트 작성
zigsong Mar 3, 2021
f19e114
feat: 검색 모달 창의 x 버튼을 누르면 모달 창이 닫히고, 볼 영상 목록으로 돌아가는 기능 작성
zigsong Mar 3, 2021
a36970d
chore: api key 저장
zigsong Mar 3, 2021
ae2d683
test: 현재 검색한 검색어가 최근 검색어 목록에 남는 테스트 작성
zigsong Mar 3, 2021
53683c2
feat: 검색 시 최근 검색어 3개가 남는 기능 구현
zigsong Mar 3, 2021
dccdcb2
feat: 검색 시 api 결과를 받아서 Video 인스턴스를 생성하는 기능 구현
zigsong Mar 3, 2021
135f789
Merge branch 'zig-step1' of https://github.com/zigsong/javascript-you…
0imbean0 Mar 3, 2021
dde6521
feat: 검색 실행 시 검색 결과를 10개씩 가져와서 보여주는 기능 구현
zigsong Mar 4, 2021
74e68ed
test: 검색 결과를 가져오는 동안 skeleton UI를 보여주는 테스트 작성
zigsong Mar 4, 2021
2932810
feat: 검색 결과를 가져오는 동안 skeleton UI를 보여주는 기능 구현
zigsong Mar 4, 2021
37fade0
test: 검색 결과가 없는 경우 결과 없음 이미지를 보여주는 테스트 작성
zigsong Mar 4, 2021
ae86a9a
feat: 검색 결과가 없는 경우 결과 없음 이미지를 보여주는 기능 구현
zigsong Mar 4, 2021
c3d292a
test: 검색 후 스크롤을 내리면 검색 결과를 10개씩 더 보여주는 테스트 작성
zigsong Mar 4, 2021
d7221b3
feat: 검색 후 스크롤을 내릴 경우 검색 결과를 10개씩 더 가져오는 기능 구현
zigsong Mar 4, 2021
5f773b5
feat: 모달 창을 열면 가장 마지막에 검색한 검색 결과 동영상들을 보여주는 기능 구현
zigsong Mar 4, 2021
3222470
refactor: Video 모델 필드 프라이빗, 날짜 출력 형식 변경
zigsong Mar 4, 2021
acaedc1
style: 모달 검색 클립 저장 버튼 추가
zigsong Mar 4, 2021
b10b227
feat: 검색 결과 동영상 저장 기능 구현
zigsong Mar 4, 2021
1ca3fb4
refactor: 네비게이션 탭 custom dom library event로 변경
zigsong Mar 4, 2021
10a0367
feat: 저장한 동영상들을 볼 영상 목록에 추가하는 기능 구현
zigsong Mar 4, 2021
87dc833
test: 검색 결과 동영상을 저장하면 동영상을 볼 영상 목록에 추가하는 테스트 작성
zigsong Mar 4, 2021
f28e78a
feat: 동영상 저장 시 해당 동영상의 저장 버튼 비활성화, 저장 개수 업데이트 기능 구현
zigsong Mar 4, 2021
2ea95b8
fix: 모달 스크롤 시 최근 검색어를 유지하고, 모달을 닫을 때 검색 내역 삭제하도록 수정
zigsong Mar 4, 2021
7e8d6cb
fix: 검색어를 입력하지 않을 시 경고창 띄우도록 수정
zigsong Mar 4, 2021
1115673
feat: 최근 검색어 클릭 시 해당 검색어로 검색하는 기능 구현
zigsong Mar 5, 2021
f1d3b39
fix: 모달 스크롤 시에만 nextPageToken 값을 유지하도록 수정
zigsong Mar 5, 2021
b9bd592
Merge branch 'zig-step1' of https://github.com/zigsong/javascript-you…
0imbean0 Mar 5, 2021
c11d143
test: 최근 검색어를 누르면 해당 검색어로 검색을 실행한 결과를 보여주는 테스트 작성
zigsong Mar 5, 2021
1e45399
fix: 검색 후 모달 결과 창의 스크롤를 최상단으로 이동
zigsong Mar 5, 2021
bcda19d
Merge branch 'zig-step1' of https://github.com/zigsong/javascript-you…
0imbean0 Mar 5, 2021
bb430b3
refator: 테스트 코드에서 중복되는 부분 함수로 분리
0imbean0 Mar 6, 2021
cfbfcd5
style:
0imbean0 Mar 6, 2021
894cd2a
style: buttom type에서 submit 제거
0imbean0 Mar 6, 2021
093ea91
refactor: Nav Tab에서 버튼 별로 기능 분리
0imbean0 Mar 6, 2021
5a06db9
refactor: api URL 생성 함수 분리
0imbean0 Mar 6, 2021
f215adb
stlye: 태그 속성 추가
0imbean0 Mar 6, 2021
4bfcca6
refactor:
0imbean0 Mar 6, 2021
8ace288
chore: vscode 세팅 gitignore 추가
0imbean0 Mar 6, 2021
538665f
chore: vscode 세팅 gitignore 추가+
0imbean0 Mar 6, 2021
5013d3f
Merge branch 'step1' of https://github.com/0imbean0/javascript-youtub…
0imbean0 Mar 6, 2021
0a8ba50
chore: vscode 세팅 gitignore 추가
0imbean0 Mar 6, 2021
e76ae5f
refactor: URL 제작 방식 URLSearchParams로 수정
zigsong Mar 6, 2021
a782720
refactor:
zigsong Mar 7, 2021
a277378
refactor: callback을 async-await로 변경
zigsong Mar 7, 2021
1bb45bf
refactor:
zigsong Mar 8, 2021
481ff4f
refactor: localStorage array 저장 방식 변경
zigsong Mar 8, 2021
a0c28ad
Merge branch 'zig-step1' of https://github.com/zigsong/javascript-you…
0imbean0 Mar 8, 2021
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
21 changes: 21 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"env": {
"browser": true
},
"extends": ["airbnb-base", "plugin:prettier/recommended"],
"plugins": ["prettier"],
"parserOptions": {
"sourceType": "module"
},
"ignorePatterns": ["cypress/"],
"rules": {
"no-new": "off",
"no-alert": "off",
"no-param-reassign": "off",
"no-return-assign": "off",
"import/extensions": "off",
"import/prefer-default-export": "off",
"max-depth": ["error", 1],
"max-lines-per-function": ["error", 15]
}
}
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,12 @@ dist

# TernJS port file
.tern-port
youtubeAPI.js

# Cypress
cypress/fixtures/
cypress/plugins/
cypress/support/

# Vscode
.vscode/
10 changes: 10 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"semi": true,
"useTabs": false,
"tabWidth": 2,
"printWidth": 80,
"singleQuote": true,
"arrowParens": "always",
"trailingComma": "all",
"endOfLine": "auto"
}
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,38 @@
- [ ] 검색 모달에 다시 접근했을 때 가장 마지막에 검색한 키워드로 검색한 결과를 보여준다.
- [ ] 최근 검색 키워드를 3개까지 화면상에 검색창 하단에 보여준다.

### ✅ TODO(FEAT) - step1

- [x] eslint, prettier, cypress 환경설정
- [x] TODO 작성
- [x] 클릭한 탭의 색을 하이라이트한다.
- [x] `동영상 검색` 버튼을 누르면 검색 모달 창이 열린다.
- [x] 검색 모달 창의 x 버튼을 누르면 검색 모달 창이 닫히고, 볼 영상 목록으로 돌아간다.
- [x] 최근 검색어에 목록에 최근 검색한 검색어가 3개 뜬다.
- [x] 가장 마지막에 검색한 검색 결과 동영상들을 보여준다.
- [x] 검색어를 입력 받을 수 있다.
- [x] 검색을 실행하면 youtube api를 통해 사용자가 입력한 검색어로 검색 결과를 가져온다.
- [x] youtube api에서 결과를 가져오는 동안 skeleton card UI로 로딩 화면을 보여준다.
- [x] youtube api를 통해 가져온 검색 결과를 10개씩 보여준다.
- [x] 검색 후 스크롤을 끝까지 이동시킬 경우 api 추가 요청을 통해 검색 결과를 10개씩 더 보여준다.
- [x] 검색 결과가 없는 경우 결과 없음 이미지를 보여준다.
- [x] 검색 결과 동영상의 저장 버튼을 누르면 Web Storage에 저장한다.
- [x] 저장한 동영상들을 `볼 영상` 목록에 추가한다.
- [x] 이미 저장된 동영상의 경우 저장 버튼을 비활성화한다.
- [x] 저장한 동영상의 개수를 업데이트한다.

### 👾 TODO(TEST) - step1

- [x] 클릭한 탭의 색을 하이라이트한다.
- [x] `동영상 검색` 버튼을 누르면 검색 모달 창이 열린다.
- [x] 검색 모달 창의 x 버튼을 누르면 검색 모달 창이 닫히고, 볼 영상 목록으로 돌아간다.
- [x] 현재 검색한 검색어가 최근 검색어 목록에 남는다.
- [x] youtube api에서 결과를 가져오는 동안 skeleton card UI로 로딩 화면을 보여준다.
- [x] 검색 결과가 없는 경우 결과 없음 이미지를 보여준다.
- [x] 검색 후 스크롤을 끝까지 이동시킬 경우 api 추가 요청을 통해 검색 결과를 10개씩 더 보여준다.
- [x] 검색 결과 동영상의 저장 버튼을 누르면 저장한 동영상들을 `볼 영상` 목록에 보여준다.
- [x] 최근 검색어를 누르면 해당 검색어로 검색을 실행한 결과를 보여준다.

### 🎯🎯 step2 강의실 관리 기능

- [ ] 가장 처음에는 저장된 영상이 없음으로, 비어있다는 것을 사용자에게 알려주는 상태를 보여준다.
Expand Down
1 change: 1 addition & 0 deletions cypress.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
115 changes: 115 additions & 0 deletions cypress/integration/myYouTube.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
describe('simba-tube', () => {
beforeEach(() => {
cy.visit('http://localhost:5500/');
cy.window().then((win) => cy.stub(win, 'alert').as('windowAlert'));
});

const searchVideo = (keyword) => {
cy.get('#search-btn').click();
cy.get('#modal-search-input').type(keyword);
cy.get('#modal-search-button').click();
};

const interceptSearch = (keyword) => {
cy.intercept({
url: 'https://www.googleapis.com/youtube/v3/search',
query: { q: keyword },
}).as('search');
};

it('클릭한 탭의 색을 하이라이트한다.', () => {
cy.get('#nav-bar > button').each((button) => {
cy.wrap(button).click();
cy.wrap(button).should(
'have.css',
'background-color',
'rgb(179, 234, 242)',
);
});
});

it('동영상 검색 버튼을 클릭하면 모달 창이 열린다.', () => {
cy.get('#search-btn').click();
cy.get('.modal').should('be.visible');
});

it('검색 모달 창의 x 버튼을 누르면 검색 모달 창이 닫히고, 볼 영상 목록으로 돌아간다.', () => {
cy.get('#search-btn').click();
cy.get('.modal-close').click();
cy.get('.modal').should('not.be.visible');
cy.get('#saved-btn').should(
'have.css',
'background-color',
'rgb(179, 234, 242)',
);
});

it('현재 검색한 검색어가 최근 검색어 목록에 남는다.', () => {
const keyword = '불닭';

searchVideo(keyword);
cy.get('.chip').eq(0).should('have.text', keyword);
});

it('youtube api에서 결과를 가져오는 동안 skeleton card UI로 로딩 화면을 보여준다.', () => {
searchVideo('불닭');
cy.get('.skeleton').should('be.visible');
});

it('검색 결과가 없는 경우 결과 없음 이미지를 보여준다. ', () => {
const keyword = 'sadffsdasdb';

interceptSearch(keyword);
searchVideo(keyword);

cy.wait('@search');
cy.get('.not-found').should('be.visible');
});

it('검색 후 스크롤를 끝까지 이동시킬 경우 api 추가 요청을 통해 검색 결과를 10개씩 더 보여준다.', () => {
const keyword = 'bts';

interceptSearch(keyword);
searchVideo(keyword);

cy.wait('@search');
cy.get('#modal-videos').scrollTo('bottom');
cy.wait('@search');
cy.get('#modal-videos').find('.clip').should('have.length', 20);
});

it('검색 결과 동영상의 저장 버튼을 누르면 저장한 동영상들을 볼 영상 목록에 보여준다.', () => {
const keyword = 'bts';

interceptSearch(keyword);
searchVideo(keyword);

cy.wait('@search');
cy.get('.clip-save-btn').eq(0).click();

cy.get('#saved-video-count').should('have.text', 1);
cy.get('#main-videos').find('.clip').should('have.length', 1);
});

it('최근 검색어 클릭 시 해당 검색어로 검색을 한다.', () => {
searchVideo('bts');

cy.get('#modal-search-input').clear().type('day6');
cy.get('#modal-search-button').click();

cy.get('#chip-1').should('have.text', 'day6');

cy.intercept({
url: 'https://www.googleapis.com/youtube/v3/search',
}).as('search');

cy.get('#chip-2').click();

cy.wait('@search').should(({ request }) => {
expect(request.url).to.include('q=bts');
});

cy.get('#modal-search-input').should('have.value', 'bts');
cy.get('#chip-1').should('have.text', 'bts');
});
});
103 changes: 24 additions & 79 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,50 +12,20 @@
<div class="w-100">
<header class="my-4">
<h2 class="text-center font-bold">👩🏻‍💻 나만의 유튜브 강의실 👨🏻‍💻</h2>
<nav class="d-flex justify-center">
<button class="btn bg-cyan-100 mx-1">👁️ 볼 영상</button>
<button class="btn mx-1">✅ 본 영상</button>
<button id="search-button" class="btn mx-1">
<nav id="nav-bar" class="d-flex justify-center">
<button id="saved-btn" class="nav-btn btn bg-cyan-100 mx-1">
👁️ 볼 영상
</button>
<button id="watched-btn" class="nav-btn btn mx-1">
✅ 본 영상
</button>
<button id="search-btn" class="nav-btn btn mx-1">
🔍 동영상 검색
</button>
</nav>
</header>
<main class="mt-10">
<section class="video-wrapper">
<article class="clip">
<div class="preview-container">
<iframe
width="100%"
height="118"
src="https://www.youtube.com/embed/Ngj3498Tm_0"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
<div class="content-container pt-2 px-1">
<h3>아두이노 무드등</h3>
<div>
<a
href="https://www.youtube.com/channel/UC-mOekGSesms0agFntnQang"
target="_blank"
class="channel-name mt-1"
>
메이커준
</a>
<div class="meta">
<p>2021년 3월 2일</p>
</div>
<div>
<span class="opacity-hover">✅</span>
<span class="opacity-hover">👍</span>
<span class="opacity-hover">💬</span>
<span class="opacity-hover">🗑️</span>
</div>
</div>
</div>
</article>
</section>
<section id="main-videos" class="video-wrapper"></section>
</main>
</div>
</div>
Expand All @@ -69,52 +39,27 @@ <h3>아두이노 무드등</h3>
<header>
<h2 class="text-center">🔎 유튜브 검색</h2>
</header>
<form class="d-flex">
<input type="text" class="w-100 mr-2 pl-2" placeholder="검색" />
<button type="button" class="btn bg-cyan-500">검색</button>
<form id="modal-search-form" class="d-flex">
<input
id="modal-search-input"
type="text"
name="search"
class="w-100 mr-2 pl-2"
placeholder="검색"
/>
<button id="modal-search-button" class="btn bg-cyan-500">
검색
</button>
</form>
<section class="mt-2">
<section class="mt-2 d-flex items-center">
<span class="text-gray-700">최근 검색어: </span>
<a class="chip">메이커준</a>
<a class="chip">우아한테크코스</a>
<a class="chip">우아한형제들</a>
<div id="chip-container" class="ml-2"></div>
</section>
<section>
<div class="d-flex justify-end text-gray-700">
저장된 영상 갯수: 50개
저장된 영상 개수: <span id="saved-video-count"></span>개
</div>
<section class="video-wrapper">
<article class="clip">
<div class="preview-container">
<iframe
width="100%"
height="118"
src="https://www.youtube.com/embed/Ngj3498Tm_0"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
<div class="content-container pt-2 px-1">
<h3>아두이노 무드등</h3>
<div>
<a
href="https://www.youtube.com/channel/UC-mOekGSesms0agFntnQang"
target="_blank"
class="channel-name mt-1"
>
메이커준
</a>
<div class="meta">
<p>2021년 3월 2일</p>
</div>
<div class="d-flex justify-end">
<button class="btn">⬇️ 저장</button>
</div>
</div>
</div>
</article>
</section>
<section id="modal-videos" class="video-wrapper"></section>
</section>
</div>
</div>
Expand Down
18 changes: 18 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "javascript-youtube-classroom",
"version": "1.0.0",
"main": "index.js",
"repository": "https://github.com/zigsong/javascript-youtube-classroom.git",
"author": "zigsong <wldms5764@gmail.com>",
"license": "MIT",
"devDependencies": {
"cypress": "^6.6.0",
"eslint": "^7.21.0",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-prettier": "^3.3.1",
"prettier": "^2.2.1"
},
"dependencies": {
"eslint-config-airbnb-base": "^14.2.1"
}
}
4 changes: 4 additions & 0 deletions src/css/shared/modules/layout.css
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
display: inline-block;
}

.d-none {
display: none;
}

/* Layout - Top / Right / Bottom / Left */
.mt-2 {
margin-top: 8px;
Expand Down
1 change: 1 addition & 0 deletions src/css/ui/index.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
@import 'modules/modal.css';
@import 'modules/chip.css';
@import 'modules/skeleton.css';
@import 'modules/youtubeCard.css';
6 changes: 5 additions & 1 deletion src/css/ui/modules/modal.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
transition: top 0.25s ease;
width: 960px;
margin: auto;
overflow: auto;
background: #fff;
border-radius: 5px;
position: relative;
Expand All @@ -39,6 +38,11 @@
padding: 0;
}

#modal-videos {
height: 460px;
overflow: auto;
}

svg {
display: block;
}
Expand Down
Loading