import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { action, 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"; interface TemplateEditingWindowProps { menu: DocCreatorMenu; template: Template; } @observer export class TemplateEditingWindow extends ObservableReactComponent { private fireflyPrompt: string = 'Use this template to generate an empty baseball card template.'; private previewWindow: HTMLDivElement | null = null; private disposers: { [name: string]: IDisposer } = {}; private promptInput: HTMLTextAreaElement | null = null; @observable _loading: boolean = false; @observable _variationsTabOpen: boolean = false; @observable _variationURLs: string[] = []; @observable _variations: Template[] = []; componentDidMount(): void { this.disposers.windowDimensions = reaction(() => this._props.menu._resizing, () => { this.forceUpdate() }, { fireImmediately: true } ); } componentWillUnmount() { Object.values(this.disposers).forEach(disposer => disposer?.()); } setPromptInputRef: React.LegacyRef = (node) => { this.promptInput = node; this.forceUpdate(); } setContainerRef: React.LegacyRef = (node) => { this.previewWindow = node; this.forceUpdate(); } @action setVariationTab = (open: boolean) => { this._variationsTabOpen = open; if (this.previewWindow && open) { this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * .6); } else if (this.previewWindow && !open) { this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * 5/3); } this.forceUpdate(); } generateVariations = async () => { this._props.menu._variations = []; this._loading = true; this._variationURLs = await this._props.menu.generateVariations(this._props.template.clone(false).getRenderedDoc()!, this.fireflyPrompt); this._variationURLs.forEach(url => { const newTemplate: Template = this._props.template.clone(true); this._props.menu._variations.push(newTemplate); }); this._loading = false; setTimeout(() => { this._variationURLs.forEach((url, i) => { this._props.menu._variations[i].setImageAsBackground(url, true); }); this.forceUpdate(); }); } get fireflyVariationsTab() { return ( <>
{}]} previewBoxRightButtonOpts={['gear', (template: Template) => {this.forceUpdate();}]} />