From 2a3612d0913f80b3f0c28677411c6f79953bb15a Mon Sep 17 00:00:00 2001 From: wonderlandpark Date: Wed, 24 Mar 2021 12:24:53 +0900 Subject: [PATCH] feat: added recent search --- components/Search.tsx | 82 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/components/Search.tsx b/components/Search.tsx index 774130e..5064a25 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import Link from 'next/link' @@ -7,14 +7,26 @@ import Fetch from '@utils/Fetch' import { BotList, ResponseProps } from '@types' import DiscordAvatar from '@components/DiscordAvatar' +import Day from '@utils/Day' const Search = (): JSX.Element => { const router = useRouter() const [query, setQuery] = useState('') + const [recentSearch, setRecentSearch] = useState([]) const [data, setData] = useState>(null) const [loading, setLoading] = useState(false) const [abortControl, setAbortControl] = useState(new AbortController()) const [hidden, setHidden] = useState(true) + useEffect(() => { + setQuery('') + setData(null) + setLoading(false) + try { + setRecentSearch(JSON.parse(localStorage.recentSearch)) + } catch { + setRecentSearch([]) + } + }, [router]) const SearchResults = async (value: string) => { setQuery(value) try { @@ -32,16 +44,34 @@ const Search = (): JSX.Element => { setLoading(false) } - const onSubmit = async () => { - setHidden(true) - redirectTo(router, `/search/?q=${encodeURIComponent(query)}`) + const onSubmit = () => { + if(query.length < 3) return + if(!localStorage.recentSearch) localStorage.recentSearch = '[]' + try { + const d = JSON.parse(localStorage.recentSearch).reverse() + if(d.findIndex(n => n.value === query) !== -1) d.splice(d.findIndex(n => n.value === query), 1) + d.push({ + value: query, + date: new Date().getTime() + }) + d.reverse() + setRecentSearch(d.slice(0, 10)) + localStorage.recentSearch = JSON.stringify(d.slice(0, 10)) + } catch { + setRecentSearch([{ + value: query, + date: new Date().getTime() + }]) + localStorage.recentSearch = JSON.stringify(recentSearch) + } finally { + redirectTo(router, `/search/?q=${encodeURIComponent(query)}`) + } } return ( -
+
setHidden(false)} + onBlur={() => setTimeout(() => setHidden(true), 80)}>
setHidden(false)} - onBlur={() => setTimeout(() => setHidden(true), 80)} className='relative z-10 flex mt-5 w-full text-black dark:text-gray-100 dark:bg-very-black bg-white rounded-lg' > { SearchResults(e.target.value) }} onKeyDown={e => { - if (e.key === 'Enter') return onSubmit() + if (e.key === 'Enter') { + onSubmit() + } }} /> + + { + recentSearch.slice(0, 10).map((el, n) => ( + +
  • + {el?.value} + + {Day(el?.date).format('MM.DD.')} + +
  • + + )) + } + : + query.length < 3 ? ( + '최소 2글자 이상 입력해주세요.' + ) : ( + '검색어를 입력해주세요.' + )} )}