@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.
- package/dist/index.esm.js +41 -219
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +41 -219
- package/dist/index.js.map +1 -1
- package/dist/ui/chatbot-popup/chat-window-screen/footer.d.ts +1 -0
- package/dist/ui/chatbot-popup/chat-window-screen/index.d.ts +2 -1
- package/dist/ui/help-popup.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/config.ts +0 -6
- package/src/ui/chatbot-popup/chat-window-screen/footer.tsx +21 -20
- package/src/ui/chatbot-popup/chat-window-screen/index.tsx +100 -96
- package/src/ui/help-center.tsx +38 -238
- package/src/ui/help-popup.tsx +3 -1
package/src/ui/help-center.tsx
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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 && (
|
package/src/ui/help-popup.tsx
CHANGED
|
@@ -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
|
);
|