Advertisement
Danny_Berova

HomeView

Mar 15th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { Component, Fragment } from 'react';
  2.  
  3. import Search from '../../components/Home/Search';
  4. import SideNavLeft from '../../components/SideNavs/SideNavLeft';
  5. import Home from '../../components/Home/Home';
  6. import HomeWelcomeBlock from '../../components/Home/homeWelcomeBlock';
  7. import SideNavRight from '../../components/SideNavs/SideNavRight';
  8.  
  9. import PostService from '../../services/post-service'
  10. import cnst from '../../utils/constants/constants';
  11.  
  12. const TOP_RATED = 'toprated';
  13. const ALL = 'all';
  14. class HomeView extends Component {
  15.   constructor(props) {
  16.     super(props);
  17.     this.state = {
  18.         posts: [],
  19.         filter: '',
  20.         filteredPosts: [],
  21.         search: '',
  22.         currentPosts: [],
  23.         latest: {
  24.             title: '',
  25.             content: '',
  26.             createdOn: ''
  27.         },
  28.         currentPage: null,
  29.         totalPages: 1
  30.     }
  31.  
  32.     this.PostService = new PostService();
  33.     this.handleChange = this.handleChange.bind(this);
  34.     this.search = this.search.bind(this);
  35.     this.filterPosts = this.filterPosts.bind(this);
  36. }
  37.  
  38. async componentWillMount() {
  39.     let data = await this.PostService.all();
  40.  
  41.     if(data.posts) {
  42.       let orderedPosts = data.posts.sort((a, b) =>{
  43.         return a.createdOn > b.createdOn  ? -1 : 1;
  44.       })
  45.       if(this.state.filter !== '')
  46.      
  47.       localStorage.removeItem(cnst.message)
  48.      
  49.         this.setState({
  50.           message: '',
  51.           filter: '',
  52.           posts: orderedPosts,
  53.           filteredPosts: orderedPosts,
  54.           currentPosts: orderedPosts,
  55.           latest: orderedPosts[0] || {title: '',
  56.                                         content: '',
  57.                                         createdOn: ''},
  58.           totalPages: Math.ceil(orderedPosts / 5)
  59.         })
  60.     }
  61. }
  62.  
  63. handleChange(event) {
  64.     this.setState({
  65.         [event.target.name]: event.target.value
  66.     })
  67. }
  68.  
  69. async filterPosts(text) {
  70.     this.setState({filteredPosts: this.state.posts, })
  71.     let filtered = this.state.posts.concat();
  72.     let filter = text;
  73.     if(text === TOP_RATED) {
  74.         filtered = filtered.sort((a, b) => a.stars.length > b.stars.length ? -1 : 1)
  75.     } else if(text === ALL){
  76.         filtered = this.state.posts;
  77.         filter = ''
  78.     } else {
  79.  
  80.      filtered = text !== ''
  81.                 ? (filtered.filter(p => p.category === text) )
  82.                 : this.state.posts
  83.     }
  84.     if(filtered.length > 0) {
  85.         let filteredLength = filtered.length > 0 ? filtered.length : 1
  86.         this.setState({
  87.             filteredPosts: filtered,
  88.             currentPosts: filtered.slice(0,5),
  89.             totalPages: Math.ceil(filteredLength / 5) || 1,
  90.             currentPage: 1,
  91.             filter: filter
  92.             })
  93.     } else {
  94.         this.setState({
  95.             filteredPosts: [{ title:'', content: '', imageUrl: '', stars:'' }],
  96.             currentPosts: [{ title:'', content: '', imageUrl: '', stars:'' }],
  97.             totalPages:1,
  98.             filter: filter
  99.     })
  100.     }
  101.    
  102.   }
  103.   search() {
  104.       let filtered = this.state.posts;
  105.       let filter = '';
  106.       if(this.state.search !== '') {
  107.           filtered = this.state.posts.filter(p => p.title.toLowerCase().includes(this.state.search.toLowerCase()))
  108.           filter = this.state.search;
  109.       } else {
  110.           filtered = this.state.posts
  111.       }
  112.       let filteredLength = filtered.length > 0 ? filtered.length : 1
  113.       if(filtered.length > 0) {
  114.  
  115.         this.setState({
  116.             filteredPosts: filtered,
  117.             currentPosts: filtered.slice(0,5),
  118.             totalPages: Math.ceil(filteredLength / 5) || 1,
  119.             currentPage: 1,
  120.             search: '',
  121.             filter: filter
  122.           })
  123.       } else {
  124.         this.setState({
  125.             filteredPosts: [{ title:'', content: '', imageUrl: '', stars:'' }],
  126.             currentPosts: [{ title:'', content: '', imageUrl: '', stars:'' }],
  127.             totalPages:1,
  128.             currentPage: 1,
  129.             search: '',
  130.             filter: filter
  131.     })
  132.     }
  133.   }
  134.  
  135. onPageChanged = data => {
  136.     let {filteredPosts } = this.state;
  137.     const { currentPage, totalPages, pageLimit } = data;
  138.  
  139.     const offset = (currentPage - 1) * pageLimit;
  140.     let currentPosts = filteredPosts.slice(offset, offset + pageLimit);
  141.  
  142.     this.setState({ currentPage, currentPosts, totalPages });
  143.   };
  144.  
  145.  
  146.   render() {
  147.    
  148.     return (
  149.         <Fragment>
  150.             <div className='row'>
  151.                 <HomeWelcomeBlock  {...this.props} />
  152.                 <SideNavLeft  {...this.state} filterPosts={this.filterPosts} />
  153.                     <div className='col s8'>
  154.                         <Search {...this.state} searching={this.search} handleChange={this.handleChange}/>
  155.                         <Home {...this.props} {...this.state} handleChange={this.handleChange} filterPosts={this.filterPosts} onPageChanged={this.onPageChanged}/>
  156.                     </div>
  157.                 <SideNavRight  {...this.state} {...this.props} filterPosts={this.filterPosts}/>
  158.             </div>
  159.         </Fragment>
  160.     );
  161.   }
  162. }
  163. export default HomeView;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement