({ fromLevel: 2 });
const { dates, intro, seo, title } = meta;
const { items: breadcrumbItems, schema: breadcrumbSchema } =
useBreadcrumbs(title);
const messages = {
image: {
caption: intl.formatMessage(
{
defaultMessage: 'Download the CV in PDF',
id: 'fN04AJ',
description: 'CVPage: download CV in PDF text',
},
{
link: DownloadLink,
}
),
title: intl.formatMessage({
defaultMessage: 'Others formats',
description: 'CVPage: cv preview widget title',
id: 'B9OCyV',
}),
},
socialMedia: {
github: intl.formatMessage({
defaultMessage: 'Github profile',
description: 'CVPage: Github profile link',
id: 'Jm0a6H',
}),
gitlab: intl.formatMessage({
defaultMessage: 'Gitlab profile',
description: 'CVPage: Gitlab profile link',
id: '++U2Hm',
}),
linkedin: intl.formatMessage({
defaultMessage: 'LinkedIn profile',
description: 'CVPage: LinkedIn profile link',
id: 'Sm2wCk',
}),
title: intl.formatMessage({
defaultMessage: 'Open-source projects',
description: 'CVPage: social media widget title',
id: '+Dre5J',
}),
},
toc: {
title: intl.formatMessage({
defaultMessage: 'Table of Contents',
description: 'PageLayout: table of contents title',
id: 'eys2uX',
}),
},
};
const jsonLd = getSchemaFrom([
getAboutPageGraph({
breadcrumb: breadcrumbSchema,
copyrightYear: new Date(dates.publication).getFullYear(),
cover: data.image.src,
dates,
description: intro,
slug: ROUTES.CV,
title,
}),
]);
const page = {
title: `${seo.title} - ${CONFIG.name}`,
url: `${CONFIG.url}${ROUTES.CV}`,
};
return (
{page.title}
{/*eslint-disable-next-line react/jsx-no-literals -- Name allowed */}
{/*eslint-disable-next-line react/jsx-no-literals -- Content allowed */}
{messages.toc.title}}
tree={tree}
/>
{messages.image.title}
}
img={}
/>
{messages.socialMedia.title}
}
media={[
{
icon: 'Github',
id: 'github',
label: messages.socialMedia.github,
url: PERSONAL_LINKS.GITHUB,
},
{
icon: 'Gitlab',
id: 'gitlab',
label: messages.socialMedia.gitlab,
url: PERSONAL_LINKS.GITLAB,
},
]}
/>
);
};
CVPage.getLayout = (page) => getLayout(page);
export const getStaticProps: GetStaticProps = async ({ locale }) => {
const translation = await loadTranslation(locale);
return {
props: {
translation,
},
};
};
export default CVPage;
='#n70'>70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { getLayout } from '@components/Layouts/Layout';
import { seo } from '@config/seo';
import { NextPageWithLayout } from '@ts/types/app';
import { loadTranslation } from '@utils/helpers/i18n';
import { GetStaticProps, GetStaticPropsContext } from 'next';
import Head from 'next/head';
import CVContent, { intro, meta, pdf, image } from '@content/pages/cv.mdx';
import PostHeader from '@components/PostHeader/PostHeader';
import { ArticleMeta } from '@ts/types/articles';
import styles from '@styles/pages/Page.module.scss';
import { CVPreview, SocialMedia, ToC } from '@components/Widgets';
import { t } from '@lingui/macro';
import Sidebar from '@components/Sidebar/Sidebar';
import { AboutPage, Graph, WebPage } from 'schema-dts';
import { config } from '@config/website';
import { useRouter } from 'next/router';
const CV: NextPageWithLayout = () => {
const router = useRouter();
const dates = {
publication: meta.publishedOn,
update: meta.updatedOn,
};
const pageMeta: ArticleMeta = {
dates,
};
const webpageSchema: WebPage = {
'@id': `${config.url}${router.asPath}`,
'@type': 'WebPage',
breadcrumb: { '@id': `${config.url}/#breadcrumb` },
name: seo.cv.title,
description: seo.cv.description,
reviewedBy: { '@id': `${config.url}/#branding` },
url: `${config.url}${router.asPath}`,
isPartOf: {
'@id': `${config.url}`,
},
};
const publicationDate = new Date(dates.publication);
const updateDate = new Date(dates.update);
const cvSchema: AboutPage = {
'@id': `${config.url}/#cv`,
'@type': 'AboutPage',
name: `${config.name} CV`,
description: intro,
author: { '@id': `${config.url}/#branding` },
creator: { '@id': `${config.url}/#branding` },
dateCreated: publicationDate.toISOString(),
dateModified: updateDate.toISOString(),
datePublished: publicationDate.toISOString(),
editor: { '@id': `${config.url}/#branding` },
image,
inLanguage: config.locales.defaultLocale,
license: 'https://creativecommons.org/licenses/by-sa/4.0/deed.fr',
thumbnailUrl: image,
mainEntityOfPage: { '@id': `${config.url}${router.asPath}` },
};
const schemaJsonLd: Graph = {
'@context': 'https://schema.org',
'@graph': [webpageSchema, cvSchema],
};
return (
<>
<Head>
<title>{seo.cv.title}</title>
<meta name="description" content={seo.cv.description} />
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaJsonLd) }}
></script>
</Head>
<article
id="cv"
className={`${styles.article} ${styles['article--no-comments']}`}
>
<PostHeader intro={intro} meta={pageMeta} title={meta.title} />
<Sidebar position="left">
<ToC />
</Sidebar>
<div className={styles.body}>
<CVContent />
</div>
<Sidebar position="right">
<CVPreview title={t`Other formats`} imgSrc={image} pdf={pdf} />
<SocialMedia
title={t`Open-source projects`}
github={true}
gitlab={true}
/>
</Sidebar>
</article>
</>
);
};
CV.getLayout = getLayout;
export const getStaticProps: GetStaticProps = async (
context: GetStaticPropsContext
) => {
const translation = await loadTranslation(
context.locale!,
process.env.NODE_ENV === 'production'
);
const breadcrumbTitle = meta.title;
return {
props: {
breadcrumbTitle,
translation,
},
};
};
export default CV;
|