|
1 | 1 | import { Suspense } from 'react' |
2 | | -import type { SessionPrincipal } from '@sim/auth/principal' |
3 | | -import { HydrationBoundary } from '@tanstack/react-query' |
4 | 2 | import type { Metadata } from 'next' |
5 | 3 | import { notFound, redirect } from 'next/navigation' |
6 | 4 | import { getSession } from '@/lib/auth' |
7 | 5 | import { WORKSPACE_SETTINGS_PATH } from '@/lib/navigation/paths' |
8 | 6 | import { getOrganizationSurfaceContext } from '@/lib/organizations/surface' |
| 7 | +import { Hydrated } from '@/app/o/[organizationId]/_redesign/hydrated' |
| 8 | +import { loadOrganizationSearchView } from '@/app/o/[organizationId]/search/search-params' |
9 | 9 | import { HomeFallback } from '@/app/workspace/[workspaceId]/home/home-fallback' |
10 | 10 | import { OrganizationSearchSurface } from '@/platform/app/(shell)/search/_components/search-surface/search-surface' |
11 | 11 | import { prefetchSearch } from '@/platform/lib/data/prefetch' |
12 | 12 |
|
13 | 13 | export const metadata: Metadata = { title: 'Search' } |
14 | 14 |
|
15 | | -interface PrefetchedSearchProps { |
16 | | - organizationId: string |
17 | | - principal: SessionPrincipal |
18 | | -} |
19 | | - |
20 | | -/** Holds only its own boundary, so the page's arrangement paints before the read settles. */ |
21 | | -async function PrefetchedSearch({ organizationId, principal }: PrefetchedSearchProps) { |
22 | | - return ( |
23 | | - <HydrationBoundary state={await prefetchSearch(organizationId, principal)}> |
24 | | - <OrganizationSearchSurface userId={principal.userId} /> |
25 | | - </HydrationBoundary> |
26 | | - ) |
27 | | -} |
28 | | - |
29 | 15 | export default async function OrganizationSearchPage({ |
30 | 16 | params, |
| 17 | + searchParams, |
31 | 18 | }: { |
32 | 19 | params: Promise<{ organizationId: string }> |
| 20 | + searchParams: Promise<Record<string, string | string[] | undefined>> |
33 | 21 | }) { |
34 | | - const { organizationId } = await params |
| 22 | + const [{ organizationId }, query] = await Promise.all([params, searchParams]) |
35 | 23 | const session = await getSession() |
36 | 24 | if (!session?.user?.id) notFound() |
37 | 25 | const context = await getOrganizationSurfaceContext(organizationId, session.user.id) |
38 | 26 | if (!context) notFound() |
39 | 27 | if (!context.searchAccess.memberScoped) redirect(WORKSPACE_SETTINGS_PATH) |
| 28 | + const surface = <OrganizationSearchSurface userId={session.user.id} /> |
| 29 | + const { q, mode } = loadOrganizationSearchView(query) |
40 | 30 | return ( |
41 | 31 | <Suspense fallback={<HomeFallback />}> |
42 | | - <PrefetchedSearch |
43 | | - organizationId={organizationId} |
44 | | - principal={{ kind: 'session', userId: session.user.id, sessionId: session.session.id }} |
45 | | - /> |
| 32 | + {q.trim() || mode === 'assistant' ? ( |
| 33 | + surface |
| 34 | + ) : ( |
| 35 | + <Hydrated |
| 36 | + state={prefetchSearch(organizationId, { |
| 37 | + kind: 'session', |
| 38 | + userId: session.user.id, |
| 39 | + sessionId: session.session.id, |
| 40 | + })} |
| 41 | + > |
| 42 | + {surface} |
| 43 | + </Hydrated> |
| 44 | + )} |
46 | 45 | </Suspense> |
47 | 46 | ) |
48 | 47 | } |
0 commit comments