Advertisement
Guest User

App.js

a guest
Apr 22nd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React from 'react'
  2. import * as BooksAPI from './BooksAPI'
  3. import './App.css'
  4. import Book from './Book'
  5. import BookSearch from './BookSearch'
  6. import {Route, Link} from 'react-router-dom'
  7.  
  8.  
  9. class BooksApp extends React.Component {
  10.     state = {
  11.         books: []
  12.     };
  13.  
  14.     componentDidMount() {
  15.         BooksAPI.getAll()
  16.             .then((books) => {
  17.                 this.sortBooks(books);
  18.                 this.setState(() => ({books}))
  19.             })
  20.     }
  21.  
  22.     changeBookshelf = (updatedBook, shelf) => {
  23.         const bookIndex = this.state.books.indexOf(updatedBook);
  24.         updatedBook.shelf = shelf;
  25.  
  26.         const updatedBooks = this.state.books.slice(0);
  27.         if(bookIndex === -1){
  28.             updatedBooks.push(updatedBook);
  29.         } else {
  30.             updatedBooks.splice(bookIndex, 1, updatedBook)
  31.         }
  32.  
  33.         this.sortBooks(updatedBooks);
  34.         this.setState(() => ({books: updatedBooks}));
  35.  
  36.         BooksAPI.update(updatedBook, shelf)
  37.     };
  38.  
  39.     sortBooks = (books) => {
  40.         books.sort((firstBook, secondBook) => {
  41.             const firstTitle = firstBook.title.toLowerCase();
  42.             const secondTitle = secondBook.title.toLowerCase();
  43.  
  44.             if (firstTitle === secondTitle) {
  45.                 return 0;
  46.             }
  47.  
  48.             return firstTitle < secondTitle ? -1 : 1;
  49.  
  50.         });
  51.     };
  52.  
  53.     render() {
  54.  
  55.         const shelves = {
  56.         currentlyReading: ['Currently Reading', 'currentlyReading'],
  57.         wantToRead: ['Want to Read', 'wantToRead'],
  58.         read: ['Read', 'read']
  59.         }
  60.        
  61.        
  62.         const {books} = this.state;
  63.  
  64.         return (
  65.             <div className="app">
  66.  
  67.                 <Route path='/search' render={() => (
  68.                     <BookSearch onChangeBookshelf={this.changeBookshelf} books={books}/>
  69.                 )}/>
  70.  
  71.                 <Route exact path='/' render={() => (
  72.                     <div className="list-books">
  73.                         <div className="list-books-title">
  74.                             <h1>MyReads</h1>
  75.                         </div>
  76.                         <div className="list-books-content">
  77.                             { Object.keys(shelves).map((shelf) =>
  78.                                 <div className="bookshelf" key={shelf}>
  79.                                     <h2 className="bookshelf-title">{shelves[shelf][0]}</h2>
  80.                                     <div className="bookshelf-books">
  81.                                         <ol className="books-grid">
  82.                                             {books
  83.                                                 .filter(book => book.shelf === shelves[shelf][1])
  84.                                                 .map((book) => (
  85.                                                     <li key={book.id}>
  86.                                                         <Book book={book}
  87.                                                             onChangeBookshelf={this.changeBookshelf}/>
  88.                                                     </li>))}
  89.                                         </ol>
  90.                                     </div>
  91.                                 </div>
  92.                             )}
  93.                         </div>
  94.                         <div className="open-search">
  95.                             <Link to='/search'>Add a book</Link>
  96.                         </div>
  97.                     </div>
  98.                 )}/>
  99.             </div>
  100.         );
  101.     }
  102. }
  103.  
  104. export default BooksApp;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement