From ca5f5b6ae56906a8c3f271a8ed124ad7e4ebecd0 Mon Sep 17 00:00:00 2001
From: Luis Felipe Risch <lfr20@inf.ufpr.br>
Date: Fri, 19 Mar 2021 12:38:11 -0300
Subject: [PATCH] Try to fix search bar problem

---
 src/Components/SearchBar.js | 154 ++++++++++++++++++++----------------
 src/Pages/Search.js         |  24 ++++--
 2 files changed, 100 insertions(+), 78 deletions(-)

diff --git a/src/Components/SearchBar.js b/src/Components/SearchBar.js
index faca3453..ac1eef5e 100644
--- a/src/Components/SearchBar.js
+++ b/src/Components/SearchBar.js
@@ -17,25 +17,26 @@ 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 { Redirect, useHistory } from 'react-router-dom'
 
 import IconSearch from '@material-ui/icons/Search'
 
-import { RadioGroup, Radio, FormControl, Select, MenuItem, Button, FormControlLabel, TextField } from '@material-ui/core'
+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'
 
 
 const dividerStyled = {
-	background: '#e0e0e0',
+  background: '#e0e0e0',
   width: '1px',
   content: "",
   display: 'block',
   top: '0',
   bottom: '0',
   right: '0',
-	minHeight: '70px',
-	margin: '0 30px'
+  minHeight: '70px',
+  margin: '0 30px'
 }
 
 const DividerVertical = () => <em style={dividerStyled}></em>
@@ -47,12 +48,12 @@ const IconSearchStyled = styled(IconSearch)`
   color: #16b8dd;
 `
 
-const TextFieldStyled = styled(TextField) `
+const TextFieldStyled = styled(TextField)`
 		flex-grow: 2;
 		margin: 0 2vw !important;
 `
 
-const RadioGroupStyled = styled(RadioGroup) `
+const RadioGroupStyled = styled(RadioGroup)`
 		display: flex;
 		flex-direction: row;
 		flex-grow: 1;
@@ -84,50 +85,50 @@ const MenuItemStyled = styled(MenuItem)`
     fontWeight: bolder;
 `
 
-const Bar = styled.div `
+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 `
+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 [query, setQuery] = useState('')
+  const [searchClass, setSearchClass] = useState('LearningObject')
 
   const { state, dispatch } = useContext(Store)
 
-  const [ goSearch, setGoSearch ] = useState(false)
+  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(() => {
+    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])
+  useEffect(() => setGoSearch(false), [goSearch])
 
-	const handleChange = ( event ) => {
+  const handleChange = (event) => {
     setQuery(event.target.value)
   }
 
   const handleKeyDown = (event) => {
-    if(event.key === 'Enter' || event.type === 'click'){
+    if (event.key === 'Enter' || event.type === 'click') {
       dispatch({
         type: 'SAVE_SEARCH',
         newSearch: {
-          query: query!==''?query:'*',
+          query: query !== '' ? query : '*',
           class: searchClass
         }
       })
@@ -135,50 +136,63 @@ export default function SearchBar(props) {
     }
   }
 
+  const linkTarget = {
+    pathname: `/busca?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 (
-              <Bar>
-                {goSearch && <Redirect to={`/busca?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}
-                />
-                <Flex>
-                  <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
-                  <Flex style={{"justifyContent": 'middle', 'flexDirection':'column'}}>
-                    <div>Pressione "Enter"</div>
-                    <div>ou click na lupa</div>
-                  </Flex>
-                  <DividerVertical />
-                  { state.windowSize.width >=900?
-                    <RadioGroupStyled row={true}
-                                aria-label="Tipo"
-                                name="types" value={searchClass}
-                                onChange={
-                                  (event)=> setSearchClass(event.target.value)
-                                }
-                    >
-                      <FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos"/>
-                      <FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções"/>
-                      <FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" />
-                    </RadioGroupStyled>
-                  :
-                    <FormControl>
-                      <SelectStyled
-                        value={searchClass}
-                        onChange={(event)=> setSearchClass(event.target.value)}
-                      >
-                        <MenuItemStyled value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled>
-                        <MenuItemStyled value="Collection" aria-label="Coleções">Coleções</MenuItemStyled>
-                        <MenuItemStyled value="User" aria-label="Usuários">Usuários</MenuItemStyled>
-                      </SelectStyled>
-                    </FormControl>
-                  }
-                </Flex>
-              </Bar>
+    <Bar>
+      {goSearch && <Redirect to={`/busca?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}
+      />
+      <Flex>
+        <Link
+          to={linkTarget}
+        >
+          <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
+        </Link>
+
+        <Flex style={{ "justifyContent": 'middle', 'flexDirection': 'column' }}>
+          <div>Pressione "Enter"</div>
+          <div>ou click na lupa</div>
+        </Flex>
+        <DividerVertical />
+        {state.windowSize.width >= 900 ?
+          <RadioGroupStyled row={true}
+            aria-label="Tipo"
+            name="types" value={searchClass}
+            onChange={
+              (event) => setSearchClass(event.target.value)
+            }
+          >
+            <FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos" />
+            <FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções" />
+            <FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" />
+          </RadioGroupStyled>
+          :
+          <FormControl>
+            <SelectStyled
+              value={searchClass}
+              onChange={(event) => setSearchClass(event.target.value)}
+            >
+              <MenuItemStyled value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled>
+              <MenuItemStyled value="Collection" aria-label="Coleções">Coleções</MenuItemStyled>
+              <MenuItemStyled value="User" aria-label="Usuários">Usuários</MenuItemStyled>
+            </SelectStyled>
+          </FormControl>
+        }
+      </Flex>
+    </Bar>
   )
 }
diff --git a/src/Pages/Search.js b/src/Pages/Search.js
index ce755f66..0a6a8a81 100644
--- a/src/Pages/Search.js
+++ b/src/Pages/Search.js
@@ -53,6 +53,7 @@ export default function Search(props) {
     const [loadingMoreData, setLoadingMoreData] = useState(false);
     const [isFiltering, setIsFiltering] = useState(false);
     const [resultsPerPage, setResultsPerPage] = useState(12);
+    const [showingResults, setShowingResults] = useState(0);
     const [totalResults, setTotalResults] = useState(0);
     const [options] = React.useState([
         { label: "Recursos", value: "LearningObject" },
@@ -86,13 +87,10 @@ export default function Search(props) {
                 class: currOption,
             },
         });
-        console.log(data);
         if (headers.has('X-Total-Count')) {
             setTotalResults(headers.get('X-Total-Count'));
         }
-        else {
-            setTotalResults(data.length);
-        }
+        setShowingResults(data.length)
         setOptionResult(currOption);
         setIsLoading(false);
         setIsFiltering(false);
@@ -108,15 +106,26 @@ export default function Search(props) {
         getRequest(url, handleSuccessfulGet, (error) => { console.log(error) })
     };
 
+(function(history){
+    const pushState = history.pushState;
+    history.pushState = function(state) {
+        if (typeof history.onpushstate == "function") {
+            history.onpushstate({state: state});
+        }
+        // Call your custom function here
+        return pushState.apply(history, arguments);
+    }
+})(window.history);
+
     useEffect(() => {
         dispatch({
             type: "HANDLE_SEARCH_BAR",
             opened: false,
         });
-
         const urlParams = new URLSearchParams(window.location.search);
         const query = urlParams.get("query");
         const searchClass = urlParams.get("search_class");
+
         if (state.search.query !== query || state.search.class !== searchClass) {
             dispatch({
                 type: "SAVE_SEARCH",
@@ -193,8 +202,7 @@ export default function Search(props) {
                             <Grid item xs={12}>
                                 <div style={{ display: "flex", flexDirection: "column", justifyContent: "center" }}>
                                     <div style={{ textAlign: "center", paddingTop: 10, fontWeight: "bolder" }}>
-                                        Exibindo {totalResults === 0 ? 0 : resultsPerPage} resultados de {totalResults} encontrados
-                                        {/*Exibindo {totalResults === 0 ? 0 : resultsPerPage} resultados*/}
+                                        Exibindo {showingResults === 0 ? 0 : showingResults} resultados de {totalResults} encontrados
                                     </div>
                                 </div>
                             </Grid>
@@ -250,7 +258,7 @@ export default function Search(props) {
                                     </GridBuscaCollection> :
                                     <Grid container direction="row" justify="center" alignItems="center">
                                         <Grid item>
-                                            <img src={ColecaoVazia} alt="coleção vazia"/>
+                                            <img src={ColecaoVazia} alt="coleção vazia" />
                                         </Grid>
                                     </Grid>
 
-- 
GitLab