You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.6 KiB

import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
const LOCAL_STORAGE_KEY = "openart_comfy_workflow_key";
const DEFAULT_HOMEPAGE_URL = "https://openart.ai/workflows/dev?developer=true";
const style = `
.openart-share-dialog a {
color: #f8f8f8;
}
.openart-share-dialog a:hover {
color: #007bff;
}
`;
export class OpenArtShareDialog extends ComfyDialog {
static instance = null;
constructor() {
super();
$el("style", {
textContent: style,
parent: document.head,
});
this.element = $el("div.comfy-modal.openart-share-dialog", {
parent: document.body, style: {
'overflow-y': "auto",
}
},
[$el("div.comfy-modal-content",
{},
[...this.createButtons()]),
]);
this.selectedOutputIndex = 0;
}
readKeyFromLocalStorage() {
return localStorage.getItem(LOCAL_STORAGE_KEY) || '';
}
saveKeyToLocalStorage(value) {
localStorage.setItem(LOCAL_STORAGE_KEY, value);
}
createButtons() {
const sectionStyle = {
marginBottom: '10px',
padding: '15px',
borderRadius: '8px',
boxShadow: '0 2px 4px rgba(0, 0, 0, 0.05)'
};
const inputStyle = {
display: 'block',
minWidth: '500px',
width: '100%',
padding: '10px',
margin: '10px 0',
borderRadius: '4px',
border: '1px solid #ddd',
boxSizing: 'border-box'
};
const hyperLinkStyle = {
display: 'block',
marginBottom: '15px',
fontWeight: 'bold',
fontSize: '20px',
};
const labelStyle = {
color: "#f8f8f8",
display: 'block',
margin: '10px 0',
fontWeight: 'bold',
textDecoration: 'none',
};
const buttonStyle = {
padding: '10px 80px',
margin: '10px 5px',
borderRadius: '4px',
border: 'none',
cursor: 'pointer',
color: '#fff',
backgroundColor: '#007bff'
};
// upload images input
this.uploadImagesInput = $el("input", { type: 'file', multiple: false, style: inputStyle })
this.uploadImagesInput.addEventListener('change', async (e) => {
const file = e.target.files[0];
if (!file) {
return;
}
const reader = new FileReader();
reader.onload = async (e) => {
const imgData = e.target.result;
this.previewImage.src = imgData;
};
reader.readAsDataURL(file);
});
// preview image
this.previewImage = $el("img", { src: "", style: { maxWidth: '100%', maxHeight: '100px' } });
this.keyInput = $el("input", { type: 'text', placeholder: "Copy & paste your API key", style: inputStyle })
// Account Section
const AccountSection = $el("div", { style: sectionStyle }, [
$el("a", { style: hyperLinkStyle, href: DEFAULT_HOMEPAGE_URL }, ["Check out 1000+ workflows others have uploaded."]),
$el("a", { style: hyperLinkStyle, href: DEFAULT_HOMEPAGE_URL }, ["You can get API key at here."]),
$el("label", { style: labelStyle }, ["OpenArt API Key"]),
this.keyInput,
]);
// Additional Inputs Section
const additionalInputsSection = $el("div", { style: sectionStyle }, [
$el("label", { style: labelStyle }, ["Image/Thumbnail (Required)"]),
this.uploadImagesInput,
this.previewImage,
$el("label", { style: labelStyle }, ["Workflow Information"]),
$el("input", { type: "text", placeholder: "Name (required)", style: inputStyle }),
$el("textarea", { placeholder: "Description (optional)", style: {
...inputStyle,
minHeight: '100px',
} }),
]);
// Share and Close Buttons
const buttonsSection = $el("div", { style: { textAlign: 'right', marginTop: '20px', display: 'flex', justifyContent: 'space-between' } }, [
$el("button", { type: "button", textContent: "Close", style: {
...buttonStyle,
backgroundColor: undefined
}, onclick: () => { this.close(); } }),
$el("button", { type: "submit", textContent: "Share", style: buttonStyle, onclick: () => { this.share(); } }),
]);
// Final Message Section
const finalMessage = $el("div", { style: { color: "white", textAlign: "center", padding: "10px" } }, []);
// Composing the full layout
const layout = [
AccountSection,
additionalInputsSection,
buttonsSection,
finalMessage,
];
return layout;
}
async share() {
this.saveKeyToLocalStorage(this.keyInput.value);
}
show({ potential_outputs, potential_output_nodes }) {
this.element.style.display = "block";
// read key from local storage and set it to the input
const key = this.readKeyFromLocalStorage();
this.keyInput.value = key;
}
}