@paperbits/common
Version:
Paperbits common components.
54 lines (40 loc) • 2.32 kB
text/typescript
import { HtmlPage } from "./htmlPage";
import { HtmlPagePublisherPlugin } from "./htmlPagePublisherPlugin";
import { IMediaService } from "../media";
export class SocialShareDataHtmlPagePublisherPlugin implements HtmlPagePublisherPlugin {
constructor(private readonly mediaService: IMediaService) { }
private appendLink(document: Document, rel: string, href: string): void {
const canonicalLinkElement: HTMLStyleElement = document.createElement("link");
canonicalLinkElement.setAttribute("rel", rel);
canonicalLinkElement.setAttribute("href", href);
document.head.appendChild(canonicalLinkElement);
}
private appendMetaTag(document: Document, name: string, content: string): void {
const element: HTMLMetaElement = document.createElement("meta");
element.setAttribute("name", name);
element.setAttribute("content", content);
document.head.appendChild(element);
}
public async apply(document: Document, page: HtmlPage): Promise<void> {
if (!page.socialShareData?.image?.sourceKey) {
return;
}
const media = await this.mediaService.getMediaByKey(page.socialShareData.image.sourceKey);
if (!media) {
return;
}
const baseUrl = page.siteHostName ? `https://${page.siteHostName}` : "";
this.appendLink(document, "image_src", baseUrl + media.permalink);
// this.appendMetaTag(document, "twitter:site", "@hostmeapp"); TODO: Collect Twitter data.
this.appendMetaTag(document, "twitter:card", "summary_large_image");
this.appendMetaTag(document, "twitter:title", page.socialShareData.title || page.title);
this.appendMetaTag(document, "twitter:description", page.socialShareData.description || page.description);
this.appendMetaTag(document, "twitter:image", baseUrl + media.permalink);
const imageWidth = page.socialShareData?.image?.width;
const imageHeight = page.socialShareData?.image?.height;
if (imageWidth && imageHeight) {
this.appendMetaTag(document, "twitter:image:width", imageWidth.toString());
this.appendMetaTag(document, "twitter:image:height", imageHeight.toString());
}
}
}