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 { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps"; import { getReadySdk } from "graphql/sdk"; import { getNextContent, getPreviousContent } from "helpers/contents"; import { prettyinlineTitle, prettyLanguage, prettySlug, } from "helpers/formatters"; import { getStatusDescription } from "helpers/others"; import { ContentWithTranslations, Immutable } from "helpers/types"; import { useMediaMobile } from "hooks/useMediaQuery"; import { AnchorIds, useScrollTopOnChange } from "hooks/useScrollTopOnChange"; import { useSmartLanguage } from "hooks/useSmartLanguage"; import { GetStaticPathsContext, GetStaticPathsResult, GetStaticPropsContext, } from "next"; import { Fragment } from "react"; interface Props extends AppStaticProps { content: ContentWithTranslations; } export default function Content(props: Immutable): JSX.Element { const { langui, content, languages } = props; const isMobile = useMediaMobile(); const [selectedTranslation, LanguageSwitcher] = useSmartLanguage({ items: content.translations, languages: languages, languageExtractor: (item) => item.language?.data?.attributes?.code, }); useScrollTopOnChange(AnchorIds.ContentPanel, [selectedTranslation]); const previousContent = content.group?.data?.attributes?.contents ? getPreviousContent( content.group.data.attributes.contents.data, content.slug ) : undefined; const nextContent = content.group?.data?.attributes?.contents ? getNextContent(content.group.data.attributes.contents.data, content.slug) : undefined; const subPanel = ( {selectedTranslation?.text_set && (

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

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

{langui.source_language}:

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

{langui.status}:

{selectedTranslation.text_set.status}
{selectedTranslation.text_set.transcribers && selectedTranslation.text_set.transcribers.data.length > 0 && (

{langui.transcribers}:

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

{langui.translators}:

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

{langui.proofreaders}:

{selectedTranslation.text_set.proofreaders.data.map( (recorder) => ( {recorder.attributes && ( )} ) )}
)} {selectedTranslation.text_set.notes && (

{"Notes"}:

)}
)} {selectedTranslation?.text_set?.text && ( <> )}
); const contentPanel = (
} /> {previousContent?.attributes && (

{langui.previous_content}

category.attributes?.short ?? "" ) } />
)} {nextContent?.attributes && ( <>

{langui.followup_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 ( ); } 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[0]?.attributes?.translations ) { return { notFound: true }; } const props: Props = { ...(await getAppStaticProps(context)), content: content.contents.data[0].attributes as ContentWithTranslations, }; 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", }; }