Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 986 | Rev 988 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
651 stevensc 1
import React, { useState, useEffect } from 'react'
979 stevensc 2
import { axios, debounce } from '../../utils'
651 stevensc 3
import { useDispatch, useSelector } from 'react-redux'
979 stevensc 4
import { useHistory, useLocation, useParams } from 'react-router-dom'
650 stevensc 5
import { addNotification } from '../../redux/notification/notification.actions'
979 stevensc 6
import { Search } from '@mui/icons-material'
7
import { Container, Grid } from '@mui/material'
5 stevensc 8
 
650 stevensc 9
import Input from 'components/UI/Input'
10
import Spinner from 'components/UI/Spinner'
11
import SearchItem from 'components/search/SearchItem'
12
import EmptySection from 'components/UI/EmptySection'
13
import FiltersSidebar from 'components/search/FiltersSidebar'
14
import CategoryFilter from 'components/search/CategoryFilter'
15
import LocationFilter from 'components/search/LocationFilter'
16
import PaginationComponent from 'components/UI/PaginationComponent'
979 stevensc 17
import LoaderContainer from 'components/UI/LoaderContainer'
5 stevensc 18
 
19
const SearchPage = () => {
485 stevensc 20
  const [entities, setEntities] = useState([])
981 stevensc 21
  const [pages, setPages] = useState(1)
485 stevensc 22
  const [loading, setLoading] = useState(true)
970 stevensc 23
  const { search, pathname } = useLocation()
976 stevensc 24
  const { category } = useParams()
979 stevensc 25
  const history = useHistory()
26
  const labels = useSelector(({ intl }) => intl.labels)
651 stevensc 27
  const dispatch = useDispatch()
5 stevensc 28
 
485 stevensc 29
  const params = new URLSearchParams(search)
30
  const keyword = params.get('keyword')
970 stevensc 31
  const currentPage = params.get('page')
5 stevensc 32
 
981 stevensc 33
  const searchEntities = () => {
485 stevensc 34
    setLoading(true)
5 stevensc 35
 
649 stevensc 36
    axios
971 stevensc 37
      .get(`${pathname}?${params.toString()}`)
649 stevensc 38
      .then(({ data: responseData }) => {
39
        const { success, data } = responseData
5 stevensc 40
 
649 stevensc 41
        if (!success) {
42
          throw new Error(data)
5 stevensc 43
        }
649 stevensc 44
 
45
        setEntities(data.current.items)
46
        setPages(data.total.pages)
485 stevensc 47
      })
649 stevensc 48
      .catch((err) => {
655 stevensc 49
        dispatch(addNotification({ style: 'danger', msg: err.message }))
649 stevensc 50
      })
51
      .finally(() => setLoading(false))
485 stevensc 52
  }
5 stevensc 53
 
975 stevensc 54
  const onChangeKeyword = debounce((value = '') => {
970 stevensc 55
    params.set('page', '1')
975 stevensc 56
    params.set('keyword', value)
970 stevensc 57
    history.replace(`${pathname}?${params.toString()}`)
58
  }, 500)
59
 
60
  const onChangePage = (currentPage = 1) => {
61
    params.set('page', `${currentPage}`)
62
    history.replace(`${pathname}?${params.toString()}`)
63
  }
64
 
65
  const onChangeCategory = (newCategory = 'user') => {
66
    params.set('page', '1')
67
    history.replace(`/search/entity/${newCategory}?${params.toString()}`)
68
  }
69
 
981 stevensc 70
  const onChangeAddress = (address = {}) => {
986 stevensc 71
    params.set('page', '1')
982 stevensc 72
    const addressEntries = Object.entries(address)
73
 
987 stevensc 74
    console.log(params.getAll())
986 stevensc 75
    params.forEach((value, key) => {
984 stevensc 76
      console.log(key, value)
986 stevensc 77
      if (!['page', 'keyword'].includes(key)) params.delete(key)
983 stevensc 78
    })
982 stevensc 79
 
986 stevensc 80
    addressEntries.forEach(([key, value]) => value && params.set(key, value))
983 stevensc 81
 
986 stevensc 82
    history.replace(`${pathname}?${params.toString()}`)
981 stevensc 83
  }
84
 
649 stevensc 85
  useEffect(() => {
981 stevensc 86
    searchEntities()
87
  }, [search, pathname])
5 stevensc 88
 
89
  return (
90
    <>
649 stevensc 91
      <Container as='main'>
375 stevensc 92
        <Input
979 stevensc 93
          icon={Search}
970 stevensc 94
          onChange={(e) => onChangeKeyword(e.target.value)}
95
          defaultValue={keyword}
651 stevensc 96
          placeholder={labels.search}
5 stevensc 97
        />
970 stevensc 98
 
980 stevensc 99
        <Grid container spacing={2} mt={2}>
100
          <Grid item xs={12} md={4} display='flex' direction='column' gap={2}>
5 stevensc 101
            <FiltersSidebar>
976 stevensc 102
              <CategoryFilter
103
                currentCategory={category}
104
                onChange={onChangeCategory}
105
              />
970 stevensc 106
 
981 stevensc 107
              <LocationFilter onChange={onChangeAddress} />
5 stevensc 108
            </FiltersSidebar>
979 stevensc 109
          </Grid>
970 stevensc 110
 
980 stevensc 111
          <Grid item xs={12} md={8} display='flex' direction='column' gap={2}>
649 stevensc 112
            <div className='posts-section'>
979 stevensc 113
              {loading ? (
114
                <LoaderContainer>
115
                  <Spinner />
116
                </LoaderContainer>
5 stevensc 117
              ) : (
981 stevensc 118
                <>
119
                  <EntitiesList entities={entities} />
120
                  <PaginationComponent
121
                    pages={pages}
122
                    currentActivePage={currentPage}
123
                    onChangePage={onChangePage}
124
                    isRow
125
                  />
126
                </>
5 stevensc 127
              )}
128
            </div>
979 stevensc 129
          </Grid>
130
        </Grid>
5 stevensc 131
      </Container>
132
    </>
485 stevensc 133
  )
134
}
5 stevensc 135
 
979 stevensc 136
const EntitiesList = ({ entities = [] }) => {
137
  if (!entities.length) {
138
    return <EmptySection message='No hay resultados' />
139
  }
140
 
141
  return (
142
    <>
143
      {entities.map((entity) => (
144
        <SearchItem key={entity.id} entity={entity} />
145
      ))}
146
    </>
147
  )
148
}
149
 
485 stevensc 150
export default SearchPage