import { AppLayout } from "components/AppLayout"; import { Chip } from "components/Chip"; import { HorizontalLine } from "components/HorizontalLine"; 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 { PreviewLine } from "components/PreviewLine"; import { RecorderChip } from "components/RecorderChip"; import { ThumbnailHeader } from "components/ThumbnailHeader"; import { ToolTip } from "components/ToolTip"; import { GetContentTextQuery } from "graphql/generated"; import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps"; import { getReadySdk } from "graphql/sdk"; import { prettyinlineTitle, prettyLanguage, prettySlug, } from "helpers/formatters"; import { getStatusDescription } from "helpers/others"; import { Immutable } from "helpers/types"; import { useMediaMobile } from "hooks/useMediaQuery"; import { useSmartLanguage } from "hooks/useSmartLanguage"; import { GetStaticPathsContext, GetStaticPathsResult, GetStaticPropsContext, } from "next"; interface Props extends AppStaticProps { content: Exclude< GetContentTextQuery["contents"], null | undefined >["data"][number]["attributes"]; contentId: Exclude< GetContentTextQuery["contents"], null | undefined >["data"][number]["id"]; } export default function Content(props: Immutable): JSX.Element { const { langui, content, languages } = props; const isMobile = useMediaMobile(); const [selectedTextSet, LanguageSwitcher] = useSmartLanguage({ items: content?.text_set, languages: languages, languageExtractor: (item) => item?.language?.data?.attributes?.code, }); const selectedTitle = content?.titles?.[0]; const subPanel = ( {selectedTextSet?.source_language?.data?.attributes && (

{selectedTextSet.source_language.data.attributes.code === selectedTextSet.language?.data?.attributes?.code ? langui.transcript_notice : langui.translation_notice}

{selectedTextSet.source_language.data.attributes.code !== selectedTextSet.language?.data?.attributes?.code && (

{langui.source_language}:

{prettyLanguage( selectedTextSet.source_language.data.attributes.code, languages )}
)}

{langui.status}:

{selectedTextSet.status}
{selectedTextSet.transcribers && selectedTextSet.transcribers.data.length > 0 && (

{langui.transcribers}:

{selectedTextSet.transcribers.data.map((recorder) => ( <> {recorder.attributes && ( )} ))}
)} {selectedTextSet.translators && selectedTextSet.translators.data.length > 0 && (

{langui.translators}:

{selectedTextSet.translators.data.map((recorder) => ( <> {recorder.attributes && ( )} ))}
)} {selectedTextSet.proofreaders && selectedTextSet.proofreaders.data.length > 0 && (

{langui.proofreaders}:

{selectedTextSet.proofreaders.data.map((recorder) => ( <> {recorder.attributes && ( )} ))}
)} {selectedTextSet.notes && (

{"Notes"}:

)}
)} {selectedTextSet && content?.text_set && selectedTextSet.text && ( <> 0 && selectedTitle ? prettyinlineTitle( selectedTitle.pre_title, selectedTitle.title, selectedTitle.subtitle ) : prettySlug(content.slug) } /> )}
); const contentPanel = ( {content && (
} /> {content.previous_recommended?.data?.attributes && (

Previous content

category.attributes?.short ?? "" ) } />
)} {content.next_recommended?.data?.attributes && ( <>

Follow-up content

category.attributes?.short ?? "" ) } /> )}
)}
); 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 ( 0 && content.titles[0] ? prettyinlineTitle( content.titles[0].pre_title, content.titles[0].title, content.titles[0].subtitle ) : prettySlug(content?.slug) } thumbnail={content?.thumbnail?.data?.attributes ?? undefined} contentPanel={contentPanel} subPanel={subPanel} description={description} {...props} /> ); } export async function getStaticProps( context: GetStaticPropsContext ): Promise<{ notFound: boolean } | { props: Props }> { const sdk = getReadySdk(); const slug = context.params?.slug ? context.params.slug.toString() : ""; const content = await sdk.getContentText({ slug: slug, language_code: context.locale ?? "en", }); if (!content.contents || content.contents.data.length === 0) return { notFound: true }; const props: Props = { ...(await getAppStaticProps(context)), content: content.contents.data[0].attributes, contentId: content.contents.data[0].id, }; return { props: props, }; } export async function getStaticPaths( context: GetStaticPathsContext ): Promise { const sdk = getReadySdk(); const contents = await sdk.getContentsSlugs(); const paths: GetStaticPathsResult["paths"] = []; contents.contents?.data.map((item) => { context.locales?.map((local) => { if (item.attributes) paths.push({ params: { slug: item.attributes.slug }, locale: local, }); }); }); return { paths, fallback: "blocking", }; }