-
Notifications
You must be signed in to change notification settings - Fork 35
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
[BB] 웹자판기 1주차 PR - 1 #10
[BB] 웹자판기 1주차 PR - 1 #10
Conversation
* env: 초기 환경설정 - create-react-app 이용 초기 설정 - lint 설정 - styled-compoenet설정 - react-router-dom commit e3c1259 Date: Mon May 9 12:27:15 2022 +0900 env: react-router-dom을 이용하여 Routing commit 25f4d36 Date: Mon May 9 11:55:49 2022 +0900 fix: index.html 파비콘 관련 코드 삭제 - manifest.json 삭제 - favicon.ico 삭제 commit 06a0422 Date: Mon May 9 11:53:48 2022 +0900 env: react-router-dom 설치 commit 6fefb18 Date: Mon May 9 11:42:47 2022 +0900 env: CRA로 초기 설정 - lint 설정 : airbnb base - styled-components 설치 * env: 절대경로 설정 * env: 디렉토리 구조 설정 * docs: 불필요한 md 삭제 * feat: NotFound 컴포넌트 구현 * fix: index path 수정 - path="/" 로 되어있던 Route 경로를 index로 수정 * refactor: Layout 디렉토리로 레이아웃 옮김 * design: 스타일 Reset 적용 * feat: 자판기, 지갑 컴포넌트 생성 * feat: 자판기 / 지갑 버튼 생성 * design: Reset, Normalize 적용 * fix: NavBar component 재활용 가능한 형태로 수정 * design: NavItem 스타일 적용 * feat: eslint-plugin-import 적용 - 절대경로로 jsx import시 external modules로 인식(internal로 안됨) - App.jsx에서 상대경로로 지정 * feat: 데이터 디렉토리 변경 및 상품 데이터 추가 * feat: 상품 목록 가져와 자판기 화면에 표시 * design: 상품 목록 style 적용 * feat: 금액 입력 input 추가 * fix: ProductButton style 중복 코드 삭제 * fix: productLi 아이템 간격 grid로 수정 * feat: 금액 투입 버튼 생성 * refacotor: NotFound 페이지 위치 변경 * feat: 진행사항 화면 구현 * feat: 지갑 화면 구현 * remove: 불필요한 주석 삭제
* fix: Styles 디렉토리명 변경 * refactor: Layout.jsx views로 이동 * design: 자판기 디자인에 색상 추가 * design: 자판기 금액 투입 영역 스타일 지정 * refactor: 디렉토리명 변경 -Styles to styles * refactor: 컴포넌트로 페이지 하위 컴포넌트들 이동 * refactor: 디렉토리명 pages로 변경 - view 에서 pages로 변경
* refactor: pages 내부 styled component styled.js로 분리 * refactor: components/ 내부 styled component 파일 분리 * refactor: 공통 컴포넌트 components/common/ 으로 이동 * refactor: button 요소들 theme 이용하여 스타일 지정 * refactor: 테마에 지정한 스타일들 themeprovider로 적용
- 불필요한 string 삭제
- InsertMoneyArea.jsx에서 상위 컴포넌트에서 넘겨준 값을 받지 않고 있던 것을 수정
* chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치
* fix: Nav 버튼 theme 적용하여 props로 전달 * design: theme에 fontweight, fontsize 추가 * fix: ProductItem theme적용하여 props 전달 * fix: returnButton theme 적용하여 props 전달 * fix: InsertButton theme 이용하여 props 전달 * fix: 지갑내 button에 theme 적용 및 theme fontsizes 적용 * remove: 불필요한 단위를 표준 단위로 설정하여 제거
- App.js와 menus.js에서 각각 string으로 관리되던 path를 한 군데에서 처리
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 비비, 리뷰를 맡은 어텀입니다!
프로젝트 구조도 잘 잡으신 것 같고 스타일 파일에 styled.js 라고 붙여주니까 스타일 파일인 게 드러나서 좋네요.
이번 프로젝트도 화이팅!! 💪
바로 머지할게요 :)
] | ||
}, | ||
"devDependencies": { | ||
"eslint-config-airbnb": "^19.0.4", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
eslint 적용 👍
"start": "react-scripts start", | ||
"build": "react-scripts build", | ||
"test": "react-scripts test", | ||
"eject": "react-scripts eject", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CRA로 생성한 프로젝트에서 eject를 하면 어떤 일이 일어나는지 찾아보시는 것도 재미있을 것 같아요. ㅎㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const NotFound = () => { | ||
return <div>올바른 경로를 입력하세요.</div>; | ||
}; | ||
|
||
export default NotFound; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호 잘못된 url로 접근했을 때 에러처리를 위한 컴포넌트인가요? 넘 좋습니다 👍
src/App.jsx
Outdated
<Route path="/" element={<Layout menusData={menus} />}> | ||
<Route path="/" element={<VendingMachine />} /> | ||
<Route path="/wallet" element={<Wallet />} /> | ||
</Route> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
path가 '/'
인 경우에 VendingMachine
컴포넌트를 렌더링하고 싶으셨던 것 맞을까요?
Index Routes라는 것을 활용해볼 수 있을 것 같아요! 공식문서 링크 함께 첨부해드릴게요.
https://reactrouter.com/docs/en/v6/getting-started/overview#index-routes
또한 '/wallet'
에 쓰인 / 는 생략해도 될 것 같습니당 (공식문서에 예제가 다 생략되어 표기돼있네요!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와! 저도 사용하면서 살짝 찝찝했던 부분이었어요!😂 알려주셔서 감사합니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어텀의 리뷰를 확인하기 전에 생각해보다,
mockData/menus.js
에서 아래와 같은 형식의 메뉴 데이터를 받아와서
{
id: 0,
menuName: "자판기",
path: "/",
},
네비게이션의 링크를 위 데이터의 path
로부터 연결하고 있어서,
Router에서도 위 데이터의 path
로 연결해야
menus
데이터에 변경이 있을때에 Router와 NavBar 모두에 적용될 것 같아서
const [indexPage, walletPage] = menus;
// 생략
<Route path={indexPage.path} element={<Layout menusData={menus} />}>
<Route path={indexPage.path} element={<VendingMachine />} />
<Route path={walletPage.path} element={<Wallet />} />
</Route>
이런식으로 수정해봤는데, 괜찮은 방법일까요?🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵넵 크게 어색하지는 않은 것 같아요!
다른 방법으로는, 저희 팀에서는 클라이언트 url은 별도의 파일로 분리하여 관리하고 있어요!
아래와 같이 작성해볼 수 있습니당
// constants/url.js
const URLS = {
HOME: '/',
WALLET: '/wallet',
}
export default URLS;
const Menus = ({ data }) => { | ||
return data.map((item) => <NavItem menuItem={item} key={item.id} />); | ||
}; | ||
|
||
const Navbar = ({ menusData }) => { | ||
return <Menus data={menusData} />; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 왜 레이어를 한 번 더 나누셨는지 궁금하네용 ㅎㅎ
Navbar 컴포넌트에서 바로 menusData.map~~
해도 될 것 같은데 나누신 이유가 궁금해요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
처음 이 부분을 작성할 때 살작 복잡해 보일 것을 예상해서
일단 분리해보고, 필요없으면 다시 합치자는 생각으로 분리해봤었어요!
그런데 지금 확인해보니 어텀 말씀대로 더 복잡도가 높아진 것 같아서(일단 만들고나서, 고쳐보자 하는 습관을 고쳐야 하는데.. 잘 안되네요! 자꾸 이렇게 놓치는 부분이 생기는데😭)
Navbar 컴포넌트를
{menusData.map((item) => (
<NavItem menuItem={item} key={item.id} />
))}
이렇게 변경해 보았습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
계속 고민만 하다가 아무것도 못하는 것보다는 일단 만들고 계속해서 고쳐나가는 것이 완성도도 높고 동기부여도 잘 되는 것 같아요!
잘 하고 계시니 걱정하지 않으셔도 됩니당 ㅎㅎㅎ 😄
<Link to={path}> | ||
<Button styles={navButtonStyle} data={{ name: menuName }} /> | ||
</Link> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
개인적인 의견이니 참고만 해주세요!
링크가 현재 NavItem
에 걸려있는데요,
개인적으로는 Navbar 메뉴가 자판기
, 지갑
두개밖에 없어서 공식문서의 예제처럼 그냥 Navbar
안에 같이 써주는 게 한눈에 보기 편하지 않을까 싶어요!
https://reactrouter.com/docs/en/v6/getting-started/overview#navigation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 어떻게 할까 고민이 되기도 했는데요,
mockData/menus.js
에서 읽어 들여서 nav와 라우터를 구성한다는 생각으로 (앞으로 메뉴가 추가된다면..? 이라는 가정 하에) 작성(위 코멘트포함)하여 이런 형태가 되었습니다.
확실히 <nav>
를 쉽게 파악하기에는 어텀이 말씀해주신 형태가 훨씬 더 좋다고 생각됩니다!
실제로 현재 메뉴는 2가지 밖에 없기도 하구요!
어떤 방식을 취하면 좋을지 더 고민해보도록 하겠습니다!🙌
|
||
import { productButtonStyle, ProductLi } from "./ProductItem.styled"; | ||
|
||
const ProductItem = ({ productsData }) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ProductItem
상품 하나를 가리키는 것처럼 느껴져서 Products
라고 하면 어떨지 제안드려봅니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아래남겨주신 코멘트까지 고려해서 변경해보겠습니다!👍
<ProductUl> | ||
<ProductItem productsData={productsData} /> | ||
</ProductUl> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이렇게 쓰이는 거라면 map을 여기서 사용해서 ProductItem
을 렌더링하는 게 더 적절할 것 같아요!
<ProductUl> | |
<ProductItem productsData={productsData} /> | |
</ProductUl> | |
<ProductUl> | |
{productsData.map(product => <ProductItem productData={product} />)} | |
</ProductUl> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아래와 같이 변경해 보았습니다!
const ProductItem = ({ productData }) => {
return (
<ProductLi>
<Button
data={productData}
styles={productButtonStyle}
className="product-button"
/>
<p className="product-price">{productData.price}</p>
</ProductLi>
);
};
훨씬 ProductItem
이라는 이름에 맞고 알기 쉬운 코드가 된 것 같아요!
감사합니다!🥳
안녕하세요 어텀!! 🤗 이번 주는 제대로 집중이 안되고 의욕이 떨어지는 시간을 보내고 있는 BB입니다..😭 이런 상황이라 나름 신경써서 코드를 작성하는데도 잘 하고자 하는 욕심이 저를 힘들게 하는건 아닐까 하는 생각이 들어서 |
ㅠㅠ 비비 힘든 시간을 보내고 계셨군요 |
* chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * Display Mode(dark/light) (#13) * [DOTORI] 1주차 첫번째 PR (#25) * chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * feat: useDisplay 커스텀 훅 생성 * feat: AppLayout, ToggleDisplay Component 구현 * feat: DisplayProvider 구현 displayMode를 전역 상태로 관리한다. * design: title font 변경, change outlet title 대문자로 변경 * PR1 Refactoring (#16) * refactor: components 디렉토리 구조 변경 * feat: common components - Nav 구현 * refactor: 라우터 모듈 분리 * refactor: 사용하지 않는 styled-components 제거, div->span, strong 태그 변경 * refactor: CoinContainer, VendProductContainer Component 분리 * Wallet Component - 동전 투입 기능 (#17) * feat: 금액 버튼 클릭시 해당 금액 개수 감소 렌더링 useCoin 커스텀 훅 사용 * feat: 금액 버튼 클릭시 잔고 금액 감소 렌더링 useBalance 커스텀 훅 사용 * feat: CoinProvider 생성 outlet 상위 컴포넌트에 생성하여 라우팅에 따른 상태 초기화 방지 * feat: InsertCoinProvider 구현 지갑에서 선택한 금액을 자판기에 투입된 금액으로 렌더링 * rename: components 디렉토리 구조 수정 * remove: merge로 생성된 중복 파일 제거 * rename: 컴포넌트 디렉토리명 대문자로 변경 * refactor: balance state 제거, useBalance삭제 coin state로 연산할 수 있는 balance state를 제거
* 1주차 수 PR 리뷰 반영 (#10) * Rename: Layout과 관련된 폴더 생성 및 파일 이름 변경 Related to: #9 * Design: props를 distructuring 하도록 수정 Related to: #9 * Style: ProductContainer 컴포넌트 내부의 변수명 변경 - 구체적인 이름으로 변경 Close: #9 Co-authored-by: kyle <[email protected]> * Story1 관련 기능 구현 (#15) * Refactor: Router dom과 관련된 컴포넌트 분리 * Style: 변수명 변경 * Feat: 지갑의 금액버튼을 누르면 총금액이 감소하는 기능 구현 - context API와 useReducer 사용 - Wallet 컴포넌트에서 Money 컴포넌트 파일 분리 - 총금액을 구하는 유틸함수 생성 Related to: #11 * Feat: 자판기에 지갑에서 투입된 금액을 보여주도록 추가 - mock data 추가 - insertMoney 시 insertMoneyData가 업데이트 되도록 함 Related to: #11 * Refactor: Input과 관련된 컴포넌트 분리 * Refactor: moneyContext 개선 - insertMoneyData를 누적해서 더하는 방식으로 변경 - insertMoney의 변수명을 buttonInsertMoney으로 변경 Related to: #11 * Feat: 자판기 input에서 금액 투입 구현 - OrderContainer 컴포넌트 내부에 있던 useState를 context로 이동 - 투입 버튼 클릭시 자동보정되는 기능 추가 - 지갑의 돈이 큰 단위부터 소모되도록 구현 Related to: #11 * Feat: 투입된 금액 만족시 구매 버튼 활성화 기능 구현 - 품절된 상품이거나 투입된 금액 보다 높은 가격의 상품의 구매버튼 비활성화 Related to: #12 * Style: 중복되는 부분을 변수로 할당, 주석 추가 * Style: 변수명 변경 - count -> unit Co-authored-by: kyle <[email protected]>
* chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * Display Mode(dark/light) (#13) * [DOTORI] 1주차 첫번째 PR (#25) * chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * feat: useDisplay 커스텀 훅 생성 * feat: AppLayout, ToggleDisplay Component 구현 * feat: DisplayProvider 구현 displayMode를 전역 상태로 관리한다. * design: title font 변경, change outlet title 대문자로 변경 * PR1 Refactoring (#16) * refactor: components 디렉토리 구조 변경 * feat: common components - Nav 구현 * refactor: 라우터 모듈 분리 * refactor: 사용하지 않는 styled-components 제거, div->span, strong 태그 변경 * refactor: CoinContainer, VendProductContainer Component 분리 * Wallet Component - 동전 투입 기능 (#17) * feat: 금액 버튼 클릭시 해당 금액 개수 감소 렌더링 useCoin 커스텀 훅 사용 * feat: 금액 버튼 클릭시 잔고 금액 감소 렌더링 useBalance 커스텀 훅 사용 * feat: CoinProvider 생성 outlet 상위 컴포넌트에 생성하여 라우팅에 따른 상태 초기화 방지 * feat: InsertCoinProvider 구현 지갑에서 선택한 금액을 자판기에 투입된 금액으로 렌더링 * rename: components 디렉토리 구조 수정 * remove: merge로 생성된 중복 파일 제거 * rename: 컴포넌트 디렉토리명 대문자로 변경 * refactor: balance state 제거, useBalance삭제 coin state로 연산할 수 있는 balance state를 제거 * PR2 Refactoring (#21) * refactor: setCoin 로직 변경 배열의 카피본에서 같은 값을 갖는 인덱스 요소의 객체를 변경 -> map 사용 * refactor: grid repeat 함수 적용 * refactor: Coin Component useMemo 적용, setProvider 분리 Coin Component 클릭시 금액의 변동사항이 있는 컴포넌트만 리렌더링 된다. * feat: 지갑에서 금액을 투입하면 알림 문구가 뜬다. (#23) useReducer 적용
* chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * Display Mode(dark/light) (#13) * [DOTORI] 1주차 첫번째 PR (#25) * chore: 프로젝트 초기 셋팅 (#2) * feat:VendingMachine, Wallet 라우팅 (#5) * Wallet Component - Markup (#6) * update: money data * design: Coin Component * design: Balance Component * design: Wallet Component * VendingMachine Component - Markup (#9) * update: product data * design: VendProduct Component * design: VendController Component * design: HistoryBox Component * design: VendingMachine Component * design: ChangeOutlet Component * design: InsertCoin Component * refactor: VendController Component의 하위컴포넌트 분리 * chore: update yarn.lock * Common Components 분리(1) (#10) * feat: Button Component 구현 * feat: InsertCoin, BrandLabel, Unit에 Button Component 적용 * chore: polished 라이브러리 설치 * refactor: Nav를 NavLink 적용하여 리팩토링 * chore: gh-pages 라이브러리 설치 * feat: useDisplay 커스텀 훅 생성 * feat: AppLayout, ToggleDisplay Component 구현 * feat: DisplayProvider 구현 displayMode를 전역 상태로 관리한다. * design: title font 변경, change outlet title 대문자로 변경 * PR1 Refactoring (#16) * refactor: components 디렉토리 구조 변경 * feat: common components - Nav 구현 * refactor: 라우터 모듈 분리 * refactor: 사용하지 않는 styled-components 제거, div->span, strong 태그 변경 * refactor: CoinContainer, VendProductContainer Component 분리 * Wallet Component - 동전 투입 기능 (#17) * feat: 금액 버튼 클릭시 해당 금액 개수 감소 렌더링 useCoin 커스텀 훅 사용 * feat: 금액 버튼 클릭시 잔고 금액 감소 렌더링 useBalance 커스텀 훅 사용 * feat: CoinProvider 생성 outlet 상위 컴포넌트에 생성하여 라우팅에 따른 상태 초기화 방지 * feat: InsertCoinProvider 구현 지갑에서 선택한 금액을 자판기에 투입된 금액으로 렌더링 * rename: components 디렉토리 구조 수정 * remove: merge로 생성된 중복 파일 제거 * rename: 컴포넌트 디렉토리명 대문자로 변경 * refactor: balance state 제거, useBalance삭제 coin state로 연산할 수 있는 balance state를 제거 * PR2 Refactoring (#21) * refactor: setCoin 로직 변경 배열의 카피본에서 같은 값을 갖는 인덱스 요소의 객체를 변경 -> map 사용 * refactor: grid repeat 함수 적용 * refactor: Coin Component useMemo 적용, setProvider 분리 Coin Component 클릭시 금액의 변동사항이 있는 컴포넌트만 리렌더링 된다. * feat: 지갑에서 금액을 투입하면 알림 문구가 뜬다. (#23) useReducer 적용 * 자판기 - 금액 투입, 상품 선택기능 (#25) * feat: 지갑에서 금액을 투입하면 알림 문구가 뜬다. useReducer 적용 * feat: 자판기에 투입된 금액 자동보정 기능 구현 * design: historyBox list margin, 자판기 margin-top * feat: 자판기에서 금액을 투입하면 알림 문구가 뜬다. * refactor: 투입 금액 보정 함수 수정 재귀함수로 리팩토링 * feat: 자판기 투입 최소, 최대 금액 설정 0원이면 early return, 잔고보다 큰 금액이면 잔고를 return * feat: 최대금액 입력시 지갑 잔고 관리 잔고와 동전의 개수는 0으로 초기화된다. * feat: history provider 분리로 렌더링 최적화 * feat: SelectButton 구현 inputCoin과 stocked에 따라 선택 가능한 상품에 초록불을 렌더한다. * feat: 선택 가능한 상품을 누를 때 상품명, 잔돈 알림 문구 구현 * feat: 돈을 투입하고 5초간 입력이 없으면 잔돈 자동반환 * feat: 투입금액이 추가 발생하면 타이머 초기화 디바운싱을 이용하여 타이머를 초기화한다. * rename: setTimer -> setDebounce * 자판기 - 상품 선택 기능(2) (#26) * feat: 지갑에서 금액을 투입하면 알림 문구가 뜬다. useReducer 적용 * feat: 자판기에 투입된 금액 자동보정 기능 구현 * design: historyBox list margin, 자판기 margin-top * feat: 자판기에서 금액을 투입하면 알림 문구가 뜬다. * refactor: 투입 금액 보정 함수 수정 재귀함수로 리팩토링 * feat: 자판기 투입 최소, 최대 금액 설정 0원이면 early return, 잔고보다 큰 금액이면 잔고를 return * feat: 최대금액 입력시 지갑 잔고 관리 잔고와 동전의 개수는 0으로 초기화된다. * feat: history provider 분리로 렌더링 최적화 * feat: SelectButton 구현 inputCoin과 stocked에 따라 선택 가능한 상품에 초록불을 렌더한다. * feat: 선택 가능한 상품을 누를 때 상품명, 잔돈 알림 문구 구현 * feat: 돈을 투입하고 5초간 입력이 없으면 잔돈 자동반환 * feat: 투입금액이 추가 발생하면 타이머 초기화 디바운싱을 이용하여 타이머를 초기화한다. * rename: setTimer -> setDebounce * remove: vendProductOutlet Component 삭제 * refactor: 투입 금액 보정 로직 변경 잔고가 있는 돈의 배열을 재귀로 돌면서 투입금액에 가까이 누적시킨다. * feat: 지갑과 자판기에서 금액을 투입하면 선택 시간 3초 초기화 provider에서 useEffect를 사용하여 wallet, vm 컴포넌트에서 insertCoin의 sideEffect를 감지 * refactor: 화살표 함수 컨벤션 통일 * refactor: 중복 코드를 하나의 객체로 변경 * refactor: styled component 분리
* 🍱 텅 이미지 크기 수정 * 🎨 데이터 구조 수정 * ✨ tab 기능 추가 - 일단 임시 공간만 둠 - 데이터 구조도 수정 * ✨ get vminfo api 추가 * ♻️ 컴포넌트 위치 데이터 변경 - 몇몇 이름도 같이 소소한 것 수정 * ♻️ provider 리팩토링
* Test: 불필요한 주석 삭제 * Refactor: useVMTimer 로직 VMTimerProvider로 합치기 issue #13 * Refactor: prop-types 에 object type구체화하기 issue #13 * Refactor: contexts로 폴더명 수정 issue #13 * Design: ProductArea에 버튼 클릭 막는 효과 수정 * Feat: 반환 버튼 클릭 시, 즉시 반환 기능 구현 issue #8 * Feat: 히스토리 젤 하단으로 자동 스크롤 기능 구현 closed issue #14 * Refactor: util에서 delay 함수 삭제 * Design: 지갑 layout 완성 closed issue #10 * Feat: 돈 클릭 시, 수량 감소 이벤트 구현 issue #15 * Feat: 상품 클릭 후 2초동안 재상품 선택 및 투입, 반환 막기 closed issue #16 * Refactor: FinalProvider App으로 이동 * Feat: 지갑에서 돈 선택 시, 히스토리 추가 및 반환 타이머 기능 구현 issue #13 * Fix: 남은 금액이 0원일 때 초기화 closed issue #17 * Feat: useWalletState 생성 * Feat: 금액 입력 시 지갑에 수량 감소하는 기능 구현 issue #8 * Docs: README 작성 * Docs: README 수정 오타 및 비디오 수정 * Refactor: useWalletState 삭제 walletContext로 합쳐서 사용 * Refactor: useHistory 삭제 HistoryContext로 합쳐서 사용 * Refactor: calcPaymentToBeUsed 함수 util에서 삭제 - WalletProvider로 이동 * Rename: util에서 helper로 변경 * Refactor: App에 provider 하나로 reduce * Rename: useVMState jsx 파일로 변경 * Docs: README 수정 - 디렉토리 변경 반영
안녕하세요, 어텀!🙌 BB라고 합니다!
부족한 점이 많지만 2주동안 잘 부탁드립니다😉
데모페이지 🖥️
링크🖱️
구현사항 ✔️
초기 설정
create-react-app
이용하여 초기 설정theme
적용화면구현
구현해야할 내용을 작은 단위로 나누어 개발하려고 노력하고있습니다!
작게 나눈 구현 사항을
issue
로 등록하여 개발해보려고 하고있습니다.useContext
나custom Hook
등 아직 잘 모르고, 공부가 필요한 부분이 많아서 디자인이나 화면 구현에 많은 시간을 할애하기 보다화면을 먼저 만들어 두고 학습할 시간을 좀 더 확보하기 위해서
이번 PR에는 기능 구현 부분은 포함되지 않았고 화면 구현에 집중했습니다.🤓
아직 상태관리가 제대로 이루어지는 부분은 없어서 앞으로 미션을 진행하면서 얼마나 어려움에 부딪히게 될지... 걱정도 되지만 어텀의 도움을 받아서 열심히 달려가보겠습니다!
살짝 5시를 넘겨 제출한 점 죄송합니다😥
리뷰 잘 부탁드립니다!🙌