Files
dify/web/app/components/plugins/marketplace/hydration-server.tsx
yyh 97417d7895 fix: improve TanStack Query client setup and fix queryKey bug
- Fix double-nested queryKey array in usePluginManifestInfo that broke
  invalidateQueries prefix matching
- Remove unnecessary useState in TanstackQueryInitializer per Advanced SSR guide
  https://tanstack.com/query/v5/docs/framework/react/guides/advanced-ssr#initial-setup
- Reduce default staleTime from 30min to 5min (matching gcTime default)
- Fix nuqs SearchParams import to use nuqs/server for consistency
2026-02-19 23:16:15 +08:00

46 lines
1.5 KiB
TypeScript

import type { SearchParams } from 'nuqs/server'
import { dehydrate, HydrationBoundary } from '@tanstack/react-query'
import { createLoader } from 'nuqs/server'
import { getQueryClientServer } from '@/context/query-client-server'
import { marketplaceQuery } from '@/service/client'
import { PLUGIN_CATEGORY_WITH_COLLECTIONS } from './constants'
import { marketplaceSearchParamsParsers } from './search-params'
import { getCollectionsParams, getMarketplaceCollectionsAndPlugins } from './utils'
// The server side logic should move to marketplace's codebase so that we can get rid of Next.js
async function getDehydratedState(searchParams?: Promise<SearchParams>) {
if (!searchParams) {
return
}
const loadSearchParams = createLoader(marketplaceSearchParamsParsers)
const params = await loadSearchParams(searchParams)
if (!PLUGIN_CATEGORY_WITH_COLLECTIONS.has(params.category)) {
return
}
const queryClient = getQueryClientServer()
await queryClient.prefetchQuery({
queryKey: marketplaceQuery.collections.queryKey({ input: { query: getCollectionsParams(params.category) } }),
queryFn: () => getMarketplaceCollectionsAndPlugins(getCollectionsParams(params.category)),
})
return dehydrate(queryClient)
}
export async function HydrateQueryClient({
searchParams,
children,
}: {
searchParams: Promise<SearchParams> | undefined
children: React.ReactNode
}) {
const dehydratedState = await getDehydratedState(searchParams)
return (
<HydrationBoundary state={dehydratedState}>
{children}
</HydrationBoundary>
)
}