Skip to content
Snippets Groups Projects
SearchBar.js 7.16 KiB
/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre
Departamento de Informatica - Universidade Federal do Parana

This file is part of Plataforma Integrada MEC.

Plataforma Integrada MEC is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Plataforma Integrada MEC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with Plataforma Integrada MEC.  If not, see <http://www.gnu.org/licenses/>.*/

import React, { useState, useEffect, useContext } from 'react'
import { Redirect } from 'react-router-dom'

import IconSearch from '@material-ui/icons/Search'

import { RadioGroup, Radio, FormControl, Select, MenuItem, Button, FormControlLabel, TextField, Link } from '@material-ui/core'
import styled from 'styled-components'
import { Store } from '../Store';
import { v4 as uuidv4 } from 'uuid'
import Grid from "@material-ui/core/Grid"


const dividerStyled = {
  background: '#e0e0e0',
  width: '1px',
  content: "",
  display: 'block',
  top: '0',
  bottom: '0',
  right: '0',
  minHeight: '70px',
  margin: '0 20px'
}

const DividerVertical = () => <em style={dividerStyled}></em>

const ButtonStyled = styled(Button)`
    text-transform: capitalize !important;
`
const IconSearchStyled = styled(IconSearch)`
  color: #16b8dd;
`

const TextFieldStyled = styled(TextField)`
		flex-grow: 2;
		margin: 0 2vw !important;
`

/*
const RadioGroupStyled = styled(RadioGroup)`
		display: flex;
		flex-direction: row;
		flex-grow: 1;
`
*/

const FormControlLabelStyled = styled(FormControlLabel)`
  *{
    text-transform: uppercase;
    color: #ff8a17 !important;
    fontWeight: bolder;
  }
`

const RadioStyled = styled(Radio)`
		color: #ff8a17;
`

const SelectStyled = styled(Select)`
  margin-right: 2vw;
  *{
    text-transform: uppercase;
    color: #ff8a17 !important;
    fontWeight: bolder;
  }
`
const MenuItemStyled = styled(MenuItem)`
    text-transform: uppercase;
    fontWeight: bolder;
`

/*const Bar = styled.div`
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-top: 1px rgba(0,0,0,.1) solid;
`
const Flex = styled.span`
  display: flex;
  align-items: center;
  color: #787380;
`*/

export default function SearchBar(props) {
  const [query, setQuery] = useState('')
  const [searchClass, setSearchClass] = useState('LearningObject')

  const { state, dispatch } = useContext(Store)

  const [goSearch, setGoSearch] = useState(false)

  useEffect(() => {
    if (window.location.pathname.includes('busca')) {
      const urlParams = new URLSearchParams(window.location.search)
      const urlQuery = urlParams.get('query')
      const urlSearchClass = urlParams.get('search_class')
      if (searchClass !== urlSearchClass || query !== urlQuery) {
        setQuery(urlQuery)
        setSearchClass(urlSearchClass)
      }
    }
  }, [])

  useEffect(() => setGoSearch(false), [goSearch])

  const handleChange = (event) => {
    setQuery(event.target.value)
  }

  const handleKeyDown = (event) => {
    if (event.key === 'Enter' || event.type === 'click') {
      dispatch({
        type: 'SAVE_SEARCH',
        newSearch: {
          query: query !== '' ? query : '*',
          class: searchClass
        }
      })
      setGoSearch(true)
    }
  }
  const linkTarget = {
    pathname: `/busca?page=0&results_per_page=12&order=review_average&query=${state.search.query}&search_class=${state.search.class}`,
    key: uuidv4(), // we could use Math.random, but that's not guaranteed unique.
    state: {
      applied: true
    }
  };

  return (
    <Grid container>
      <Grid container item xs={12} sm={6} md={6} lg={6} xl={6}>
        {goSearch && <Redirect to={`/busca?page=0&results_per_page=12&order=review_average&query=${state.search.query}&search_class=${state.search.class}`} />}
        <TextFieldStyled
          id="standard-search"
          label="O que você está buscando"
          type="search"
          margin="normal"
          value={query}
          onChange={handleChange}
          onKeyPress={handleKeyDown}
        />
      </Grid>
      <Grid container item justify="center" alignItems="center" xs={12} sm={6} md={6} lg={6} xl={6}>
      {state.windowSize.width >= 960 ?
        <React.Fragment>
          <Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}>
            <Link
              to={linkTarget}
            >
              <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
            </Link>
          </Grid>
          <Grid container item justify="center" alignItems="center" xs={12} sm={3} md={3} lg={3} xl={3}>
            <span>Pressione "Enter" ou click na lupa</span>
          </Grid>
          <Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}>
            <DividerVertical />
          </Grid>
          <Grid container item justify="center" alignItems="center" xs={12} sm={7} md={7} lg={7} xl={7}>
            <RadioGroup row={true}
              aria-label="Tipo"
              name="types" value={searchClass}
              onChange={
                (event) => setSearchClass(event.target.value)
              }
              justify="center" alignItems="center"
            >
              <FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos" />
              <FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções" />
              <FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" />
            </RadioGroup>
          </Grid>
        </React.Fragment>
      :
        <React.Fragment>
          <Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}>
            <FormControl>
              <SelectStyled
                value={searchClass}
                onChange={(event) => setSearchClass(event.target.value)}
              >
                <MenuItemStyled style={{color : "#ff7f00"}} value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled>
                <MenuItemStyled style={{color : "#673ab7"}} value="Collection" aria-label="Coleções">Coleções</MenuItemStyled>
                <MenuItemStyled style={{color : "#00bcd4"}} value="User" aria-label="Usuários">Usuários</MenuItemStyled>
              </SelectStyled>
            </FormControl>
          </Grid>
          <Grid container item justify="center" alignItems="center" xs={2} sm={2} md={2} lg={2} xl={2}>
            <DividerVertical />
          </Grid>
          <Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}>
            <Link
              to={linkTarget}
            >
              <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
            </Link>
          </Grid>
        </React.Fragment>
      }
      </Grid>
    </Grid>
  )
}