Skip to content

Commit 4f41dab

Browse files
committed
feat: move stop inference button into the send button
1 parent ef85220 commit 4f41dab

File tree

4 files changed

+51
-43
lines changed

4 files changed

+51
-43
lines changed

extensions/inference-nitro-extension/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,11 @@ export default class JanInferenceNitroExtension implements InferenceExtension {
227227
events.emit(EventName.OnMessageUpdate, message);
228228
},
229229
error: async (err) => {
230+
if (instance.isCancelled) {
231+
message.status = MessageStatus.Ready;
232+
events.emit(EventName.OnMessageUpdate, message);
233+
return;
234+
}
230235
const messageContent: ThreadContent = {
231236
type: ContentType.Text,
232237
text: {

extensions/inference-openai-extension/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ export default class JanInferenceOpenAIExtension implements InferenceExtension {
217217
events.emit(EventName.OnMessageUpdate, message);
218218
},
219219
error: async (err) => {
220+
if (instance.isCancelled) {
221+
message.status = MessageStatus.Ready;
222+
events.emit(EventName.OnMessageUpdate, message);
223+
return;
224+
}
220225
const messageContent: ThreadContent = {
221226
type: ContentType.Text,
222227
text: {

web/screens/Chat/MessageToolbar/index.tsx

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import {
2-
EventName,
32
MessageStatus,
43
ExtensionType,
54
ThreadMessage,
6-
events,
75
ChatCompletionRole,
86
} from '@janhq/core'
9-
import { ConversationalExtension, InferenceExtension } from '@janhq/core'
7+
import { ConversationalExtension } from '@janhq/core'
108
import { useAtomValue, useSetAtom } from 'jotai'
11-
import { RefreshCcw, Copy, Trash2Icon, StopCircle } from 'lucide-react'
9+
import { RefreshCcw, Copy, Trash2Icon } from 'lucide-react'
1210

1311
import { twMerge } from 'tailwind-merge'
1412

@@ -29,17 +27,6 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => {
2927
const messages = useAtomValue(getCurrentChatMessagesAtom)
3028
const { resendChatMessage } = useSendChatMessage()
3129

32-
const onStopInferenceClick = async () => {
33-
events.emit(EventName.OnInferenceStopped, {})
34-
35-
setTimeout(() => {
36-
events.emit(EventName.OnMessageUpdate, {
37-
...message,
38-
status: MessageStatus.Ready,
39-
})
40-
}, 300)
41-
}
42-
4330
const onDeleteClick = async () => {
4431
deleteMessage(message.id ?? '')
4532
if (thread) {
@@ -60,26 +47,19 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => {
6047
resendChatMessage(message)
6148
}
6249

50+
if (message.status !== MessageStatus.Ready) return null
51+
6352
return (
6453
<div className={twMerge('flex flex-row items-center')}>
6554
<div className="flex overflow-hidden rounded-md border border-border bg-background/20">
66-
{message.status === MessageStatus.Pending && (
55+
{message.id === messages[messages.length - 1]?.id && (
6756
<div
6857
className="cursor-pointer border-r border-border px-2 py-2 hover:bg-background/80"
69-
onClick={onStopInferenceClick}
58+
onClick={onRegenerateClick}
7059
>
71-
<StopCircle size={14} />
60+
<RefreshCcw size={14} />
7261
</div>
7362
)}
74-
{message.status !== MessageStatus.Pending &&
75-
message.id === messages[messages.length - 1]?.id && (
76-
<div
77-
className="cursor-pointer border-r border-border px-2 py-2 hover:bg-background/80"
78-
onClick={onRegenerateClick}
79-
>
80-
<RefreshCcw size={14} />
81-
</div>
82-
)}
8363
<div
8464
className="cursor-pointer border-r border-border px-2 py-2 hover:bg-background/80"
8565
onClick={() => {
@@ -91,14 +71,12 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => {
9171
>
9272
<Copy size={14} />
9373
</div>
94-
{message.status === MessageStatus.Ready && (
95-
<div
96-
className="cursor-pointer px-2 py-2 hover:bg-background/80"
97-
onClick={onDeleteClick}
98-
>
99-
<Trash2Icon size={14} />
100-
</div>
101-
)}
74+
<div
75+
className="cursor-pointer px-2 py-2 hover:bg-background/80"
76+
onClick={onDeleteClick}
77+
>
78+
<Trash2Icon size={14} />
79+
</div>
10280
</div>
10381
</div>
10482
)

web/screens/Chat/index.tsx

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { ChangeEvent, Fragment, KeyboardEvent, useEffect, useRef } from 'react'
22

3+
import { EventName, MessageStatus, events } from '@janhq/core'
34
import { Button, Textarea } from '@janhq/uikit'
45

56
import { useAtom, useAtomValue } from 'jotai'
67

8+
import { StopCircle } from 'lucide-react'
79
import { twMerge } from 'tailwind-merge'
810

911
import LogoMark from '@/containers/Brand/Logo/Mark'
@@ -26,6 +28,7 @@ import ThreadList from '@/screens/Chat/ThreadList'
2628

2729
import Sidebar, { showRightSideBarAtom } from './Sidebar'
2830

31+
import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom'
2932
import {
3033
activeThreadAtom,
3134
getActiveThreadIdAtom,
@@ -40,6 +43,7 @@ const ChatScreen = () => {
4043

4144
const { activeModel, stateModel } = useActiveModel()
4245
const { setMainViewState } = useMainViewState()
46+
const messages = useAtomValue(getCurrentChatMessagesAtom)
4347

4448
const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom)
4549
const activeThreadState = useAtomValue(activeThreadStateAtom)
@@ -94,6 +98,10 @@ const ChatScreen = () => {
9498
}
9599
}
96100

101+
const onStopInferenceClick = async () => {
102+
events.emit(EventName.OnInferenceStopped, {})
103+
}
104+
97105
return (
98106
<div className="flex h-full w-full">
99107
<div className="flex h-full w-60 flex-shrink-0 flex-col overflow-y-auto border-r border-border bg-background dark:bg-background/50">
@@ -159,14 +167,26 @@ const ChatScreen = () => {
159167
onPromptChange(e)
160168
}
161169
/>
162-
<Button
163-
size="lg"
164-
disabled={disabled || stateModel.loading || !activeThread}
165-
themes={'primary'}
166-
onClick={sendChatMessage}
167-
>
168-
Send
169-
</Button>
170+
{messages[messages.length - 1]?.status !== MessageStatus.Pending ? (
171+
<Button
172+
size="lg"
173+
disabled={disabled || stateModel.loading || !activeThread}
174+
themes="primary"
175+
className="min-w-[100px]"
176+
onClick={sendChatMessage}
177+
>
178+
Send
179+
</Button>
180+
) : (
181+
<Button
182+
size="lg"
183+
themes="danger"
184+
onClick={onStopInferenceClick}
185+
className="min-w-[100px]"
186+
>
187+
<StopCircle size={24} />
188+
</Button>
189+
)}
170190
</div>
171191
</div>
172192
</div>

0 commit comments

Comments
 (0)