mirror of
http://112.124.100.131/huang.ze/ebiz-dify-ai.git
synced 2025-12-15 22:06:52 +08:00
improvement: Optimizing the experience of the app list page (#3885)
This commit is contained in:
53
web/app/(commonLayout)/apps/hooks/useAppsQueryState.ts
Normal file
53
web/app/(commonLayout)/apps/hooks/useAppsQueryState.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { type ReadonlyURLSearchParams, usePathname, useRouter, useSearchParams } from 'next/navigation'
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react'
|
||||
|
||||
type AppsQuery = {
|
||||
tagIDs?: string[]
|
||||
keywords?: string
|
||||
}
|
||||
|
||||
// Parse the query parameters from the URL search string.
|
||||
function parseParams(params: ReadonlyURLSearchParams): AppsQuery {
|
||||
const tagIDs = params.get('tagIDs')?.split(';')
|
||||
const keywords = params.get('keywords') || undefined
|
||||
return { tagIDs, keywords }
|
||||
}
|
||||
|
||||
// Update the URL search string with the given query parameters.
|
||||
function updateSearchParams(query: AppsQuery, current: URLSearchParams) {
|
||||
const { tagIDs, keywords } = query || {}
|
||||
|
||||
if (tagIDs && tagIDs.length > 0)
|
||||
current.set('tagIDs', tagIDs.join(';'))
|
||||
else
|
||||
current.delete('tagIDs')
|
||||
|
||||
if (keywords)
|
||||
current.set('keywords', keywords)
|
||||
else
|
||||
current.delete('keywords')
|
||||
}
|
||||
|
||||
function useAppsQueryState() {
|
||||
const searchParams = useSearchParams()
|
||||
const [query, setQuery] = useState<AppsQuery>(() => parseParams(searchParams))
|
||||
|
||||
const router = useRouter()
|
||||
const pathname = usePathname()
|
||||
const syncSearchParams = useCallback((params: URLSearchParams) => {
|
||||
const search = params.toString()
|
||||
const query = search ? `?${search}` : ''
|
||||
router.push(`${pathname}${query}`)
|
||||
}, [router, pathname])
|
||||
|
||||
// Update the URL search string whenever the query changes.
|
||||
useEffect(() => {
|
||||
const params = new URLSearchParams(searchParams)
|
||||
updateSearchParams(query, params)
|
||||
syncSearchParams(params)
|
||||
}, [query, searchParams, syncSearchParams])
|
||||
|
||||
return useMemo(() => ({ query, setQuery }), [query])
|
||||
}
|
||||
|
||||
export default useAppsQueryState
|
||||
Reference in New Issue
Block a user