import React, { ReactElement, useState, useEffect, useCallback } from 'react' import AssetList from '@shared/AssetList' import queryString from 'query-string' import Filters from './Filters' import Sort from './sort' import { getResults, updateQueryStringParameter } from './utils' import { useUserPreferences } from '@context/UserPreferences' import { useCancelToken } from '@hooks/useCancelToken' import styles from './index.module.css' import { useRouter } from 'next/router' export default function SearchPage({ setTotalResults, setTotalPagesNumber }: { setTotalResults: (totalResults: number) => void setTotalPagesNumber: (totalPagesNumber: number) => void }): ReactElement { const router = useRouter() const [parsed, setParsed] = useState>() const { chainIds } = useUserPreferences() const [queryResult, setQueryResult] = useState() const [loading, setLoading] = useState() const [serviceType, setServiceType] = useState() const [accessType, setAccessType] = useState() const [sortType, setSortType] = useState() const [sortDirection, setSortDirection] = useState() const newCancelToken = useCancelToken() useEffect(() => { const parsed = queryString.parse(location.search) const { sort, sortOrder, serviceType, accessType } = parsed setParsed(parsed) setServiceType(serviceType as string) setAccessType(accessType as string) setSortDirection(sortOrder as string) setSortType(sort as string) }, [router]) const updatePage = useCallback( (page: number) => { const { pathname, query } = router const newUrl = updateQueryStringParameter( pathname + '?' + JSON.stringify(query) .replace(/"|{|}/g, '') .replace(/:/g, '=') .replace(/,/g, '&'), 'page', `${page}` ) return router.push(newUrl) }, [router] ) const fetchAssets = useCallback( async (parsed: queryString.ParsedQuery, chainIds: number[]) => { setLoading(true) setTotalResults(undefined) const queryResult = await getResults(parsed, chainIds, newCancelToken()) setQueryResult(queryResult) setTotalResults(queryResult?.totalResults || 0) setTotalPagesNumber(queryResult?.totalPages || 0) setLoading(false) }, [newCancelToken, setTotalPagesNumber, setTotalResults] ) useEffect(() => { if (!parsed || !queryResult) return const { page } = parsed if (queryResult.totalPages < Number(page)) updatePage(1) }, [parsed, queryResult, updatePage]) useEffect(() => { if (!parsed || !chainIds) return fetchAssets(parsed, chainIds) }, [parsed, chainIds, newCancelToken, fetchAssets]) return ( <>
) }