import { HtmlMetaDescriptor } from 'remix';
type SocialSite = {
title: string;
twitter?: string;
};
type SocialArticle = {
origin: string;
url: string;
// TODO: canonical
title: string;
description?: string;
image?: string;
twitter?: string;
keywords?: string[];
};
function allDefined(meta: Record): HtmlMetaDescriptor {
return Object.fromEntries(
Object.entries(meta).filter(([, v]) => v),
) as HtmlMetaDescriptor;
}
export function getMetaTagsForSite({ title, twitter }: SocialSite): HtmlMetaDescriptor {
const meta = {
title,
'twitter:site': twitter ? `@${twitter.replace('@', '')}` : undefined,
};
return allDefined(meta);
}
export function getMetaTagsForArticle({
origin,
url,
title,
description,
image,
twitter,
keywords,
}: SocialArticle): HtmlMetaDescriptor {
const meta = {
title,
description,
keywords: keywords?.join(', '),
image,
'og:url': origin && url ? `${origin}${url}` : undefined,
'og:title': title,
'og:description': description,
'og:image': image,
'twitter:card': image ? 'summary_large_image' : 'summary',
'twitter:creator': twitter ? `@${twitter.replace('@', '')}` : undefined,
'twitter:title': title,
'twitter:description': description,
'twitter:image': image,
'twitter:alt': title,
};
return allDefined(meta);
}