aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/formattedText/FormattedTextBox.tsx
diff options
context:
space:
mode:
authorSophie Zhang <sophie_zhang@brown.edu>2023-03-01 23:49:11 -0500
committerSophie Zhang <sophie_zhang@brown.edu>2023-03-01 23:49:11 -0500
commitd34d212ea550a3c1ca16747fadeb9e69c936cb5d (patch)
tree97c731c14523273b95e42f925c594d5e9114628f /src/client/views/nodes/formattedText/FormattedTextBox.tsx
parentf189ce6f25b91fcd402b7e81ba8ed378e39e6142 (diff)
feat: simple typing animation
Diffstat (limited to 'src/client/views/nodes/formattedText/FormattedTextBox.tsx')
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.tsx97
1 files changed, 31 insertions, 66 deletions
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 35c845deb..65b96c281 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -65,20 +65,12 @@ import applyDevTools = require('prosemirror-dev-tools');
import React = require('react');
import { Configuration, OpenAIApi } from 'openai';
import { gptAPICall, GPTCallType } from '../../../apis/gpt/Summarization';
-import ReactLoading from 'react-loading';
-import Typist from 'react-typist';
const translateGoogleApi = require('translate-google-api');
export const GoogleRef = 'googleDocId';
type PullHandler = (exportState: Opt<GoogleApiClientUtils.Docs.ImportResult>, dataDoc: Doc) => void;
-enum GPTStatus {
- LOADING,
- TYPING,
- NONE,
-}
-
@observer
export class FormattedTextBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
public static LayoutString(fieldStr: string) {
@@ -181,19 +173,10 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FieldViewProps
};
}
- // State for GPT Typing animation
- @observable
- private gptStatus: GPTStatus = GPTStatus.NONE;
- @observable
- private gptPrompt: string = '';
+ // State for GPT
@observable
private gptRes: string = '';
- @action
- private setGPTStatus = (status: GPTStatus) => {
- this.gptStatus = status;
- };
-
public static PasteOnLoad: ClipboardEvent | undefined;
public static SelectOnLoad = '';
public static DontSelectInitialText = false; // whether initial text should be selected or not
@@ -877,31 +860,29 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FieldViewProps
});
};
+ animateRes = (resIndex: number) => {
+ if (resIndex < this.gptRes.length) {
+ this.dataDoc.text = (this.dataDoc.text as RichTextField)?.Text + this.gptRes[resIndex];
+ setTimeout(() => {
+ this.animateRes(resIndex + 1);
+ }, 20);
+ }
+ };
+
askGPT = action(async () => {
try {
- this.gptPrompt = (this.dataDoc.text as RichTextField)?.Text;
- this.setGPTStatus(GPTStatus.LOADING);
let res = await gptAPICall((this.dataDoc.text as RichTextField)?.Text, GPTCallType.COMPLETION);
// let res = await this.mockGPT();
if (res) {
this.gptRes = res;
- this.setGPTStatus(GPTStatus.TYPING);
- } else {
- this.setGPTStatus(GPTStatus.NONE);
+ this.animateRes(0);
}
} catch (err) {
console.log(err);
this.dataDoc.text = (this.dataDoc.text as RichTextField)?.Text + 'Something went wrong';
- this.setGPTStatus(GPTStatus.NONE);
}
});
- setGPTText = action(() => {
- this.dataDoc.text = (this.dataDoc.text as RichTextField)?.Text + this.gptRes;
- this.gptRes = '';
- this.setGPTStatus(GPTStatus.NONE);
- });
-
generateImage = async () => {
console.log('Generate image from text: ', (this.dataDoc.text as RichTextField)?.Text);
try {
@@ -1997,45 +1978,29 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FieldViewProps
onPointerUp={this.onPointerUp}
onPointerDown={this.onPointerDown}
onDoubleClick={this.onDoubleClick}>
- {this.gptStatus === GPTStatus.NONE || this.gptStatus === GPTStatus.LOADING ? (
+ <div
+ className={`formattedTextBox-outer${selected ? '-selected' : ''}`}
+ ref={this._scrollRef}
+ style={{
+ width: this.props.dontSelectOnLoad ? '100%' : `calc(100% - ${this.sidebarWidthPercent})`,
+ pointerEvents: !active && !SnappingManager.GetIsDragging() ? 'none' : undefined,
+ overflow: this.layoutDoc._singleLine ? 'hidden' : this.layoutDoc._autoHeight ? 'visible' : undefined,
+ }}
+ onScroll={this.onScroll}
+ onDrop={this.ondrop}>
<div
- className={`formattedTextBox-outer${selected ? '-selected' : ''}`}
- ref={this._scrollRef}
+ className={minimal ? 'formattedTextBox-minimal' : `formattedTextBox-inner${rounded}${selPaddingClass}`}
+ ref={this.createDropTarget}
style={{
- width: this.props.dontSelectOnLoad ? '100%' : `calc(100% - ${this.sidebarWidthPercent})`,
- pointerEvents: !active && !SnappingManager.GetIsDragging() ? 'none' : undefined,
- overflow: this.layoutDoc._singleLine ? 'hidden' : this.layoutDoc._autoHeight ? 'visible' : undefined,
+ padding: StrCast(this.layoutDoc._textBoxPadding),
+ paddingLeft: StrCast(this.layoutDoc._textBoxPaddingX, `${paddingX - selPad}px`),
+ paddingRight: StrCast(this.layoutDoc._textBoxPaddingX, `${paddingX - selPad}px`),
+ paddingTop: StrCast(this.layoutDoc._textBoxPaddingY, `${paddingY - selPad}px`),
+ paddingBottom: StrCast(this.layoutDoc._textBoxPaddingY, `${paddingY - selPad}px`),
+ pointerEvents: !active && !SnappingManager.GetIsDragging() ? (this.layoutDoc.isLinkButton ? 'none' : undefined) : undefined,
}}
- onScroll={this.onScroll}
- onDrop={this.ondrop}>
- <div
- className={minimal ? 'formattedTextBox-minimal' : `formattedTextBox-inner${rounded}${selPaddingClass}`}
- ref={this.createDropTarget}
- style={{
- padding: StrCast(this.layoutDoc._textBoxPadding),
- paddingLeft: StrCast(this.layoutDoc._textBoxPaddingX, `${paddingX - selPad}px`),
- paddingRight: StrCast(this.layoutDoc._textBoxPaddingX, `${paddingX - selPad}px`),
- paddingTop: StrCast(this.layoutDoc._textBoxPaddingY, `${paddingY - selPad}px`),
- paddingBottom: StrCast(this.layoutDoc._textBoxPaddingY, `${paddingY - selPad}px`),
- pointerEvents: !active && !SnappingManager.GetIsDragging() ? (this.layoutDoc.isLinkButton ? 'none' : undefined) : undefined,
- }}
- />
- </div>
- ) : (
- <div className="gpt-typing-wrapper">
- <div>{this.gptPrompt}</div>
- <br />
- <Typist
- key={this.gptRes}
- avgTypingDelay={15}
- cursor={{ hideWhenDone: true }}
- onTypingDone={() => {
- this.setGPTText();
- }}>
- <div>{this.gptRes}</div>
- </Typist>
- </div>
- )}
+ />
+ </div>
{this.noSidebar || this.props.dontSelectOnLoad || !this.SidebarShown || this.sidebarWidthPercent === '0%' ? null : this.sidebarCollection}
{this.noSidebar || this.Document._noSidebar || this.props.dontSelectOnLoad || this.Document._singleLine ? null : this.sidebarHandle}
{this.audioHandle}