Skip to content

Commit 604e96d

Browse files
styling done
1 parent 6af133b commit 604e96d

File tree

12 files changed

+112
-111
lines changed

12 files changed

+112
-111
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { Book, BookDetails } from '../../logic/store/book/book.models';
2+
import { Button, ButtonType } from '../button/button';
3+
import { generatePath } from 'react-router-dom';
4+
import { AppRoute } from '../../app/app.route.const';
5+
import { useCallback } from 'react';
6+
import { navigateTo } from '../../logic/navigation';
7+
import styled from 'styled-components';
8+
import { BookField } from '../../pages/home/components/book-field/book-field';
9+
import { translate, translationKeys } from '../../logic/translations/translation.service';
10+
11+
interface BookCardProps {
12+
book: Book;
13+
bookDetails?: BookDetails;
14+
bigImage?: boolean;
15+
navigateToDetailsButton?: boolean;
16+
}
17+
18+
export const BookCard: React.FC<BookCardProps> = ({
19+
book,
20+
bigImage = false,
21+
navigateToDetailsButton = false,
22+
bookDetails,
23+
}) => {
24+
const { isbn13 } = book;
25+
26+
const bookPath = isbn13 && generatePath(AppRoute.Book, { isbn13 });
27+
28+
const handleSeeDetails = useCallback(() => bookPath && navigateTo(bookPath), [bookPath]);
29+
30+
return (
31+
<Container>
32+
<Image src={book.image} bigImage={bigImage} width={bigImage ? 300 : 150} height={bigImage ? 350 : 175} />
33+
<Description>
34+
<div>
35+
<BookField field={translate(translationKeys.common.book.title)} value={book.title} />
36+
<BookField field={translate(translationKeys.common.book.subtitle)} value={book.subtitle} />
37+
<BookField field={translate(translationKeys.common.book.isbn13)} value={book.isbn13} />
38+
<BookField field={translate(translationKeys.common.book.price)} value={book.price} />
39+
{bookDetails && (
40+
<>
41+
<BookField field={translate(translationKeys.common.book.year)} value={bookDetails.year} />
42+
<BookField field={translate(translationKeys.common.book.publisher)} value={bookDetails.publisher} />
43+
<BookField field={translate(translationKeys.common.book.rating)} value={bookDetails.rating} />
44+
<BookField field={translate(translationKeys.common.book.pages)} value={bookDetails.pages} />
45+
<BookField field={translate(translationKeys.common.book.description)} value={bookDetails.desc} />
46+
</>
47+
)}
48+
</div>
49+
{navigateToDetailsButton && <Button title="See details" type={ButtonType.Primary} onClick={handleSeeDetails} />}
50+
</Description>
51+
</Container>
52+
);
53+
};
54+
55+
const Container = styled.div`
56+
display: flex;
57+
flex-direction: row;
58+
margin-bottom: 3rem;
59+
`;
60+
61+
const Image = styled.img<{ bigImage: boolean }>`
62+
margin: -25px;
63+
margin: ${({ bigImage }) => (bigImage ? -50 : -25)}px;
64+
`;
65+
66+
const Description = styled.div`
67+
margin-left: 2rem;
68+
display: flex;
69+
flex-direction: column;
70+
justify-content: space-between;
71+
`;

src/pages/home/components/book-cards/book-cards.tsx renamed to src/components/book-cards/book-cards.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useSelector } from 'react-redux';
22
import styled from 'styled-components';
3-
import { getBookCards } from '../../../../logic/store/book/book.selector';
4-
import { translate, translationKeys } from '../../../../logic/translations/translation.service';
3+
import { getBookCards } from '../../logic/store/book/book.selector';
4+
import { translate, translationKeys } from '../../logic/translations/translation.service';
55
import { BookCard } from '../book-card/book-card';
66

77
export const BookCards: React.FC = () => {
@@ -11,7 +11,7 @@ export const BookCards: React.FC = () => {
1111
<>
1212
<Title>{translate(translationKeys.common.searchForm.title)}</Title>
1313
{bookCards?.map((bookCard, index) => (
14-
<BookCard key={index} book={bookCard} />
14+
<BookCard key={index} book={bookCard} navigateToDetailsButton />
1515
))}
1616
</>
1717
);

src/logic/store/book/book.epic.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ const fetchBooks$: RootEpic = (action$) =>
1616
map((result) => bookSlice.actions.setBooks({ books: result.books }))
1717
);
1818

19-
const fetchNote$: RootEpic = (action$) =>
19+
const fetchBook$: RootEpic = (action$) =>
2020
action$.pipe(
2121
filter(bookSlice.actions.fetchBook.match),
2222
map(action => action.payload.isbn13),
2323
managed(switchMap((isbn13) => from(bookApi.fetchBook(isbn13)))),
24-
map((book) => bookSlice.actions.setBook({ book }))
24+
map((bookDetails) => bookSlice.actions.setBook({ bookDetails }))
2525
);
2626

27-
export const bookEpic$ = combineEpics(fetchBooks$, fetchNote$);
27+
export const bookEpic$ = combineEpics(fetchBooks$, fetchBook$);

src/logic/store/book/book.slice.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
2-
import { Book } from './book.models';
2+
import { Book, BookDetails } from './book.models';
33
import { ObjectByKey } from '../../object';
44

55
export interface BookState {
66
books?: Book[];
7-
bookById?: ObjectByKey<Book>;
7+
bookById?: ObjectByKey<BookDetails>;
88
}
99

1010
const initialState: BookState = {};
@@ -18,11 +18,11 @@ export const bookSlice = createSlice({
1818
setBooks: (state, action: PayloadAction<{ books: Book[] }>) => {
1919
state.books = action.payload.books;
2020
},
21-
setBook: (state, action: PayloadAction<{ book: Book }>) => {
22-
const { book } = action.payload;
21+
setBook: (state, action: PayloadAction<{ bookDetails: BookDetails }>) => {
22+
const { bookDetails } = action.payload;
2323
if (!state.bookById) state.bookById = {};
24-
if (book.isbn13) {
25-
state.bookById[book.isbn13] = book;
24+
if (bookDetails.isbn13) {
25+
state.bookById[bookDetails.isbn13] = bookDetails;
2626
}
2727
},
2828
},
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
export const en = {
22
common: {
3-
buttons: {},
3+
buttons: {
4+
back: 'Back',
5+
},
46
book: {
57
title: 'Title',
68
subtitle: 'Subtitle',
79
isbn13: 'ISBN 13',
810
price: 'Price',
11+
description: 'Description',
12+
year: 'Year',
13+
publisher: 'Publisher',
14+
rating: 'Rating',
15+
pages: 'Pages',
916
},
1017
searchForm: {
1118
title: 'Search results',
1219
},
1320
},
14-
pages: {
15-
home: {},
16-
book: {},
17-
},
1821
};

src/pages/book/book.page.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,41 @@ import { bookSlice } from '../../logic/store/book/book.slice';
66
import { Button, ButtonType } from '../../components/button/button';
77
import { Layout } from '../../components/layout/layout';
88
import { navigateBack } from '../../logic/navigation';
9-
10-
import './book.styles.css';
9+
import { BookCard } from '../../components/book-card/book-card';
10+
import { translate, translationKeys } from '../../logic/translations/translation.service';
11+
import styled from 'styled-components';
1112

1213
export const BookPage: React.FC = () => {
1314
const dispatch = useDispatch();
15+
1416
const { isbn13 } =
1517
useParams<{
1618
isbn13: string;
1719
}>();
18-
const book = useSelector(getBook(isbn13));
20+
const bookDetails = useSelector(getBook(isbn13));
1921

2022
useEffect(() => {
2123
dispatch(bookSlice.actions.fetchBook({ isbn13 }));
2224
}, [dispatch, isbn13]);
2325

2426
const handleBack = useCallback(() => navigateBack(), []);
2527

26-
return book ? (
28+
return bookDetails ? (
2729
<Layout>
28-
<div className="note">
29-
<div className="note-buttons">
30-
<Button title="Back" type={ButtonType.Secondary} onClick={handleBack} />
31-
</div>
32-
<div className="note-content">{book.title || ''}</div>
33-
</div>
30+
<Buttons>
31+
<Button
32+
title={translate(translationKeys.common.buttons.back)}
33+
type={ButtonType.Secondary}
34+
onClick={handleBack}
35+
/>
36+
</Buttons>
37+
<BookCard book={bookDetails} bigImage bookDetails={bookDetails} />
3438
</Layout>
3539
) : null;
3640
};
41+
42+
const Buttons = styled.div`
43+
justify-content: space-between;
44+
display: flex;
45+
margin-bottom: 4rem;
46+
`;

src/pages/book/book.styles.css

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/pages/home/components/book-card/book-card.tsx

Lines changed: 0 additions & 53 deletions
This file was deleted.

src/pages/home/home.page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useEffect } from 'react';
22
import { useDispatch } from 'react-redux';
33
import { Layout } from '../../components/layout/layout';
44
import { bookSlice } from '../../logic/store/book/book.slice';
5-
import { BookCards } from './components/book-cards/book-cards';
5+
import { BookCards } from '../../components/book-cards/book-cards';
66
import { SearchForm } from './components/search-form/search-form';
77

88
export const HomePage: React.FC = () => {

src/styles/colors.css

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)