|
1 | 1 | import { questSlugSchema } from '@/utils/validation-schemas'; |
2 | 2 | import type { Metadata } from 'next'; |
3 | 3 | import { redirect, RedirectType } from 'next/navigation'; |
4 | | -import { getQuestsWithNoCampaignAttached } from 'src/app/lib/getQuestsWithNoCampaignAttached'; |
5 | | -import { siteName } from 'src/app/lib/metadata'; |
6 | | -import { AppPaths, getSiteUrl, JUMPER_QUESTS_PATH } from 'src/const/urls'; |
| 4 | +import { AppPaths, getSiteUrl } from 'src/const/urls'; |
7 | 5 | import { sliceStrToXChar } from 'src/utils/splitStringToXChar'; |
8 | | -import { getStrapiBaseUrl } from 'src/utils/strapi/strapiHelper'; |
9 | | -import { getQuestBySlug } from '../../../lib/getQuestBySlug'; |
10 | 6 |
|
11 | 7 | type Params = Promise<{ slug: string }>; |
12 | 8 |
|
| 9 | +/** |
| 10 | + * Legacy `/quests/:slug` URLs redirect to `/missions/:slug`. |
| 11 | + * Keep metadata cheap (no Strapi): canonical points at missions so crawlers |
| 12 | + * and previews prefer the real URL; avoid indexing the redirect hop. |
| 13 | + */ |
13 | 14 | export async function generateMetadata({ |
14 | 15 | params, |
15 | 16 | }: { |
16 | 17 | params: Params; |
17 | 18 | }): Promise<Metadata> { |
18 | 19 | const { slug } = await params; |
19 | | - |
20 | | - try { |
21 | | - // Validate slug |
22 | | - const slugResult = questSlugSchema.safeParse(slug); |
23 | | - if (!slugResult.success) { |
24 | | - throw new Error('Invalid quest slug'); |
25 | | - } |
26 | | - |
27 | | - const quest = await getQuestBySlug(slugResult.data); |
28 | | - if (!quest || !quest.data) { |
29 | | - throw new Error(); |
30 | | - } |
31 | | - |
32 | | - const questData = quest.data; |
33 | | - const baseUrl = getStrapiBaseUrl(); |
34 | | - |
35 | | - const openGraph: Metadata['openGraph'] = { |
36 | | - title: `Jumper Quest | ${sliceStrToXChar(questData.Title, 45)}`, |
37 | | - description: `${sliceStrToXChar(questData.Information || 'Quest description', 60)}`, |
38 | | - siteName: siteName, |
39 | | - url: `${getSiteUrl()}${JUMPER_QUESTS_PATH}/${slug}`, |
40 | | - images: [ |
41 | | - { |
42 | | - url: `${baseUrl}${questData.Image?.url}`, |
43 | | - width: 900, |
44 | | - height: 450, |
45 | | - alt: 'banner image', |
46 | | - }, |
47 | | - ], |
48 | | - type: 'article', |
49 | | - }; |
50 | | - |
51 | | - return { |
52 | | - title: `Jumper Quest | ${sliceStrToXChar(questData.Title, 45)}`, |
53 | | - description: questData.Subtitle, |
54 | | - alternates: { |
55 | | - canonical: `${getSiteUrl()}${JUMPER_QUESTS_PATH}/${slug}`, |
56 | | - }, |
57 | | - twitter: openGraph, |
58 | | - openGraph, |
59 | | - }; |
60 | | - } catch (err) { |
61 | | - return { |
62 | | - title: `Jumper Quest | ${sliceStrToXChar(slug.replaceAll('-', ' '), 45)}`, |
63 | | - description: `This is the description for the quest "${slug.replaceAll('-', ' ')}".`, |
64 | | - }; |
65 | | - } |
| 20 | + const slugResult = questSlugSchema.safeParse(slug); |
| 21 | + const pathSlug = slugResult.success ? slugResult.data : slug; |
| 22 | + const missionUrl = `${getSiteUrl()}${AppPaths.Missions}/${pathSlug}`; |
| 23 | + const titleFromSlug = sliceStrToXChar(pathSlug.replaceAll('-', ' '), 45); |
| 24 | + |
| 25 | + return { |
| 26 | + title: `Jumper Mission | ${titleFromSlug}`, |
| 27 | + alternates: { |
| 28 | + canonical: missionUrl, |
| 29 | + }, |
| 30 | + robots: { |
| 31 | + index: false, |
| 32 | + follow: true, |
| 33 | + }, |
| 34 | + }; |
66 | 35 | } |
67 | 36 |
|
68 | | -export async function generateStaticParams() { |
69 | | - const { data } = await getQuestsWithNoCampaignAttached(); |
70 | | - |
71 | | - return data.data.map((quest) => ({ slug: quest.Slug })); |
72 | | -} |
73 | | - |
74 | | -export const dynamicParams = true; |
75 | | -export const revalidate = 300; |
76 | | - |
77 | 37 | export default async function Page({ params }: { params: Params }) { |
78 | 38 | const { slug } = await params; |
79 | 39 |
|
|
0 commit comments