Some checks failed
Branch Build CE / Build Setup (push) Has been cancelled
Branch Build CE / Build-Push Admin Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Web Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Space Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Live Collaboration Docker Image (push) Has been cancelled
Branch Build CE / Build-Push API Server Docker Image (push) Has been cancelled
Branch Build CE / Build-Push Proxy Docker Image (push) Has been cancelled
Branch Build CE / Build-Push AIO Docker Image (push) Has been cancelled
Branch Build CE / Upload Build Assets (push) Has been cancelled
Branch Build CE / Build Release (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Codespell / Check for spelling errors (push) Has been cancelled
Sync Repositories / sync_changes (push) Has been cancelled
Synced from upstream: 8853637e981ed7d8a6cff32bd98e7afe20f54362
55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
"use server";
|
|
|
|
type Props = {
|
|
children: React.ReactNode;
|
|
params: {
|
|
anchor: string;
|
|
};
|
|
};
|
|
|
|
// TODO: Convert into SSR in order to generate metadata
|
|
export async function generateMetadata({ params }: Props) {
|
|
const { anchor } = params;
|
|
const DEFAULT_TITLE = "Plane";
|
|
const DEFAULT_DESCRIPTION = "Made with Plane, an AI-powered work management platform with publishing capabilities.";
|
|
// Validate anchor before using in request (only allow alphanumeric, -, _)
|
|
const ANCHOR_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
if (!ANCHOR_REGEX.test(anchor)) {
|
|
return { title: DEFAULT_TITLE, description: DEFAULT_DESCRIPTION };
|
|
}
|
|
try {
|
|
const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/public/anchor/${anchor}/meta/`);
|
|
const data = await response.json();
|
|
return {
|
|
title: data?.name || DEFAULT_TITLE,
|
|
description: data?.description || DEFAULT_DESCRIPTION,
|
|
openGraph: {
|
|
title: data?.name || DEFAULT_TITLE,
|
|
description: data?.description || DEFAULT_DESCRIPTION,
|
|
type: "website",
|
|
images: [
|
|
{
|
|
url: data?.cover_image,
|
|
width: 800,
|
|
height: 600,
|
|
alt: data?.name || DEFAULT_TITLE,
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: data?.name || DEFAULT_TITLE,
|
|
description: data?.description || DEFAULT_DESCRIPTION,
|
|
images: [data?.cover_image],
|
|
},
|
|
};
|
|
} catch {
|
|
return { title: DEFAULT_TITLE, description: DEFAULT_DESCRIPTION };
|
|
}
|
|
}
|
|
|
|
export default async function IssuesLayout(_props: Props) {
|
|
// return <IssuesClientLayout params={{ anchor }}>{children}</IssuesClientLayout>;
|
|
return null;
|
|
}
|