import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import React from 'react'; import { SettingsManager } from '../../../util/SettingsManager'; import { ObservableReactComponent } from '../../ObservableReactComponent'; import { Button, IconButton } from 'browndash-components'; import ReactLoading from 'react-loading'; import { AiOutlineSend } from 'react-icons/ai'; import { MarqueeOptionsMenu } from './MarqueeOptionsMenu'; import './ImageLabelHandler.scss'; import { gptAPICall, GPTCallType } from '../../../apis/gpt/GPT'; import { InkData } from '../../../../fields/InkField'; @observer export class SmartDrawHandler extends ObservableReactComponent<{}> { static Instance: SmartDrawHandler; @observable private _display: boolean = false; @observable private _pageX: number = 0; @observable private _pageY: number = 0; @observable private _yRelativeToTop: boolean = true; @observable private _isLoading: boolean = false; @observable private _userInput: string = ''; // @observable public strokes: InkData[] = []; private _addToDocFunc: (strokeList: InkData[]) => void = () => {}; constructor(props: any) { super(props); makeObservable(this); SmartDrawHandler.Instance = this; } @action setIsLoading = (isLoading: boolean) => { this._isLoading = isLoading; }; @action setUserInput = (input: string) => { this._userInput = input; }; @action displaySmartDrawHandler = (x: number, y: number, addToDoc: (strokeList: InkData[]) => void) => { this._pageX = x; this._pageY = y; this._display = true; this._addToDocFunc = addToDoc; }; @action hideLabelhandler = () => { this._display = false; }; @action waitForCoords = async () => {}; @action drawWithGPT = async (startPoint: { X: number; Y: number }, input: string) => { console.log('start point is', startPoint); this.setIsLoading(true); try { const res = await gptAPICall(input, GPTCallType.DRAW); if (!res) { console.error('GPT call failed'); return; } console.log('GPT response:', res); // const controlPts: [number, number][][] = JSON.parse(res) as [number, number][][]; // console.log("Control Points", controlPts); // const transformedPts: { X: number; Y: number }[][] = []; // controlPts.forEach(stroke => { // stroke.map(pt => { // pt.X += startPoint.X, pt.Y += startPoint.Y; // }); // transformedPts.push(stroke); // }); const simplifiedRes: string = res.replace(/[^\d\[\],]/g, ''); console.log(simplifiedRes) try { const controlPts: { X: number; Y: number }[][] = JSON.parse(simplifiedRes).map((stroke: [number, number][]) => stroke.map(([X, Y]) => ({ X: X + startPoint.X, Y: Y + startPoint.Y }))); console.log('transformed points', controlPts); // this.strokes = controlPts; this._addToDocFunc(controlPts); } catch (err) { console.error('Incompatible GPT output type'); } } catch (err) { console.error('GPT call failed', err); } this.setIsLoading(false); this.setUserInput(''); }; render() { if (this._display) { return (
} color={MarqueeOptionsMenu.Instance.userColor} style={{ width: '19px' }} /> { this.setUserInput(e.target.value); }} placeholder="Enter item to draw" />
{/* {this._labelGroups.map(group => { return (

{group}

{ this.removeLabel(group); }} icon={'x'} color={MarqueeOptionsMenu.Instance.userColor} style={{ width: '19px' }} />
); })} */}
); } else { return <>; } } }