@@ -35,15 +35,14 @@ export default function TextChat({ messages }) {
35
35
const { error, latestMessage } = convo ;
36
36
const { ask, regenerate, stopGenerating } = useMessageHandler ( ) ;
37
37
38
- const isNotAppendable = ( ! isSubmitting && latestMessage ?. submitting ) || latestMessage ?. error ;
38
+ const isNotAppendable = latestMessage ?. cancelled || latestMessage ?. error ;
39
39
40
40
// auto focus to input, when enter a conversation.
41
41
useEffect ( ( ) => {
42
42
inputRef . current ?. focus ( ) ;
43
43
} , [ convo ?. conversationId ] ) ;
44
44
45
45
const messageHandler = ( data , currentState , currentMsg ) => {
46
-
47
46
const { messages, _currentMsg, message, sender, isRegenerate } = currentState ;
48
47
49
48
if ( isRegenerate )
@@ -75,6 +74,38 @@ export default function TextChat({ messages }) {
75
74
) ;
76
75
} ;
77
76
77
+ const cancelHandler = ( data , currentState , currentMsg ) => {
78
+ const { messages, _currentMsg, message, sender, isRegenerate } = currentState ;
79
+
80
+ if ( isRegenerate )
81
+ dispatch (
82
+ setMessages ( [
83
+ ...messages ,
84
+ {
85
+ sender,
86
+ text : data ,
87
+ parentMessageId : message ?. overrideParentMessageId ,
88
+ messageId : message ?. overrideParentMessageId + '_' ,
89
+ cancelled : true
90
+ }
91
+ ] )
92
+ ) ;
93
+ else
94
+ dispatch (
95
+ setMessages ( [
96
+ ...messages ,
97
+ currentMsg ,
98
+ {
99
+ sender,
100
+ text : data ,
101
+ parentMessageId : currentMsg ?. messageId ,
102
+ messageId : currentMsg ?. messageId + '_' ,
103
+ cancelled : true
104
+ }
105
+ ] )
106
+ ) ;
107
+ } ;
108
+
78
109
const createdHandler = ( data , currentState , currentMsg ) => {
79
110
const { conversationId } = currentMsg ;
80
111
dispatch (
@@ -93,9 +124,11 @@ export default function TextChat({ messages }) {
93
124
const { model, chatGptLabel, promptPrefix } = message ;
94
125
if ( isRegenerate ) dispatch ( setMessages ( [ ...messages , responseMessage ] ) ) ;
95
126
else dispatch ( setMessages ( [ ...messages , requestMessage , responseMessage ] ) ) ;
127
+ dispatch ( setSubmitState ( false ) ) ;
96
128
97
129
const isBing = model === 'bingai' || model === 'sydney' ;
98
130
131
+ // refresh title
99
132
if ( requestMessage . parentMessageId == '00000000-0000-0000-0000-000000000000' ) {
100
133
setTimeout ( ( ) => {
101
134
dispatch ( refreshConversation ( ) ) ;
@@ -163,8 +196,6 @@ export default function TextChat({ messages }) {
163
196
} )
164
197
) ;
165
198
}
166
-
167
- dispatch ( setSubmitState ( false ) ) ;
168
199
} ;
169
200
170
201
const errorHandler = ( data , currentState , currentMsg ) => {
@@ -193,7 +224,9 @@ export default function TextChat({ messages }) {
193
224
}
194
225
195
226
const currentState = submission ;
227
+
196
228
let currentMsg = { ...currentState . message } ;
229
+ let latestResponseText = '' ;
197
230
198
231
const { server, payload } = createPayload ( submission ) ;
199
232
const onMessage = ( e ) => {
@@ -216,6 +249,7 @@ export default function TextChat({ messages }) {
216
249
console . log ( data ) ;
217
250
}
218
251
if ( data . message ) {
252
+ latestResponseText = text ;
219
253
messageHandler ( text , currentState , currentMsg ) ;
220
254
}
221
255
// console.log('dataStream', data);
@@ -233,6 +267,10 @@ export default function TextChat({ messages }) {
233
267
234
268
events . onmessage = onMessage ;
235
269
270
+ events . oncancel = ( e ) => {
271
+ cancelHandler ( latestResponseText , currentState , currentMsg ) ;
272
+ } ;
273
+
236
274
events . onerror = function ( e ) {
237
275
console . log ( 'error in opening conn.' ) ;
238
276
events . close ( ) ;
@@ -245,9 +283,13 @@ export default function TextChat({ messages }) {
245
283
events . stream ( ) ;
246
284
247
285
return ( ) => {
248
- dispatch ( setSubmitState ( false ) ) ;
249
286
events . removeEventListener ( 'message' , onMessage ) ;
287
+ const isCancelled = events . readyState <= 1 ;
250
288
events . close ( ) ;
289
+ if ( isCancelled ) {
290
+ const e = new Event ( 'cancel' ) ;
291
+ events . dispatchEvent ( e ) ;
292
+ }
251
293
} ;
252
294
} , [ submission ] ) ;
253
295
@@ -290,9 +332,9 @@ export default function TextChat({ messages }) {
290
332
const changeHandler = ( e ) => {
291
333
const { value } = e . target ;
292
334
293
- if ( isSubmitting && ( value === '' || value === '\n' ) ) {
294
- return ;
295
- }
335
+ // if (isSubmitting && (value === '' || value === '\n')) {
336
+ // return;
337
+ // }
296
338
dispatch ( setText ( value ) ) ;
297
339
} ;
298
340
@@ -301,20 +343,8 @@ export default function TextChat({ messages }) {
301
343
dispatch ( setError ( false ) ) ;
302
344
} ;
303
345
304
- const placeholder = ( ) => {
305
- if ( disabled && isSubmitting ) {
306
- return 'Choose another model or customize GPT again' ;
307
- } else if ( ! isSubmitting && latestMessage ?. submitting ) {
308
- return 'Message in progress...' ;
309
- // } else if (latestMessage?.error) {
310
- // return 'Error...';
311
- } else {
312
- return '' ;
313
- }
314
- } ;
315
-
316
346
return (
317
- < div className = "input-panel md:bg-vert-light-gradient dark:md:bg-vert-dark-gradient absolute bottom-0 left-0 w-full border-t bg-white pt -2 dark:border-white/20 dark:bg-gray-800 md:border-t-0 md:border-transparent md:bg-transparent md:dark:border-transparent" >
347
+ < div className = "input-panel md:bg-vert-light-gradient dark:md:bg-vert-dark-gradient fixed bottom-0 left-0 w-full border-t bg-white py -2 dark:border-white/20 dark:bg-gray-800 md:absolute md: border-t-0 md:border-transparent md:bg-transparent md:dark:border-transparent md:dark:bg -transparent" >
318
348
< form className = "stretch mx-2 flex flex-row gap-3 last:mb-2 md:pt-2 md:last:mb-6 lg:mx-auto lg:max-w-3xl lg:pt-6" >
319
349
< div className = "relative flex h-full flex-1 md:flex-col" >
320
350
< span className = "order-last ml-1 flex justify-center gap-0 md:order-none md:m-auto md:mb-2 md:w-full md:gap-2" >
@@ -352,13 +382,19 @@ export default function TextChat({ messages }) {
352
382
ref = { inputRef }
353
383
// style={{maxHeight: '200px', height: '24px', overflowY: 'hidden'}}
354
384
rows = "1"
355
- value = { text }
385
+ value = { disabled || isNotAppendable ? '' : text }
356
386
onKeyUp = { handleKeyUp }
357
387
onKeyDown = { handleKeyDown }
358
388
onChange = { changeHandler }
359
389
onCompositionStart = { handleCompositionStart }
360
390
onCompositionEnd = { handleCompositionEnd }
361
- placeholder = { placeholder ( ) }
391
+ placeholder = {
392
+ disabled
393
+ ? 'Choose another model or customize GPT again'
394
+ : isNotAppendable
395
+ ? 'Edit your message or Regenerate.'
396
+ : ''
397
+ }
362
398
disabled = { disabled || isNotAppendable }
363
399
className = "m-0 h-auto max-h-52 resize-none overflow-auto border-0 bg-transparent p-0 pl-12 pr-8 leading-6 placeholder:text-sm focus:outline-none focus:ring-0 focus-visible:ring-0 dark:bg-transparent md:pl-8"
364
400
/>
0 commit comments