const bindAll = require('lodash.bindall'); const connect = require('react-redux').connect; const FormattedMessage = require('react-intl').FormattedMessage; const injectIntl = require('react-intl').injectIntl; const intlShape = require('react-intl').intlShape; const PropTypes = require('prop-types'); const React = require('react'); const api = require('../../lib/api'); const Button = require('../../components/forms/button.jsx'); const Form = require('../../components/forms/form.jsx'); const Grid = require('../../components/grid/grid.jsx'); const navigationActions = require('../../redux/navigation.js'); const Select = require('../../components/forms/select.jsx'); const TitleBanner = require('../../components/title-banner/title-banner.jsx'); const Tabs = require('../../components/tabs/tabs.jsx'); const Page = require('../../components/page/www/page.jsx'); const render = require('../../lib/render.jsx'); require('./search.scss'); class Search extends React.Component { constructor (props) { super(props); bindAll(this, [ 'getSearchState', 'handleChangeSortMode', 'handleGetSearchMore', 'getTab' ]); this.state = this.getSearchState(); this.state.loaded = []; this.state.loadNumber = 16; this.state.mode = ''; this.state.offset = 0; this.state.loadMore = false; } componentDidMount () { const query = window.location.search; const q = query.lastIndexOf('q='); let term = ''; if (q !== -1) { term = query.substring(q + 2, query.length).toLowerCase(); } while (term.indexOf('/') > -1) { term = term.substring(0, term.indexOf('/')); } while (term.indexOf('&') > -1) { term = term.substring(0, term.indexOf('&')); } term = decodeURIComponent(term.split('+').join(' ')); this.props.dispatch(navigationActions.setSearchTerm(term)); let mode = ''; const m = query.lastIndexOf('m='); if (m !== -1) { mode = query.substring(m + 2, query.length).toLowerCase(); } while (mode.indexOf('/') > -1) { mode = mode.substring(0, term.indexOf('/')); } while (term.indexOf('&') > -1) { mode = mode.substring(0, term.indexOf('&')); } mode = decodeURIComponent(mode.split('+').join(' ')); this.props.dispatch(navigationActions.setMode(mode)); } componentDidUpdate (prevProps) { if (this.props.searchTerm !== prevProps.searchTerm) { this.handleGetSearchMore(); } } getSearchState () { let pathname = window.location.pathname.toLowerCase(); if (pathname[pathname.length - 1] === '/') { pathname = pathname.substring(0, pathname.length - 1); } const start = pathname.lastIndexOf('/'); const type = pathname.substring(start + 1, pathname.length); const modeOptions = ['trending', 'popular', 'recent', '']; return { acceptableModes: modeOptions, tab: type, loadNumber: 16 }; } handleChangeSortMode (name, value) { if (this.state.acceptableModes.indexOf(value) !== -1) { const term = this.props.searchTerm.split(' ').join('+'); window.location = `${window.location.origin}/search/${this.state.tab}?q=${term}&m=${value}`; } } handleGetSearchMore () { let termText = ''; if (this.props.searchTerm !== '') { termText = `&q=${encodeURIComponent(this.props.searchTerm.split(' ').join('+'))}`; } const locale = this.props.intl.locale; const loadNumber = this.state.loadNumber; const offset = this.state.offset; const mode = this.state.mode; const queryString = `limit=${loadNumber}&offset=${offset}&language=${locale}&mode=${mode}${termText}`; api({ uri: `/search/${this.state.tab}?${queryString}` }, (err, body) => { const loadedSoFar = this.state.loaded; Array.prototype.push.apply(loadedSoFar, body); const currentOffset = this.state.offset + this.state.loadNumber; const willLoadMore = body.length === this.state.loadNumber; this.setState({ loaded: loadedSoFar, offset: currentOffset, loadMore: willLoadMore }); }); } getTab (type) { const term = this.props.searchTerm.split(' ').join('+'); let allTab = (
  • ); if (this.state.tab === type) { allTab = (
  • ); } return allTab; } getProjectBox () { const results = ( ); let searchAction = null; if (this.state.loaded.length === 0 && this.state.offset !== 0) { searchAction =

    ; } else if (this.state.loadMore) { searchAction = ( ); } return (
    {results} {searchAction}
    ); } render () { return (

    {this.getTab('projects')} {this.getTab('studios')}