import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import Link from 'next/link' import { makeBotURL, redirectTo } from '@utils/Tools' 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 { abortControl.abort() } catch { return null } const controller = new AbortController() setAbortControl(controller) if (value.length > 2) setLoading(true) const res = await Fetch(`/search/bots?q=${encodeURIComponent(value)}`, { signal: controller.signal, }) setData(res) setLoading(false) } 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)}>
{ SearchResults(e.target.value) }} onKeyDown={e => { if (e.key === 'Enter') { onSubmit() } }} />
    {data && data.code === 200 && data.data ? ( data.data.data.length === 0 ? (
  • 검색 결과가 없습니다.
  • ) : ( data.data.data.map(el => (
  • {el.name}

    {el.intro}

  • )) ) ) : loading ? (
  • 검색중입니다...
  • ) : (
  • {query && data ? ( data.message?.includes('문법') ? ( <> 검색 문법이 잘못되었습니다.
    더 알아보기 ) : ( (data.errors && data.errors[0]) || data.message ) ) : query.length === 0 ? !recentSearch || !Array.isArray(recentSearch) || recentSearch.length === 0? '최근 검색 기록이 없습니다.' : <>
  • 최근 검색어
  • { recentSearch.slice(0, 10).map((el, n) => (
  • {el?.value} {Day(el?.date).format('MM.DD.')}
  • )) } : query.length < 3 ? ( '최소 2글자 이상 입력해주세요.' ) : ( '검색어를 입력해주세요.' )} )}
) } export default Search