@@ -33,11 +33,14 @@ export const Setting = () => {
33
33
suggested_messages : "" ,
34
34
} ) ;
35
35
const [ loadingState , setLoadingState ] = useState ( {
36
- uploading : false ,
37
36
updating : false ,
38
- removing : false ,
37
+ avatarUploading : false ,
38
+ avatarRemoving : false ,
39
+ chatIconUploading : false ,
40
+ chatIconRemoving : false ,
39
41
} ) ;
40
- const fileSelector = useRef < HTMLInputElement > ( null ) ;
42
+ const avatarFileSelector = useRef < HTMLInputElement > ( null ) ;
43
+ const chatIconFileSelector = useRef < HTMLInputElement > ( null ) ;
41
44
42
45
useEffect ( ( ) => {
43
46
getBotSettings ( ) . then ( ( res ) => {
@@ -67,36 +70,51 @@ export const Setting = () => {
67
70
setLoadingState ( ( prev ) => ( { ...prev , updating : true } ) ) ;
68
71
try {
69
72
await updateBotSettings ( settings ) ;
73
+ toast . success ( "Settings updated successfully." ) ;
70
74
} catch ( error ) {
71
- toast . error ( "Failed to update settings. Please try again." ) ;
75
+ toast . error (
76
+ ( error as any ) . message || "Failed to update settings. Please try again."
77
+ ) ;
72
78
}
73
79
setLoadingState ( ( prev ) => ( { ...prev , updating : false } ) ) ;
74
80
} ;
75
81
76
- const onFileSelected = async ( file ?: File ) => {
82
+ const onFileSelected = async (
83
+ field : "bot_avatar" | "chat_icon" ,
84
+ file ?: File
85
+ ) => {
77
86
if ( ! file ) return ;
78
- setLoadingState ( ( prev ) => ( { ...prev , uploading : true } ) ) ;
87
+ const loadingField =
88
+ field === "bot_avatar" ? " avatarRemoving" : "chatIconRemoving" ;
89
+ setLoadingState ( ( prev ) => ( { ...prev , [ loadingField ] : true } ) ) ;
79
90
try {
80
91
const {
81
92
data : { picture_url } ,
82
93
} = await uploadPicture ( file ) ;
83
- await updateBotSettings ( { ...settings , bot_avatar : picture_url } ) ;
84
- setSettings ( ( prev ) => ( { ...prev , bot_avatar : picture_url } ) ) ;
94
+ await updateBotSettings ( { ...settings , [ field ] : picture_url } ) ;
95
+ setSettings ( ( prev ) => ( { ...prev , [ field ] : picture_url } ) ) ;
96
+ toast . success ( "Image updated successfully." ) ;
85
97
} catch ( error ) {
86
- toast . error ( "Failed to upload image. Please try again." ) ;
98
+ toast . error (
99
+ ( error as any ) . message || "Failed to upload image. Please try again."
100
+ ) ;
87
101
}
88
- setLoadingState ( ( prev ) => ( { ...prev , uploading : false } ) ) ;
102
+ setLoadingState ( ( prev ) => ( { ...prev , [ loadingField ] : false } ) ) ;
89
103
} ;
90
104
91
- const removeAvatar = async ( ) => {
92
- setLoadingState ( ( prev ) => ( { ...prev , removing : true } ) ) ;
105
+ const removeImageField = async ( field : "bot_avatar" | "chat_icon" ) => {
106
+ const loadingField =
107
+ field === "bot_avatar" ? " avatarRemoving" : "chatIconRemoving" ;
108
+ setLoadingState ( ( prev ) => ( { ...prev , [ loadingField ] : true } ) ) ;
93
109
try {
94
- await updateBotSettings ( { ...settings , bot_avatar : "" } ) ;
95
- setSettings ( ( prev ) => ( { ...prev , bot_avatar : "" } ) ) ;
110
+ await updateBotSettings ( { ...settings , [ field ] : "" } ) ;
111
+ setSettings ( ( prev ) => ( { ...prev , [ field ] : "" } ) ) ;
96
112
} catch ( error ) {
97
- toast . error ( "Failed to remove image. Please try again." ) ;
113
+ toast . error (
114
+ ( error as any ) . message || "Failed to remove image. Please try again."
115
+ ) ;
98
116
}
99
- setLoadingState ( ( prev ) => ( { ...prev , removing : false } ) ) ;
117
+ setLoadingState ( ( prev ) => ( { ...prev , [ loadingField ] : false } ) ) ;
100
118
} ;
101
119
102
120
return (
@@ -111,7 +129,7 @@ export const Setting = () => {
111
129
< SelectContent >
112
130
< SelectGroup >
113
131
< SelectLabel > { settings . model } </ SelectLabel >
114
- < SelectItem value = "gpt-3.5-turbor " > gpt-3.5-turbor </ SelectItem >
132
+ < SelectItem value = "gpt-3.5-turbo " > gpt-3.5-turbo </ SelectItem >
115
133
</ SelectGroup >
116
134
</ SelectContent >
117
135
</ Select >
@@ -153,6 +171,51 @@ export const Setting = () => {
153
171
/>
154
172
</ div >
155
173
174
+ < div className = "flex items-center" >
175
+ < Avatar >
176
+ < AvatarFallback > </ AvatarFallback >
177
+ < AvatarImage src = { settings . bot_avatar } alt = { settings . bot_name } />
178
+ </ Avatar >
179
+ < div className = "ml-6" >
180
+ < small className = "text-sm font-medium leading-none" >
181
+ Profile Picture
182
+ </ small >
183
+ < div className = "mt-1 mb-3" >
184
+ < div className = "flex items-center space-x-3" >
185
+ < Button
186
+ className = "h-7 px-3 text-xs"
187
+ variant = "outline"
188
+ loading = { loadingState . avatarUploading }
189
+ onClick = { ( ) => avatarFileSelector . current ?. click ( ) }
190
+ >
191
+ < UploadIcon className = "mr-2" />
192
+ Upload image
193
+ </ Button >
194
+ { settings . bot_avatar && (
195
+ < Button
196
+ className = "h-7 px-3 text-xs"
197
+ variant = "ghost"
198
+ loading = { loadingState . avatarRemoving }
199
+ onClick = { ( ) => removeImageField ( "bot_avatar" ) }
200
+ >
201
+ Remove
202
+ </ Button >
203
+ ) }
204
+ </ div >
205
+ < Input
206
+ className = "hidden"
207
+ accept = "image/*"
208
+ multiple = { false }
209
+ type = "file"
210
+ ref = { avatarFileSelector }
211
+ onChange = { ( e ) =>
212
+ onFileSelected ( "bot_avatar" , e . target . files ?. [ 0 ] )
213
+ }
214
+ />
215
+ </ div >
216
+ </ div >
217
+ </ div >
218
+
156
219
< small className = "text-sm font-medium leading-none" > Display name</ small >
157
220
< div className = "mt-1 mb-3" >
158
221
< Input
@@ -168,7 +231,7 @@ export const Setting = () => {
168
231
< div className = "flex items-center" >
169
232
< Avatar >
170
233
< AvatarFallback > </ AvatarFallback >
171
- < AvatarImage src = { settings . bot_avatar } alt = { settings . bot_name } />
234
+ < AvatarImage src = { settings . chat_icon } alt = "Ask" />
172
235
</ Avatar >
173
236
< div className = "ml-6" >
174
237
< small className = "text-sm font-medium leading-none" >
@@ -179,18 +242,18 @@ export const Setting = () => {
179
242
< Button
180
243
className = "h-7 px-3 text-xs"
181
244
variant = "outline"
182
- loading = { loadingState . uploading }
183
- onClick = { ( ) => fileSelector . current ?. click ( ) }
245
+ loading = { loadingState . chatIconUploading }
246
+ onClick = { ( ) => chatIconFileSelector . current ?. click ( ) }
184
247
>
185
248
< UploadIcon className = "mr-2" />
186
249
Upload image
187
250
</ Button >
188
- { settings . bot_avatar && (
251
+ { settings . chat_icon && (
189
252
< Button
190
253
className = "h-7 px-3 text-xs"
191
254
variant = "ghost"
192
- loading = { loadingState . removing }
193
- onClick = { removeAvatar }
255
+ loading = { loadingState . chatIconRemoving }
256
+ onClick = { ( ) => removeImageField ( "chat_icon" ) }
194
257
>
195
258
Remove
196
259
</ Button >
@@ -201,8 +264,10 @@ export const Setting = () => {
201
264
accept = "image/*"
202
265
multiple = { false }
203
266
type = "file"
204
- ref = { fileSelector }
205
- onChange = { ( e ) => onFileSelected ( e . target . files ?. [ 0 ] ) }
267
+ ref = { chatIconFileSelector }
268
+ onChange = { ( e ) =>
269
+ onFileSelected ( "chat_icon" , e . target . files ?. [ 0 ] )
270
+ }
206
271
/>
207
272
</ div >
208
273
</ div >
0 commit comments