eventoL/eventoL

View on GitHub
eventol/front/src/containers/Home/index.jsx

Summary

Maintainability
A
3 hrs
Test Coverage
A
100%
import React from 'react';
import PropTypes from 'prop-types';
import withSizes from 'react-sizes';

import Hero from '../../components/Hero';
import Header from '../../components/Header';
import Search from '../../components/Search';
import TitleList from '../../components/TitleList';
import {mapSizesToProps} from '../../utils/dom';
import {
  BACKGROUND_DEFAULT,
  LOGO_HEADER_DEFAULT,
  LOGO_LANDING_DEFAULT,
} from '../../utils/constants';
import {
  getSearchUrl,
  getMyEventsUrl,
  getUpcomingEventsUrl,
  getFinishedEventsUrl,
  getEventsWithConfirmedScheduleUrl,
  getFeaturedEventsUrl,
  getRecentEventsUrl,
} from '../../utils/urls';

import './index.scss';

class Home extends React.PureComponent {
  static propTypes = {
    background: PropTypes.string,
    eventolMessage: PropTypes.string,
    handleOnChangeLanguage: PropTypes.func,
    isMobile: PropTypes.bool.isRequired,
    languages: PropTypes.arrayOf(
      PropTypes.shape({
        code: PropTypes.string,
        name: PropTypes.string,
      })
    ),
    logoHeader: PropTypes.string,
    logoLanding: PropTypes.string,
    user: PropTypes.shape({
      first_name: PropTypes.string,
      last_name: PropTypes.string,
    }),
  };

  static defaultProps = {
    background: BACKGROUND_DEFAULT,
    eventolMessage: null,
    handleOnChangeLanguage: null,
    languages: [],
    logoHeader: LOGO_HEADER_DEFAULT,
    logoLanding: LOGO_LANDING_DEFAULT,
    user: null,
  };

  state = {
    searchUrl: '',
    searched: false,
  };

  handleOnEnter = searchTerm => {
    if (searchTerm !== '') {
      const searchUrl = getSearchUrl(searchTerm);
      this.setState({searchUrl, searched: true});
    }
  };

  handlerOnChangeLanguage = languageCode => {
    const {handleOnChangeLanguage} = this.props;
    if (handleOnChangeLanguage) {
      handleOnChangeLanguage(languageCode);
    }
  };

  render() {
    const {searched, searchUrl} = this.state;
    const {
      user,
      eventolMessage,
      background,
      logoHeader,
      logoLanding,
      isMobile,
      languages,
    } = this.props;
    return (
      <div>
        <Header
          handlerOnChangeLanguage={this.handlerOnChangeLanguage}
          isMobile={isMobile}
          languages={languages}
          logoHeader={logoHeader}
          user={user}
        />

        <Hero
          background={background}
          isLogged={user !== null}
          logoLanding={logoLanding}
          message={eventolMessage}
        >
          <Search onEnter={this.handleOnEnter} />
        </Hero>

        {searched && (
          <TitleList
            id="search_results"
            showEmpty
            title={gettext('Search results')}
            url={searchUrl}
          />
        )}

        <TitleList
          id="my_events"
          title={gettext('My Events')}
          url={getMyEventsUrl()}
        />

        <TitleList
          id="recent"
          title={gettext('Recent Events')}
          url={getRecentEventsUrl()}
        />

        <TitleList
          id="featured"
          title={gettext('Featured Events')}
          url={getFeaturedEventsUrl()}
        />

        <TitleList
          id="next"
          title={gettext('Upcoming Events')}
          url={getUpcomingEventsUrl()}
        />

        <TitleList
          id="schedule_confirmed"
          title={gettext('Events with Confirmed Schedule')}
          url={getEventsWithConfirmedScheduleUrl()}
        />

        <TitleList
          id="finished"
          title={gettext('Finished Events')}
          url={getFinishedEventsUrl()}
        />
      </div>
    );
  }
}

export default withSizes(mapSizesToProps)(Home);