accords-library.com/src/pages/news/[slug].tsx

184 lines
5.2 KiB
TypeScript
Raw Normal View History

2022-03-17 16:05:34 +00:00
import AppLayout from "components/AppLayout";
import Chip from "components/Chip";
import ThumbnailHeader from "components/Content/ThumbnailHeader";
import HorizontalLine from "components/HorizontalLine";
import LanguageSwitcher from "components/LanguageSwitcher";
2022-03-17 16:05:34 +00:00
import Markdawn from "components/Markdown/Markdawn";
import TOC from "components/Markdown/TOC";
import ReturnButton, {
ReturnButtonType,
} from "components/PanelComponents/ReturnButton";
import ContentPanel from "components/Panels/ContentPanel";
import SubPanel from "components/Panels/SubPanel";
import RecorderChip from "components/RecorderChip";
import ToolTip from "components/ToolTip";
import { GetPostQuery } from "graphql/generated";
import { getReadySdk } from "graphql/sdk";
import {
GetStaticPathsContext,
GetStaticPathsResult,
GetStaticPropsContext,
} from "next";
2022-03-17 16:05:34 +00:00
import { useRouter } from "next/router";
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
import {
getLocalesFromLanguages,
getStatusDescription,
prettySlug,
} from "queries/helpers";
2022-03-17 16:05:34 +00:00
2022-04-03 08:34:21 +00:00
interface Props extends AppStaticProps {
post: Exclude<
GetPostQuery["posts"],
null | undefined
>["data"][number]["attributes"];
postId: Exclude<
GetPostQuery["posts"],
null | undefined
>["data"][number]["id"];
2022-03-17 16:05:34 +00:00
}
2022-04-03 08:34:21 +00:00
export default function LibrarySlug(props: Props): JSX.Element {
const { post, langui } = props;
const locales = getLocalesFromLanguages(post?.translations_languages);
2022-03-17 16:05:34 +00:00
const router = useRouter();
const thumbnail = post?.translations?.[0]?.thumbnail?.data
? post.translations[0].thumbnail.data.attributes
: post?.thumbnail?.data
? post.thumbnail.data.attributes
: undefined;
const body = post?.translations?.[0]?.body ?? "";
const title = post?.translations?.[0]?.title ?? prettySlug(post?.slug);
const except = post?.translations?.[0]?.excerpt ?? "";
2022-03-18 13:10:30 +00:00
2022-03-17 16:05:34 +00:00
const subPanel = (
<SubPanel>
<ReturnButton
href="/news"
title={langui.news}
langui={langui}
displayOn={ReturnButtonType.desktop}
2022-03-17 16:05:34 +00:00
horizontalLine
/>
{post?.translations?.[0] && (
2022-03-17 16:05:34 +00:00
<div className="grid grid-flow-col place-items-center place-content-center gap-2">
<p className="font-headers">{langui.status}:</p>
<ToolTip
content={getStatusDescription(post.translations[0].status, langui)}
maxWidth={"20rem"}
>
<Chip>{post.translations[0].status}</Chip>
</ToolTip>
</div>
)}
{post?.authors && post.authors.data.length > 0 && (
2022-03-17 16:05:34 +00:00
<div>
<p className="font-headers">{"Authors"}:</p>
<div className="grid place-items-center place-content-center gap-2">
{post.authors.data.map((author) => (
<>
{author.attributes && (
<RecorderChip
key={author.id}
langui={langui}
recorder={author.attributes}
/>
)}
</>
2022-03-17 16:05:34 +00:00
))}
</div>
</div>
)}
<HorizontalLine />
<TOC text={body} title={title} />
2022-03-17 16:05:34 +00:00
</SubPanel>
);
const contentPanel = (
<ContentPanel>
<ReturnButton
href="/news"
title={langui.news}
langui={langui}
displayOn={ReturnButtonType.mobile}
2022-03-17 16:05:34 +00:00
className="mb-10"
/>
<ThumbnailHeader
2022-03-18 13:10:30 +00:00
thumbnail={thumbnail}
title={title}
description={except}
2022-03-17 16:05:34 +00:00
langui={langui}
categories={post?.categories}
2022-03-17 16:05:34 +00:00
/>
<HorizontalLine />
{locales.includes(router.locale ?? "en") ? (
<Markdawn text={body} />
) : (
<LanguageSwitcher
locales={locales}
languages={props.languages}
langui={props.langui}
/>
2022-03-17 16:05:34 +00:00
)}
</ContentPanel>
);
return (
<AppLayout
navTitle={title}
2022-03-17 16:05:34 +00:00
contentPanel={contentPanel}
subPanel={subPanel}
thumbnail={thumbnail ?? undefined}
2022-03-17 16:05:34 +00:00
{...props}
/>
);
}
export async function getStaticProps(
context: GetStaticPropsContext
2022-04-03 08:34:21 +00:00
): Promise<{ notFound: boolean } | { props: Props }> {
const sdk = getReadySdk();
const slug = context.params?.slug ? context.params.slug.toString() : "";
const post = await sdk.getPost({
slug: slug,
language_code: context.locale ?? "en",
});
if (!post.posts?.data[0]) return { notFound: true };
2022-04-03 08:34:21 +00:00
const props: Props = {
2022-03-17 16:05:34 +00:00
...(await getAppStaticProps(context)),
post: post.posts.data[0].attributes,
postId: post.posts.data[0].id,
2022-03-17 16:05:34 +00:00
};
return {
props: props,
};
}
2022-03-17 16:05:34 +00:00
export async function getStaticPaths(
context: GetStaticPathsContext
): Promise<GetStaticPathsResult> {
const sdk = getReadySdk();
const posts = await sdk.getPostsSlugs();
const paths: GetStaticPathsResult["paths"] = [];
if (posts.posts)
posts.posts.data.map((item) => {
context.locales?.map((local) => {
if (item.attributes)
paths.push({ params: { slug: item.attributes.slug }, locale: local });
});
2022-03-17 16:05:34 +00:00
});
return {
paths,
fallback: "blocking",
2022-03-17 16:05:34 +00:00
};
}