import { action, makeObservable, observable, reaction } from 'mobx'; import React from 'react'; import { returnFalse, returnEmptyFilter } from '../../../../../../ClientUtils'; import { emptyFunction } from '../../../../../../Utils'; import { 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.'; private _optionsButtonOpts: [IconProp, () => void] = ['gear', emptyFunction]; private _previewBoxRightButtonOpts: [IconProp, () => void] = ['gear', () => this.forceUpdate()]; @observable _fireflyOptions: FireflyStructureOptions = { numVariations: 3, temperature: 0, useStyleRef: false }; @observable _promptInput: HTMLTextAreaElement | null = null; @observable _loading: boolean = false; @observable _variationsTabOpen: boolean = false; @observable _variationURLs: string[] = []; constructor(props: FireflyVariationsTabProps) { super(props); makeObservable(this); } generateVariations = action(async () => { this._props.menu._variations = []; this._loading = true; const cloneTemplate = this._props.template.clone(false); cloneTemplate.setMatteBackground(); const doc = cloneTemplate.getRenderedDoc()!; this._props.menu.generateVariations(doc, this._prompt, this._fireflyOptions).then( action((urls: string[]) => { (this._variationURLs = urls).forEach(url => { const template = this._props.template.clone(true); template.setImageAsBackground(url, true); this._props.menu._variations.push(template); }); this._loading = false; }) ); }); render() { return (