Proyectos de Subversion LeadersLinked - SPA

Rev

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

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