Added better description
This commit is contained in:
parent
46c4fece41
commit
97c8670924
|
@ -117,6 +117,8 @@ export function AppLayout(props: Immutable<Props>): JSX.Element {
|
|||
const ogTitle =
|
||||
title ?? navTitle ?? prettySlug(router.asPath.split("/").pop());
|
||||
|
||||
const metaTitle = `${titlePrefix} - ${ogTitle}`;
|
||||
|
||||
const metaDescription = description ?? langui.default_description ?? "";
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -191,16 +193,16 @@ export function AppLayout(props: Immutable<Props>): JSX.Element {
|
|||
mobile:grid-rows-[1fr_5rem] mobile:[grid-template-areas:'content''navbar']`}
|
||||
>
|
||||
<Head>
|
||||
<title>{`${titlePrefix} - ${ogTitle}`}</title>
|
||||
|
||||
<meta
|
||||
name="twitter:title"
|
||||
content={`${titlePrefix} - ${ogTitle}`}
|
||||
></meta>
|
||||
|
||||
<title>{metaTitle}</title>
|
||||
<meta name="description" content={metaDescription} />
|
||||
<meta name="twitter:description" content={metaDescription}></meta>
|
||||
|
||||
<meta name="twitter:title" content={metaTitle}></meta>
|
||||
<meta name="twitter:description" content={metaDescription}></meta>
|
||||
<meta name="twitter:card" content="summary_large_image"></meta>
|
||||
<meta name="twitter:image" content={metaImage.image}></meta>
|
||||
|
||||
<meta property="og:title" content={metaTitle} />
|
||||
<meta property="og:description" content={metaDescription} />
|
||||
<meta property="og:image" content={metaImage.image}></meta>
|
||||
<meta property="og:image:secure_url" content={metaImage.image}></meta>
|
||||
<meta
|
||||
|
@ -213,9 +215,6 @@ export function AppLayout(props: Immutable<Props>): JSX.Element {
|
|||
></meta>
|
||||
<meta property="og:image:alt" content={metaImage.alt}></meta>
|
||||
<meta property="og:image:type" content="image/jpeg"></meta>
|
||||
<meta name="twitter:card" content="summary_large_image"></meta>
|
||||
|
||||
<meta name="twitter:image" content={metaImage.image}></meta>
|
||||
</Head>
|
||||
|
||||
{/* Background when navbar is opened */}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { AppStaticProps } from "graphql/getAppStaticProps";
|
||||
import { getDescription } from "helpers/description";
|
||||
import { prettySlug } from "helpers/formatters";
|
||||
import { getStatusDescription } from "helpers/others";
|
||||
import { Immutable, PostWithTranslations } from "helpers/types";
|
||||
|
@ -168,6 +169,11 @@ export function PostPage(props: Immutable<Props>): JSX.Element {
|
|||
return (
|
||||
<AppLayout
|
||||
navTitle={title}
|
||||
description={getDescription({
|
||||
langui: langui,
|
||||
description: selectedTranslation?.excerpt,
|
||||
categories: post.categories,
|
||||
})}
|
||||
contentPanel={contentPanel}
|
||||
subPanel={subPanel}
|
||||
thumbnail={thumbnail ?? undefined}
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
import { AppStaticProps } from "graphql/getAppStaticProps";
|
||||
import { prettySlug } from "./formatters";
|
||||
import { Content, Immutable } from "./types";
|
||||
|
||||
interface Description {
|
||||
langui: AppStaticProps["langui"];
|
||||
description?: string | null | undefined;
|
||||
type?: Immutable<Content["type"]>;
|
||||
categories?: Immutable<Content["categories"]>;
|
||||
}
|
||||
|
||||
export function getDescription(props: Description): string {
|
||||
const { langui, description: text, type, categories } = props;
|
||||
|
||||
let description = "";
|
||||
|
||||
// TEXT
|
||||
if (text) {
|
||||
description += prettyMarkdown(text);
|
||||
description += "\n\n";
|
||||
}
|
||||
|
||||
// TYPE
|
||||
if (type?.data) {
|
||||
description += `${langui.type}: `;
|
||||
|
||||
description += `(${
|
||||
type.data.attributes?.titles?.[0]?.title ??
|
||||
prettySlug(type.data.attributes?.slug)
|
||||
})`;
|
||||
|
||||
description += "\n";
|
||||
}
|
||||
|
||||
// CATEGORIES
|
||||
if (categories?.data && categories.data.length > 0) {
|
||||
description += `${langui.categories}: `;
|
||||
description += prettyChip(
|
||||
categories.data.map((category) => category.attributes?.short)
|
||||
);
|
||||
|
||||
description += "\n";
|
||||
}
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
function prettyMarkdown(markdown: string): string {
|
||||
return markdown.replace(/[*]/gu, "").replace(/[_]/gu, "");
|
||||
}
|
||||
|
||||
function prettyChip(items: (string | undefined)[]): string {
|
||||
return items
|
||||
.filter((item) => item !== undefined)
|
||||
.map((item) => `(${item})`)
|
||||
.join(" ");
|
||||
}
|
|
@ -9,7 +9,7 @@ export interface PostWithTranslations extends Omit<Post, "translations"> {
|
|||
translations: NonNullable<Post["translations"]>;
|
||||
}
|
||||
|
||||
type Content = NonNullable<
|
||||
export type Content = NonNullable<
|
||||
NonNullable<GetContentTextQuery["contents"]>["data"][number]["attributes"]
|
||||
>;
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ import { ToolTip } from "components/ToolTip";
|
|||
import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { getNextContent, getPreviousContent } from "helpers/contents";
|
||||
import { getDescription } from "helpers/description";
|
||||
import {
|
||||
prettyinlineTitle,
|
||||
prettyLanguage,
|
||||
|
@ -389,24 +390,6 @@ export default function Content(props: Immutable<Props>): JSX.Element {
|
|||
</ContentPanel>
|
||||
);
|
||||
|
||||
let description = "";
|
||||
if (content.type?.data) {
|
||||
description += `${langui.type}: `;
|
||||
|
||||
description +=
|
||||
content.type.data.attributes?.titles?.[0]?.title ??
|
||||
prettySlug(content.type.data.attributes?.slug);
|
||||
|
||||
description += "\n";
|
||||
}
|
||||
if (content.categories?.data && content.categories.data.length > 0) {
|
||||
description += `${langui.categories}: `;
|
||||
description += content.categories.data
|
||||
.map((category) => category.attributes?.short)
|
||||
.join(" | ");
|
||||
description += "\n";
|
||||
}
|
||||
|
||||
return (
|
||||
<AppLayout
|
||||
navTitle={
|
||||
|
@ -418,10 +401,15 @@ export default function Content(props: Immutable<Props>): JSX.Element {
|
|||
)
|
||||
: prettySlug(content.slug)
|
||||
}
|
||||
description={getDescription({
|
||||
langui: langui,
|
||||
description: selectedTranslation?.description,
|
||||
type: content.type,
|
||||
categories: content.categories,
|
||||
})}
|
||||
thumbnail={content.thumbnail?.data?.attributes ?? undefined}
|
||||
contentPanel={contentPanel}
|
||||
subPanel={subPanel}
|
||||
description={description}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -244,20 +244,8 @@ export async function getStaticProps(
|
|||
});
|
||||
if (!contents.contents) return { notFound: true };
|
||||
contents.contents.data.sort((a, b) => {
|
||||
const titleA = a.attributes?.translations?.[0]
|
||||
? prettyinlineTitle(
|
||||
a.attributes.translations[0].pre_title,
|
||||
a.attributes.translations[0].title,
|
||||
a.attributes.translations[0].subtitle
|
||||
)
|
||||
: a.attributes?.slug ?? "";
|
||||
const titleB = b.attributes?.translations?.[0]
|
||||
? prettyinlineTitle(
|
||||
b.attributes.translations[0].pre_title,
|
||||
b.attributes.translations[0].title,
|
||||
b.attributes.translations[0].subtitle
|
||||
)
|
||||
: b.attributes?.slug ?? "";
|
||||
const titleA = a.attributes?.slug ?? "";
|
||||
const titleB = b.attributes?.slug ?? "";
|
||||
return titleA.localeCompare(titleB);
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue