import { Dialog } from "./dialog";
import { Pic2Card } from "./pic2card";
export class FetchManager {
private pic2cardService = Pic2Card.pic2cardService !== '' ? Pic2Card.pic2cardService : process.env.PIC_TO_CARD_PREDICTION_API;
private headers = {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
};
async getSampleImages() {
const option = {
method: "GET",
headers: this.headers,
};
try {
const sampleImages = await fetch(
this.pic2cardService + "/get_card_templates",
option
);
return await sampleImages.json();
} catch (err) {
console.log(err.message);
}
}
async getPredictedData(imageContent, isTemplateBindingEnabled) {
const options = {
method: "POST",
headers: this.headers,
body: JSON.stringify({
image: imageContent.split(",")[1],
}),
};
try {
const endPoint = isTemplateBindingEnabled
? "/predict_json?format=template"
: "/predict_json";
const picResponse = await fetch(
this.pic2cardService + endPoint,
options
);
return await picResponse.json();
} catch (err) {
console.log(err.message);
}
}
}
export class OpenImageDialog extends Dialog {
private _renderedElement: HTMLElement;
private _imageElement: HTMLElement;
private _buttonContainer: HTMLElement;
private _inputTemplate: HTMLElement;
private _uploadedImage: string =
"data:image/png;base64,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";
private _predictedCardJSON: predictedCardJSON;
private fetchManager: FetchManager;
private isTemplateOptionChecked: boolean = false;
private allowedImageSize = 2; // In MB
constructor() {
super();
this.fetchManager = new FetchManager();
}
private setContent(element: HTMLElement) {
this._renderedElement.appendChild(element);
}
private removeContent(element: HTMLElement) {
this._renderedElement.removeChild(element);
}
private renderTitle(): HTMLElement {
const title = document.createElement("div");
title.className = "acd-image-title";
title.innerText = "Upload your own card design";
return title;
}
private renderTitleContent(): HTMLElement {
const content = document.createElement("div");
content.className = "acd-image-title-content";
content.innerText =
"Design your card and upload it as a png or jpeg, and watch it magically convert to a functioning Adaptive Card";
return content;
}
private renderUploadedImage(): HTMLElement {
this._imageElement = document.createElement("img");
this._imageElement.className = "acd-image-placeholder";
this._imageElement.setAttribute("src", this._uploadedImage);
return this._imageElement;
}
private renderUploadButton(type: string): HTMLElement {
const privacyLink = Pic2Card.privacyLink;
this._buttonContainer = document.createElement("div");
this._buttonContainer.className = "acd-upload-button-container";
const fileNote = document.createElement("div");
fileNote.className = "acd-image-file-note";
fileNote.innerHTML =
`By using the upload feature you agree to our image usage policy`;
type !== "file" &&
this._buttonContainer.appendChild(this.renderCheckbox());
this._buttonContainer.appendChild(
type === "file"
? this.createFileButton()
: this.createActionButton()
);
this._buttonContainer.appendChild(fileNote);
return this._buttonContainer;
}
private renderCheckbox() {
const checkboxContainer = document.createElement("div");
checkboxContainer.className = "acd-checkbox-container";
const inputElement = document.createElement("INPUT");
inputElement.className = "acd-checkbox-element";
inputElement.setAttribute("id", "template-option");
inputElement.setAttribute("type", "checkbox");
inputElement.onclick = () => {
const checkbox = document.getElementById(
"template-option"
) as HTMLInputElement;
this.isTemplateOptionChecked = checkbox.checked ? true : false;
};
inputElement.onfocus = () => {
const customCheckbox = document.getElementById(
"acd-custom-checkbox-item"
) as HTMLInputElement;
customCheckbox.className = "acd-custom-checkbox acd-custom-checkbox-foucs"
};
inputElement.addEventListener("focusout", () => {
const customCheckbox = document.getElementById(
"acd-custom-checkbox-item"
) as HTMLInputElement;
customCheckbox.className = "acd-custom-checkbox"
});
const customCheckboxElement = (
document.createElement("SPAN")
);
customCheckboxElement.id = "acd-custom-checkbox-item";
customCheckboxElement.className = "acd-custom-checkbox";
checkboxContainer.appendChild(inputElement);
checkboxContainer.appendChild(customCheckboxElement);
checkboxContainer.appendChild(this.renderLabelText());
return checkboxContainer;
}
private renderLabelText() {
const labelElement = document.createElement("LABEL");
labelElement.className = "acd-label-element";
labelElement.setAttribute("for", "template-option");
labelElement.innerHTML =
"Create Adaptive Card with template bindings and sample data";
return labelElement;
}
private checkFileSize(file: File) {
const filesize = parseInt((file.size / 1024 / 1024).toFixed(4)); // MB
return filesize < this.allowedImageSize;
}
private createFileButton() {
const inputElement = document.createElement("INPUT");
inputElement.className = "acd-file-type";
inputElement.setAttribute("type", "file");
inputElement.setAttribute("button-name", "Browse File");
inputElement.setAttribute("accept", "image/*");
inputElement.setAttribute("aria-label", "Browse File");
inputElement.onchange = () => {
if (this.checkFileSize(inputElement.files[0])) {
const reader = new FileReader();
reader.readAsDataURL(inputElement.files[0]);
reader.onload = () => this.renderImage(reader.result as string, inputElement.files[0].name);
reader.onerror = (error) => console.log(error);
} else {
this._inputTemplate.removeChild(this._buttonContainer);
this._inputTemplate.appendChild(
this.renderUploadButton("file")
);
this.generateErrorText(
"Invalid file size. Try image under 2 MB"
);
this._uploadedImage =
"data:image/png;base64,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";
this._imageElement.setAttribute("src", this._uploadedImage);
}
};
return inputElement;
}
private generateErrorText(text: string) {
const errorContent = document.createElement("div");
errorContent.setAttribute("role", "status");
errorContent.className = "acd-error-text";
errorContent.innerText = text;
this._buttonContainer.appendChild(errorContent);
}
private onCardFailure(spinnerElement: HTMLElement) {
this.removeContent(spinnerElement);
this._inputTemplate.removeChild(this._buttonContainer);
let uploadButton = this.renderUploadButton("file");
this._inputTemplate.appendChild(uploadButton);
this.generateErrorText("Failed to generate card for selected Image");
uploadButton.focus();
}
createActionButton() {
const uploadButton = document.createElement("INPUT");
uploadButton.className = "acd-card-button";
uploadButton.setAttribute("type", "BUTTON");
uploadButton.setAttribute("button-name", "Convert to Adaptive Card");
uploadButton.setAttribute("value", "Convert to Adaptive Card");
uploadButton.onclick = () => {
uploadButton.setAttribute("aria-label", "Conversion to Adaptive card button pressed. Adaptive Card conversion in Progress");
let spinnerElement = this.loadSpinner();
this.setContent(spinnerElement);
spinnerElement.focus();
this.fetchManager
.getPredictedData(
this._uploadedImage,
this.isTemplateOptionChecked
)
.then((res) => {
if (!res || res.error) {
this.onCardFailure(spinnerElement);
} else {
this._predictedCardJSON = res.card_json;
this.close();
}
});
};
return uploadButton;
}
private loadSpinner() {
let spinnerHostElement = document.createElement("div");
spinnerHostElement.className = "acd-spinner-host";
let spinnerElement = document.createElement("div");
spinnerElement.className = "acd-spinner acd-image-spinner";
let spinnerText = document.createElement("div");
spinnerText.setAttribute("role", "status");
spinnerText.className = "acd-conversion-text";
spinnerText.innerText = "Adaptive Card conversion in progress";
spinnerHostElement.appendChild(spinnerElement);
spinnerHostElement.appendChild(spinnerText);
return spinnerHostElement;
}
private renderImage(imageContent: string, imageName: string) {
this._imageElement.setAttribute("src", imageContent);
this._imageElement.setAttribute("alt", imageName);
this._uploadedImage = imageContent;
this._inputTemplate.removeChild(this._buttonContainer);
this._inputTemplate.appendChild(this.renderUploadButton("action"));
}
private renderUploadControl(): HTMLElement {
this._inputTemplate = document.createElement("div");
this._inputTemplate.className = "acd-upload-control";
this._inputTemplate.appendChild(this.renderUploadedImage());
this._inputTemplate.appendChild(this.renderUploadButton("file"));
return this._inputTemplate;
}
private renderUploadContainer(): HTMLElement {
const uploadTemplate = document.createElement("div");
uploadTemplate.className = "acd-image-file-container";
uploadTemplate.appendChild(this.renderUploadControl());
return uploadTemplate;
}
private renderImageContainer(): HTMLElement {
let template = document.createElement("div");
template.className = "acd-image-upload-container";
template.appendChild(this.renderTitle());
template.appendChild(this.renderTitleContent());
template.appendChild(this.renderUploadContainer());
return template;
}
private renderSampleTemplate() {
let sampleImageTemplate = document.createElement("div");
sampleImageTemplate.id = "acd-sample-images";
sampleImageTemplate.tabIndex = 0;
sampleImageTemplate.className = "acd-sample-image-container";
sampleImageTemplate.style.flexDirection = "column";
let spinnerElement = document.createElement("div");
spinnerElement.className = "acd-spinner";
spinnerElement.style.width = "28px";
spinnerElement.style.height = "28px";
const message = document.createElement("div");
message.className = "acd-dialog-message";
message.innerText = "Loading Sample Images...";
message.style.marginTop = "10px";
sampleImageTemplate.appendChild(spinnerElement);
sampleImageTemplate.appendChild(message);
this.fetchManager.getSampleImages().then((res) => {
if (res) {
const imageTitle = document.createElement("div");
imageTitle.innerText = "Choose from our Sample Images";
imageTitle.className = "acd-image-title sample-info-text";
sampleImageTemplate.style.flexDirection = "row";
sampleImageTemplate.removeChild(spinnerElement);
sampleImageTemplate.removeChild(message);
sampleImageTemplate.appendChild(imageTitle);
const imageContainer = document.createElement("div");
imageContainer.className = "acd-sample-list";
imageContainer.setAttribute("role", "list");
res.templates.map((template, index) => {
let sampleImage = new ImageItem(template, index+1);
sampleImage.onClick = (selectedImage: string, imageName: string) => {
this.renderImage(selectedImage, imageName);
};
imageContainer.appendChild(sampleImage.render());
});
sampleImageTemplate.appendChild(imageContainer);
let firstChild = imageContainer.firstElementChild as HTMLElement;
firstChild.focus();
} else {
const errorElement = document.createElement("div");
errorElement.innerText = "Failed to reach pic2card service";
errorElement.className = "acd-image-title error-info";
errorElement.setAttribute("role", "status");
sampleImageTemplate.removeChild(message);
sampleImageTemplate.removeChild(spinnerElement);
sampleImageTemplate.appendChild(errorElement);
}
});
return sampleImageTemplate;
}
protected renderContent(): HTMLElement {
this._renderedElement = document.createElement("div");
this._renderedElement.className = "acd-pic2card-container";
const poweredByContainer = document.createElement("div");
poweredByContainer.className = "acd-poweredby-title";
poweredByContainer.innerHTML =
"Powered By BigThinkCode";
const container = document.createElement("div");
container.className = "acd-sample-container";
container.appendChild(this.renderImageContainer());
container.appendChild(this.renderSampleTemplate());
this.setContent(poweredByContainer);
this.setContent(container);
return this._renderedElement;
}
get predictedCardJSON(): predictedCardJSON {
return this._predictedCardJSON;
}
}
export class ImageItem {
constructor(readonly template: string, readonly itemIndex: number) {}
onClick: (template: string, sampleImageName: string) => void;
render(): HTMLElement {
const sampleImageName = `Sample Image ${this.itemIndex}`;
const imagePlaceholder = (
document.createElement("img")
);
imagePlaceholder.className = "acd-sample-image";
imagePlaceholder.tabIndex = 0;
imagePlaceholder.setAttribute("role", "listitem");
imagePlaceholder.setAttribute("alt", sampleImageName);
imagePlaceholder.setAttribute(
"src",
"data:image/png;base64," + this.template
);
imagePlaceholder.onclick = (event) => {
this.onClick((event.target as HTMLImageElement).src, sampleImageName);
imagePlaceholder.setAttribute("alt", `${sampleImageName} selected`);
};
imagePlaceholder.onfocus = () => {
imagePlaceholder.setAttribute("alt", sampleImageName);
}
imagePlaceholder.onkeydown = (event) => {
if (event.code === "Enter") {
this.onClick((event.target as HTMLImageElement).src, sampleImageName);
imagePlaceholder.setAttribute("alt", `${sampleImageName} selected`);
}
}
return imagePlaceholder;
}
}
export interface predictedCardJSON {
card: {};
data: {};
}