Skip to content

Commit

Permalink
[milzipmoza-developers#3] feat - 책 조회 페이지 컴포넌트 기반으로 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
TheDevLuffy committed Feb 9, 2020
1 parent 2ac59d9 commit d9701bf
Show file tree
Hide file tree
Showing 9 changed files with 210 additions and 14 deletions.
23 changes: 23 additions & 0 deletions pages/books/[id].tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import * as React from "react";
import AppBarContainer from "../../src/components/organisms/containers/AppBarContainer";
import ContentContainer from "../../src/components/organisms/containers/ContentContainer";
import {Card} from "react-bootstrap";
import {useRouter} from "next/router";

const Index = () => {
const router = useRouter();
const {id} = router.query;

return (
<AppBarContainer isLoggedIn={true}>
<ContentContainer>
<Card>
<Card.Header as="h5">장서 상세 정보</Card.Header>
조회 할 책 id - {id}
</Card>
</ContentContainer>
</AppBarContainer>
);
};

export default Index;
96 changes: 82 additions & 14 deletions pages/books/index.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import * as React from "react";
import {useState} from "react";
import AppBarContainer from "../../src/components/organisms/containers/AppBarContainer";
import ContentContainer from "../../src/components/organisms/containers/ContentContainer";
import {Card, ListGroup} from "react-bootstrap";
import {Card} from "react-bootstrap";
import {ILibraryBook} from "../../src/models/interfaces";
import LibraryBookElement from "../../src/components/molecules/LibraryBookElement";
import Divider from "../../src/components/atoms/Divider";
import {useRouter} from "next/router";
import LibraryBookCardFooter from "../../src/components/organisms/LibraryBookCardFooter";
import LibraryBookCardBody from "../../src/components/organisms/LibraryBookCardBody";
import LibraryBookCardHeader from "../../src/components/molecules/LibraryBookCardHeader";

const remoteSearchBooks: ILibraryBook[] = [
{
Expand Down Expand Up @@ -56,25 +61,88 @@ const remoteSearchBooks: ILibraryBook[] = [
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 6,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 7,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 8,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 9,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 10,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
];

const Index = () => {
const router = useRouter();

const [page, setPage] = useState(1);
const [books, setooks] = useState<ILibraryBook[]>(remoteSearchBooks);

const onPageDown = () => {
if (page !== 1) {
setPage(page - 1);
}
};

const onPageUp = () => {
// TODO: 로직 수정 필요
if (books.length >= 10) {
setPage(page + 1);
}
};

const selectBookClickHandler = (id: number) => () => {
router.push(`/books/${id}`);
};
return (
<AppBarContainer isLoggedIn={true}>
<ContentContainer>
<Card>
<Card.Header as="h5">장서 목록</Card.Header>
<div style={{overflow: 'scroll'}}>
<ListGroup variant="flush" style={{height: '700px'}}>
{remoteSearchBooks.map((libraryBook: ILibraryBook, i: number) => (
<ListGroup.Item key={i} style={{height: 'fit-content'}}>
<LibraryBookElement libraryBook={libraryBook}/>
</ListGroup.Item>))}
</ListGroup>
</div>
<div>
페이지 버튼
</div>
<LibraryBookCardHeader/>
<LibraryBookCardBody books={books} onClick={selectBookClickHandler}/>
<Divider/>
<LibraryBookCardFooter page={page} onPageDown={onPageDown} onPageUp={onPageUp}/>
</Card>
</ContentContainer>
</AppBarContainer>
Expand Down
7 changes: 7 additions & 0 deletions src/components/atoms/Divider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import * as React from "react";

const Divider = () => (
<div style={{backgroundColor: '#DFDFDF', height: '1px'}}/>
);

export default Divider;
28 changes: 28 additions & 0 deletions src/components/molecules/LibraryBookCardHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {useRouter} from "next/router";
import {Button, Card} from "react-bootstrap";
import * as React from "react";

const LibraryBookCardHeader = () => {
const router = useRouter();

const enrollButtonClickHandler = () => {
router.push("/books/create");
};

return (
<Card.Header as="h5">
<div style={{display: 'flex', flexDirection: 'row'}}>
<div style={{flex: 13, display: 'flex', flexDirection: 'column', justifyContent: 'center'}}>
<div style={{width: 'fit-content'}}>
장서 목록
</div>
</div>
<div style={{flex: 1}}>
<Button variant="primary" size="sm" onClick={enrollButtonClickHandler}>새 책 등록</Button>
</div>
</div>
</Card.Header>
);
};

export default LibraryBookCardHeader;
21 changes: 21 additions & 0 deletions src/components/molecules/LibraryBookPageButtons.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import LibraryBookPageContext from "../../contexts/LibraryBookPageContext";
import {Button, ButtonGroup} from "react-bootstrap";
import * as React from "react";

const LibraryBookPageButtons = () => {
return (
<LibraryBookPageContext.Consumer>
{({page, onPageDown, onPageUp}) => (
<div style={{height: '40px', display: 'flex', flexDirection: 'row', justifyContent: 'center'}}>
<ButtonGroup aria-label="Basic example">
<Button variant="primary" onClick={onPageDown}>이전</Button>
<Button disabled>{page}</Button>
<Button variant="primary" onClick={onPageUp}>다음</Button>
</ButtonGroup>
</div>
)}
</LibraryBookPageContext.Consumer>
)
};

export default LibraryBookPageButtons;
20 changes: 20 additions & 0 deletions src/components/organisms/LibraryBookCardBody.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {ListGroup} from "react-bootstrap";
import {ILibraryBook} from "../../models/interfaces";
import LibraryBookElement from "../molecules/LibraryBookElement";
import * as React from "react";
import "./mouseover.css";

const LibraryBookCardBody = ({books, onClick}) => (
<div style={{overflow: 'scroll'}}>
<ListGroup variant="flush" style={{height: '700px'}}>
{books.map((libraryBook: ILibraryBook, i: number) => (
<ListGroup.Item className="library-book-item"
key={i} style={{height: '150px', cursor: 'pointer'}}
onClick={onClick(libraryBook.id)}>
<LibraryBookElement libraryBook={libraryBook}/>
</ListGroup.Item>))}
</ListGroup>
</div>
);

export default LibraryBookCardBody;
12 changes: 12 additions & 0 deletions src/components/organisms/LibraryBookCardFooter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import LibraryBookPageContext from "../../contexts/LibraryBookPageContext";
import LibraryBookPageButtons from "../molecules/LibraryBookPageButtons";
import * as React from "react";


const LibraryBookCardFooter = ({page, onPageDown, onPageUp}) => (
<LibraryBookPageContext.Provider value={{page, onPageDown, onPageUp}}>
<LibraryBookPageButtons/>
</LibraryBookPageContext.Provider>
);

export default LibraryBookCardFooter;
4 changes: 4 additions & 0 deletions src/components/organisms/mouseover.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.library-book-item:hover {
box-shadow: 4px 3px 10px 0 rgba(0, 0, 0, 0.5);
z-index: 10000;
}
13 changes: 13 additions & 0 deletions src/contexts/LibraryBookPageContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import * as React from "react";

const LibraryBookPageContext = React.createContext({
page: 1,
onPageDown: () => {

},
onPageUp: () => {

},
});

export default LibraryBookPageContext;

0 comments on commit d9701bf

Please sign in to comment.