@agentcrafta/chat-next 0.0.7 → 0.0.8
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/chat.style.css +180 -0
- package/dist/index.js +54 -50
- package/dist/index.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* Estilos base para AgentCrafta Chat */
|
|
2
|
+
.agentcrafta-chat-container {
|
|
3
|
+
position: fixed;
|
|
4
|
+
z-index: 999;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.agentcrafta-chat-container.bottom-right {
|
|
8
|
+
bottom: 2rem;
|
|
9
|
+
right: 2rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.agentcrafta-chat-container.bottom-left {
|
|
13
|
+
bottom: 2rem;
|
|
14
|
+
left: 2rem;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.agentcrafta-chat-container.top-right {
|
|
18
|
+
top: 2rem;
|
|
19
|
+
right: 2rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.agentcrafta-chat-container.top-left {
|
|
23
|
+
top: 2rem;
|
|
24
|
+
left: 2rem;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.agentcrafta-chat-window {
|
|
28
|
+
margin-bottom: 1rem;
|
|
29
|
+
height: 520px;
|
|
30
|
+
width: 450px;
|
|
31
|
+
overflow: hidden;
|
|
32
|
+
border-radius: 1rem;
|
|
33
|
+
background-color: white;
|
|
34
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
35
|
+
transition: all 0.3s ease-in-out;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.agentcrafta-chat-window.bottom-right,
|
|
39
|
+
.agentcrafta-chat-window.bottom-left {
|
|
40
|
+
transform-origin: bottom;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.agentcrafta-chat-window.top-right,
|
|
44
|
+
.agentcrafta-chat-window.top-left {
|
|
45
|
+
transform-origin: top;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.agentcrafta-chat-window.visible {
|
|
49
|
+
transform: scale(1);
|
|
50
|
+
opacity: 1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.agentcrafta-chat-window.hidden {
|
|
54
|
+
transform: scale(0.95);
|
|
55
|
+
opacity: 0;
|
|
56
|
+
pointer-events: none;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.agentcrafta-chat-header {
|
|
60
|
+
display: flex;
|
|
61
|
+
height: 3.5rem;
|
|
62
|
+
align-items: center;
|
|
63
|
+
justify-content: space-between;
|
|
64
|
+
padding: 0 1.25rem;
|
|
65
|
+
background-color: var(--primary-color, #0066cc);
|
|
66
|
+
color: white;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.agentcrafta-chat-header-content {
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
gap: 0.75rem;
|
|
73
|
+
font-size: 1rem;
|
|
74
|
+
font-weight: 500;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.agentcrafta-chat-logo {
|
|
78
|
+
height: 1.75rem;
|
|
79
|
+
width: 1.75rem;
|
|
80
|
+
border-radius: 0.25rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.agentcrafta-chat-actions {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 0.75rem;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.agentcrafta-chat-button {
|
|
90
|
+
border-radius: 0.5rem;
|
|
91
|
+
padding: 0.5rem;
|
|
92
|
+
transition: background-color 0.2s;
|
|
93
|
+
border: none;
|
|
94
|
+
background: transparent;
|
|
95
|
+
cursor: pointer;
|
|
96
|
+
color: inherit;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.agentcrafta-chat-button:hover {
|
|
100
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.agentcrafta-chat-button:disabled {
|
|
104
|
+
cursor: not-allowed;
|
|
105
|
+
opacity: 0.5;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.agentcrafta-chat-content {
|
|
109
|
+
position: relative;
|
|
110
|
+
height: calc(100% - 56px);
|
|
111
|
+
width: 100%;
|
|
112
|
+
background-color: #f9fafb;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.agentcrafta-chat-loading {
|
|
116
|
+
position: absolute;
|
|
117
|
+
inset: 0;
|
|
118
|
+
z-index: 10;
|
|
119
|
+
display: flex;
|
|
120
|
+
align-items: center;
|
|
121
|
+
justify-content: center;
|
|
122
|
+
background-color: rgba(249, 250, 251, 0.8);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.agentcrafta-chat-loading-content {
|
|
126
|
+
display: flex;
|
|
127
|
+
flex-direction: column;
|
|
128
|
+
align-items: center;
|
|
129
|
+
gap: 0.75rem;
|
|
130
|
+
color: #4b5563;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.agentcrafta-chat-loading-spinner {
|
|
134
|
+
height: 2rem;
|
|
135
|
+
width: 2rem;
|
|
136
|
+
animation: spin 1s linear infinite;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@keyframes spin {
|
|
140
|
+
from {
|
|
141
|
+
transform: rotate(0deg);
|
|
142
|
+
}
|
|
143
|
+
to {
|
|
144
|
+
transform: rotate(360deg);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.agentcrafta-chat-loading-text {
|
|
149
|
+
font-size: 0.875rem;
|
|
150
|
+
font-weight: 500;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Estilos para el botón flotante */
|
|
154
|
+
.agentcrafta-chat-fab {
|
|
155
|
+
height: 3.5rem;
|
|
156
|
+
width: 3.5rem;
|
|
157
|
+
border-radius: 9999px;
|
|
158
|
+
background-color: var(--primary-color, #0066cc);
|
|
159
|
+
color: white;
|
|
160
|
+
border: none;
|
|
161
|
+
cursor: pointer;
|
|
162
|
+
display: flex;
|
|
163
|
+
align-items: center;
|
|
164
|
+
justify-content: center;
|
|
165
|
+
box-shadow:
|
|
166
|
+
0 10px 15px -3px rgba(0, 0, 0, 0.1),
|
|
167
|
+
0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
|
168
|
+
transition: all 0.2s;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.agentcrafta-chat-fab:hover {
|
|
172
|
+
transform: scale(1.1);
|
|
173
|
+
box-shadow:
|
|
174
|
+
0 20px 25px -5px rgba(0, 0, 0, 0.1),
|
|
175
|
+
0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.agentcrafta-chat-fab:active {
|
|
179
|
+
transform: scale(1.05);
|
|
180
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -141,27 +141,41 @@ var useChat = (styleOptionsProps, entryPoint) => {
|
|
|
141
141
|
import "@agentcrafta/core";
|
|
142
142
|
|
|
143
143
|
// src/client/chat-button-default.tsx
|
|
144
|
-
import { jsx } from "react/jsx-runtime";
|
|
144
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
145
145
|
var ChatButtonDefault = ({ toggle, isVisible }) => {
|
|
146
146
|
return /* @__PURE__ */ jsx(
|
|
147
147
|
"button",
|
|
148
148
|
{
|
|
149
149
|
onClick: toggle,
|
|
150
|
-
className:
|
|
151
|
-
"aria-label": "
|
|
152
|
-
|
|
153
|
-
"aria-controls": "agentcrafta-chat-window",
|
|
154
|
-
children: /* @__PURE__ */ jsx(
|
|
150
|
+
className: "agentcrafta-chat-fab",
|
|
151
|
+
"aria-label": isVisible ? "Cerrar chat" : "Abrir chat",
|
|
152
|
+
children: isVisible ? /* @__PURE__ */ jsxs(
|
|
155
153
|
"svg",
|
|
156
154
|
{
|
|
157
|
-
|
|
155
|
+
width: "24",
|
|
156
|
+
height: "24",
|
|
157
|
+
viewBox: "0 0 24 24",
|
|
158
|
+
fill: "none",
|
|
159
|
+
stroke: "currentColor",
|
|
160
|
+
strokeWidth: "2",
|
|
161
|
+
strokeLinecap: "round",
|
|
162
|
+
strokeLinejoin: "round",
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
165
|
+
/* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
) : /* @__PURE__ */ jsx(
|
|
169
|
+
"svg",
|
|
170
|
+
{
|
|
171
|
+
width: "24",
|
|
172
|
+
height: "24",
|
|
158
173
|
viewBox: "0 0 24 24",
|
|
159
174
|
fill: "none",
|
|
160
175
|
stroke: "currentColor",
|
|
161
176
|
strokeWidth: "2",
|
|
162
177
|
strokeLinecap: "round",
|
|
163
178
|
strokeLinejoin: "round",
|
|
164
|
-
"aria-hidden": "true",
|
|
165
179
|
children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
|
|
166
180
|
}
|
|
167
181
|
)
|
|
@@ -170,19 +184,7 @@ var ChatButtonDefault = ({ toggle, isVisible }) => {
|
|
|
170
184
|
};
|
|
171
185
|
|
|
172
186
|
// src/client/chat.tsx
|
|
173
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
174
|
-
var positionClasses = {
|
|
175
|
-
"bottom-right": "bottom-8 right-8",
|
|
176
|
-
"bottom-left": "bottom-8 left-8",
|
|
177
|
-
"top-right": "top-8 right-8",
|
|
178
|
-
"top-left": "top-8 left-8"
|
|
179
|
-
};
|
|
180
|
-
var originClasses = {
|
|
181
|
-
"bottom-right": "origin-bottom-right",
|
|
182
|
-
"bottom-left": "origin-bottom-left",
|
|
183
|
-
"top-right": "origin-top-right",
|
|
184
|
-
"top-left": "origin-top-left"
|
|
185
|
-
};
|
|
187
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
186
188
|
var Chat = ({
|
|
187
189
|
botName = "Agent",
|
|
188
190
|
show = true,
|
|
@@ -222,11 +224,8 @@ var Chat = ({
|
|
|
222
224
|
const existingScript = document.querySelector(
|
|
223
225
|
'script[src*="botframework-webchat"]'
|
|
224
226
|
);
|
|
225
|
-
if (
|
|
226
|
-
|
|
227
|
-
initializeChat();
|
|
228
|
-
initializedRef.current = true;
|
|
229
|
-
}
|
|
227
|
+
if (existingScript) {
|
|
228
|
+
scriptLoadedRef.current = true;
|
|
230
229
|
return;
|
|
231
230
|
}
|
|
232
231
|
const script = document.createElement("script");
|
|
@@ -234,10 +233,6 @@ var Chat = ({
|
|
|
234
233
|
script.async = true;
|
|
235
234
|
script.onload = () => {
|
|
236
235
|
scriptLoadedRef.current = true;
|
|
237
|
-
if (!initializedRef.current) {
|
|
238
|
-
initializeChat();
|
|
239
|
-
initializedRef.current = true;
|
|
240
|
-
}
|
|
241
236
|
};
|
|
242
237
|
script.onerror = () => {
|
|
243
238
|
console.error("Error al cargar el script de WebChat");
|
|
@@ -247,31 +242,40 @@ var Chat = ({
|
|
|
247
242
|
return () => {
|
|
248
243
|
cleanup();
|
|
249
244
|
};
|
|
250
|
-
}, [
|
|
245
|
+
}, [portalContainer, show]);
|
|
246
|
+
React2.useEffect(() => {
|
|
247
|
+
if (!isVisible) return;
|
|
248
|
+
if (!scriptLoadedRef.current) return;
|
|
249
|
+
if (initializedRef.current) return;
|
|
250
|
+
initializeChat();
|
|
251
|
+
initializedRef.current = true;
|
|
252
|
+
}, [isVisible]);
|
|
251
253
|
if (!show || !portalContainer) return null;
|
|
252
254
|
return createPortal(
|
|
253
|
-
/* @__PURE__ */
|
|
255
|
+
/* @__PURE__ */ jsxs2(
|
|
254
256
|
"div",
|
|
255
257
|
{
|
|
256
|
-
className: `
|
|
258
|
+
className: `agentcrafta-chat-container ${position}`,
|
|
257
259
|
role: "dialog",
|
|
258
260
|
"aria-modal": "false",
|
|
259
261
|
children: [
|
|
260
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ jsxs2(
|
|
261
263
|
"div",
|
|
262
264
|
{
|
|
263
265
|
id: "agentcrafta-chat-window",
|
|
264
|
-
className: `
|
|
266
|
+
className: `agentcrafta-chat-window ${position} ${isVisible ? "visible" : "hidden"}`,
|
|
265
267
|
role: "complementary",
|
|
266
268
|
"aria-label": `Chat ${botName}`,
|
|
267
269
|
children: [
|
|
268
|
-
/* @__PURE__ */
|
|
270
|
+
/* @__PURE__ */ jsxs2(
|
|
269
271
|
"div",
|
|
270
272
|
{
|
|
271
|
-
className: "
|
|
272
|
-
style: {
|
|
273
|
+
className: "agentcrafta-chat-header",
|
|
274
|
+
style: {
|
|
275
|
+
color: styleOptionsMerged.suggestedActionTextColor
|
|
276
|
+
},
|
|
273
277
|
children: [
|
|
274
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-header-content", children: [
|
|
275
279
|
logoUrl && /* @__PURE__ */ jsx2(
|
|
276
280
|
"img",
|
|
277
281
|
{
|
|
@@ -279,18 +283,18 @@ var Chat = ({
|
|
|
279
283
|
alt: "Logo",
|
|
280
284
|
width: 24,
|
|
281
285
|
height: 24,
|
|
282
|
-
className: "
|
|
286
|
+
className: "agentcrafta-chat-logo"
|
|
283
287
|
}
|
|
284
288
|
),
|
|
285
289
|
/* @__PURE__ */ jsx2("span", { children: botName })
|
|
286
290
|
] }),
|
|
287
|
-
/* @__PURE__ */
|
|
291
|
+
/* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-actions", children: [
|
|
288
292
|
/* @__PURE__ */ jsx2(
|
|
289
293
|
"button",
|
|
290
294
|
{
|
|
291
295
|
onClick: restartConversation,
|
|
292
296
|
disabled: isRestarting,
|
|
293
|
-
className: "
|
|
297
|
+
className: "agentcrafta-chat-button",
|
|
294
298
|
style: { color: styleOptionsMerged.suggestedActionTextColor },
|
|
295
299
|
children: isRestarting ? /* @__PURE__ */ jsx2(
|
|
296
300
|
"svg",
|
|
@@ -304,10 +308,10 @@ var Chat = ({
|
|
|
304
308
|
strokeLinecap: "round",
|
|
305
309
|
strokeLinejoin: "round",
|
|
306
310
|
"aria-hidden": "true",
|
|
307
|
-
className: "
|
|
311
|
+
className: "agentcrafta-chat-loading-spinner",
|
|
308
312
|
children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
|
|
309
313
|
}
|
|
310
|
-
) : /* @__PURE__ */
|
|
314
|
+
) : /* @__PURE__ */ jsxs2(
|
|
311
315
|
"svg",
|
|
312
316
|
{
|
|
313
317
|
width: "20",
|
|
@@ -331,9 +335,9 @@ var Chat = ({
|
|
|
331
335
|
"button",
|
|
332
336
|
{
|
|
333
337
|
onClick: () => handleChangeVisibility(false),
|
|
334
|
-
className: "
|
|
338
|
+
className: "agentcrafta-chat-button",
|
|
335
339
|
style: { color: styleOptionsMerged.suggestedActionTextColor },
|
|
336
|
-
children: /* @__PURE__ */
|
|
340
|
+
children: /* @__PURE__ */ jsxs2(
|
|
337
341
|
"svg",
|
|
338
342
|
{
|
|
339
343
|
width: "20",
|
|
@@ -361,15 +365,15 @@ var Chat = ({
|
|
|
361
365
|
"div",
|
|
362
366
|
{
|
|
363
367
|
ref: webChatRef,
|
|
364
|
-
className: "
|
|
368
|
+
className: "agentcrafta-chat-content"
|
|
365
369
|
},
|
|
366
370
|
chatKey
|
|
367
371
|
),
|
|
368
|
-
isRestarting && /* @__PURE__ */ jsx2("div", { className: "
|
|
372
|
+
isRestarting && /* @__PURE__ */ jsx2("div", { className: "agentcrafta-chat-loading", children: /* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-loading-content", children: [
|
|
369
373
|
/* @__PURE__ */ jsx2(
|
|
370
374
|
"svg",
|
|
371
375
|
{
|
|
372
|
-
className: "
|
|
376
|
+
className: "agentcrafta-chat-loading-spinner",
|
|
373
377
|
viewBox: "0 0 24 24",
|
|
374
378
|
fill: "none",
|
|
375
379
|
stroke: "currentColor",
|
|
@@ -377,7 +381,7 @@ var Chat = ({
|
|
|
377
381
|
children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
|
|
378
382
|
}
|
|
379
383
|
),
|
|
380
|
-
/* @__PURE__ */ jsx2("span", { className: "
|
|
384
|
+
/* @__PURE__ */ jsx2("span", { className: "agentcrafta-chat-loading-text", children: "Reiniciando conversaci\xF3n..." })
|
|
381
385
|
] }) })
|
|
382
386
|
]
|
|
383
387
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/chat.tsx","../src/client/use-chat.ts","../src/client/chat-button-default.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { useChat } from \"./use-chat\";\r\nimport { type StyleOptions, type WebChatLib } from \"@agentcrafta/core\";\r\nimport { ChatButtonDefault } from \"./chat-button-default\";\r\n\r\ndeclare global {\r\n interface Window {\r\n WebChat: WebChatLib;\r\n }\r\n}\r\n\r\ntype Position = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\r\n\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\ntype ChatProps = {\r\n show?: boolean;\r\n botName?: string;\r\n logoUrl?: string;\r\n chatButton?: (props: ChatButtonProps) => React.ReactNode;\r\n styleOptions?: Partial<StyleOptions>;\r\n entryPoint: string;\r\n position?: Position;\r\n};\r\n\r\nconst positionClasses: Record<Position, string> = {\r\n \"bottom-right\": \"bottom-8 right-8\",\r\n \"bottom-left\": \"bottom-8 left-8\",\r\n \"top-right\": \"top-8 right-8\",\r\n \"top-left\": \"top-8 left-8\",\r\n};\r\nconst originClasses: Record<Position, string> = {\r\n \"bottom-right\": \"origin-bottom-right\",\r\n \"bottom-left\": \"origin-bottom-left\",\r\n \"top-right\": \"origin-top-right\",\r\n \"top-left\": \"origin-top-left\",\r\n};\r\n\r\n/**\r\n * @description Componente de chat para interactuar con un agente virtual utilizando Bot Framework Web Chat. Permite iniciar y reiniciar conversaciones, y se adapta a la configuración de estilo definida en el hook useChat.\r\n * @param botName Nombre del bot a mostrar en el encabezado del chat\r\n * @param logoUrl URL del logo a mostrar junto al nombre del bot (opcional)\r\n * @param chatButton Elemento de botón personalizado para abrir el chat (opcional)\r\n * @param show Indica si el chat debe mostrarse o no (por defecto es true)\r\n * @param styleOptions: StyleOptions Opciones de estilo personalizadas para el chat (opcional)\r\n * @param entryPoint Punto de entrada para la conversación (opcional)\r\n * @param position Posición del chat en la pantalla (por defecto es \"bottom-right\")\r\n * @returns\r\n */\r\nexport const Chat = ({\r\n botName = \"Agent\",\r\n show = true,\r\n logoUrl,\r\n chatButton,\r\n styleOptions,\r\n entryPoint,\r\n position = \"bottom-right\",\r\n}: ChatProps) => {\r\n const {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n handleChangeVisibility,\r\n } = useChat(styleOptions, entryPoint);\r\n const [portalContainer, setPortalContainer] =\r\n React.useState<HTMLElement | null>(null);\r\n const initializedRef = React.useRef(false);\r\n const scriptLoadedRef = React.useRef(false);\r\n\r\n const toggle = () => handleChangeVisibility(!isVisible);\r\n\r\n const button = chatButton ? (\r\n chatButton({ isVisible, toggle })\r\n ) : (\r\n <ChatButtonDefault isVisible={isVisible} toggle={toggle} />\r\n );\r\n\r\n React.useEffect(() => {\r\n let container = document.getElementById(\"agentcrafta-chat-root\");\r\n\r\n if (!container) {\r\n container = document.createElement(\"div\");\r\n container.id = \"agentcrafta-chat-root\";\r\n document.body.appendChild(container);\r\n }\r\n\r\n setPortalContainer(container);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (!show || !portalContainer) return;\r\n // Verificar si el script ya existe en el DOM\r\n const existingScript = document.querySelector(\r\n 'script[src*=\"botframework-webchat\"]',\r\n );\r\n\r\n if (\r\n (existingScript || scriptLoadedRef.current) &&\r\n !initializedRef.current\r\n ) {\r\n // Si WebChat ya está disponible, inicializar\r\n if (globalThis.window.WebChat) {\r\n initializeChat();\r\n initializedRef.current = true;\r\n }\r\n return;\r\n }\r\n\r\n // Cargar el script solo si no existe\r\n const script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdn.botframework.com/botframework-webchat/latest/webchat.js\";\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n scriptLoadedRef.current = true;\r\n if (!initializedRef.current) {\r\n initializeChat();\r\n initializedRef.current = true;\r\n }\r\n };\r\n\r\n script.onerror = () => {\r\n console.error(\"Error al cargar el script de WebChat\");\r\n scriptLoadedRef.current = false;\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n return () => {\r\n cleanup();\r\n };\r\n }, [chatKey, portalContainer, show]);\r\n\r\n if (!show || !portalContainer) return null;\r\n\r\n return createPortal(\r\n <div\r\n className={`fixed ${positionClasses[position]} z-[999]`}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n >\r\n <div\r\n id=\"agentcrafta-chat-window\"\r\n className={`mb-4 h-[520px] w-[450px] ${originClasses[position]} overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-in-out ${\r\n isVisible\r\n ? \"scale-100 opacity-100\"\r\n : \"pointer-events-none scale-95 opacity-0\"\r\n }`}\r\n role=\"complementary\"\r\n aria-label={`Chat ${botName}`}\r\n >\r\n <div\r\n className=\"flex h-14 items-center justify-between bg-primary px-5 text-white\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <div className=\"flex items-center gap-3 text-base font-medium\">\r\n {logoUrl && (\r\n <img\r\n src={logoUrl}\r\n alt=\"Logo\"\r\n width={24}\r\n height={24}\r\n className=\"h-7 w-7 rounded-sm\"\r\n />\r\n )}\r\n <span>{botName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n onClick={restartConversation}\r\n disabled={isRestarting}\r\n className=\"rounded-lg p-2 transition hover:bg-white/10\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n {isRestarting ? (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className=\"animate-spin\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\r\n <path d=\"M3 3v5h5\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => handleChangeVisibility(false)}\r\n className=\"rounded-lg p-2 transition hover:bg-white/10\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n key={chatKey}\r\n ref={webChatRef}\r\n className=\"relative h-[calc(100%-56px)] w-full bg-gray-50\"\r\n />\r\n\r\n {isRestarting && (\r\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-gray-50/80\">\r\n <div className=\"flex flex-col items-center gap-3 text-gray-600\">\r\n <svg\r\n className=\"h-8 w-8 animate-spin\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n <span className=\"text-sm font-medium\">\r\n Reiniciando conversación...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {button}\r\n </div>,\r\n portalContainer,\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\n\r\nimport {\r\n TypeDispatch,\r\n styleOptionsBase,\r\n type StyleOptions,\r\n type WebChatAction,\r\n type WebChatStore,\r\n} from \"@agentcrafta/core\";\r\nimport {\r\n getChatStoreConfig,\r\n getConversationToken,\r\n getRegionalSettings,\r\n logChatError,\r\n} from \"../server\";\r\n\r\nexport const useChat = (\r\n styleOptionsProps: Partial<StyleOptions> | undefined,\r\n entryPoint: string,\r\n) => {\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isRestarting, setIsRestarting] = React.useState(false);\r\n const [chatKey, setChatKey] = React.useState(Date.now());\r\n const webChatRef = React.useRef<HTMLDivElement>(null);\r\n const webChatInstanceRef = React.useRef<unknown>(null);\r\n const directLineUrlRef = React.useRef<string | null>(null);\r\n const isInitializedRef = React.useRef(false);\r\n\r\n const styleOptionsMerged = { ...styleOptionsBase, ...styleOptionsProps };\r\n\r\n const handleChangeVisibility = (visible: boolean) => {\r\n setIsVisible(visible);\r\n };\r\n\r\n /**\r\n * Crea una tienda personalizada para Web Chat que maneja la conexión y filtra actividades específicas.\r\n *\r\n * @returns action: WebChatAction\r\n */\r\n const createCustomStore = async () => {\r\n const configResult = await getChatStoreConfig();\r\n const { eventConfig, filterConfig, initialState } = configResult ?? {};\r\n\r\n return globalThis.window.WebChat.createStore(\r\n initialState || {},\r\n ({ dispatch }: WebChatStore) =>\r\n (next: (action: WebChatAction) => WebChatAction) =>\r\n (action: WebChatAction) => {\r\n if (action.type === TypeDispatch.CONNECTED_FULFILLED) {\r\n dispatch({\r\n type: TypeDispatch.POST_ACTIVITY,\r\n meta: { method: \"keyboard\" },\r\n payload: {\r\n activity: eventConfig?.startConversation || {\r\n channelData: { postBack: true },\r\n name: \"startConversation\",\r\n type: \"event\",\r\n },\r\n },\r\n });\r\n }\r\n\r\n // Filtrar actividades trace con configuración del servidor\r\n if (\r\n action.type === TypeDispatch.INCOMING_ACTIVITY &&\r\n action.payload?.activity?.type === \"trace\"\r\n ) {\r\n const errorMessage =\r\n filterConfig?.traceErrorMessage || \"Error de conectividad\";\r\n console.error(errorMessage);\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n logChatError({\r\n errorType: \"trace_activity\",\r\n errorMessage: \"Trace activity filtered\",\r\n actionType: action.type,\r\n });\r\n\r\n return action;\r\n }\r\n\r\n return next(action);\r\n },\r\n );\r\n };\r\n\r\n /**\r\n * Reinicia la conversación del chat usando el patrón React key para remount completo.\r\n * @returns\r\n */\r\n const restartConversation = async () => {\r\n if (isRestarting) return;\r\n\r\n try {\r\n setIsRestarting(true);\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n setChatKey(Date.now());\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error al reiniciar conversación:\", errorMessage);\r\n logChatError({\r\n errorType: \"restart_conversation\",\r\n errorMessage,\r\n actionType: \"Error reiniciando conversación\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n } finally {\r\n setIsRestarting(false);\r\n }\r\n };\r\n\r\n /**\r\n * Inicializa el chat embebido obteniendo la URL de DirectLine y el token de conversación.\r\n * @returns\r\n */\r\n const initializeChat = async () => {\r\n if (isInitializedRef.current) return;\r\n\r\n try {\r\n const data = await getRegionalSettings(entryPoint);\r\n directLineUrlRef.current = data.channelUrlsById.directline;\r\n\r\n if (!directLineUrlRef.current) {\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage: \"DirectLine URL not found in regional settings\",\r\n actionType: \"Error inicializando chat\",\r\n });\r\n console.error(\"No se pudo obtener la URL de DirectLine\");\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n return;\r\n }\r\n const token = await getConversationToken(entryPoint);\r\n const directLine = globalThis.window.WebChat.createDirectLine({\r\n domain: `${directLineUrlRef.current}v3/directline`,\r\n token,\r\n });\r\n\r\n if (webChatRef.current && !isInitializedRef.current) {\r\n const store = await createCustomStore();\r\n webChatInstanceRef.current = globalThis.window.WebChat.renderWebChat(\r\n {\r\n directLine,\r\n styleOptions: styleOptionsMerged,\r\n store,\r\n },\r\n webChatRef.current,\r\n );\r\n isInitializedRef.current = true;\r\n }\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error detallado al inicializar el chat:\", err);\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage,\r\n actionType: \"Error inicializando chat\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n }\r\n };\r\n\r\n /**\r\n * Limpia la instancia del chat embebido de forma simple.\r\n */\r\n const cleanup = () => {\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n // No manipular DOM directamente - dejar que React maneje el ciclo de vida\r\n };\r\n\r\n return {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n handleChangeVisibility,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n };\r\n};\r\n","\"use client\";\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\nexport const ChatButtonDefault = ({ toggle, isVisible }: ChatButtonProps) => {\r\n return (\r\n <button\r\n onClick={toggle}\r\n className={`flex h-16 w-16 items-center justify-center rounded-full bg-primary shadow-lg transition-all duration-300 hover:-translate-y-1 hover:shadow-xl ${\r\n isVisible\r\n ? \"pointer-events-none translate-y-2 scale-95 opacity-0\"\r\n : \"scale-100 opacity-100\"\r\n }`}\r\n aria-label=\"Open Chat Assistant\"\r\n aria-expanded={isVisible}\r\n aria-controls=\"agentcrafta-chat-window\"\r\n >\r\n <svg\r\n className=\"h-7 w-7 text-white transition-transform\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>\r\n </button>\r\n );\r\n};\r\n"],"mappings":"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","names":["React","jsx","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/chat.tsx","../src/client/use-chat.ts","../src/client/chat-button-default.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { useChat } from \"./use-chat\";\r\nimport { type StyleOptions, type WebChatLib } from \"@agentcrafta/core\";\r\nimport { ChatButtonDefault } from \"./chat-button-default\";\r\n\r\ndeclare global {\r\n interface Window {\r\n WebChat: WebChatLib;\r\n }\r\n}\r\n\r\ntype Position = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\r\n\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\ntype ChatProps = {\r\n show?: boolean;\r\n botName?: string;\r\n logoUrl?: string;\r\n chatButton?: (props: ChatButtonProps) => React.ReactNode;\r\n styleOptions?: Partial<StyleOptions>;\r\n entryPoint: string;\r\n position?: Position;\r\n};\r\n\r\n/**\r\n * @description Componente de chat para interactuar con un agente virtual utilizando Bot Framework Web Chat. Permite iniciar y reiniciar conversaciones, y se adapta a la configuración de estilo definida en el hook useChat.\r\n * @param botName Nombre del bot a mostrar en el encabezado del chat\r\n * @param logoUrl URL del logo a mostrar junto al nombre del bot (opcional)\r\n * @param chatButton Elemento de botón personalizado para abrir el chat (opcional)\r\n * @param show Indica si el chat debe mostrarse o no (por defecto es true)\r\n * @param styleOptions: StyleOptions Opciones de estilo personalizadas para el chat (opcional)\r\n * @param entryPoint Punto de entrada para la conversación (opcional)\r\n * @param position Posición del chat en la pantalla (por defecto es \"bottom-right\")\r\n * @returns\r\n */\r\nexport const Chat = ({\r\n botName = \"Agent\",\r\n show = true,\r\n logoUrl,\r\n chatButton,\r\n styleOptions,\r\n entryPoint,\r\n position = \"bottom-right\",\r\n}: ChatProps) => {\r\n const {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n handleChangeVisibility,\r\n } = useChat(styleOptions, entryPoint);\r\n const [portalContainer, setPortalContainer] =\r\n React.useState<HTMLElement | null>(null);\r\n const initializedRef = React.useRef(false);\r\n const scriptLoadedRef = React.useRef(false);\r\n\r\n const toggle = () => handleChangeVisibility(!isVisible);\r\n\r\n const button = chatButton ? (\r\n chatButton({ isVisible, toggle })\r\n ) : (\r\n <ChatButtonDefault isVisible={isVisible} toggle={toggle} />\r\n );\r\n\r\n React.useEffect(() => {\r\n let container = document.getElementById(\"agentcrafta-chat-root\");\r\n\r\n if (!container) {\r\n container = document.createElement(\"div\");\r\n container.id = \"agentcrafta-chat-root\";\r\n document.body.appendChild(container);\r\n }\r\n\r\n setPortalContainer(container);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (!show || !portalContainer) return;\r\n // Verificar si el script ya existe en el DOM\r\n const existingScript = document.querySelector(\r\n 'script[src*=\"botframework-webchat\"]',\r\n );\r\n\r\n if (existingScript) {\r\n scriptLoadedRef.current = true;\r\n return;\r\n }\r\n\r\n // Cargar el script solo si no existe\r\n const script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdn.botframework.com/botframework-webchat/latest/webchat.js\";\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n scriptLoadedRef.current = true;\r\n };\r\n\r\n script.onerror = () => {\r\n console.error(\"Error al cargar el script de WebChat\");\r\n scriptLoadedRef.current = false;\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n return () => {\r\n cleanup();\r\n };\r\n }, [portalContainer, show]);\r\n\r\n /**\r\n * Inicializar SOLO la primera vez que se abre\r\n */\r\n React.useEffect(() => {\r\n if (!isVisible) return;\r\n if (!scriptLoadedRef.current) return;\r\n if (initializedRef.current) return;\r\n\r\n initializeChat();\r\n initializedRef.current = true;\r\n }, [isVisible]);\r\n\r\n if (!show || !portalContainer) return null;\r\n\r\n return createPortal(\r\n <div\r\n className={`agentcrafta-chat-container ${position}`}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n >\r\n <div\r\n id=\"agentcrafta-chat-window\"\r\n className={`agentcrafta-chat-window ${position} ${isVisible ? \"visible\" : \"hidden\"}`}\r\n role=\"complementary\"\r\n aria-label={`Chat ${botName}`}\r\n >\r\n <div\r\n className=\"agentcrafta-chat-header\"\r\n style={{\r\n color: styleOptionsMerged.suggestedActionTextColor,\r\n }}\r\n >\r\n <div className=\"agentcrafta-chat-header-content\">\r\n {logoUrl && (\r\n <img\r\n src={logoUrl}\r\n alt=\"Logo\"\r\n width={24}\r\n height={24}\r\n className=\"agentcrafta-chat-logo\"\r\n />\r\n )}\r\n <span>{botName}</span>\r\n </div>\r\n <div className=\"agentcrafta-chat-actions\">\r\n <button\r\n onClick={restartConversation}\r\n disabled={isRestarting}\r\n className=\"agentcrafta-chat-button\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n {isRestarting ? (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className=\"agentcrafta-chat-loading-spinner\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\r\n <path d=\"M3 3v5h5\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => handleChangeVisibility(false)}\r\n className=\"agentcrafta-chat-button\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n key={chatKey}\r\n ref={webChatRef}\r\n className=\"agentcrafta-chat-content\"\r\n />\r\n\r\n {isRestarting && (\r\n <div className=\"agentcrafta-chat-loading\">\r\n <div className=\"agentcrafta-chat-loading-content\">\r\n <svg\r\n className=\"agentcrafta-chat-loading-spinner\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n <span className=\"agentcrafta-chat-loading-text\">\r\n Reiniciando conversación...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {button}\r\n </div>,\r\n portalContainer,\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\n\r\nimport {\r\n TypeDispatch,\r\n styleOptionsBase,\r\n type StyleOptions,\r\n type WebChatAction,\r\n type WebChatStore,\r\n} from \"@agentcrafta/core\";\r\nimport {\r\n getChatStoreConfig,\r\n getConversationToken,\r\n getRegionalSettings,\r\n logChatError,\r\n} from \"../server\";\r\n\r\nexport const useChat = (\r\n styleOptionsProps: Partial<StyleOptions> | undefined,\r\n entryPoint: string,\r\n) => {\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isRestarting, setIsRestarting] = React.useState(false);\r\n const [chatKey, setChatKey] = React.useState(Date.now());\r\n const webChatRef = React.useRef<HTMLDivElement>(null);\r\n const webChatInstanceRef = React.useRef<unknown>(null);\r\n const directLineUrlRef = React.useRef<string | null>(null);\r\n const isInitializedRef = React.useRef(false);\r\n\r\n const styleOptionsMerged = { ...styleOptionsBase, ...styleOptionsProps };\r\n\r\n const handleChangeVisibility = (visible: boolean) => {\r\n setIsVisible(visible);\r\n };\r\n\r\n /**\r\n * Crea una tienda personalizada para Web Chat que maneja la conexión y filtra actividades específicas.\r\n *\r\n * @returns action: WebChatAction\r\n */\r\n const createCustomStore = async () => {\r\n const configResult = await getChatStoreConfig();\r\n const { eventConfig, filterConfig, initialState } = configResult ?? {};\r\n\r\n return globalThis.window.WebChat.createStore(\r\n initialState || {},\r\n ({ dispatch }: WebChatStore) =>\r\n (next: (action: WebChatAction) => WebChatAction) =>\r\n (action: WebChatAction) => {\r\n if (action.type === TypeDispatch.CONNECTED_FULFILLED) {\r\n dispatch({\r\n type: TypeDispatch.POST_ACTIVITY,\r\n meta: { method: \"keyboard\" },\r\n payload: {\r\n activity: eventConfig?.startConversation || {\r\n channelData: { postBack: true },\r\n name: \"startConversation\",\r\n type: \"event\",\r\n },\r\n },\r\n });\r\n }\r\n\r\n // Filtrar actividades trace con configuración del servidor\r\n if (\r\n action.type === TypeDispatch.INCOMING_ACTIVITY &&\r\n action.payload?.activity?.type === \"trace\"\r\n ) {\r\n const errorMessage =\r\n filterConfig?.traceErrorMessage || \"Error de conectividad\";\r\n console.error(errorMessage);\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n logChatError({\r\n errorType: \"trace_activity\",\r\n errorMessage: \"Trace activity filtered\",\r\n actionType: action.type,\r\n });\r\n\r\n return action;\r\n }\r\n\r\n return next(action);\r\n },\r\n );\r\n };\r\n\r\n /**\r\n * Reinicia la conversación del chat usando el patrón React key para remount completo.\r\n * @returns\r\n */\r\n const restartConversation = async () => {\r\n if (isRestarting) return;\r\n\r\n try {\r\n setIsRestarting(true);\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n setChatKey(Date.now());\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error al reiniciar conversación:\", errorMessage);\r\n logChatError({\r\n errorType: \"restart_conversation\",\r\n errorMessage,\r\n actionType: \"Error reiniciando conversación\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n } finally {\r\n setIsRestarting(false);\r\n }\r\n };\r\n\r\n /**\r\n * Inicializa el chat embebido obteniendo la URL de DirectLine y el token de conversación.\r\n * @returns\r\n */\r\n const initializeChat = async () => {\r\n if (isInitializedRef.current) return;\r\n\r\n try {\r\n const data = await getRegionalSettings(entryPoint);\r\n directLineUrlRef.current = data.channelUrlsById.directline;\r\n\r\n if (!directLineUrlRef.current) {\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage: \"DirectLine URL not found in regional settings\",\r\n actionType: \"Error inicializando chat\",\r\n });\r\n console.error(\"No se pudo obtener la URL de DirectLine\");\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n return;\r\n }\r\n const token = await getConversationToken(entryPoint);\r\n const directLine = globalThis.window.WebChat.createDirectLine({\r\n domain: `${directLineUrlRef.current}v3/directline`,\r\n token,\r\n });\r\n\r\n if (webChatRef.current && !isInitializedRef.current) {\r\n const store = await createCustomStore();\r\n webChatInstanceRef.current = globalThis.window.WebChat.renderWebChat(\r\n {\r\n directLine,\r\n styleOptions: styleOptionsMerged,\r\n store,\r\n },\r\n webChatRef.current,\r\n );\r\n isInitializedRef.current = true;\r\n }\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error detallado al inicializar el chat:\", err);\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage,\r\n actionType: \"Error inicializando chat\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n }\r\n };\r\n\r\n /**\r\n * Limpia la instancia del chat embebido de forma simple.\r\n */\r\n const cleanup = () => {\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n // No manipular DOM directamente - dejar que React maneje el ciclo de vida\r\n };\r\n\r\n return {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n handleChangeVisibility,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n };\r\n};\r\n","\"use client\";\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\nexport const ChatButtonDefault = ({ toggle, isVisible }: ChatButtonProps) => {\r\n return (\r\n <button\r\n onClick={toggle}\r\n className=\"agentcrafta-chat-fab\"\r\n aria-label={isVisible ? \"Cerrar chat\" : \"Abrir chat\"}\r\n >\r\n {isVisible ? (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n};\r\n"],"mappings":"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","names":["React","jsx","jsxs","React"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentcrafta/chat-next",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"
|
|
5
|
+
"style": "dist/chat.style.css",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"*.css"
|
|
8
|
+
],
|
|
6
9
|
"description": "Customizable chat agent",
|
|
7
10
|
"author": "Lazaro Blanco",
|
|
8
11
|
"license": "MIT",
|
|
9
12
|
"scripts": {
|
|
10
|
-
"build": "tsup",
|
|
13
|
+
"build": "tsup && cpy src/client/chat.style.css dist/ --flat",
|
|
11
14
|
"dev": "tsup --watch",
|
|
12
15
|
"typecheck": "tsc --noEmit",
|
|
13
16
|
"test": "vitest",
|
|
@@ -24,7 +27,8 @@
|
|
|
24
27
|
"./server": {
|
|
25
28
|
"types": "./dist/server/index.d.ts",
|
|
26
29
|
"default": "./dist/server/index.js"
|
|
27
|
-
}
|
|
30
|
+
},
|
|
31
|
+
"./styles.css": "./dist/chat.style.css"
|
|
28
32
|
},
|
|
29
33
|
"peerDependencies": {
|
|
30
34
|
"next": ">=14",
|