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 2] 우디(류정우) 미션 제출합니다. #167

Merged
merged 61 commits into from
Jun 11, 2023
Merged
Show file tree
Hide file tree
Changes from 45 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
6ba1736
chore: 스타일을 다른 파일로 분리하기 위해 폴더 구조 변경
jw-r May 27, 2023
4f5b0e4
style: Header 스타일 변경
jw-r May 28, 2023
c247984
style: Product List 모바일 대응
jw-r May 28, 2023
a512419
style: Skeleton 모바일 대응
jw-r May 28, 2023
9fae525
style: Cart Page 모바일 대웅
jw-r May 28, 2023
1ff7066
style: 모바일 대응 수정
jw-r May 28, 2023
6250dc8
style 카트 추가 아이콘 및 상대 위치 지정
jw-r May 28, 2023
5bc4125
refactor: mutation을 각 컴포넌트에서 호출하도록 변경
jw-r May 30, 2023
39f6ff1
feat: checkbox를 update하는 로직을 hook으로 분리
jw-r May 30, 2023
6a307f5
feat: 주문 목록 마크업 작성
jw-r May 30, 2023
a72c858
feat: Header에 주문 목록 링크 추가 및 추문 목록 페이지를 작은 컴포넌트로 분리
jw-r May 31, 2023
d5fca04
feat: msw가 실행중이라면 baseUrl을 빈 문자열로 설정하도록 변경
jw-r May 31, 2023
7f25a16
refactor: POST 대한 response data를 Location에서 뽑아 사용하는 것이 아닌 json 데이터로 전…
jw-r May 31, 2023
03f2cd8
msw: 명세에 따른 msw 구현
jw-r May 31, 2023
00e22a2
refactor: 카드 페이지와 관련된 컴포넌트를 CartPage 폴더 내부로 이동
jw-r May 31, 2023
4e6dae3
refactor: pageTitle을 Layout 컴포넌트에서 조건부로 렌더링하도록 변경
jw-r May 31, 2023
b15d6f9
refactor: 절대 경로 설정
jw-r May 31, 2023
41f3a6f
feat: 주문 요청 및 주문 정보 그리기
jw-r Jun 1, 2023
236e695
feat: Suspense를 사용하기 위해 Prommise를 throw하는 hook 구현 및 적용
jw-r Jun 1, 2023
4f3736a
feat: API Response 데이터 타입 지정
jw-r Jun 1, 2023
43810e5
refactor: ProductList에 Suspense 적용 및 Skeleton 분리
jw-r Jun 1, 2023
21487db
refactor: undefined가 되지 않는 객체의 옵셔널 체이닝 제거
jw-r Jun 1, 2023
b07c0c0
refactor: 장바구니 정보를 가져오는 데이터를 recoil의 selector로 받아오도록 변경
jw-r Jun 2, 2023
79db81f
refactor: 상품 목록을 fetch하는 비동기 요청을 selector에서 하도록 변경
jw-r Jun 3, 2023
f14d127
feat: orderPolicy와 usablePoint를 fetch하는 selector 구현
jw-r Jun 3, 2023
8ca653c
feat: 구매 목록과 구매 상세 정보를 fetch하는 selector 구현 및 적용
jw-r Jun 3, 2023
11150bf
refactor: 장바구니에 상품을 추가하는 비동기 로직을 recoil의 selector를 사용해서 구현
jw-r Jun 3, 2023
2629bd4
feat: size 프로퍼티 추가
jw-r Jun 3, 2023
5c29853
feat: 장바구니에 상태와 업데이트 로직을 selector를 사용해서 추상화
jw-r Jun 3, 2023
98f79c4
feat: 상품을 구매하는 비동기 처리를 recoil내에서 하도록 변경
jw-r Jun 3, 2023
e6f0152
refactor: App과 router 분리, react-error-boundary 설치
jw-r Jun 4, 2023
081a957
feat: ErrorBoundary적용 및 FallbackRender 구현
jw-r Jun 4, 2023
5780025
refactor: 주문 날짜를 표시하도록 변경
jw-r Jun 4, 2023
cdb3429
refactor: 주문 완료 시, 장바구니 정보를 fetch하도록 변경
jw-r Jun 4, 2023
3001ed5
fix: 포인트를 fetch하는 비동기 로직을 가진 selector의 키 값이 다른 키와 중복되는 문제 해결
jw-r Jun 4, 2023
75321b3
feat: 입력받은 point에 대한 유효성 검사
jw-r Jun 4, 2023
8212ccb
refactor: 포인트에 대한 처리를 hook으로 분리
jw-r Jun 4, 2023
aa01fa3
refactor: cart의 상태를 변경하는 로직을 cartRepository selector 내부에 추상화
jw-r Jun 4, 2023
878e320
feat: OrderSummary 컴포넌트의 스켈레톤 구현 및 Suspense 적용
jw-r Jun 4, 2023
509f5d3
feat: 컴포넌트가 렌더링 될 때, selector를 refrech 하는 것으로 cache 제거
jw-r Jun 5, 2023
4e78ce6
refactor: product 관련 컴포넌트를 Home 폴더 하위로 이동, API 요청 컴포넌트에 ErrorBoundary 적용
jw-r Jun 5, 2023
4b44782
feat: 구매 상세 정보 영수증 구현
jw-r Jun 5, 2023
31d693c
feat: 모바일 UI에서의 주문 버튼에 주문하기 이벤트 추가
jw-r Jun 5, 2023
4f426f5
refactor: baseApiUrl을 fetchAPI의 인자로 넘겨주도록 변경
jw-r Jun 5, 2023
9a97639
chore: 서버 옵션에 msw 주석화(오류 수정 후 배포 예정)
jw-r Jun 5, 2023
6c105e7
Update src/components/FallbackRender/FallbackRender.tsx
jw-r Jun 8, 2023
937b162
refactor: Header 내부의 img 태그를 svg로 변환 후 리액트 컴포넌트로 추상화
jw-r Jun 8, 2023
0c289b8
refactor: 불필요한 타입 제거
jw-r Jun 8, 2023
9ec5282
refactor: 함수의 반환값을 변수에 할당하지 않고 그대로 반환
jw-r Jun 8, 2023
4a530cf
refactor: 함수의 반환값을 변수에 할당하지 않고 그대로 반환
jw-r Jun 8, 2023
f0aa7e7
refactor: 객체 타입의 모든 프로퍼티가 옵셔널일 때, Partial 적용
jw-r Jun 8, 2023
a2f3282
refactor(OrderBoxHeader): 주문 날짜의 포멧팅을 부모 컴포넌트에서 진행한 후 props로 내려받도록 변경
jw-r Jun 8, 2023
51a3675
refactor: if문을 사용하는대신, 객체를 사용해서 key값으로 url을 mapping하도록 변경
jw-r Jun 8, 2023
e8b8544
refactor: atom, selector의 key 상수화 및 any 제거
jw-r Jun 8, 2023
b1eb0ac
refactor: atom의 selector와 혼동되지 않도록 컴포넌트의 네이밍 변경
jw-r Jun 8, 2023
5794193
refactor: 모바일 대응 OrderSummary를 명확한 네이밍으로 분리
jw-r Jun 8, 2023
ae99588
refactor: body로 올 수 있는 타입을 명시화
jw-r Jun 8, 2023
c91e67f
refactor: 타입을 craco로 설정한 절대 경로로 import하도록 변경
jw-r Jun 8, 2023
a8c5135
refactor: 타입 추론이 가능한 객체에 대한 타입 애너테이션 제거
jw-r Jun 8, 2023
3688082
refactor: 변수명과 컴포넌트명이 일치하면서 생기는 헷갈림을 변수명을 보다 명확하게 표현하는 것으로 방지
jw-r Jun 8, 2023
1f201d2
refactor: async/await + then 체이닝을 혼합해서 사용하는 방식 제거
jw-r Jun 8, 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
13 changes: 13 additions & 0 deletions craco.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const CracoAlias = require('craco-alias');

module.exports = {
plugins: [
{
plugin: CracoAlias,
options: {
source: 'tsconfig',
tsConfigPath: './tsconfig.paths.json',
},
},
],
};
152 changes: 147 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
"homepage": "https://evencoding.github.io/react-shopping-cart/",
"private": true,
"dependencies": {
"@craco/craco": "^7.1.0",
"craco-alias": "^3.0.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-error-boundary": "^4.0.9",
Copy link

Choose a reason for hiding this comment

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

후덜덜.. 용감하시군요

Copy link
Author

Choose a reason for hiding this comment

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

에러 핸들링이 생소하기도 하고, 다른 부분에 시간을 많이 쏟아서.. 급하게 도입해버렸습니다😭
'안하는 것 보단 낫다!' 라고 생각해서 그만🫠

방학기간에 레벨2에서 학습한 내용을 심화적으로 학습할 수 있도록 앱을 하나 만들 계획인데, 그 때 꼭 직접 Class로 작성해서 천천히 맛보겠습니다🥺

"react-router-dom": "^6.11.1",
"react-scripts": "5.0.1",
"recoil": "^0.7.7",
Expand All @@ -15,10 +18,10 @@
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "craco eject",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build",
"predeploy": "npm run build",
Expand Down
34 changes: 6 additions & 28 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,20 @@
import { useEffect } from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';

import { useSetCartState } from './recoils/recoilCart';
import { useQuery } from './hooks/useQuery';

import GlobalStyle from './GlobalStyle';

import { useApiBaseUrlValue } from './recoils/recoilApiBaseUrl';

import { Home } from './components/pages/Home';
import { ShoppingCart } from './components/pages/ShoppingCart';

import { CartItemType } from './types';
import { FETCH_URL, PATH } from './constants';
import { useCartRepository } from '@recoils/cartAtoms';
import { Router } from './router';

export const App = () => {
const baseUrl = useApiBaseUrlValue();
const { data: cart } = useQuery<CartItemType[]>(baseUrl + FETCH_URL.CART_ITEMS, {
Authorization: `Basic ${btoa(process.env.REACT_APP_API_CREDENTIAL!)}`,
});

const setCartState = useSetCartState();
const { fetchCartItems } = useCartRepository();

useEffect(() => {
if (!cart) return;

setCartState(cart);
}, [cart, setCartState]);
fetchCartItems();
}, [fetchCartItems]);

return (
<>
<GlobalStyle />
<BrowserRouter basename={process.env.PUBLIC_URL}>
<Routes>
<Route path={PATH.HOME} Component={Home} />
<Route path={PATH.CART} Component={ShoppingCart} />
</Routes>
</BrowserRouter>
<Router />
</>
);
};
17 changes: 13 additions & 4 deletions src/GlobalStyle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@ const GlobalStyle = createGlobalStyle`
}

:root {
--primary-color: #5f0080;
--primary-color: #00B9B3;
--blue: #006DF9;

--grey-100: #ffffff;
--grey-200: #dddddd;
--grey-300: #aaaaaa;
--grey-200: #F1F3F6;
--grey-300: #E5E5E5;
--grey-400: #333333;
--grey-500: #000000;

--red: #FF5C23;
}

*, *::before, *::after {
Expand All @@ -26,6 +29,8 @@ const GlobalStyle = createGlobalStyle`

body {
font-family: 'Baemin';

color:var(--grey-400)
}

input[type="checkbox"] {
Expand Down Expand Up @@ -67,6 +72,10 @@ const GlobalStyle = createGlobalStyle`
margin:0;
}

li {
list-style: none;
}

a {
text-decoration: none;
outline: none;
Expand Down
Loading