import { config } from '@config/website';
import { ArticleMeta } from '@ts/types/articles';
import { getFormattedDate } from '@utils/helpers/format';
import Link from 'next/link';
import { useRouter } from 'next/router';
import { useIntl } from 'react-intl';
import styles from './PostMeta.module.scss';
type PostMetaMode = 'list' | 'single';
const PostMeta = ({
meta,
mode = 'list',
}: {
meta: ArticleMeta;
mode?: PostMetaMode;
}) => {
const {
author,
commentCount,
dates,
readingTime,
results,
thematics,
topics,
website,
wordsCount,
} = meta;
const intl = useIntl();
const router = useRouter();
const locale = router.locale ? router.locale : config.locales.defaultLocale;
const isThematic = () => router.asPath.includes('/thematique/');
const isArticle = () => router.asPath.includes('/article/');
const getTopics = () => {
return (
topics &&
topics.map((topic) => {
return (
{topic.title}
);
})
);
};
const getThematics = () => {
return (
thematics &&
thematics.map((thematic) => {
return (
{thematic.title}
);
})
);
};
const getCommentsCount = () => {
return intl.formatMessage(
{
defaultMessage:
'{commentCount, plural, =0 {No comments} one {# comment} other {# comments}}',
description: 'PostMeta: comment count value',
},
{ commentCount }
);
};
const getReadingTime = () => {
if (!readingTime) return;
if (readingTime < 0)
return intl.formatMessage({
defaultMessage: 'less than 1 minute',
description: 'PostMeta: Reading time value',
});
return intl.formatMessage(
{
defaultMessage:
'{readingTime, plural, =0 {# minutes} one {# minute} other {# minutes}}',
description: 'PostMeta: reading time value',
},
{ readingTime }
);
};
const getDates = () => {
if (!dates) return <>>;
const publicationDate = getFormattedDate(dates.publication, locale);
const updateDate = getFormattedDate(dates.update, locale);
return (
<>
{intl.formatMessage({
defaultMessage: 'Published on:',
description: 'PostMeta: publication date label',
})}
{publicationDate !== updateDate && (
{intl.formatMessage({
defaultMessage: 'Updated on:',
description: 'PostMeta: update date label',
})}
)}
>
);
};
const wrapperClass = styles[`wrapper--${mode}`];
return (
{author && (
-
{intl.formatMessage({
defaultMessage: 'Written by:',
description: 'Article meta',
})}
- {author.name}
)}
{getDates()}
{readingTime !== undefined && wordsCount !== undefined && (
-
{intl.formatMessage({
defaultMessage: 'Reading time:',
description: 'Article meta',
})}
-
{getReadingTime()}
)}
{results && (
-
{intl.formatMessage({
defaultMessage: 'Total:',
description: 'Article meta',
})}
-
{intl.formatMessage(
{
defaultMessage:
'{results, plural, =0 {No articles} one {# article} other {# articles}}',
description: 'PostMeta: total found articles',
},
{ results }
)}
)}
{!isThematic() && thematics && thematics.length > 0 && (
-
{intl.formatMessage(
{
defaultMessage:
'{thematicsCount, plural, =0 {Thematics:} one {Thematic:} other {Thematics:}}',
description: 'PostMeta: thematics list label',
},
{ thematicsCount: thematics.length }
)}
{getThematics()}
)}
{isThematic() && topics && topics.length > 0 && (
-
{intl.formatMessage(
{
defaultMessage:
'{topicsCount, plural, =0 {Topics:} one {Topic:} other {Topics:}}',
description: 'PostMeta: topics list label',
},
{ topicsCount: topics.length }
)}
{getTopics()}
)}
{website && (
-
{intl.formatMessage({
defaultMessage: 'Website:',
description: 'PostMeta: website label',
})}
-
{website}
)}
{commentCount !== undefined && (
-
{intl.formatMessage({
defaultMessage: 'Comments:',
description: 'PostMeta: comment count label',
})}
-
{isArticle() ? (
{getCommentsCount()}
) : (
getCommentsCount()
)}
)}
);
};
export default PostMeta;