import type { FC, ReactElement, ReactNode } from 'react';
import { useIntl } from 'react-intl';
import type { PageLink } from '../../../../types';
import { getReadingTimeFrom } from '../../../../utils/helpers';
import { Link, Time, VisuallyHidden } from '../../../atoms';
import {
CardMeta,
type CardMetaProps,
MetaItem,
type MetaItemProps,
} from '../../../molecules';
const a11y = (chunks: ReactNode) => {chunks};
export type PostPreviewMetaComment = {
/**
* The number of comments.
*/
count: number;
/**
* The post heading (used to generate an accessible label).
*/
postHeading: string;
/**
* An url to the comments section.
*/
url?: string;
};
export type PostPreviewMetaData = {
/**
* The author name.
*/
author?: string;
/**
* The number of comments on the post and eventually an url to read them.
*/
comments?: PostPreviewMetaComment;
/**
* The publication date of the post.
*/
publicationDate?: string;
/**
* The thematics attached to the post.
*/
thematics?: PageLink[];
/**
* The topics attached to the post.
*/
topics?: PageLink[];
/**
* The last modification date of the post.
*/
updateDate?: string;
/**
* The number of words in the post.
*/
wordsCount?: number;
};
export type PostPreviewMetaProps = Omit & {
/**
* The post meta.
*/
meta: PostPreviewMetaData;
};
export const PostPreviewMeta: FC = ({
meta,
...props
}) => {
const intl = useIntl();
const getAuthor = (author: string): ReactElement => (
);
const getComments = (
comments: PostPreviewMetaComment
): ReactElement => {
const commentsLabel = intl.formatMessage(
{
defaultMessage:
'{commentsCount, plural, =0 {No comments} one {# comment} other {# comments}} about {title}',
description: 'PostPreviewMeta: comments count',
id: 'NfAn9N',
},
{
a11y,
commentsCount: comments.count,
title: comments.postHeading,
}
);
return (
{commentsLabel}
) : (
<>{commentsLabel}>
)
}
/>
);
};
const getPublicationDate = (date: string): ReactElement => (
}
/>
);
const getThematics = (thematics: PageLink[]): ReactElement => (
{
return {
id: `thematic-${thematic.id}`,
value: {thematic.name},
};
})}
/>
);
const getTopics = (topics: PageLink[]): ReactElement => (
{
return {
id: `topic-${topic.id}`,
value: {topic.name},
};
})}
/>
);
const getUpdateDate = (date: string): ReactElement => (
}
/>
);
const getReadingTime = (wordsCount: number): ReactElement => (
);
return (
{meta.author ? getAuthor(meta.author) : null}
{meta.publicationDate ? getPublicationDate(meta.publicationDate) : null}
{meta.updateDate && meta.updateDate !== meta.publicationDate
? getUpdateDate(meta.updateDate)
: null}
{meta.wordsCount ? getReadingTime(meta.wordsCount) : null}
{meta.thematics ? getThematics(meta.thematics) : null}
{meta.topics ? getTopics(meta.topics) : null}
{meta.comments ? getComments(meta.comments) : null}
);
};