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

[장바구니 미션 Step 1] 가브리엘(윤주현) 미션 제출합니다. #161

Merged
merged 100 commits into from
May 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
7eb040e
chore: vite 초기 설정
ukkodeveloper May 9, 2023
f8425e6
docs: 기능 요구 사항 반영하여 구현 목록 작성
ukkodeveloper May 9, 2023
8b7f648
chore: github page 자동 배포 설정
ukkodeveloper May 9, 2023
3ee6544
chore: storybook 설치 및 자동배포 설정
ukkodeveloper May 9, 2023
81d5d6b
test: product item 컴포넌트 스토리북 테스트 추가
ukkodeveloper May 9, 2023
f638bd6
feat: product item 컴포넌트 뼈대 구현
ukkodeveloper May 9, 2023
43b1710
chore: styled-components 및 해당 타입 설치
ukkodeveloper May 9, 2023
32ab82f
feat: product item 컴포넌트 스타일 구현
ukkodeveloper May 9, 2023
1426fed
test: product item 컴포넌트 스타일북 케이스 추가
ukkodeveloper May 9, 2023
676f769
feat: product item type 별도로 분리
ukkodeveloper May 9, 2023
2ecbaf9
feat: CartController 컴포넌트 구현 및 적용
ukkodeveloper May 9, 2023
3609413
test: CartController 스토리 추가
ukkodeveloper May 9, 2023
f68a85a
refactor: ProductItem 스타일 높이 변경 및 배경 색상 제거
ukkodeveloper May 9, 2023
3eb14a3
refactor: 사용하지 않는 App, index 스타일 제거
ukkodeveloper May 9, 2023
f543ec3
chore: svg 이미지 파일 추가 및 타입 설정
ukkodeveloper May 10, 2023
abbd4b3
feat: global style 적용하여 기본 스타일링 reset
ukkodeveloper May 10, 2023
7a6f475
chore: svg 파일 타입 컴포넌트로 지정
ukkodeveloper May 10, 2023
f3a6249
feat: Header 컴포넌트 스타일 적용하여 구현
ukkodeveloper May 10, 2023
b9cb2fe
test: Header 컴포넌트 스토리 테스트 추가
ukkodeveloper May 10, 2023
d661179
refactor: 프로젝트 title 변경
ukkodeveloper May 10, 2023
cdee2be
feat: style theme 적용
ukkodeveloper May 10, 2023
aff4a05
test: header 컴포넌트 스토리에 providers 적용
ukkodeveloper May 10, 2023
8b0a17a
fix: globalStyle 오탈자 수정
ukkodeveloper May 10, 2023
f8f7c50
test: ProductItem 컴포넌트 스토리북에 providers 적용
ukkodeveloper May 10, 2023
68b67fe
chore: 배포 중 eslint 적용하지 않도록 설정
ukkodeveloper May 10, 2023
88a3f26
fix: 배포시 빌드 버그 수정
ukkodeveloper May 10, 2023
300362f
fix: 사용하지 않는 라이브러리 import 제거
ukkodeveloper May 10, 2023
2ab9ac5
chore: react-router-dom 설치
ukkodeveloper May 10, 2023
515d0d4
feat: react router dom을 위한 공통 레이아웃 구현 및 적용
ukkodeveloper May 10, 2023
19ae63d
fix: base url 버그 수정
ukkodeveloper May 10, 2023
e23a789
fix: storybook 테스트를 위한 router-dom providers에 추가
ukkodeveloper May 10, 2023
7a36341
chore: recoil 설치
ukkodeveloper May 10, 2023
a3313f7
feat: 상품 리스트 mock 데이터 생성
ukkodeveloper May 10, 2023
6f780cd
feat: recoil root 적용 및 providers에 추가
ukkodeveloper May 10, 2023
67a1246
feat: Home 컴포넌트 구현 및 상품 리스트를 mock api로 구현
ukkodeveloper May 10, 2023
d869ac9
feat: cart list 상태로 관리 및 장바구니 등록 버튼 클릭시 상태 변경 구현
ukkodeveloper May 10, 2023
cb1d202
feat: 장바구니 리스트 수량 조절 기능 구현
ukkodeveloper May 10, 2023
51f3c51
fix: useCart 커스텀 훅 mockAPI 통신 순서 변경
ukkodeveloper May 11, 2023
706571b
fix: CartController 컴포넌트 자체로 갖고 있던 quantity 상태 제거
ukkodeveloper May 11, 2023
7928bc0
refactor: useCart 커스텀훅 반복되는 로직 추상화
ukkodeveloper May 11, 2023
25326cc
feat: 반응형 ui 적용
ukkodeveloper May 11, 2023
f5c7a75
refactor: CartController 컴포넌트 높이 등 세부 스타일링 수정
ukkodeveloper May 11, 2023
e6c33d8
feat: mockApi 적용하여 장바구니 아이템 local storage에 등록 구현
ukkodeveloper May 11, 2023
accde08
feat: mockApi 이용하여 장바구니 업데이트 및 local storage 등록
ukkodeveloper May 11, 2023
b438257
feat: 상품 리스트 local storage 등록 및 로딩 시 불러오기 구현
ukkodeveloper May 11, 2023
eac9f8a
feat: mockApi 이용하여 장바구니 아이템 삭제 기능 구현
ukkodeveloper May 11, 2023
18db0f2
fix: 컴포넌트 수정으로 인한 storybook 수정사항 적용
ukkodeveloper May 11, 2023
772b138
refactor: 사용하지 않는 지역변수 제거
ukkodeveloper May 11, 2023
5fdf2fe
docs: 기능 요구사항 문서 최신화
gabrielyoon7 May 11, 2023
f9fe5ce
refactor: 기본 이미지를 고양이에서 다른 이미지로 변경
gabrielyoon7 May 11, 2023
ca639c3
refactor: atom 모듈화
gabrielyoon7 May 11, 2023
f4f5e2a
fix: 수량이 100개 이상 설정되는 문제 수정
gabrielyoon7 May 11, 2023
e43b6d4
docs: 기능 목록 요구사항 최신화
gabrielyoon7 May 11, 2023
d4cd216
docs: readme 작성
gabrielyoon7 May 11, 2023
af74b2a
style: 불필요한 코드 제거 및 코드 간격 조정 등
gabrielyoon7 May 11, 2023
05111c9
feat: 데이터 처리 중 오류 발생 시 콘솔에 결과가 출력되는 기능 구현
gabrielyoon7 May 11, 2023
03c5369
Update readme.md
gabrielyoon7 May 11, 2023
fd94d66
Update readme.md
gabrielyoon7 May 11, 2023
688bfb5
refactor: html lang을 en 에서 ko 로 변경
gabrielyoon7 May 14, 2023
b2d6090
refactor: 과도한 래핑 함수 제거
gabrielyoon7 May 14, 2023
f0b14ee
refactor: 가독성 개선을 위해 quantity 삼항연산자 분리
gabrielyoon7 May 14, 2023
7583730
style: jsx self-closing element 적용
gabrielyoon7 May 14, 2023
2c8d6c5
style: 불필요한 주석 제거
gabrielyoon7 May 14, 2023
b344d5e
refactor: 검색한 카트의 수량을 nullish coalescing operator으로 접근하도록 개선
gabrielyoon7 May 14, 2023
698642d
refactor: 타입 import 방식 변경
gabrielyoon7 May 14, 2023
6f21aac
refactor: import * as S from ... 표기법 제거
gabrielyoon7 May 14, 2023
603dcc8
refactor: 신규 장바구니 아이템 추가 전 검사하는 로직 개선
gabrielyoon7 May 15, 2023
7e2d02f
style: 불필요한 Fragment 제거
gabrielyoon7 May 15, 2023
c019867
refactor: addCart에서 이미 있는 장바구니 아이템이 발견되는 경우 반환되는 로직을 개선
gabrielyoon7 May 15, 2023
a4f5b22
style: 주석 스타일 개선
gabrielyoon7 May 15, 2023
09bf7f6
refactor: 장바구니 페이지 품목 임시 표시용 텍스트 스타일 변경
gabrielyoon7 May 15, 2023
ceb9ecd
chore: storyvook v6 => v5.3.10으로 다운그레이드
gabrielyoon7 May 15, 2023
65c18c8
chore: 미사용 패키지 제거
gabrielyoon7 May 15, 2023
eeed7f4
refactor: newCartItem을 타입으로 강제하도록 개선
gabrielyoon7 May 15, 2023
aa40a84
refactor: nested object 의 프로퍼티 값을 수정하기 위한 새로운 함수 구현
gabrielyoon7 May 15, 2023
a9720c5
chore: recoil-persist 설치
gabrielyoon7 May 15, 2023
913c267
refactor: mockApi 제거
gabrielyoon7 May 15, 2023
8e5bfb9
refactor: ProductList 컴포넌트 추가
gabrielyoon7 May 15, 2023
d4b2311
refactor: 불필요한 커스텀훅 제거
gabrielyoon7 May 15, 2023
3d106bc
refactor: 장바구니 갯수를 selector로 계산하도록 개선
gabrielyoon7 May 15, 2023
8f1609b
refactor: 함수명 변경
gabrielyoon7 May 15, 2023
dc49bd2
refactor: 장바구니 수량 조회 로직 개선
gabrielyoon7 May 15, 2023
a2d0865
fix: vite 환경에서의 Duplicate atom key 에러 해결
gabrielyoon7 May 15, 2023
8699234
fix: selector 버그 수정을 위해 원상 복구
gabrielyoon7 May 15, 2023
a16398a
refactor: recoil-persist 제거
gabrielyoon7 May 15, 2023
4c9a346
chore: msw 설치 및 기본 세팅
gabrielyoon7 May 16, 2023
5093da3
refactor: 상품 목록을 fetch에 연결 및 msw 모킹 구현
gabrielyoon7 May 16, 2023
d61e6df
chore: react-error-boundary 설치
gabrielyoon7 May 16, 2023
54f744a
refactor: 상품 리스트 수신 에러 핸들링
gabrielyoon7 May 16, 2023
ec92e5f
refactor: 장바구니 목록을 msw로 mocking
gabrielyoon7 May 16, 2023
e770a63
refactor: 신규 장바구니 추가 fetch 추가 및 msw mocking 구현
gabrielyoon7 May 16, 2023
c60c5a5
refactor: 삭제 fetch 구현 (msw)
gabrielyoon7 May 16, 2023
76880e2
refactor: 장바구니 아이템 수량 변경 fetch 코드 구현 및 msw mocking
gabrielyoon7 May 16, 2023
63abdf6
refactor: mockData 이미지 주소를 http => https 변경
gabrielyoon7 May 16, 2023
f241488
fix: 배포시 이미지가 뜨지 않는 문제 수정
gabrielyoon7 May 16, 2023
96d7cea
fix: 이미지 요청이 필터링 되는 문제 수정
gabrielyoon7 May 16, 2023
f891a21
refactor: api 계층 분리
gabrielyoon7 May 16, 2023
3ab454f
fix: 이미지 버그 수정
gabrielyoon7 May 16, 2023
38456f3
style: 불필요한 코드 제거
gabrielyoon7 May 16, 2023
e7c59c5
refactor: 불필요한 코드 제거
gabrielyoon7 May 16, 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
16 changes: 16 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module.exports = {
env: {
browser: true,
es2020: true
},
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': 'warn'
}
};
24 changes: 24 additions & 0 deletions .github/workflows/chromatic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Workflow name
name: 'Chromatic Deployment'

# Event for the workflow
on:
push:
branches: ['step1']

# List of jobs
jobs:
test:
# Operating System
runs-on: ubuntu-latest
# Job steps
steps:
- uses: actions/checkout@v1
- run: yarn
#👇 Adds Chromatic as a step in the workflow
- uses: chromaui/action@v1
# Options required for Chromatic's GitHub Action
with:
#👇 Chromatic projectToken, see https://storybook.js.org/tutorials/intro-to-storybook/react/ko/deploy/ to obtain it
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
51 changes: 51 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# GitHub Pages에 정적 콘텐츠를 배포하기 위한 간단한 워크플로우
name: Deploy static content to Pages

on:
# 기본 브랜치에 대한 푸시 이벤트 발생 시 실행
push:
branches: ['step1']

# Actions 탭에서 수동으로 워크플로우를 실행할 수 있도록 구성
workflow_dispatch:

# GITHUB_TOKEN의 권한을 설정하여 GitHub Pages에 배포할 수 있도록 함
permissions:
contents: read
pages: write
id-token: write

# 동시에 하나의 배포만 허용하도록 구성
concurrency:
group: 'pages'
cancel-in-progress: true

jobs:
# 단순히 배포만 수행하기에 하나의 잡으로만 구성
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'npm'
- name: Install dependencies
run: npm install
- name: Build
run: npm run build
- name: Setup Pages
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
# dist 디렉터리 업로드
path: './dist'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
17 changes: 17 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import type { StorybookConfig } from "@storybook/react-vite";
const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|ts|tsx)"],
addons: [
"@storybook/addon-links",
"@storybook/addon-essentials",
"@storybook/addon-interactions",
],
framework: {
name: "@storybook/react-vite",
options: {},
},
docs: {
autodocs: "tag",
},
};
export default config;
15 changes: 15 additions & 0 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { Preview } from "@storybook/react";

const preview: Preview = {
parameters: {
actions: { argTypesRegex: "^on[A-Z].*" },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
},
};

export default preview;
25 changes: 0 additions & 25 deletions README.md

This file was deleted.

Empty file removed REQUIREMENTS.md
Empty file.
30 changes: 30 additions & 0 deletions docs/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 기능 목록 요구사항

- Header

- [x] header의 숫자 표시를 통해 장바구니에 담긴 품목의 갯수 표시
- [x] header의 로고를 눌렀을 때 홈으로 복귀한다.

- [x] recoil을 사용하여 전역 상태 관리
- [x] Mock 데이터를 활용하여 상품 데이터를 처리한다. 협업 미션을 고려하여 장바구니 API 예상 명세 참고
- [x] 적합한 테스트 도구를 선택하여 사용하고, 중요한 테스트 케이스를 정의하여 테스트
- [x] API 요청을 처리하는 공통 함수나 커스텀 훅을 작성하여 재사용 가능하게 만든다.

- [x] 상품 목록을 조회한다.
- [x] 장바구니 아이템 목록 조회, 추가, 수량 변경, 삭제

- [x] 페이지간 공통 스타일이 있는 경우 재사용한다.

- [x] 컨테이너 좌우 간격
- [x] 색상

- [x] 서버와의 통신을 담당하는 코드와 UI를 렌더링 하는 코드를 분리하여 관심사를 분리한다.
- [x] 에러 처리 로직을 명확하게 작성하여 코드의 가독성을 높인다.
- [x] 불필요한 상태 관리를 최소화하고, 상태 업데이트를 최적화한다.
- [x] 컴포넌트의 리렌더링을 최소화하기 위해 memoization을 적용한다.

- [x] 상품 목록을 보여준다.
- [x] 상품의 장바구니 담긴 갯수를 조절할 수 있다.

- [x] 상품의 장바구니 허용 갯수는 1 ~ 100개이다.
- [x] 장바구니 아이콘을 누르면 갯수 입력창이 렌더된다. 그리고 상품 갯수는 1이 기본값이다.
16 changes: 16 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="ko">

<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React Shopping Cart</title>
</head>

<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>

</html>
Loading