From def5c78dd6435365b2f69bf6aee82068f6cf013c Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Wed, 23 Nov 2022 13:33:06 +0700 Subject: Search suggestion --- src/components/Header.js | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) (limited to 'src/components/Header.js') diff --git a/src/components/Header.js b/src/components/Header.js index 2a33df63..e3d8d41d 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -4,17 +4,19 @@ import ShoppingCartIcon from "../icons/shopping-cart.svg"; import SearchIcon from "../icons/search.svg"; import MenuIcon from "../icons/menu.svg"; import ChevronRightIcon from "../icons/chevron-right.svg"; -import { useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import Head from "next/head"; import Logo from "../images/logo.png"; import { useRouter } from "next/router"; import { getAuth } from "../helpers/auth"; +import axios from "axios"; export default function Header({ title }) { const router = useRouter(); const { q = '' } = router.query; const [searchQuery, setSearchQuery] = useState(q); + const [suggestions, setSuggestions] = useState([]); const searchQueryRef = useRef(); const [isMenuActive, setIsMenuActive] = useState(false); const [auth, setAuth] = useState(); @@ -24,9 +26,30 @@ export default function Header({ title }) { }, [auth]); useEffect(() => { - if (q) searchQueryRef.current.blur(); + if (q) { + searchQueryRef.current.blur(); + setSuggestions([]); + }; }, [q]) + const clickSuggestion = (value) => { + console.log(value); + router.push(`/shop/search?q=${value}`, undefined, { scroll: false }); + } + + const getSuggestion = useCallback(async () => { + if (searchQuery.trim().length > 0) { + let result = await axios(`${process.env.SELF_HOST}/api/shop/suggest?q=${searchQuery.trim()}`); + setSuggestions(result.data.suggest.mySuggester[searchQuery.trim()].suggestions); + } else { + setSuggestions([]); + } + }, [searchQuery]); + + useEffect(() => { + if (document.activeElement == searchQueryRef.current) getSuggestion(); + }, [getSuggestion]); + const openMenu = () => setIsMenuActive(true); const closeMenu = () => setIsMenuActive(false); @@ -101,15 +124,17 @@ export default function Header({ title }) { -
+ setSearchQuery(e.target.value)} + onFocus={getSuggestion} value={searchQuery} className="form-input rounded-r-none border-r-0 focus:ring-0" placeholder="Ketikan nama, merek, part number" + autoComplete="false" /> + {suggestions.length > 1 ? ( +
+ {suggestions.map((suggestion, index) => ( +

clickSuggestion(suggestion.term)} className="w-full p-2" key={index}>{suggestion.term}

+ ))} +
+ ) : ''}
+ {suggestions.length > 1 ? ( +
setSuggestions([])}>
+ ) : ''} ) } \ No newline at end of file -- cgit v1.2.3