@aslaluroba/help-center-react 2.0.2 → 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 -43
- 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 +367 -141
- 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/postcss.config.js +0 -6
- package/rollup.config.js +0 -58
- package/tailwind.config.js +0 -174
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,95 +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);
|
|
89
|
+
|
|
90
|
+
return updatedMessages;
|
|
91
|
+
});
|
|
75
92
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
93
|
+
setAssistantStatus('idle');
|
|
94
|
+
console.log('🔄 Assistant status set to idle');
|
|
95
|
+
};
|
|
79
96
|
|
|
80
|
-
const handleEndChat = async () => {
|
|
81
|
-
if (!sessionId || !selectedOption) return
|
|
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;
|
|
119
|
+
|
|
120
|
+
const payload = { rating, comment };
|
|
93
121
|
|
|
94
|
-
|
|
95
|
-
|
|
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');
|
|
96
125
|
|
|
97
|
-
|
|
98
|
-
setTimeout(() => {
|
|
99
|
-
setMessages([])
|
|
100
|
-
setSelectedOption(null)
|
|
101
|
-
}, 3000)
|
|
126
|
+
setIsReviewDialogOpen(false);
|
|
102
127
|
} catch (error) {
|
|
103
|
-
console.error('Error
|
|
104
|
-
setError('Failed to
|
|
105
|
-
// If ending chat fails, the chat is not considered closed.
|
|
106
|
-
setIsChatClosed(false)
|
|
128
|
+
console.error('Error sending chat review:', error);
|
|
129
|
+
setError('Failed to send chat review');
|
|
107
130
|
}
|
|
108
|
-
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const handleCloseChatReview = () => {
|
|
134
|
+
setIsReviewDialogOpen(false);
|
|
135
|
+
};
|
|
109
136
|
|
|
110
137
|
const handleStartChat = async (option: Option) => {
|
|
111
|
-
await startNewChatSession(option)
|
|
112
|
-
}
|
|
138
|
+
await startNewChatSession(option);
|
|
139
|
+
};
|
|
113
140
|
|
|
114
141
|
const startNewChatSession = async (option: Option) => {
|
|
115
142
|
try {
|
|
116
|
-
setStatus('loading')
|
|
117
|
-
setError('')
|
|
118
|
-
setMessages([])
|
|
143
|
+
setStatus('loading');
|
|
144
|
+
setError('');
|
|
145
|
+
setMessages([]);
|
|
119
146
|
|
|
120
|
-
const tokenResponse = await configService.getToken()
|
|
147
|
+
const tokenResponse = await configService.getToken();
|
|
121
148
|
const chatSessionCreateDto = {
|
|
122
149
|
helpScreenId: helpScreenId,
|
|
123
150
|
optionId: option.id,
|
|
@@ -125,19 +152,21 @@ export function HelpCenter({
|
|
|
125
152
|
user: {
|
|
126
153
|
id: user.id,
|
|
127
154
|
name: user.name,
|
|
128
|
-
email: user.email
|
|
129
|
-
}
|
|
130
|
-
})
|
|
131
|
-
}
|
|
132
|
-
|
|
155
|
+
email: user.email,
|
|
156
|
+
},
|
|
157
|
+
}),
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
|
|
133
161
|
|
|
134
162
|
if (!response.ok) {
|
|
135
|
-
throw new Error('Failed to create chat session')
|
|
163
|
+
throw new Error('Failed to create chat session');
|
|
136
164
|
}
|
|
137
165
|
|
|
138
|
-
const createdSession = await response.json()
|
|
166
|
+
const createdSession = await response.json();
|
|
167
|
+
console.log('Created session:', createdSession);
|
|
139
168
|
|
|
140
|
-
setSessionId(createdSession.id)
|
|
169
|
+
setSessionId(createdSession.id);
|
|
141
170
|
|
|
142
171
|
// Add greeting message if available
|
|
143
172
|
if (option.assistant?.greeting) {
|
|
@@ -147,9 +176,9 @@ export function HelpCenter({
|
|
|
147
176
|
senderType: 3, // AI
|
|
148
177
|
messageContent: option.assistant.greeting,
|
|
149
178
|
sentAt: new Date(),
|
|
150
|
-
isSeen: true
|
|
151
|
-
}
|
|
152
|
-
])
|
|
179
|
+
isSeen: true,
|
|
180
|
+
},
|
|
181
|
+
]);
|
|
153
182
|
} else {
|
|
154
183
|
// Default greeting if none provided
|
|
155
184
|
setMessages([
|
|
@@ -158,33 +187,31 @@ export function HelpCenter({
|
|
|
158
187
|
senderType: 3,
|
|
159
188
|
messageContent: 'Hello! How can I assist you today?\nمرحباً! كيف يمكنني مساعدتك اليوم؟',
|
|
160
189
|
sentAt: new Date(),
|
|
161
|
-
isSeen: true
|
|
162
|
-
}
|
|
163
|
-
])
|
|
190
|
+
isSeen: true,
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
164
193
|
}
|
|
165
194
|
|
|
166
195
|
// Connect to SignalR
|
|
167
|
-
ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage)
|
|
196
|
+
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
|
|
168
197
|
|
|
169
|
-
setIsSignalRConnected(true)
|
|
170
|
-
setIsChatClosed(false)
|
|
171
|
-
setStatus('succeeded')
|
|
198
|
+
setIsSignalRConnected(true);
|
|
199
|
+
setIsChatClosed(false);
|
|
200
|
+
setStatus('succeeded');
|
|
172
201
|
} catch (error) {
|
|
173
|
-
console.error('Chat start error:', error)
|
|
174
|
-
setError(error instanceof Error ? error.message : 'Failed to start chat session')
|
|
175
|
-
setStatus('failed')
|
|
176
|
-
// If starting chat fails, SignalR is not connected.
|
|
177
|
-
setIsSignalRConnected(false)
|
|
202
|
+
console.error('Chat start error:', error);
|
|
203
|
+
setError(error instanceof Error ? error.message : 'Failed to start chat session');
|
|
204
|
+
setStatus('failed');
|
|
178
205
|
}
|
|
179
|
-
}
|
|
206
|
+
};
|
|
180
207
|
|
|
181
208
|
const handleSendMessage = async (message: string) => {
|
|
182
|
-
let currentSessionId = sessionId
|
|
209
|
+
let currentSessionId = sessionId;
|
|
183
210
|
|
|
184
211
|
if (message.trim() !== '') {
|
|
185
212
|
try {
|
|
186
213
|
// Set loading state
|
|
187
|
-
setAssistantStatus('typing')
|
|
214
|
+
setAssistantStatus('typing');
|
|
188
215
|
|
|
189
216
|
// Add user message to the chat immediately
|
|
190
217
|
setMessages((prevMessages) => [
|
|
@@ -194,9 +221,9 @@ export function HelpCenter({
|
|
|
194
221
|
senderType: 1, // Customer
|
|
195
222
|
messageContent: message,
|
|
196
223
|
sentAt: new Date(),
|
|
197
|
-
isSeen: false
|
|
198
|
-
}
|
|
199
|
-
])
|
|
224
|
+
isSeen: false,
|
|
225
|
+
},
|
|
226
|
+
]);
|
|
200
227
|
|
|
201
228
|
// Create a new chat session if not started yet
|
|
202
229
|
if (!currentSessionId) {
|
|
@@ -206,74 +233,270 @@ export function HelpCenter({
|
|
|
206
233
|
user: {
|
|
207
234
|
id: user?.id,
|
|
208
235
|
name: user?.name,
|
|
209
|
-
email: user?.email
|
|
210
|
-
}
|
|
211
|
-
}
|
|
236
|
+
email: user?.email,
|
|
237
|
+
},
|
|
238
|
+
};
|
|
212
239
|
|
|
213
|
-
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto)
|
|
240
|
+
const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
|
|
214
241
|
|
|
215
242
|
if (!response.ok) {
|
|
216
|
-
throw new Error('Failed to create chat session')
|
|
243
|
+
throw new Error('Failed to create chat session');
|
|
217
244
|
}
|
|
218
245
|
|
|
219
|
-
const createdSession = await response.json()
|
|
220
|
-
setSessionId(createdSession.id)
|
|
221
|
-
currentSessionId = createdSession.id
|
|
246
|
+
const createdSession = await response.json();
|
|
247
|
+
setSessionId(createdSession.id);
|
|
248
|
+
currentSessionId = createdSession.id;
|
|
222
249
|
|
|
223
250
|
// Connect to SignalR with the new session
|
|
224
|
-
const tokenResponse = await configService.getToken()
|
|
225
|
-
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage)
|
|
226
|
-
|
|
227
|
-
setIsSignalRConnected(true)
|
|
251
|
+
const tokenResponse = await configService.getToken();
|
|
252
|
+
await ClientSignalRService.startConnection(createdSession.id, tokenResponse, handleReceiveMessage);
|
|
253
|
+
setIsSignalRConnected(true);
|
|
228
254
|
}
|
|
229
255
|
|
|
230
256
|
// Send the message
|
|
231
|
-
const messageDto = { messageContent: message }
|
|
232
|
-
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
|
+
);
|
|
233
263
|
|
|
234
264
|
if (!response.ok) {
|
|
235
|
-
throw new Error('Failed to send message')
|
|
265
|
+
throw new Error('Failed to send message');
|
|
236
266
|
}
|
|
237
267
|
|
|
238
268
|
// Update the sent message as seen
|
|
239
|
-
setMessages((prevMessages) =>
|
|
269
|
+
setMessages((prevMessages) =>
|
|
270
|
+
prevMessages.map((msg) => (msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg))
|
|
271
|
+
);
|
|
240
272
|
} catch (error) {
|
|
241
|
-
console.error('Error in message handling:', error)
|
|
242
|
-
setAssistantStatus('idle')
|
|
273
|
+
console.error('Error in message handling:', error);
|
|
274
|
+
setAssistantStatus('idle');
|
|
243
275
|
setMessages((prevMessages) => [
|
|
244
276
|
...prevMessages,
|
|
245
277
|
{
|
|
246
278
|
id: Date.now(),
|
|
247
279
|
senderType: 3, // System
|
|
248
|
-
messageContent:
|
|
280
|
+
messageContent:
|
|
281
|
+
'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
|
|
249
282
|
sentAt: new Date(),
|
|
250
|
-
isSeen: true
|
|
251
|
-
}
|
|
252
|
-
])
|
|
283
|
+
isSeen: true,
|
|
284
|
+
},
|
|
285
|
+
]);
|
|
253
286
|
}
|
|
254
287
|
}
|
|
255
|
-
}
|
|
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
|
+
// };
|
|
256
472
|
|
|
257
473
|
useEffect(() => {
|
|
258
474
|
if (isOpen && helpScreenId) {
|
|
259
|
-
|
|
475
|
+
console.log('📊 Loading help screen data for ID:', helpScreenId);
|
|
476
|
+
setStatus('loading');
|
|
260
477
|
|
|
261
478
|
apiRequest(`client/clientHelpScreen/${helpScreenId}`)
|
|
262
479
|
.then((res) => res.json())
|
|
263
480
|
.then((data) => {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
481
|
+
console.log('✅ Help screen data loaded:', data);
|
|
482
|
+
setHelpScreenData(data);
|
|
483
|
+
setStatus('succeeded');
|
|
484
|
+
setError('');
|
|
267
485
|
})
|
|
268
486
|
.catch((err) => {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
487
|
+
console.error('❌ Failed to load help screen data:', err);
|
|
488
|
+
setError(err.message);
|
|
489
|
+
setStatus('failed');
|
|
490
|
+
});
|
|
272
491
|
}
|
|
273
|
-
}, [isOpen, helpScreenId])
|
|
492
|
+
}, [isOpen, helpScreenId]);
|
|
493
|
+
|
|
494
|
+
useEffect(() => {
|
|
495
|
+
console.log('🔄 SignalR connection status', isSignalRConnected);
|
|
496
|
+
}, [isSignalRConnected]);
|
|
274
497
|
|
|
275
498
|
return (
|
|
276
|
-
<div className=
|
|
499
|
+
<div className='babylai-help-center-container mb-4'>
|
|
277
500
|
{showArrowAnimation && !isOpen && (
|
|
278
501
|
<FloatingMessage onClose={handleCloseArrowAnimation} message={messageLabel || t('homeSdk.needAssistance')} />
|
|
279
502
|
)}
|
|
@@ -302,6 +525,9 @@ export function HelpCenter({
|
|
|
302
525
|
showHelpScreen={showHelpScreen}
|
|
303
526
|
/>
|
|
304
527
|
)}
|
|
528
|
+
{isOpen && !!isReviewDialogOpen && (
|
|
529
|
+
<ReviewDialog handleSubmit={handleSendChatReview} onClose={handleCloseChatReview} />
|
|
530
|
+
)}
|
|
305
531
|
</div>
|
|
306
|
-
)
|
|
532
|
+
);
|
|
307
533
|
}
|