@aslaluroba/help-center-react 2.1.1 → 2.1.3
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 +58 -6
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +58 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/ui/help-center.tsx +17 -2
- package/src/ui/help-popup.tsx +44 -4
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"main": "dist/index.js",
|
|
4
4
|
"module": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
|
-
"version": "2.1.
|
|
6
|
+
"version": "2.1.3",
|
|
7
7
|
"description": "BabylAI Help Center Widget for React and Next.js",
|
|
8
8
|
"private": false,
|
|
9
9
|
"exports": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"version:patch": "npm version patch --no-git-tag-version",
|
|
28
28
|
"version:minor": "npm version minor --no-git-tag-version",
|
|
29
29
|
"version:major": "npm version major --no-git-tag-version",
|
|
30
|
-
"publish": "yarn clean && yarn build && yarn version:patch && yarn publish --access public",
|
|
30
|
+
"publish:patch": "yarn clean && yarn build && yarn version:patch && yarn publish --access public",
|
|
31
31
|
"publish:minor": "yarn clean && yarn build && yarn version:minor && yarn publish --access public",
|
|
32
32
|
"publish:major": "yarn clean && yarn build && yarn version:major && yarn publish --access public"
|
|
33
33
|
},
|
package/src/ui/help-center.tsx
CHANGED
|
@@ -41,6 +41,7 @@ export function HelpCenter({
|
|
|
41
41
|
const [selectedOption, setSelectedOption] = useState<Option | null>(null);
|
|
42
42
|
|
|
43
43
|
const [sessionId, setSessionId] = useState<string | null>(null);
|
|
44
|
+
const [reviewSessionId, setReviewSessionId] = useState<string | null>(null);
|
|
44
45
|
const [isSignalRConnected, setIsSignalRConnected] = useState(false);
|
|
45
46
|
const [isChatClosed, setIsChatClosed] = useState(false);
|
|
46
47
|
const [messages, setMessages] = useState<Message[]>([]);
|
|
@@ -91,6 +92,14 @@ export function HelpCenter({
|
|
|
91
92
|
const response = await apiRequest(`Client/ClientChatSession/${sessionId}/close`, 'POST');
|
|
92
93
|
if (!response.ok) throw new Error('Failed to close chat session');
|
|
93
94
|
|
|
95
|
+
// Store sessionId for review before clearing the main sessionId
|
|
96
|
+
setReviewSessionId(sessionId);
|
|
97
|
+
|
|
98
|
+
// Clear the sessionId after successfully closing the session
|
|
99
|
+
setSessionId(null);
|
|
100
|
+
setSelectedOption(null);
|
|
101
|
+
setMessages([]);
|
|
102
|
+
|
|
94
103
|
setIsReviewDialogOpen(true);
|
|
95
104
|
if (option) {
|
|
96
105
|
handleStartChat(option);
|
|
@@ -99,19 +108,24 @@ export function HelpCenter({
|
|
|
99
108
|
console.error('Error ending chat:', error);
|
|
100
109
|
setError('Failed to end chat session');
|
|
101
110
|
setAssistantStatus('idle');
|
|
111
|
+
// Even if there's an error, clear the session state to prevent stuck state
|
|
112
|
+
setReviewSessionId(sessionId); // Store for review even if there's an error
|
|
113
|
+
setSessionId(null);
|
|
114
|
+
setSelectedOption(null);
|
|
102
115
|
}
|
|
103
116
|
};
|
|
104
117
|
|
|
105
118
|
const handleSendChatReview = async ({ comment, rating }: ReviewProps) => {
|
|
106
|
-
if (!
|
|
119
|
+
if (!reviewSessionId) return;
|
|
107
120
|
|
|
108
121
|
const payload = { rating, comment };
|
|
109
122
|
|
|
110
123
|
try {
|
|
111
|
-
const response = await apiRequest(`Client/ClientChatSession/${
|
|
124
|
+
const response = await apiRequest(`Client/ClientChatSession/${reviewSessionId}/review`, 'POST', payload);
|
|
112
125
|
if (!response.ok) throw new Error('Failed to send chat review');
|
|
113
126
|
|
|
114
127
|
setIsReviewDialogOpen(false);
|
|
128
|
+
setReviewSessionId(null); // Clear review session ID after review is sent
|
|
115
129
|
} catch (error) {
|
|
116
130
|
console.error('Error sending chat review:', error);
|
|
117
131
|
setError('Failed to send chat review');
|
|
@@ -120,6 +134,7 @@ export function HelpCenter({
|
|
|
120
134
|
|
|
121
135
|
const handleCloseChatReview = () => {
|
|
122
136
|
setIsReviewDialogOpen(false);
|
|
137
|
+
setReviewSessionId(null); // Clear review session ID when review is closed
|
|
123
138
|
};
|
|
124
139
|
|
|
125
140
|
const handleStartChat = async (option: Option) => {
|
package/src/ui/help-popup.tsx
CHANGED
|
@@ -166,11 +166,51 @@ export function HelpPopup({
|
|
|
166
166
|
const handleEndAndStartNewChat = useCallback(async () => {
|
|
167
167
|
if (tempSelectedOption) {
|
|
168
168
|
setStartNewChatConfirmation(false);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
// First end the current chat and wait for it to complete
|
|
172
|
+
await onEndChat();
|
|
173
|
+
|
|
174
|
+
// Wait for sessionId to be cleared (indicating the session is fully closed)
|
|
175
|
+
// We'll use a polling mechanism to wait for the state to update
|
|
176
|
+
const maxAttempts = 50; // 5 seconds max wait time
|
|
177
|
+
let attempts = 0;
|
|
178
|
+
|
|
179
|
+
while (sessionId && attempts < maxAttempts) {
|
|
180
|
+
await new Promise((resolve) => setTimeout(resolve, 100)); // Wait 100ms
|
|
181
|
+
attempts++;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Only start new chat after current session is fully closed
|
|
185
|
+
if (!sessionId) {
|
|
186
|
+
setShowChat(true);
|
|
187
|
+
onStartChat(tempSelectedOption);
|
|
188
|
+
setSelectedOption(tempSelectedOption);
|
|
189
|
+
} else {
|
|
190
|
+
console.warn('Session did not close properly, but proceeding with new chat');
|
|
191
|
+
setShowChat(true);
|
|
192
|
+
onStartChat(tempSelectedOption);
|
|
193
|
+
setSelectedOption(tempSelectedOption);
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
console.error('Error ending current chat:', error);
|
|
197
|
+
// Even if ending fails, try to start new chat
|
|
198
|
+
setShowChat(true);
|
|
199
|
+
onStartChat(tempSelectedOption);
|
|
200
|
+
setSelectedOption(tempSelectedOption);
|
|
201
|
+
} finally {
|
|
202
|
+
setTempSelectedOption(null);
|
|
203
|
+
}
|
|
172
204
|
}
|
|
173
|
-
}, [
|
|
205
|
+
}, [
|
|
206
|
+
onEndChat,
|
|
207
|
+
onStartChat,
|
|
208
|
+
setSelectedOption,
|
|
209
|
+
setTempSelectedOption,
|
|
210
|
+
tempSelectedOption,
|
|
211
|
+
setStartNewChatConfirmation,
|
|
212
|
+
sessionId,
|
|
213
|
+
]);
|
|
174
214
|
|
|
175
215
|
const handleEndChat = useCallback(() => {
|
|
176
216
|
setEndChatConfirmation(false);
|