1
- import React , { useState , useEffect } from "react" ;
1
+ import React , { useState , useEffect , useCallback } from "react" ;
2
2
import axios from "axios" ;
3
3
import { Wrapper } from "src/components/Dashboard/Profile/ProfileElements" ;
4
- import { AIChatContainer , ChatHeader , ChatInput , ChatBox , ChatTitle , ToggleSection } from "./AIChatElements" ;
5
- import ChatMessages from "./ChatMessages" ;
4
+ import { AIChatContainer } from "./AIChatElements" ;
6
5
import RecentChats from "./RecentChats" ;
7
6
import { useSelector } from "react-redux" ;
8
- import { BiSend } from "react-icons/bi" ;
9
- import { CircleSpinner } from "react-spinners-kit" ;
10
7
import { getApiUrl } from "src/features/apiUrl" ;
11
8
import { toast } from "react-toastify" ;
12
- import { SlOptionsVertical } from "react-icons/sl" ;
13
- import { FaAngleLeft , FaAngleRight } from "react-icons/fa" ;
14
9
import AuthPopup from "src/pages/AuthPopup/AuthPopup" ;
15
- import Prompts from "./Prompts/Prompts " ;
16
- import { TbMessage2Plus } from "react-icons/tb " ;
17
- import { RecentChatsHeader } from "src/components/AIChat/RecentChatsElements .jsx" ;
10
+ import { Route , Routes } from "react-router-dom " ;
11
+ import Chat from "src/components/AIChat/Chat.jsx " ;
12
+ import NewChat from "src/components/AIChat/NewChat .jsx" ;
18
13
19
14
const API_BASE_URL = getApiUrl ( "api/aiChat" ) ;
20
15
21
16
const AiChat = ( ) => {
22
- // const navigate = useNavigate();
23
17
const { user } = useSelector ( ( state ) => state . auth ) ;
24
-
25
- // if (!user) {
26
- // navigate("/login");
27
- // }
28
-
29
18
const [ chats , setChats ] = useState ( [ ] ) ;
19
+ const [ chat , setChat ] = useState ( { } ) ;
30
20
const [ isTrailEnded , setIsTrailEnded ] = useState ( false ) ;
31
-
32
21
const trailMessage = [
33
22
{
34
23
type : "user" ,
@@ -43,13 +32,12 @@ const AiChat = () => {
43
32
_id : "65b7507df24f3468473bb983" ,
44
33
} ,
45
34
] ;
46
-
47
35
const [ userInput , setUserInput ] = useState ( "" ) ;
48
36
const [ isLoading , setIsLoading ] = useState ( false ) ;
49
37
const [ selectedChatId , setSelectedChatId ] = useState ( null ) ;
50
-
51
38
const [ toggle , setToggle ] = useState ( false ) ;
52
39
const [ showAuthPopup , setShowAuthPopup ] = useState ( false ) ;
40
+ const [ fetchError , setFetchError ] = useState ( null ) ;
53
41
54
42
useEffect ( ( ) => {
55
43
const handleResize = ( ) => {
@@ -64,6 +52,7 @@ const AiChat = () => {
64
52
window . addEventListener ( "resize" , handleResize ) ;
65
53
return ( ) => window . removeEventListener ( "resize" , handleResize ) ;
66
54
} , [ ] ) ;
55
+
67
56
const handleSendDummyMessage = async ( dummyMessage ) => {
68
57
setUserInput ( dummyMessage ) ;
69
58
setIsLoading ( true ) ;
@@ -111,6 +100,8 @@ const AiChat = () => {
111
100
return ;
112
101
}
113
102
103
+ console . log ( userInput ) ;
104
+
114
105
try {
115
106
const response = await axios . post (
116
107
`${ API_BASE_URL } /ask/${ selectedChatId } ` ,
@@ -123,7 +114,9 @@ const AiChat = () => {
123
114
} ,
124
115
) ;
125
116
126
- const { chats } = response . data ;
117
+ const { chats, updatedChat } = response . data ;
118
+
119
+ setChat ( updatedChat ) ;
127
120
setChats ( chats ) ;
128
121
setUserInput ( "" ) ;
129
122
} catch ( error ) {
@@ -132,9 +125,6 @@ const AiChat = () => {
132
125
toast ( "Your trial period has ended" ) ;
133
126
return ;
134
127
}
135
- // toast("Please enter your API Key");
136
-
137
- // toast(error.response.data);
138
128
console . error ( error ) ;
139
129
} finally {
140
130
setIsLoading ( false ) ;
@@ -146,7 +136,6 @@ const AiChat = () => {
146
136
setIsLoading ( true ) ;
147
137
setShowAuthPopup ( true ) ;
148
138
setIsLoading ( false ) ;
149
-
150
139
}
151
140
} ;
152
141
@@ -158,14 +147,40 @@ const AiChat = () => {
158
147
Authorization : `Bearer ${ user . token } ` ,
159
148
} ,
160
149
} ) ;
161
- const { chats } = response . data ;
162
- setChats ( chats ) ;
150
+ setChats ( response . data ) ;
163
151
setSelectedChatId ( chats . length > 0 ? chats . reverse ( ) [ 0 ] ?. _id : null ) ;
164
152
} catch ( error ) {
165
153
console . error ( error ) ;
166
154
}
167
155
} ;
168
156
157
+ const getChat = useCallback ( async ( ) => {
158
+ try {
159
+ setFetchError ( null ) ;
160
+ const response = await axios . get ( `${ API_BASE_URL } /${ selectedChatId } ` , {
161
+ headers : {
162
+ "Content-Type" : "application/json" ,
163
+ Authorization : `Bearer ${ user . token } ` ,
164
+ } ,
165
+ } ) ;
166
+ setChat ( response . data ) ;
167
+ } catch ( error ) {
168
+ console . error ( "Error fetching chat:" , error ) ;
169
+ setFetchError ( "Failed to load chat. Please try again." ) ;
170
+ }
171
+ } , [ API_BASE_URL , selectedChatId , user . token ] ) ;
172
+
173
+ useEffect ( ( ) => {
174
+ if ( ! user ) return ;
175
+ getMessages ( ) ;
176
+ } , [ ] ) ;
177
+
178
+ useEffect ( ( ) => {
179
+ if ( ! selectedChatId ) return ;
180
+
181
+ getChat ( ) ;
182
+ } , [ getChat , selectedChatId ] ) ;
183
+
169
184
const handleNewChat = async ( ) => {
170
185
setIsLoading ( true ) ;
171
186
@@ -225,10 +240,9 @@ const AiChat = () => {
225
240
}
226
241
} ;
227
242
228
- useEffect ( ( ) => {
229
- if ( ! user ) return ;
230
- getMessages ( ) ;
231
- } , [ ] ) ;
243
+ const handleCloseAuthPopup = ( ) => {
244
+ setShowAuthPopup ( false ) ;
245
+ } ;
232
246
233
247
useEffect ( ( ) => {
234
248
if ( chats . length === 0 ) {
@@ -238,9 +252,7 @@ const AiChat = () => {
238
252
}
239
253
} , [ ] ) ;
240
254
241
- const handleCloseAuthPopup = ( ) => {
242
- setShowAuthPopup ( false ) ;
243
- } ;
255
+ console . log ( fetchError ) ;
244
256
245
257
return (
246
258
< Wrapper >
@@ -258,72 +270,50 @@ const AiChat = () => {
258
270
/>
259
271
) }
260
272
261
- { selectedChatId ? (
262
- chats . map (
263
- ( chat ) =>
264
- chat . _id === selectedChatId && (
265
- < ChatBox key = { chat ?. _id } >
266
- < ChatHeader >
267
- < ToggleSection onClick = { ( ) => setToggle ( ! toggle ) } >
268
- { toggle ? < FaAngleRight /> : < FaAngleLeft /> }
269
- </ ToggleSection >
270
- < ChatTitle > { chat ?. title } </ ChatTitle >
271
- < SlOptionsVertical />
272
- </ ChatHeader >
273
-
274
- < ChatMessages
275
- messages = { chat . messages }
276
- isTrailEnded = { isTrailEnded }
277
- trailMessage = { trailMessage }
278
- />
279
-
280
- { ! isTrailEnded ? (
281
- < >
282
- { chat . title !== "New Chat" ? null : (
283
- < Prompts handleSendDummyMessage = { handleSendDummyMessage } />
284
- ) }
285
-
286
- < ChatInput onSubmit = { handleSendMessage } >
287
- < input
288
- type = "text"
289
- value = { userInput }
290
- onChange = { ( e ) => setUserInput ( e . target . value ) }
291
- />
292
- { isLoading ? (
293
- < button >
294
- < CircleSpinner size = { 20 } color = { "#131313" } />
295
- </ button >
296
- ) : (
297
- < button type = "submit" >
298
- < BiSend size = { 25 } />
299
- </ button >
300
- ) }
301
- </ ChatInput >
302
- </ >
303
- ) : null }
304
- </ ChatBox >
305
- ) ,
306
- )
307
- ) : (
308
- < ChatBox key = { selectedChatId } >
309
- < ChatHeader >
310
- < ToggleSection onClick = { ( ) => setToggle ( ! toggle ) } >
311
- { toggle ? < FaAngleRight /> : < FaAngleLeft /> }
312
- </ ToggleSection >
313
- < ChatTitle > { "New Chat" } </ ChatTitle >
314
- < SlOptionsVertical className = "hidden" />
315
- </ ChatHeader >
316
-
317
- < ChatInput onClick = { handleIsUserExit } className = "cursor-pointer" onSubmit = { handleSendMessage } >
318
- < p > Start a New Chat</ p >
319
- < RecentChatsHeader >
320
- < div className = "new-chat-button" onClick = { handleNewChat } >
321
- < TbMessage2Plus size = { 30 } />
322
- </ div >
323
- </ RecentChatsHeader >
324
- </ ChatInput >
325
- </ ChatBox >
326
- ) }
273
+ < Routes >
274
+ < Route
275
+ index
276
+ exac
277
+ path = { "" }
278
+ element = {
279
+ < NewChat
280
+ trailMessage = { trailMessage }
281
+ setToggle = { setToggle }
282
+ toggle = { toggle }
283
+ handleIsUserExit = { handleIsUserExit }
284
+ handleNewChat = { handleNewChat }
285
+ handleSendMessage = { handleSendMessage }
286
+ />
287
+ }
288
+ />
289
+
290
+ < Route
291
+ path = { "/:id" }
292
+ element = {
293
+ < Chat
294
+ selectedChatId = { selectedChatId }
295
+ isTrailEnded = { isTrailEnded }
296
+ isLoading = { isLoading }
297
+ userInput = { userInput }
298
+ setUserInput = { setUserInput }
299
+ handleSendDummyMessage = { handleSendDummyMessage }
300
+ handleSendMessage = { handleSendMessage }
301
+ handleIsUserExit = { handleIsUserExit }
302
+ API_BASE_URL = { API_BASE_URL }
303
+ setToggle = { setToggle }
304
+ toggle = { toggle }
305
+ user = { user }
306
+ chats = { chats }
307
+ chat = { chat }
308
+ setChats = { setChats }
309
+ handleDeleteChat = { handleDeleteChat }
310
+ handleNewChat = { handleNewChat }
311
+ trailMessage = { trailMessage }
312
+ setSelectedChatId = { setSelectedChatId }
313
+ />
314
+ }
315
+ />
316
+ </ Routes >
327
317
</ AIChatContainer >
328
318
</ Wrapper >
329
319
) ;
0 commit comments