1
0
Fork 0

AIStory: add blocking ui on generation

This commit is contained in:
Pabloader 2024-11-01 21:27:20 +00:00
parent d917c6e6a9
commit 469359807d
4 changed files with 31 additions and 11 deletions

View File

@ -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 {

View File

@ -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>
); );
} }

View File

@ -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>
))} ))}

View File

@ -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,