AIStory: add blocking ui on generation
This commit is contained in:
parent
d917c6e6a9
commit
469359807d
|
|
@ -53,6 +53,12 @@ button {
|
||||||
background-color: var(--backgroundColor);
|
background-color: var(--backgroundColor);
|
||||||
color: var(--color);
|
color: var(--color);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ export const Input = () => {
|
||||||
const { input, setInput, addMessage, continueMessage } = useContext(StateContext);
|
const { input, setInput, addMessage, continueMessage } = useContext(StateContext);
|
||||||
const { generating } = useContext(LLMContext);
|
const { generating } = useContext(LLMContext);
|
||||||
|
|
||||||
|
console.log({generating});
|
||||||
|
|
||||||
const handleChange = useCallback((e: Event) => {
|
const handleChange = useCallback((e: Event) => {
|
||||||
if (e.target instanceof HTMLTextAreaElement) {
|
if (e.target instanceof HTMLTextAreaElement) {
|
||||||
setInput(e.target.value);
|
setInput(e.target.value);
|
||||||
|
|
@ -36,7 +38,7 @@ export const Input = () => {
|
||||||
return (
|
return (
|
||||||
<div class="chat-input">
|
<div class="chat-input">
|
||||||
<textarea onInput={handleChange} onKeyDown={handleKeyDown} value={input} />
|
<textarea onInput={handleChange} onKeyDown={handleKeyDown} value={input} />
|
||||||
<button onClick={handleSend} disabled={generating}>{input ? 'Send' : 'Continue'}</button>
|
<button onClick={handleSend} class={`${generating ? 'disabled': ''}`}>{input ? 'Send' : 'Continue'}</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -27,17 +27,22 @@ export const MiniChat = ({ history = [], buttons = {}, open, onClose }: IProps)
|
||||||
ref.current?.querySelectorAll('textarea').forEach(height ? DOMTools.fixHeight : DOMTools.scrollDown);
|
ref.current?.querySelectorAll('textarea').forEach(height ? DOMTools.fixHeight : DOMTools.scrollDown);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const handleInit = useCallback((force = false) => {
|
||||||
|
if (force || confirm('Clear chat?')) {
|
||||||
|
setMessages([MessageTools.create('', 'user', true)]);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fitTextareas();
|
fitTextareas();
|
||||||
}, [messages]);
|
}, [messages]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (messages.length === 0) {
|
||||||
|
handleInit(true);
|
||||||
|
}
|
||||||
DOMTools.scrollDown(ref.current);
|
DOMTools.scrollDown(ref.current);
|
||||||
}, [messages.length]);
|
}, [messages.length, handleInit]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setMessages([MessageTools.create('', 'user', true)]);
|
|
||||||
}, [open])
|
|
||||||
|
|
||||||
const handleGenerate = useCallback(async () => {
|
const handleGenerate = useCallback(async () => {
|
||||||
if (messages.length > 0 && !generating) {
|
if (messages.length > 0 && !generating) {
|
||||||
|
|
@ -97,11 +102,18 @@ export const MiniChat = ({ history = [], buttons = {}, open, onClose }: IProps)
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class={styles.buttons}>
|
<div class={styles.buttons}>
|
||||||
<button onClick={handleGenerate} disabled={generating}>
|
<button onClick={handleGenerate} class={`${generating ? 'disabled' : ''}`}>
|
||||||
Generate
|
Generate
|
||||||
</button>
|
</button>
|
||||||
{answer && Object.entries(buttons).map(([label, onClick], i) => (
|
<button onClick={() => handleInit()} class={`${generating ? 'disabled' : ''}`}>
|
||||||
<button key={i} onClick={() => onClick(answer)}>
|
Clear
|
||||||
|
</button>
|
||||||
|
{Object.entries(buttons).map(([label, onClick], i) => (
|
||||||
|
<button
|
||||||
|
key={i}
|
||||||
|
onClick={() => onClick(answer ?? '')}
|
||||||
|
class={`${(generating || !answer) ? 'disabled' : ''}`}
|
||||||
|
>
|
||||||
{label}
|
{label}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ export const LLMContextProvider = ({ children }: { children?: any }) => {
|
||||||
}), [connectionUrl]);
|
}), [connectionUrl]);
|
||||||
|
|
||||||
useEffect(() => void (async () => {
|
useEffect(() => void (async () => {
|
||||||
if (triggerNext && !generating) {
|
if (triggerNext && !generating.value) {
|
||||||
setTriggerNext(false);
|
setTriggerNext(false);
|
||||||
|
|
||||||
let messageId = messages.length - 1;
|
let messageId = messages.length - 1;
|
||||||
|
|
@ -152,7 +152,7 @@ export const LLMContextProvider = ({ children }: { children?: any }) => {
|
||||||
|
|
||||||
MessageTools.playReady();
|
MessageTools.playReady();
|
||||||
}
|
}
|
||||||
})(), [triggerNext, messages, generating]);
|
})(), [triggerNext, messages, generating.value]);
|
||||||
|
|
||||||
const rawContext: IContext = {
|
const rawContext: IContext = {
|
||||||
generating: generating.value,
|
generating: generating.value,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue