import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { action, makeAutoObservable, makeObservable, observable, reaction, runInAction } from "mobx"; import React from "react"; import { returnFalse, returnEmptyFilter, returnTrue } 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 { TemplateMenuAIUtils } from "../Backend/TemplateMenuAIUtils"; import { ObservableReactComponent } from "../../../../ObservableReactComponent"; import { IDisposer } from "mobx-utils"; import { ImageField } from "../../../../../../fields/URLField"; import { DocCreatorMenuButton } from "./DocCreatorMenuButton"; import { TbHistory } from "react-icons/tb"; 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 doc: Doc = this._props.template.clone(false).getRenderedDoc()!; this._variationURLs = await this._props.menu.generateVariations(doc, this.prompt, this.fireflyOptions); this._variationURLs.forEach(url => { 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; } render() { return (
{}]} previewBoxRightButtonOpts={['gear', (template: Template) => {this.forceUpdate();}]} />