import { action, makeObservable, observable, reaction, runInAction } from "mobx"; import React from "react"; import { returnFalse, returnEmptyFilter } from "../../../../../../ClientUtils"; import { emptyFunction } from "../../../../../../Utils"; import { Doc, returnEmptyDoclist } from "../../../../../../fields/Doc"; import { DefaultStyleProvider } from "../../../../StyleProvider"; import { DocumentView, DocumentViewInternal } from "../../../DocumentView"; import { DocCreatorMenu } from "../DocCreatorMenu"; import { TemplatePreviewGrid } from "./TemplatePreviewGrid"; import { observer } from "mobx-react"; import { Transform } from "../../../../../util/Transform"; import { Template } from "../Template"; import { ObservableReactComponent } from "../../../../ObservableReactComponent"; import { IDisposer } from "mobx-utils"; import { DocCreatorMenuButton } from "./DocCreatorMenuButton"; import { IconProp } from "@fortawesome/fontawesome-svg-core"; export type FireflyStructureOptions = { numVariations: number; temperature: number; useStyleRef: boolean; } interface FireflyVariationsTabProps { menu: DocCreatorMenu; template: Template; } @observer export class FireflyVariationsTab extends ObservableReactComponent { private prompt: string = 'Use this template to generate an empty baseball card template.'; @observable private promptInput: HTMLTextAreaElement | null = null; @observable _loading: boolean = false; @observable _variationsTabOpen: boolean = false; @observable _variationURLs: string[] = []; @observable private fireflyOptions: FireflyStructureOptions = {numVariations: 3, temperature: 0, useStyleRef: false}; constructor(props: FireflyVariationsTabProps) { super(props); makeObservable(this); } generateVariations = async () => { this._props.menu._variations = []; this._loading = true; const cloneTemplate = this._props.template.clone(false); cloneTemplate.setMatteBackground(); const doc: Doc = cloneTemplate.getRenderedDoc()!; this._variationURLs = await this._props.menu.generateVariations(doc, this.prompt, this.fireflyOptions); this._variationURLs.forEach(() => { const newTemplate: Template = this._props.template.clone(true); this._props.menu._variations.push(newTemplate); }); setTimeout(() => { this._variationURLs.forEach((url, i) => { this._props.menu._variations[i].setImageAsBackground(url, true); }); this._loading = false; }); } setPromptInputRef: React.LegacyRef = (node) => { this.promptInput = node; } // eslint-disable-next-line private optionsButtonOpts: [IconProp, () => any] = ['gear', () => {}]; // eslint-disable-next-line private previewBoxRightButtonOpts: [IconProp, () => any] = ['gear', () => this.forceUpdate()]; render() { return (