@aslaluroba/help-center-react 2.0.4 → 2.0.5
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/core/api.d.ts +4 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.esm.js +994 -25294
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +995 -25295
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/types.d.ts +4 -0
- package/dist/ui/chatbot-popup/chat-window-screen/footer.d.ts +1 -0
- package/dist/ui/chatbot-popup/chat-window-screen/index.d.ts +1 -1
- package/dist/ui/help-center.d.ts +1 -1
- package/dist/ui/help-popup.d.ts +9 -3
- package/dist/ui/review-dialog/index.d.ts +8 -0
- package/dist/ui/review-dialog/rating.d.ts +12 -0
- package/package.json +26 -5
- package/src/assets/icons/arrowRight.svg +1 -1
- package/src/assets/icons/closeCircle.svg +1 -1
- package/src/components/ui/agent-response/agent-response.tsx +36 -34
- package/src/components/ui/header.tsx +2 -3
- package/src/core/SignalRService.ts +25 -25
- package/src/core/api.ts +180 -44
- package/src/globals.css +0 -9
- package/src/index.ts +3 -2
- package/src/lib/config.ts +31 -25
- package/src/lib/types.ts +5 -0
- package/src/locales/ar.json +18 -1
- package/src/locales/en.json +26 -8
- package/src/ui/chatbot-popup/chat-window-screen/footer.tsx +31 -34
- package/src/ui/chatbot-popup/chat-window-screen/header.tsx +47 -53
- package/src/ui/chatbot-popup/chat-window-screen/index.tsx +178 -88
- package/src/ui/chatbot-popup/options-list-screen/header.tsx +24 -20
- package/src/ui/chatbot-popup/options-list-screen/index.tsx +24 -24
- package/src/ui/chatbot-popup/options-list-screen/option-card.tsx +9 -4
- package/src/ui/help-center.tsx +366 -136
- package/src/ui/help-popup.tsx +239 -165
- package/src/ui/review-dialog/index.tsx +106 -0
- package/src/ui/review-dialog/rating.tsx +78 -0
- package/tsconfig.json +48 -0
package/src/ui/help-center.tsx
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import '
|
|
1
|
+
import ReviewDialog from '@/ui/review-dialog';
|
|
2
|
+
import React, { useEffect, useState } from 'react';
|
|
3
|
+
import { apiRequest } from '../core/api';
|
|
4
|
+
import { ClientSignalRService } from '../core/SignalRService';
|
|
5
|
+
import { configService } from '../lib/config';
|
|
6
|
+
import { useLocalTranslation } from '../useLocalTranslation';
|
|
7
|
+
import '../globals.css';
|
|
8
|
+
import { HelpScreenData, Message, Option, ReviewProps } from '../lib/types';
|
|
9
|
+
import { FloatingMessage } from './floating-message';
|
|
10
|
+
import { HelpButton } from './help-button';
|
|
11
|
+
import { HelpPopup } from './help-popup';
|
|
11
12
|
|
|
12
13
|
interface HelpCenterProps {
|
|
13
|
-
helpScreenId: string
|
|
14
|
-
language: string
|
|
14
|
+
helpScreenId: string;
|
|
15
|
+
language: string;
|
|
15
16
|
user?: {
|
|
16
|
-
id?: string
|
|
17
|
-
name?: string
|
|
18
|
-
email?: string
|
|
19
|
-
avatar?: string
|
|
20
|
-
}
|
|
21
|
-
showArrow?: boolean
|
|
22
|
-
messageLabel?: string | null
|
|
23
|
-
showHelpScreen?: boolean
|
|
17
|
+
id?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
email?: string;
|
|
20
|
+
avatar?: string;
|
|
21
|
+
};
|
|
22
|
+
showArrow?: boolean;
|
|
23
|
+
messageLabel?: string | null;
|
|
24
|
+
showHelpScreen?: boolean;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export function HelpCenter({
|
|
@@ -29,93 +30,121 @@ export function HelpCenter({
|
|
|
29
30
|
showArrow = true,
|
|
30
31
|
language = 'en',
|
|
31
32
|
messageLabel = null,
|
|
32
|
-
showHelpScreen = false
|
|
33
|
+
showHelpScreen = false,
|
|
33
34
|
}: HelpCenterProps) {
|
|
34
|
-
const { t } = useLocalTranslation(language)
|
|
35
|
-
const [isOpen, setIsOpen] = useState(false)
|
|
36
|
-
const [showArrowAnimation, setShowArrowAnimation] = useState(showArrow)
|
|
37
|
-
const [helpScreenData, setHelpScreenData] = useState<HelpScreenData | null>(null)
|
|
38
|
-
const [status, setStatus] = useState('idle')
|
|
39
|
-
const [error, setError] = useState('')
|
|
40
|
-
const [selectedOption, setSelectedOption] = useState<Option | null>(null)
|
|
41
|
-
|
|
42
|
-
const [sessionId, setSessionId] = useState<string | null>(null)
|
|
43
|
-
const [isSignalRConnected, setIsSignalRConnected] = useState(false)
|
|
44
|
-
const [isChatClosed, setIsChatClosed] = useState(false)
|
|
45
|
-
const [messages, setMessages] = useState<Message[]>([])
|
|
46
|
-
const [needsAgent, setNeedsAgent] = useState(false)
|
|
47
|
-
const [assistantStatus, setAssistantStatus] = useState('idle')
|
|
35
|
+
const { t } = useLocalTranslation(language);
|
|
36
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
37
|
+
const [showArrowAnimation, setShowArrowAnimation] = useState(showArrow);
|
|
38
|
+
const [helpScreenData, setHelpScreenData] = useState<HelpScreenData | null>(null);
|
|
39
|
+
const [status, setStatus] = useState('idle');
|
|
40
|
+
const [error, setError] = useState('');
|
|
41
|
+
const [selectedOption, setSelectedOption] = useState<Option | null>(null);
|
|
42
|
+
|
|
43
|
+
const [sessionId, setSessionId] = useState<string | null>(null);
|
|
44
|
+
const [isSignalRConnected, setIsSignalRConnected] = useState(false);
|
|
45
|
+
const [isChatClosed, setIsChatClosed] = useState(false);
|
|
46
|
+
const [messages, setMessages] = useState<Message[]>([]);
|
|
47
|
+
const [needsAgent, setNeedsAgent] = useState(false);
|
|
48
|
+
const [assistantStatus, setAssistantStatus] = useState('idle');
|
|
49
|
+
|
|
50
|
+
const [isReviewDialogOpen, setIsReviewDialogOpen] = useState(false);
|
|
48
51
|
|
|
49
52
|
const handleTogglePopup = () => {
|
|
50
|
-
setIsOpen(!isOpen)
|
|
51
|
-
setShowArrowAnimation(isOpen)
|
|
52
|
-
}
|
|
53
|
+
setIsOpen(!isOpen);
|
|
54
|
+
setShowArrowAnimation(isOpen);
|
|
55
|
+
};
|
|
53
56
|
|
|
54
57
|
const handleCloseArrowAnimation = () => {
|
|
55
|
-
setShowArrowAnimation(false)
|
|
56
|
-
}
|
|
58
|
+
setShowArrowAnimation(false);
|
|
59
|
+
};
|
|
57
60
|
|
|
58
61
|
const handleReceiveMessage = (message: string, senderType: number, needsAgent: boolean) => {
|
|
59
|
-
|
|
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
|
+
|
|
60
72
|
if (needsAgent) {
|
|
61
|
-
|
|
73
|
+
console.log('🚨 Agent needed for this message');
|
|
74
|
+
setNeedsAgent(true);
|
|
62
75
|
}
|
|
63
76
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
...prevMessages,
|
|
67
|
-
{
|
|
77
|
+
setMessages((prevMessages) => {
|
|
78
|
+
const newMessage = {
|
|
68
79
|
id: Date.now(),
|
|
69
80
|
senderType: senderType,
|
|
70
81
|
messageContent: message,
|
|
71
82
|
sentAt: new Date(),
|
|
72
|
-
isSeen: true
|
|
73
|
-
}
|
|
74
|
-
|
|
83
|
+
isSeen: true,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
console.log('✅ Adding message to state:', newMessage);
|
|
87
|
+
const updatedMessages = [...prevMessages, newMessage];
|
|
88
|
+
console.log('📊 Total messages after update:', updatedMessages.length);
|
|
75
89
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
90
|
+
return updatedMessages;
|
|
91
|
+
});
|
|
79
92
|
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
setAssistantStatus('idle');
|
|
94
|
+
console.log('🔄 Assistant status set to idle');
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const handleEndChat = async (option?: Option) => {
|
|
98
|
+
if (!sessionId || !selectedOption) return;
|
|
82
99
|
|
|
83
100
|
try {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
setIsSignalRConnected(false)
|
|
101
|
+
await ClientSignalRService.stopConnection();
|
|
102
|
+
setIsSignalRConnected(false);
|
|
87
103
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
104
|
+
const response = await apiRequest(`Client/ClientChatSession/${sessionId}/close`, 'POST');
|
|
105
|
+
if (!response.ok) throw new Error('Failed to close chat session');
|
|
106
|
+
|
|
107
|
+
setIsReviewDialogOpen(true);
|
|
108
|
+
if (option) {
|
|
109
|
+
handleStartChat(option);
|
|
92
110
|
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error('Error ending chat:', error);
|
|
113
|
+
setError('Failed to end chat session');
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const handleSendChatReview = async ({ comment, rating }: ReviewProps) => {
|
|
118
|
+
if (!sessionId) return;
|
|
93
119
|
|
|
94
|
-
|
|
95
|
-
setIsChatClosed(true)
|
|
120
|
+
const payload = { rating, comment };
|
|
96
121
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
122
|
+
try {
|
|
123
|
+
const response = await apiRequest(`Client/ClientChatSession/${sessionId}/review`, 'POST', payload);
|
|
124
|
+
if (!response.ok) throw new Error('Failed to send chat review');
|
|
125
|
+
|
|
126
|
+
setIsReviewDialogOpen(false);
|
|
102
127
|
} catch (error) {
|
|
103
|
-
console.error('Error
|
|
104
|
-
setError('Failed to
|
|
128
|
+
console.error('Error sending chat review:', error);
|
|
129
|
+
setError('Failed to send chat review');
|
|
105
130
|
}
|
|
106
|
-
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const handleCloseChatReview = () => {
|
|
134
|
+
setIsReviewDialogOpen(false);
|
|
135
|
+
};
|
|
107
136
|
|
|
108
137
|
const handleStartChat = async (option: Option) => {
|
|
109
|
-
await startNewChatSession(option)
|
|
110
|
-
}
|
|
138
|
+
await startNewChatSession(option);
|
|
139
|
+
};
|
|
111
140
|
|
|
112
141
|
const startNewChatSession = async (option: Option) => {
|
|
113
142
|
try {
|
|
114
|
-
setStatus('loading')
|
|
115
|
-
setError('')
|
|
116
|
-
setMessages([])
|
|
143
|
+
setStatus('loading');
|
|
144
|
+
setError('');
|
|
145
|
+
setMessages([]);
|
|
117
146
|
|
|
118
|
-
const tokenResponse = await configService.getToken()
|
|
147
|
+
const tokenResponse = await configService.getToken();
|
|
119
148
|
const chatSessionCreateDto = {
|
|
120
149
|
helpScreenId: helpScreenId,
|
|
121
150
|
optionId: option.id,
|
|
@@ -123,20 +152,21 @@ export function HelpCenter({
|
|
|
123
152
|
user: {
|
|
124
153
|
id: user.id,
|
|
125
154
|
name: user.name,
|
|
126
|
-
email: user.email
|
|
127
|
-
}
|
|
128
|
-
})
|
|
129
|
-
}
|
|
155
|
+
email: user.email,
|
|
156
|
+
},
|
|
157
|
+
}),
|
|
158
|
+
};
|
|
130
159
|
|
|
131
|
-
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto)
|
|
160
|
+
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
|
|
132
161
|
|
|
133
162
|
if (!response.ok) {
|
|
134
|
-
throw new Error('Failed to create chat session')
|
|
163
|
+
throw new Error('Failed to create chat session');
|
|
135
164
|
}
|
|
136
165
|
|
|
137
|
-
const createdSession = await response.json()
|
|
166
|
+
const createdSession = await response.json();
|
|
167
|
+
console.log('Created session:', createdSession);
|
|
138
168
|
|
|
139
|
-
setSessionId(createdSession.id)
|
|
169
|
+
setSessionId(createdSession.id);
|
|
140
170
|
|
|
141
171
|
// Add greeting message if available
|
|
142
172
|
if (option.assistant?.greeting) {
|
|
@@ -146,9 +176,9 @@ export function HelpCenter({
|
|
|
146
176
|
senderType: 3, // AI
|
|
147
177
|
messageContent: option.assistant.greeting,
|
|
148
178
|
sentAt: new Date(),
|
|
149
|
-
isSeen: true
|
|
150
|
-
}
|
|
151
|
-
])
|
|
179
|
+
isSeen: true,
|
|
180
|
+
},
|
|
181
|
+
]);
|
|
152
182
|
} else {
|
|
153
183
|
// Default greeting if none provided
|
|
154
184
|
setMessages([
|
|
@@ -157,31 +187,31 @@ export function HelpCenter({
|
|
|
157
187
|
senderType: 3,
|
|
158
188
|
messageContent: 'Hello! How can I assist you today?\nمرحباً! كيف يمكنني مساعدتك اليوم؟',
|
|
159
189
|
sentAt: new Date(),
|
|
160
|
-
isSeen: true
|
|
161
|
-
}
|
|
162
|
-
])
|
|
190
|
+
isSeen: true,
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
163
193
|
}
|
|
164
194
|
|
|
165
195
|
// Connect to SignalR
|
|
166
|
-
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage)
|
|
196
|
+
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
|
|
167
197
|
|
|
168
|
-
setIsSignalRConnected(true)
|
|
169
|
-
setIsChatClosed(false)
|
|
170
|
-
setStatus('succeeded')
|
|
198
|
+
setIsSignalRConnected(true);
|
|
199
|
+
setIsChatClosed(false);
|
|
200
|
+
setStatus('succeeded');
|
|
171
201
|
} catch (error) {
|
|
172
|
-
console.error('Chat start error:', error)
|
|
173
|
-
setError(error instanceof Error ? error.message : 'Failed to start chat session')
|
|
174
|
-
setStatus('failed')
|
|
202
|
+
console.error('Chat start error:', error);
|
|
203
|
+
setError(error instanceof Error ? error.message : 'Failed to start chat session');
|
|
204
|
+
setStatus('failed');
|
|
175
205
|
}
|
|
176
|
-
}
|
|
206
|
+
};
|
|
177
207
|
|
|
178
208
|
const handleSendMessage = async (message: string) => {
|
|
179
|
-
let currentSessionId = sessionId
|
|
209
|
+
let currentSessionId = sessionId;
|
|
180
210
|
|
|
181
211
|
if (message.trim() !== '') {
|
|
182
212
|
try {
|
|
183
213
|
// Set loading state
|
|
184
|
-
setAssistantStatus('typing')
|
|
214
|
+
setAssistantStatus('typing');
|
|
185
215
|
|
|
186
216
|
// Add user message to the chat immediately
|
|
187
217
|
setMessages((prevMessages) => [
|
|
@@ -191,9 +221,9 @@ export function HelpCenter({
|
|
|
191
221
|
senderType: 1, // Customer
|
|
192
222
|
messageContent: message,
|
|
193
223
|
sentAt: new Date(),
|
|
194
|
-
isSeen: false
|
|
195
|
-
}
|
|
196
|
-
])
|
|
224
|
+
isSeen: false,
|
|
225
|
+
},
|
|
226
|
+
]);
|
|
197
227
|
|
|
198
228
|
// Create a new chat session if not started yet
|
|
199
229
|
if (!currentSessionId) {
|
|
@@ -203,73 +233,270 @@ export function HelpCenter({
|
|
|
203
233
|
user: {
|
|
204
234
|
id: user?.id,
|
|
205
235
|
name: user?.name,
|
|
206
|
-
email: user?.email
|
|
207
|
-
}
|
|
208
|
-
}
|
|
236
|
+
email: user?.email,
|
|
237
|
+
},
|
|
238
|
+
};
|
|
209
239
|
|
|
210
|
-
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto)
|
|
240
|
+
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
|
|
211
241
|
|
|
212
242
|
if (!response.ok) {
|
|
213
|
-
throw new Error('Failed to create chat session')
|
|
243
|
+
throw new Error('Failed to create chat session');
|
|
214
244
|
}
|
|
215
245
|
|
|
216
|
-
const createdSession = await response.json()
|
|
217
|
-
setSessionId(createdSession.id)
|
|
218
|
-
currentSessionId = createdSession.id
|
|
246
|
+
const createdSession = await response.json();
|
|
247
|
+
setSessionId(createdSession.id);
|
|
248
|
+
currentSessionId = createdSession.id;
|
|
219
249
|
|
|
220
250
|
// Connect to SignalR with the new session
|
|
221
|
-
const tokenResponse = await configService.getToken()
|
|
222
|
-
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage)
|
|
223
|
-
setIsSignalRConnected(true)
|
|
251
|
+
const tokenResponse = await configService.getToken();
|
|
252
|
+
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
|
|
253
|
+
setIsSignalRConnected(true);
|
|
224
254
|
}
|
|
225
255
|
|
|
226
256
|
// Send the message
|
|
227
|
-
const messageDto = { messageContent: message }
|
|
228
|
-
const response = await apiRequest(
|
|
257
|
+
const messageDto = { messageContent: message };
|
|
258
|
+
const response = await apiRequest(
|
|
259
|
+
`Client/ClientChatSession/${currentSessionId}/send-message`,
|
|
260
|
+
'POST',
|
|
261
|
+
messageDto
|
|
262
|
+
);
|
|
229
263
|
|
|
230
264
|
if (!response.ok) {
|
|
231
|
-
throw new Error('Failed to send message')
|
|
265
|
+
throw new Error('Failed to send message');
|
|
232
266
|
}
|
|
233
267
|
|
|
234
268
|
// Update the sent message as seen
|
|
235
|
-
setMessages((prevMessages) =>
|
|
269
|
+
setMessages((prevMessages) =>
|
|
270
|
+
prevMessages.map((msg) => (msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg))
|
|
271
|
+
);
|
|
236
272
|
} catch (error) {
|
|
237
|
-
console.error('Error in message handling:', error)
|
|
238
|
-
setAssistantStatus('idle')
|
|
273
|
+
console.error('Error in message handling:', error);
|
|
274
|
+
setAssistantStatus('idle');
|
|
239
275
|
setMessages((prevMessages) => [
|
|
240
276
|
...prevMessages,
|
|
241
277
|
{
|
|
242
278
|
id: Date.now(),
|
|
243
279
|
senderType: 3, // System
|
|
244
|
-
messageContent:
|
|
280
|
+
messageContent:
|
|
281
|
+
'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
|
|
245
282
|
sentAt: new Date(),
|
|
246
|
-
isSeen: true
|
|
247
|
-
}
|
|
248
|
-
])
|
|
283
|
+
isSeen: true,
|
|
284
|
+
},
|
|
285
|
+
]);
|
|
249
286
|
}
|
|
250
287
|
}
|
|
251
|
-
}
|
|
288
|
+
};
|
|
289
|
+
|
|
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
|
+
// };
|
|
252
472
|
|
|
253
473
|
useEffect(() => {
|
|
254
474
|
if (isOpen && helpScreenId) {
|
|
255
|
-
|
|
475
|
+
console.log('📊 Loading help screen data for ID:', helpScreenId);
|
|
476
|
+
setStatus('loading');
|
|
256
477
|
|
|
257
478
|
apiRequest(`client/clientHelpScreen/${helpScreenId}`)
|
|
258
479
|
.then((res) => res.json())
|
|
259
480
|
.then((data) => {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
481
|
+
console.log('✅ Help screen data loaded:', data);
|
|
482
|
+
setHelpScreenData(data);
|
|
483
|
+
setStatus('succeeded');
|
|
484
|
+
setError('');
|
|
263
485
|
})
|
|
264
486
|
.catch((err) => {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
487
|
+
console.error('❌ Failed to load help screen data:', err);
|
|
488
|
+
setError(err.message);
|
|
489
|
+
setStatus('failed');
|
|
490
|
+
});
|
|
268
491
|
}
|
|
269
|
-
}, [isOpen, helpScreenId])
|
|
492
|
+
}, [isOpen, helpScreenId]);
|
|
493
|
+
|
|
494
|
+
useEffect(() => {
|
|
495
|
+
console.log('🔄 SignalR connection status', isSignalRConnected);
|
|
496
|
+
}, [isSignalRConnected]);
|
|
270
497
|
|
|
271
498
|
return (
|
|
272
|
-
<div className=
|
|
499
|
+
<div className='babylai-help-center-container mb-4'>
|
|
273
500
|
{showArrowAnimation && !isOpen && (
|
|
274
501
|
<FloatingMessage onClose={handleCloseArrowAnimation} message={messageLabel || t('homeSdk.needAssistance')} />
|
|
275
502
|
)}
|
|
@@ -298,6 +525,9 @@ export function HelpCenter({
|
|
|
298
525
|
showHelpScreen={showHelpScreen}
|
|
299
526
|
/>
|
|
300
527
|
)}
|
|
528
|
+
{isOpen && !!isReviewDialogOpen && (
|
|
529
|
+
<ReviewDialog handleSubmit={handleSendChatReview} onClose={handleCloseChatReview} />
|
|
530
|
+
)}
|
|
301
531
|
</div>
|
|
302
|
-
)
|
|
532
|
+
);
|
|
303
533
|
}
|