aboutsummaryrefslogtreecommitdiffstats
path: root/src/pages
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-01-20 11:57:16 +0100
committerArmand Philippot <git@armandphilippot.com>2022-01-20 11:57:16 +0100
commitf5ba1046b13acd239c472e361f345902937662fb (patch)
treed2468fa51f3d2f9dda61eb9cdf6594ad8e618352 /src/pages
parent08855874397399459b281f6f0506fa5e91cdfdc0 (diff)
chore: add a page for projects
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/projets.tsx108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/pages/projets.tsx b/src/pages/projets.tsx
new file mode 100644
index 0000000..0c04024
--- /dev/null
+++ b/src/pages/projets.tsx
@@ -0,0 +1,108 @@
+import { getLayout } from '@components/Layouts/Layout';
+import PostHeader from '@components/PostHeader/PostHeader';
+import ProjectsList from '@components/ProjectsList/ProjectsList';
+import { seo } from '@config/seo';
+import { config } from '@config/website';
+import PageContent, { intro, meta } from '@content/pages/projects.mdx';
+import styles from '@styles/pages/Projects.module.scss';
+import { Project } from '@ts/types/app';
+import { loadTranslation } from '@utils/helpers/i18n';
+import { getSortedProjects } from '@utils/helpers/projects';
+import { GetStaticProps, GetStaticPropsContext } from 'next';
+import Head from 'next/head';
+import { useRouter } from 'next/router';
+import { Article, Graph, WebPage } from 'schema-dts';
+
+const Projects = ({ projects }: { projects: Project[] }) => {
+ const dates = {
+ publication: meta.publishedOn,
+ update: meta.updatedOn,
+ };
+ const publicationDate = new Date(dates.publication);
+ const updateDate = new Date(dates.update);
+ const router = useRouter();
+ const pageUrl = `${config.url}${router.asPath}`;
+
+ const webpageSchema: WebPage = {
+ '@id': `${pageUrl}`,
+ '@type': 'WebPage',
+ breadcrumb: { '@id': `${config.url}/#breadcrumb` },
+ name: seo.legalNotice.title,
+ description: seo.legalNotice.description,
+ inLanguage: config.locales.defaultLocale,
+ license: 'https://creativecommons.org/licenses/by-sa/4.0/deed.fr',
+ reviewedBy: { '@id': `${config.url}/#branding` },
+ url: `${pageUrl}`,
+ isPartOf: {
+ '@id': `${config.url}`,
+ },
+ };
+
+ const articleSchema: Article = {
+ '@id': `${config.url}/#projects`,
+ '@type': 'Article',
+ name: meta.title,
+ description: intro,
+ author: { '@id': `${config.url}/#branding` },
+ copyrightYear: publicationDate.getFullYear(),
+ creator: { '@id': `${config.url}/#branding` },
+ dateCreated: publicationDate.toISOString(),
+ dateModified: updateDate.toISOString(),
+ datePublished: publicationDate.toISOString(),
+ editor: { '@id': `${config.url}/#branding` },
+ inLanguage: config.locales.defaultLocale,
+ license: 'https://creativecommons.org/licenses/by-sa/4.0/deed.fr',
+ mainEntityOfPage: { '@id': `${pageUrl}` },
+ };
+
+ const schemaJsonLd: Graph = {
+ '@context': 'https://schema.org',
+ '@graph': [webpageSchema, articleSchema],
+ };
+
+ return (
+ <>
+ <Head>
+ <title>{seo.projects.title}</title>
+ <meta name="description" content={seo.projects.description} />
+ <meta property="og:url" content={`${pageUrl}`} />
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={meta.title} />
+ <meta property="og:description" content={intro} />
+ <script
+ type="application/ld+json"
+ dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaJsonLd) }}
+ ></script>
+ </Head>
+ <article id="projects" className={styles.article}>
+ <PostHeader title={meta.title} intro={<PageContent />} />
+ <div className={styles.body}>
+ {projects.length > 0 && <ProjectsList projects={projects} />}
+ </div>
+ </article>
+ </>
+ );
+};
+
+Projects.getLayout = getLayout;
+
+export const getStaticProps: GetStaticProps = async (
+ context: GetStaticPropsContext
+) => {
+ const translation = await loadTranslation(
+ context.locale!,
+ process.env.NODE_ENV === 'production'
+ );
+ const breadcrumbTitle = meta.title;
+ const projects: Project[] = await getSortedProjects();
+
+ return {
+ props: {
+ breadcrumbTitle,
+ projects,
+ translation,
+ },
+ };
+};
+
+export default Projects;