1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-06-29 00:57:50 +02:00
market/src/components/Search/index.tsx

114 lines
3.6 KiB
TypeScript
Raw Normal View History

import React, { ReactElement, useState, useEffect, useCallback } from 'react'
2021-11-24 14:31:23 +01:00
import AssetList from '@shared/AssetList'
2020-07-01 18:13:32 +02:00
import queryString from 'query-string'
import Filters from './Filters'
import Sort from './sort'
2021-10-19 14:06:16 +02:00
import { getResults, updateQueryStringParameter } from './utils'
2021-10-13 18:48:59 +02:00
import { useUserPreferences } from '@context/UserPreferences'
import { useCancelToken } from '@hooks/useCancelToken'
import styles from './index.module.css'
import { useRouter } from 'next/router'
2020-07-01 18:13:32 +02:00
export default function SearchPage({
setTotalResults,
setTotalPagesNumber
2020-07-01 18:13:32 +02:00
}: {
setTotalResults: (totalResults: number) => void
setTotalPagesNumber: (totalPagesNumber: number) => void
2020-07-01 18:13:32 +02:00
}): ReactElement {
const router = useRouter()
const [parsed, setParsed] = useState<queryString.ParsedQuery<string>>()
const { chainIds } = useUserPreferences()
const [queryResult, setQueryResult] = useState<PagedAssets>()
2020-07-15 15:47:25 +02:00
const [loading, setLoading] = useState<boolean>()
const [serviceType, setServiceType] = useState<string>()
const [accessType, setAccessType] = useState<string>()
const [sortType, setSortType] = useState<string>()
const [sortDirection, setSortDirection] = useState<string>()
const newCancelToken = useCancelToken()
2020-07-01 18:13:32 +02:00
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])
2020-07-01 18:13:32 +02:00
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<string>, 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])
2020-07-01 18:13:32 +02:00
return (
<>
2021-10-19 14:06:16 +02:00
<div className={styles.search}>
<div className={styles.row}>
<Filters
serviceType={serviceType}
accessType={accessType}
setServiceType={setServiceType}
setAccessType={setAccessType}
addFiltersToUrl
/>
<Sort
sortType={sortType}
sortDirection={sortDirection}
setSortType={setSortType}
setSortDirection={setSortDirection}
/>
</div>
2021-10-19 14:06:16 +02:00
</div>
<div className={styles.results}>
<AssetList
assets={queryResult?.results}
showPagination
isLoading={loading}
page={queryResult?.page}
totalPages={queryResult?.totalPages}
onPageChange={updatePage}
/>
</div>
</>
2020-07-01 18:13:32 +02:00
)
}