@aslaluroba/help-center-react 2.0.5 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -59,18 +59,7 @@ export function HelpCenter({
59
59
  };
60
60
 
61
61
  const handleReceiveMessage = (message: string, senderType: number, needsAgent: boolean) => {
62
- console.log('🎯 Help Center received message:', {
63
- message,
64
- senderType,
65
- needsAgent,
66
- timestamp: new Date().toISOString(),
67
- currentSessionId: sessionId,
68
- isSignalRConnected,
69
- messagesCount: messages.length,
70
- });
71
-
72
62
  if (needsAgent) {
73
- console.log('🚨 Agent needed for this message');
74
63
  setNeedsAgent(true);
75
64
  }
76
65
 
@@ -83,15 +72,12 @@ export function HelpCenter({
83
72
  isSeen: true,
84
73
  };
85
74
 
86
- console.log('✅ Adding message to state:', newMessage);
87
75
  const updatedMessages = [...prevMessages, newMessage];
88
- console.log('📊 Total messages after update:', updatedMessages.length);
89
76
 
90
77
  return updatedMessages;
91
78
  });
92
79
 
93
80
  setAssistantStatus('idle');
94
- console.log('🔄 Assistant status set to idle');
95
81
  };
96
82
 
97
83
  const handleEndChat = async (option?: Option) => {
@@ -100,6 +86,7 @@ export function HelpCenter({
100
86
  try {
101
87
  await ClientSignalRService.stopConnection();
102
88
  setIsSignalRConnected(false);
89
+ setAssistantStatus('idle');
103
90
 
104
91
  const response = await apiRequest(`Client/ClientChatSession/${sessionId}/close`, 'POST');
105
92
  if (!response.ok) throw new Error('Failed to close chat session');
@@ -111,6 +98,7 @@ export function HelpCenter({
111
98
  } catch (error) {
112
99
  console.error('Error ending chat:', error);
113
100
  setError('Failed to end chat session');
101
+ setAssistantStatus('idle');
114
102
  }
115
103
  };
116
104
 
@@ -139,12 +127,16 @@ export function HelpCenter({
139
127
  };
140
128
 
141
129
  const startNewChatSession = async (option: Option) => {
130
+ if (isSignalRConnected || sessionId) {
131
+ handleEndChat();
132
+ }
142
133
  try {
143
134
  setStatus('loading');
144
135
  setError('');
145
136
  setMessages([]);
146
137
 
147
138
  const tokenResponse = await configService.getToken();
139
+
148
140
  const chatSessionCreateDto = {
149
141
  helpScreenId: helpScreenId,
150
142
  optionId: option.id,
@@ -164,23 +156,20 @@ export function HelpCenter({
164
156
  }
165
157
 
166
158
  const createdSession = await response.json();
167
- console.log('Created session:', createdSession);
168
159
 
169
160
  setSessionId(createdSession.id);
170
161
 
171
- // Add greeting message if available
172
162
  if (option.assistant?.greeting) {
173
163
  setMessages([
174
164
  {
175
165
  id: Date.now(),
176
- senderType: 3, // AI
166
+ senderType: 3,
177
167
  messageContent: option.assistant.greeting,
178
168
  sentAt: new Date(),
179
169
  isSeen: true,
180
170
  },
181
171
  ]);
182
172
  } else {
183
- // Default greeting if none provided
184
173
  setMessages([
185
174
  {
186
175
  id: Date.now(),
@@ -192,40 +181,45 @@ export function HelpCenter({
192
181
  ]);
193
182
  }
194
183
 
195
- // Connect to SignalR
196
184
  await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
197
185
 
186
+ // Verify the connection is actually active
187
+ if (!ClientSignalRService.isConnectionActive()) {
188
+ throw new Error('SignalR connection failed to establish properly');
189
+ }
190
+
198
191
  setIsSignalRConnected(true);
199
192
  setIsChatClosed(false);
200
193
  setStatus('succeeded');
201
194
  } catch (error) {
202
- console.error('Chat start error:', error);
203
195
  setError(error instanceof Error ? error.message : 'Failed to start chat session');
204
196
  setStatus('failed');
205
197
  }
206
198
  };
207
199
 
208
200
  const handleSendMessage = async (message: string) => {
201
+ // Only send message if SignalR is connected
202
+ if (!isSignalRConnected) {
203
+ setError('Connection lost. Please try again.');
204
+ return;
205
+ }
206
+
209
207
  let currentSessionId = sessionId;
210
208
 
211
209
  if (message.trim() !== '') {
212
210
  try {
213
- // Set loading state
214
211
  setAssistantStatus('typing');
215
212
 
216
- // Add user message to the chat immediately
217
- setMessages((prevMessages) => [
218
- ...prevMessages,
219
- {
220
- id: Date.now(),
221
- senderType: 1, // Customer
222
- messageContent: message,
223
- sentAt: new Date(),
224
- isSeen: false,
225
- },
226
- ]);
213
+ const userMessage = {
214
+ id: Date.now(),
215
+ senderType: 1,
216
+ messageContent: message,
217
+ sentAt: new Date(),
218
+ isSeen: false,
219
+ };
220
+
221
+ setMessages((prevMessages) => [...prevMessages, userMessage]);
227
222
 
228
- // Create a new chat session if not started yet
229
223
  if (!currentSessionId) {
230
224
  const chatSessionCreateDto = {
231
225
  helpScreenId: helpScreenId,
@@ -247,14 +241,13 @@ export function HelpCenter({
247
241
  setSessionId(createdSession.id);
248
242
  currentSessionId = createdSession.id;
249
243
 
250
- // Connect to SignalR with the new session
251
244
  const tokenResponse = await configService.getToken();
252
245
  await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
253
246
  setIsSignalRConnected(true);
254
247
  }
255
248
 
256
- // Send the message
257
249
  const messageDto = { messageContent: message };
250
+
258
251
  const response = await apiRequest(
259
252
  `Client/ClientChatSession/${currentSessionId}/send-message`,
260
253
  'POST',
@@ -265,236 +258,43 @@ export function HelpCenter({
265
258
  throw new Error('Failed to send message');
266
259
  }
267
260
 
268
- // Update the sent message as seen
269
261
  setMessages((prevMessages) =>
270
262
  prevMessages.map((msg) => (msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg))
271
263
  );
272
264
  } catch (error) {
273
- console.error('Error in message handling:', error);
274
265
  setAssistantStatus('idle');
275
- setMessages((prevMessages) => [
276
- ...prevMessages,
277
- {
278
- id: Date.now(),
279
- senderType: 3, // System
280
- messageContent:
281
- 'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
282
- sentAt: new Date(),
283
- isSeen: true,
284
- },
285
- ]);
266
+ const errorMessage = {
267
+ id: Date.now(),
268
+ senderType: 3,
269
+ messageContent:
270
+ 'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
271
+ sentAt: new Date(),
272
+ isSeen: true,
273
+ };
274
+
275
+ setMessages((prevMessages) => [...prevMessages, errorMessage]);
286
276
  }
287
277
  }
288
278
  };
289
279
 
290
- // const startNewChatSession = async (option: Option) => {
291
- // console.log('🚀 Starting new chat session with option:', option);
292
-
293
- // if (isSignalRConnected || sessionId) {
294
- // console.log('⚠️ Existing connection detected, ending current chat');
295
- // handleEndChat();
296
- // }
297
- // try {
298
- // setStatus('loading');
299
- // setError('');
300
- // setMessages([]);
301
-
302
- // console.log('🔑 Getting token for authentication...');
303
- // const tokenResponse = await configService.getToken();
304
- // console.log('✅ Token obtained successfully');
305
-
306
- // const chatSessionCreateDto = {
307
- // helpScreenId: helpScreenId,
308
- // optionId: option.id,
309
- // ...(user && {
310
- // user: {
311
- // id: user.id,
312
- // name: user.name,
313
- // email: user.email,
314
- // },
315
- // }),
316
- // };
317
-
318
- // console.log('📡 Creating chat session with data:', chatSessionCreateDto);
319
- // const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
320
-
321
- // if (!response.ok) {
322
- // throw new Error('Failed to create chat session');
323
- // }
324
-
325
- // const createdSession = await response.json();
326
- // console.log('✅ Chat session created:', createdSession);
327
-
328
- // setSessionId(createdSession.id);
329
-
330
- // if (option.assistant?.greeting) {
331
- // console.log('💬 Adding custom greeting:', option.assistant.greeting);
332
- // setMessages([
333
- // {
334
- // id: Date.now(),
335
- // senderType: 3,
336
- // messageContent: option.assistant.greeting,
337
- // sentAt: new Date(),
338
- // isSeen: true,
339
- // },
340
- // ]);
341
- // } else {
342
- // console.log('💬 Adding default greeting');
343
- // setMessages([
344
- // {
345
- // id: Date.now(),
346
- // senderType: 3,
347
- // messageContent: 'Hello! How can I assist you today?\nمرحباً! كيف يمكنني مساعدتك اليوم؟',
348
- // sentAt: new Date(),
349
- // isSeen: true,
350
- // },
351
- // ]);
352
- // }
353
-
354
- // console.log('🔌 Starting SignalR connection...');
355
- // await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
356
- // console.log('✅ SignalR connection established');
357
-
358
- // // Verify the connection is actually active
359
- // if (!ClientSignalRService.isConnectionActive()) {
360
- // throw new Error('SignalR connection failed to establish properly');
361
- // }
362
-
363
- // setIsSignalRConnected(true);
364
- // setIsChatClosed(false);
365
- // setStatus('succeeded');
366
-
367
- // console.log('🎉 Chat session fully initialized and ready');
368
- // } catch (error) {
369
- // console.error('❌ Chat start error:', error);
370
- // setError(error instanceof Error ? error.message : 'Failed to start chat session');
371
- // setStatus('failed');
372
- // }
373
- // };
374
-
375
- // const handleSendMessage = async (message: string) => {
376
- // console.log('📤 Sending message:', message);
377
- // console.log('📊 Current state:', {
378
- // sessionId,
379
- // isSignalRConnected,
380
- // messagesCount: messages.length,
381
- // selectedOptionId: selectedOption?.id,
382
- // });
383
-
384
- // let currentSessionId = sessionId;
385
-
386
- // if (message.trim() !== '') {
387
- // try {
388
- // setAssistantStatus('typing');
389
- // console.log('⏳ Assistant status set to typing');
390
-
391
- // const userMessage = {
392
- // id: Date.now(),
393
- // senderType: 1,
394
- // messageContent: message,
395
- // sentAt: new Date(),
396
- // isSeen: false,
397
- // };
398
-
399
- // console.log('✅ Adding user message to UI:', userMessage);
400
- // setMessages((prevMessages) => [...prevMessages, userMessage]);
401
-
402
- // if (!currentSessionId) {
403
- // console.log('🆕 No existing session, creating new one...');
404
- // const chatSessionCreateDto = {
405
- // helpScreenId: helpScreenId,
406
- // optionId: selectedOption?.id,
407
- // user: {
408
- // id: user?.id,
409
- // name: user?.name,
410
- // email: user?.email,
411
- // },
412
- // };
413
-
414
- // console.log('📡 Creating new session with data:', chatSessionCreateDto);
415
- // const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
416
-
417
- // if (!response.ok) {
418
- // throw new Error('Failed to create chat session');
419
- // }
420
-
421
- // const createdSession = await response.json();
422
- // console.log('✅ New session created:', createdSession);
423
- // setSessionId(createdSession.id);
424
- // currentSessionId = createdSession.id;
425
-
426
- // console.log('🔌 Starting SignalR connection for new session...');
427
- // const tokenResponse = await configService.getToken();
428
- // await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
429
- // setIsSignalRConnected(true);
430
- // console.log('✅ SignalR connection established for new session');
431
- // }
432
-
433
- // const messageDto = { messageContent: message };
434
- // console.log('📡 Sending message to API:', messageDto);
435
- // console.log('🎯 Target endpoint:', `Client/ClientChatSession/${currentSessionId}/send-message`);
436
-
437
- // const response = await apiRequest(
438
- // `Client/ClientChatSession/${currentSessionId}/send-message`,
439
- // 'POST',
440
- // messageDto
441
- // );
442
-
443
- // if (!response.ok) {
444
- // throw new Error('Failed to send message');
445
- // }
446
-
447
- // console.log('✅ Message sent successfully to server');
448
- // console.log('⏳ Waiting for SignalR response...');
449
-
450
- // setMessages((prevMessages) =>
451
- // prevMessages.map((msg) => (msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg))
452
- // );
453
-
454
- // console.log('✅ User message marked as seen');
455
- // } catch (error) {
456
- // console.error('❌ Error in message handling:', error);
457
- // setAssistantStatus('idle');
458
- // const errorMessage = {
459
- // id: Date.now(),
460
- // senderType: 3,
461
- // messageContent:
462
- // 'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
463
- // sentAt: new Date(),
464
- // isSeen: true,
465
- // };
466
-
467
- // console.log('📨 Adding error message:', errorMessage);
468
- // setMessages((prevMessages) => [...prevMessages, errorMessage]);
469
- // }
470
- // }
471
- // };
472
-
473
280
  useEffect(() => {
474
281
  if (isOpen && helpScreenId) {
475
- console.log('📊 Loading help screen data for ID:', helpScreenId);
476
282
  setStatus('loading');
477
283
 
478
284
  apiRequest(`client/clientHelpScreen/${helpScreenId}`)
479
285
  .then((res) => res.json())
480
286
  .then((data) => {
481
- console.log('✅ Help screen data loaded:', data);
482
287
  setHelpScreenData(data);
483
288
  setStatus('succeeded');
484
289
  setError('');
485
290
  })
486
291
  .catch((err) => {
487
- console.error('❌ Failed to load help screen data:', err);
488
292
  setError(err.message);
489
293
  setStatus('failed');
490
294
  });
491
295
  }
492
296
  }, [isOpen, helpScreenId]);
493
297
 
494
- useEffect(() => {
495
- console.log('🔄 SignalR connection status', isSignalRConnected);
496
- }, [isSignalRConnected]);
497
-
498
298
  return (
499
299
  <div className='babylai-help-center-container mb-4'>
500
300
  {showArrowAnimation && !isOpen && (
@@ -90,6 +90,7 @@ export function HelpPopup({
90
90
  selectedOption,
91
91
  setSelectedOption,
92
92
  showHelpScreen,
93
+ isSignalRConnected,
93
94
  }: HelpPopupProps) {
94
95
  // ALL HOOKS MUST BE CALLED FIRST - BEFORE ANY EARLY RETURNS
95
96
  const [showChat, setShowChat] = useState(false);
@@ -151,7 +152,7 @@ export function HelpPopup({
151
152
 
152
153
  const handleSendMessage = useCallback(
153
154
  (message: string) => {
154
- if (message.trim()) {
155
+ if (message.trim() && isSignalRConnected) {
155
156
  onSendMessage(message.trim());
156
157
  }
157
158
  },
@@ -200,6 +201,7 @@ export function HelpPopup({
200
201
  messages={memoizedMessages}
201
202
  assistantStatus={assistantStatus}
202
203
  needsAgent={needsAgent}
204
+ isSignalRConnected={isSignalRConnected}
203
205
  />
204
206
  </>
205
207
  );