import axios from "axios";
import getHash from "../functions/getHash";
import getHTMLDetails from "../functions/template";
export default class LinkPreviewCard {
static store: Object = {};
elem: HTMLAnchorElement;
cardElement: HTMLDivElement;
url: string;
sid: string;
constructor(element: HTMLAnchorElement) {
this.elem = element;
var url = this.elem.getAttribute("href");
if (!url) {
return;
}
this.url = url;
this.sid = getHash(this.url);
this.activate();
}
async activate() {
this.setCard();
var data = await this.getDetails();
if (data && this.minimumDataAvailable(data)) {
this.hydrateCard(data);
} else {
this.hydrateError();
}
}
async getDetails() {
if (Object.keys(LinkPreviewCard.store).includes(this.sid)) {
return LinkPreviewCard.store[this.sid];
} else {
var details = await this.fetchDetails();
if (
details &&
details.success &&
this.minimumDataAvailable(details.data)
) {
LinkPreviewCard.store[this.sid] = details.data;
return details.data;
}
return this.hydrateError();
}
}
setCard() {
var html_ = `
`;
this.cardElement = document.createElement("div");
this.cardElement.classList.add("loading");
this.cardElement.classList.add("__linkPreview_card");
this.cardElement.innerHTML = html_;
this.elem.innerHTML = "";
this.elem.style.textDecoration = "none";
this.setCustomStyles();
this.elem.appendChild(this.cardElement);
}
setCustomStyles() {
if (
this.elem.getAttribute("custom-box-shadow") !== null ||
this.elem.getAttribute("custom-box-shadow") !== undefined
) {
this.cardElement.style.boxShadow =
this.elem.getAttribute("custom-box-shadow") || "";
}
if (
this.elem.getAttribute("custom-border") !== null ||
this.elem.getAttribute("custom-border") !== undefined
) {
this.cardElement.style.border =
this.elem.getAttribute("custom-border") || "";
}
}
async fetchDetails() {
try {
var urlData = await axios.get(
`https://link-previewer.anishroy.me/api/getLinkData?link=${this.url}`
);
return urlData.data;
} catch (err) {
return false;
}
}
minimumDataAvailable(data: {
image?: string;
title: string;
icon: string;
description: string;
owner: string;
language: string;
type: string;
}) {
if (data.title && data.title.trim() === "") return false;
if (data.description && data.description.trim() === "") return false;
if (data.icon && data.icon.trim() === "") return false;
return true;
}
hydrateCard(data: {
image?: string;
title: string;
icon: string;
description: string;
owner: string;
language: string;
type: string;
}) {
if (this.cardElement) {
this.cardElement.classList.remove("loading");
this.cardElement.innerHTML = getHTMLDetails(data, {
image: data.image ? true : false,
extra: data.type ? true : false,
});
}
}
hydrateError() {
if (this.cardElement) {
this.cardElement.classList.remove("loading");
this.cardElement.innerHTML = `could not fetch data`;
}
}
}