-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpage.tsx
More file actions
69 lines (56 loc) · 1.64 KB
/
page.tsx
File metadata and controls
69 lines (56 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { cache } from "react";
import type { Metadata } from "next/types";
import { createClient } from "@/utils/supabase/server";
import { siteConfig } from "@/config/site";
import { generateListingMetadata } from "@/utils/listingUtils";
import MapPageClient from "@/features/map";
import type { Listing } from "@/types/listing";
type MapPageSearchParams = {
listing?: string;
};
type MapPageProps = {
searchParams: Promise<MapPageSearchParams>;
};
const getInitialData = cache(async (listingSlug: string | undefined) => {
const supabase = await createClient();
const {
data: { user },
} = await supabase.auth.getUser();
const listingResponse = listingSlug
? await supabase
.from(user ? "listings_private_data" : "listings_public_data")
.select()
.eq("slug", listingSlug)
.single()
: null;
return {
user,
listing: (listingResponse?.data ?? null) as Listing | null,
};
});
export async function generateMetadata({
searchParams,
}: MapPageProps): Promise<Metadata> {
const listingSlug = (await searchParams)?.listing;
if (!listingSlug) {
return {
title: "Map",
openGraph: {
title: `Map · ${siteConfig.name}`,
},
};
}
const { user, listing } = await getInitialData(listingSlug);
return generateListingMetadata(listing, user);
}
export default async function Page({ searchParams }: MapPageProps) {
const listingSlug = (await searchParams)?.listing;
const { user, listing } = await getInitialData(listingSlug);
return (
<MapPageClient
user={user}
initialListingSlug={listingSlug ?? null}
initialListing={listing}
/>
);
}