1
1
import type { FC , FormEvent } from 'react'
2
- import React from 'react'
2
+ import React , { useCallback } from 'react'
3
3
import { useTranslation } from 'react-i18next'
4
4
import {
5
5
PlayIcon ,
@@ -19,6 +19,7 @@ export type IRunOnceProps = {
19
19
siteInfo : SiteInfo
20
20
promptConfig : PromptConfig
21
21
inputs : Record < string , any >
22
+ inputsRef : React . MutableRefObject < Record < string , any > >
22
23
onInputsChange : ( inputs : Record < string , any > ) => void
23
24
onSend : ( ) => void
24
25
visionConfig : VisionSettings
@@ -27,6 +28,7 @@ export type IRunOnceProps = {
27
28
const RunOnce : FC < IRunOnceProps > = ( {
28
29
promptConfig,
29
30
inputs,
31
+ inputsRef,
30
32
onInputsChange,
31
33
onSend,
32
34
visionConfig,
@@ -47,6 +49,11 @@ const RunOnce: FC<IRunOnceProps> = ({
47
49
onSend ( )
48
50
}
49
51
52
+ const handleInputsChange = useCallback ( ( newInputs : Record < string , any > ) => {
53
+ onInputsChange ( newInputs )
54
+ inputsRef . current = newInputs
55
+ } , [ onInputsChange , inputsRef ] )
56
+
50
57
return (
51
58
< div className = "" >
52
59
< section >
@@ -60,7 +67,7 @@ const RunOnce: FC<IRunOnceProps> = ({
60
67
< Select
61
68
className = 'w-full'
62
69
defaultValue = { inputs [ item . key ] }
63
- onSelect = { ( i ) => { onInputsChange ( { ...inputs , [ item . key ] : i . value } ) } }
70
+ onSelect = { ( i ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : i . value } ) } }
64
71
items = { ( item . options || [ ] ) . map ( i => ( { name : i , value : i } ) ) }
65
72
allowSearch = { false }
66
73
bgClassName = 'bg-gray-50'
@@ -72,7 +79,7 @@ const RunOnce: FC<IRunOnceProps> = ({
72
79
className = "block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
73
80
placeholder = { `${ item . name } ${ ! item . required ? `(${ t ( 'appDebug.variableTable.optional' ) } )` : '' } ` }
74
81
value = { inputs [ item . key ] }
75
- onChange = { ( e ) => { onInputsChange ( { ...inputs , [ item . key ] : e . target . value } ) } }
82
+ onChange = { ( e ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : e . target . value } ) } }
76
83
maxLength = { item . max_length || DEFAULT_VALUE_MAX_LEN }
77
84
/>
78
85
) }
@@ -81,7 +88,7 @@ const RunOnce: FC<IRunOnceProps> = ({
81
88
className = 'h-[104px] sm:text-xs'
82
89
placeholder = { `${ item . name } ${ ! item . required ? `(${ t ( 'appDebug.variableTable.optional' ) } )` : '' } ` }
83
90
value = { inputs [ item . key ] }
84
- onChange = { ( e ) => { onInputsChange ( { ...inputs , [ item . key ] : e . target . value } ) } }
91
+ onChange = { ( e ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : e . target . value } ) } }
85
92
/>
86
93
) }
87
94
{ item . type === 'number' && (
@@ -90,12 +97,12 @@ const RunOnce: FC<IRunOnceProps> = ({
90
97
className = "block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
91
98
placeholder = { `${ item . name } ${ ! item . required ? `(${ t ( 'appDebug.variableTable.optional' ) } )` : '' } ` }
92
99
value = { inputs [ item . key ] }
93
- onChange = { ( e ) => { onInputsChange ( { ...inputs , [ item . key ] : e . target . value } ) } }
100
+ onChange = { ( e ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : e . target . value } ) } }
94
101
/>
95
102
) }
96
103
{ item . type === 'file' && (
97
104
< FileUploaderInAttachmentWrapper
98
- onChange = { ( files ) => { onInputsChange ( { ...inputs , [ item . key ] : getProcessedFiles ( files ) [ 0 ] } ) } }
105
+ onChange = { ( files ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : getProcessedFiles ( files ) [ 0 ] } ) } }
99
106
fileConfig = { {
100
107
...item . config ,
101
108
fileUploadConfig : ( visionConfig as any ) . fileUploadConfig ,
@@ -104,7 +111,7 @@ const RunOnce: FC<IRunOnceProps> = ({
104
111
) }
105
112
{ item . type === 'file-list' && (
106
113
< FileUploaderInAttachmentWrapper
107
- onChange = { ( files ) => { onInputsChange ( { ...inputs , [ item . key ] : getProcessedFiles ( files ) } ) } }
114
+ onChange = { ( files ) => { handleInputsChange ( { ...inputsRef . current , [ item . key ] : getProcessedFiles ( files ) } ) } }
108
115
fileConfig = { {
109
116
...item . config ,
110
117
fileUploadConfig : ( visionConfig as any ) . fileUploadConfig ,
0 commit comments