@pocketping/widget 1.4.0 → 1.5.1
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.cjs +92 -17
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +92 -17
- package/dist/pocketping.min.global.js +49 -5
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -151,6 +151,7 @@ function styles(primaryColor, theme) {
|
|
|
151
151
|
flex-direction: column;
|
|
152
152
|
overflow: hidden;
|
|
153
153
|
z-index: 9998;
|
|
154
|
+
transition: max-height 0.2s ease, bottom 0.2s ease;
|
|
154
155
|
}
|
|
155
156
|
|
|
156
157
|
.pp-window.pp-bottom-right {
|
|
@@ -167,13 +168,21 @@ function styles(primaryColor, theme) {
|
|
|
167
168
|
.pp-window {
|
|
168
169
|
width: calc(100vw - 20px);
|
|
169
170
|
height: auto;
|
|
171
|
+
min-height: 300px;
|
|
170
172
|
max-height: calc(100vh - 100px);
|
|
171
|
-
max-height: calc(
|
|
173
|
+
max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
|
|
172
174
|
bottom: 80px;
|
|
173
175
|
right: 10px;
|
|
174
176
|
left: 10px;
|
|
175
177
|
border-radius: 12px;
|
|
176
178
|
}
|
|
179
|
+
|
|
180
|
+
/* When keyboard is likely open (input focused), reduce height */
|
|
181
|
+
.pp-window:has(.pp-input:focus) {
|
|
182
|
+
max-height: calc(50vh - 20px);
|
|
183
|
+
max-height: calc(50svh - 20px);
|
|
184
|
+
bottom: 10px;
|
|
185
|
+
}
|
|
177
186
|
}
|
|
178
187
|
|
|
179
188
|
.pp-header {
|
|
@@ -964,17 +973,52 @@ function styles(primaryColor, theme) {
|
|
|
964
973
|
text-overflow: ellipsis;
|
|
965
974
|
}
|
|
966
975
|
|
|
976
|
+
/* Clickable reply quote */
|
|
977
|
+
.pp-reply-quote-clickable {
|
|
978
|
+
cursor: pointer;
|
|
979
|
+
transition: background 0.15s, transform 0.1s;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.pp-reply-quote-clickable:hover {
|
|
983
|
+
background: ${isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.08)"};
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
.pp-reply-quote-clickable:active {
|
|
987
|
+
transform: scale(0.98);
|
|
988
|
+
}
|
|
989
|
+
|
|
967
990
|
/* Reply quote in visitor message bubble needs higher contrast */
|
|
968
991
|
.pp-message-visitor .pp-reply-quote {
|
|
969
992
|
background: rgba(255, 255, 255, 0.18);
|
|
970
993
|
border-left-color: rgba(255, 255, 255, 0.7);
|
|
971
994
|
}
|
|
972
995
|
|
|
996
|
+
.pp-message-visitor .pp-reply-quote-clickable:hover {
|
|
997
|
+
background: rgba(255, 255, 255, 0.25);
|
|
998
|
+
}
|
|
999
|
+
|
|
973
1000
|
.pp-message-visitor .pp-reply-sender,
|
|
974
1001
|
.pp-message-visitor .pp-reply-content {
|
|
975
1002
|
color: rgba(255, 255, 255, 0.9);
|
|
976
1003
|
}
|
|
977
1004
|
|
|
1005
|
+
/* Message highlight animation (when scrolling to a message) */
|
|
1006
|
+
.pp-message-highlight {
|
|
1007
|
+
animation: pp-highlight-pulse 1.5s ease-out;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
@keyframes pp-highlight-pulse {
|
|
1011
|
+
0% {
|
|
1012
|
+
box-shadow: 0 0 0 0 ${primaryColor}80;
|
|
1013
|
+
}
|
|
1014
|
+
30% {
|
|
1015
|
+
box-shadow: 0 0 0 6px ${primaryColor}40;
|
|
1016
|
+
}
|
|
1017
|
+
100% {
|
|
1018
|
+
box-shadow: 0 0 0 0 ${primaryColor}00;
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
978
1022
|
/* Deleted Message */
|
|
979
1023
|
.pp-message-deleted {
|
|
980
1024
|
opacity: 0.6;
|
|
@@ -1273,6 +1317,16 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1273
1317
|
document.addEventListener("click", handleClickOutside);
|
|
1274
1318
|
return () => document.removeEventListener("click", handleClickOutside);
|
|
1275
1319
|
}, [messageMenu]);
|
|
1320
|
+
const scrollToMessage = (messageId) => {
|
|
1321
|
+
const messageElement = document.getElementById(`pp-msg-${messageId}`);
|
|
1322
|
+
if (messageElement) {
|
|
1323
|
+
messageElement.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
1324
|
+
messageElement.classList.add("pp-message-highlight");
|
|
1325
|
+
setTimeout(() => {
|
|
1326
|
+
messageElement.classList.remove("pp-message-highlight");
|
|
1327
|
+
}, 1500);
|
|
1328
|
+
}
|
|
1329
|
+
};
|
|
1276
1330
|
const dragCounterRef = (0, import_hooks.useRef)(0);
|
|
1277
1331
|
const handleDragEnter = (e) => {
|
|
1278
1332
|
e.preventDefault();
|
|
@@ -1413,10 +1467,14 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1413
1467
|
} else {
|
|
1414
1468
|
const replyToMsg = messages.find((m) => m.id === msg.replyTo);
|
|
1415
1469
|
if (replyToMsg) {
|
|
1470
|
+
const hasAttachment = !!(replyToMsg.attachments && replyToMsg.attachments.length > 0);
|
|
1416
1471
|
replyData = {
|
|
1472
|
+
id: replyToMsg.id,
|
|
1417
1473
|
sender: replyToMsg.sender,
|
|
1418
1474
|
content: replyToMsg.content,
|
|
1419
|
-
deleted: !!replyToMsg.deletedAt
|
|
1475
|
+
deleted: !!replyToMsg.deletedAt,
|
|
1476
|
+
hasAttachment,
|
|
1477
|
+
attachmentType: hasAttachment ? replyToMsg.attachments[0].mimeType : void 0
|
|
1420
1478
|
};
|
|
1421
1479
|
}
|
|
1422
1480
|
}
|
|
@@ -1426,6 +1484,7 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1426
1484
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
1427
1485
|
"div",
|
|
1428
1486
|
{
|
|
1487
|
+
id: `pp-msg-${msg.id}`,
|
|
1429
1488
|
class: `pp-message pp-message-${msg.sender} ${isDeleted ? "pp-message-deleted" : ""}`,
|
|
1430
1489
|
onContextMenu: (e) => handleMessageContextMenu(e, msg),
|
|
1431
1490
|
onMouseEnter: () => setHoveredMessageId(msg.id),
|
|
@@ -1465,13 +1524,26 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1465
1524
|
)
|
|
1466
1525
|
] })
|
|
1467
1526
|
] }),
|
|
1468
|
-
replyData && replyData.content && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
(replyData.
|
|
1473
|
-
|
|
1474
|
-
|
|
1527
|
+
replyData && (replyData.content || replyData.hasAttachment) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
1528
|
+
"div",
|
|
1529
|
+
{
|
|
1530
|
+
class: "pp-reply-quote pp-reply-quote-clickable",
|
|
1531
|
+
onClick: () => scrollToMessage(replyData.id),
|
|
1532
|
+
role: "button",
|
|
1533
|
+
tabIndex: 0,
|
|
1534
|
+
onKeyDown: (e) => e.key === "Enter" && scrollToMessage(replyData.id),
|
|
1535
|
+
children: [
|
|
1536
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
|
|
1537
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-content", children: replyData.deleted ? "Message deleted" : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
1538
|
+
replyData.hasAttachment && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-attachment-icon", children: replyData.attachmentType?.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
|
|
1539
|
+
replyData.content ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
1540
|
+
(replyData.content || "").slice(0, 50),
|
|
1541
|
+
(replyData.content || "").length > 50 ? "..." : ""
|
|
1542
|
+
] }) : replyData.attachmentType?.startsWith("image/") ? "Photo" : "File"
|
|
1543
|
+
] }) })
|
|
1544
|
+
]
|
|
1545
|
+
}
|
|
1546
|
+
),
|
|
1475
1547
|
isDeleted ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { class: "pp-message-content pp-deleted-content", children: [
|
|
1476
1548
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-deleted-icon", children: "\u{1F5D1}\uFE0F" }),
|
|
1477
1549
|
" Message deleted"
|
|
@@ -1543,8 +1615,11 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1543
1615
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { class: "pp-reply-preview-content", children: [
|
|
1544
1616
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-label", children: "Replying to" }),
|
|
1545
1617
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { class: "pp-reply-text", children: [
|
|
1546
|
-
replyingTo.
|
|
1547
|
-
replyingTo.content
|
|
1618
|
+
replyingTo.attachments && replyingTo.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-attachment-icon", children: replyingTo.attachments[0].mimeType.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
|
|
1619
|
+
replyingTo.content ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
1620
|
+
replyingTo.content.slice(0, 50),
|
|
1621
|
+
replyingTo.content.length > 50 ? "..." : ""
|
|
1622
|
+
] }) : replyingTo.attachments?.[0]?.mimeType.startsWith("image/") ? "Photo" : "File"
|
|
1548
1623
|
] })
|
|
1549
1624
|
] }),
|
|
1550
1625
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { class: "pp-reply-cancel", onClick: handleCancelReply, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CloseIcon, {}) })
|
|
@@ -2120,12 +2195,12 @@ var PocketPingClient = class {
|
|
|
2120
2195
|
if (!this.session) {
|
|
2121
2196
|
throw new Error("Not connected");
|
|
2122
2197
|
}
|
|
2123
|
-
const response = await this.fetch(
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
}
|
|
2128
|
-
|
|
2198
|
+
const response = await this.fetch(
|
|
2199
|
+
`/message/${messageId}?sessionId=${encodeURIComponent(this.session.sessionId)}`,
|
|
2200
|
+
{
|
|
2201
|
+
method: "DELETE"
|
|
2202
|
+
}
|
|
2203
|
+
);
|
|
2129
2204
|
if (response.deleted) {
|
|
2130
2205
|
const messageIndex = this.session.messages.findIndex((m) => m.id === messageId);
|
|
2131
2206
|
if (messageIndex >= 0) {
|
package/dist/index.d.cts
CHANGED
|
@@ -81,6 +81,10 @@ interface ReplyToData {
|
|
|
81
81
|
content: string;
|
|
82
82
|
sender: string;
|
|
83
83
|
deleted?: boolean;
|
|
84
|
+
/** Indicates if the replied message has attachments (e.g., image) */
|
|
85
|
+
hasAttachment?: boolean;
|
|
86
|
+
/** MIME type of the first attachment (for icon display) */
|
|
87
|
+
attachmentType?: string;
|
|
84
88
|
}
|
|
85
89
|
interface Message {
|
|
86
90
|
id: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -81,6 +81,10 @@ interface ReplyToData {
|
|
|
81
81
|
content: string;
|
|
82
82
|
sender: string;
|
|
83
83
|
deleted?: boolean;
|
|
84
|
+
/** Indicates if the replied message has attachments (e.g., image) */
|
|
85
|
+
hasAttachment?: boolean;
|
|
86
|
+
/** MIME type of the first attachment (for icon display) */
|
|
87
|
+
attachmentType?: string;
|
|
84
88
|
}
|
|
85
89
|
interface Message {
|
|
86
90
|
id: string;
|
package/dist/index.js
CHANGED
|
@@ -110,6 +110,7 @@ function styles(primaryColor, theme) {
|
|
|
110
110
|
flex-direction: column;
|
|
111
111
|
overflow: hidden;
|
|
112
112
|
z-index: 9998;
|
|
113
|
+
transition: max-height 0.2s ease, bottom 0.2s ease;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
.pp-window.pp-bottom-right {
|
|
@@ -126,13 +127,21 @@ function styles(primaryColor, theme) {
|
|
|
126
127
|
.pp-window {
|
|
127
128
|
width: calc(100vw - 20px);
|
|
128
129
|
height: auto;
|
|
130
|
+
min-height: 300px;
|
|
129
131
|
max-height: calc(100vh - 100px);
|
|
130
|
-
max-height: calc(
|
|
132
|
+
max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
|
|
131
133
|
bottom: 80px;
|
|
132
134
|
right: 10px;
|
|
133
135
|
left: 10px;
|
|
134
136
|
border-radius: 12px;
|
|
135
137
|
}
|
|
138
|
+
|
|
139
|
+
/* When keyboard is likely open (input focused), reduce height */
|
|
140
|
+
.pp-window:has(.pp-input:focus) {
|
|
141
|
+
max-height: calc(50vh - 20px);
|
|
142
|
+
max-height: calc(50svh - 20px);
|
|
143
|
+
bottom: 10px;
|
|
144
|
+
}
|
|
136
145
|
}
|
|
137
146
|
|
|
138
147
|
.pp-header {
|
|
@@ -923,17 +932,52 @@ function styles(primaryColor, theme) {
|
|
|
923
932
|
text-overflow: ellipsis;
|
|
924
933
|
}
|
|
925
934
|
|
|
935
|
+
/* Clickable reply quote */
|
|
936
|
+
.pp-reply-quote-clickable {
|
|
937
|
+
cursor: pointer;
|
|
938
|
+
transition: background 0.15s, transform 0.1s;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
.pp-reply-quote-clickable:hover {
|
|
942
|
+
background: ${isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.08)"};
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
.pp-reply-quote-clickable:active {
|
|
946
|
+
transform: scale(0.98);
|
|
947
|
+
}
|
|
948
|
+
|
|
926
949
|
/* Reply quote in visitor message bubble needs higher contrast */
|
|
927
950
|
.pp-message-visitor .pp-reply-quote {
|
|
928
951
|
background: rgba(255, 255, 255, 0.18);
|
|
929
952
|
border-left-color: rgba(255, 255, 255, 0.7);
|
|
930
953
|
}
|
|
931
954
|
|
|
955
|
+
.pp-message-visitor .pp-reply-quote-clickable:hover {
|
|
956
|
+
background: rgba(255, 255, 255, 0.25);
|
|
957
|
+
}
|
|
958
|
+
|
|
932
959
|
.pp-message-visitor .pp-reply-sender,
|
|
933
960
|
.pp-message-visitor .pp-reply-content {
|
|
934
961
|
color: rgba(255, 255, 255, 0.9);
|
|
935
962
|
}
|
|
936
963
|
|
|
964
|
+
/* Message highlight animation (when scrolling to a message) */
|
|
965
|
+
.pp-message-highlight {
|
|
966
|
+
animation: pp-highlight-pulse 1.5s ease-out;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
@keyframes pp-highlight-pulse {
|
|
970
|
+
0% {
|
|
971
|
+
box-shadow: 0 0 0 0 ${primaryColor}80;
|
|
972
|
+
}
|
|
973
|
+
30% {
|
|
974
|
+
box-shadow: 0 0 0 6px ${primaryColor}40;
|
|
975
|
+
}
|
|
976
|
+
100% {
|
|
977
|
+
box-shadow: 0 0 0 0 ${primaryColor}00;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
|
|
937
981
|
/* Deleted Message */
|
|
938
982
|
.pp-message-deleted {
|
|
939
983
|
opacity: 0.6;
|
|
@@ -1232,6 +1276,16 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1232
1276
|
document.addEventListener("click", handleClickOutside);
|
|
1233
1277
|
return () => document.removeEventListener("click", handleClickOutside);
|
|
1234
1278
|
}, [messageMenu]);
|
|
1279
|
+
const scrollToMessage = (messageId) => {
|
|
1280
|
+
const messageElement = document.getElementById(`pp-msg-${messageId}`);
|
|
1281
|
+
if (messageElement) {
|
|
1282
|
+
messageElement.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
1283
|
+
messageElement.classList.add("pp-message-highlight");
|
|
1284
|
+
setTimeout(() => {
|
|
1285
|
+
messageElement.classList.remove("pp-message-highlight");
|
|
1286
|
+
}, 1500);
|
|
1287
|
+
}
|
|
1288
|
+
};
|
|
1235
1289
|
const dragCounterRef = useRef(0);
|
|
1236
1290
|
const handleDragEnter = (e) => {
|
|
1237
1291
|
e.preventDefault();
|
|
@@ -1372,10 +1426,14 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1372
1426
|
} else {
|
|
1373
1427
|
const replyToMsg = messages.find((m) => m.id === msg.replyTo);
|
|
1374
1428
|
if (replyToMsg) {
|
|
1429
|
+
const hasAttachment = !!(replyToMsg.attachments && replyToMsg.attachments.length > 0);
|
|
1375
1430
|
replyData = {
|
|
1431
|
+
id: replyToMsg.id,
|
|
1376
1432
|
sender: replyToMsg.sender,
|
|
1377
1433
|
content: replyToMsg.content,
|
|
1378
|
-
deleted: !!replyToMsg.deletedAt
|
|
1434
|
+
deleted: !!replyToMsg.deletedAt,
|
|
1435
|
+
hasAttachment,
|
|
1436
|
+
attachmentType: hasAttachment ? replyToMsg.attachments[0].mimeType : void 0
|
|
1379
1437
|
};
|
|
1380
1438
|
}
|
|
1381
1439
|
}
|
|
@@ -1385,6 +1443,7 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1385
1443
|
return /* @__PURE__ */ jsxs(
|
|
1386
1444
|
"div",
|
|
1387
1445
|
{
|
|
1446
|
+
id: `pp-msg-${msg.id}`,
|
|
1388
1447
|
class: `pp-message pp-message-${msg.sender} ${isDeleted ? "pp-message-deleted" : ""}`,
|
|
1389
1448
|
onContextMenu: (e) => handleMessageContextMenu(e, msg),
|
|
1390
1449
|
onMouseEnter: () => setHoveredMessageId(msg.id),
|
|
@@ -1424,13 +1483,26 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1424
1483
|
)
|
|
1425
1484
|
] })
|
|
1426
1485
|
] }),
|
|
1427
|
-
replyData && replyData.content && /* @__PURE__ */ jsxs(
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
(replyData.
|
|
1432
|
-
|
|
1433
|
-
|
|
1486
|
+
replyData && (replyData.content || replyData.hasAttachment) && /* @__PURE__ */ jsxs(
|
|
1487
|
+
"div",
|
|
1488
|
+
{
|
|
1489
|
+
class: "pp-reply-quote pp-reply-quote-clickable",
|
|
1490
|
+
onClick: () => scrollToMessage(replyData.id),
|
|
1491
|
+
role: "button",
|
|
1492
|
+
tabIndex: 0,
|
|
1493
|
+
onKeyDown: (e) => e.key === "Enter" && scrollToMessage(replyData.id),
|
|
1494
|
+
children: [
|
|
1495
|
+
/* @__PURE__ */ jsx("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
|
|
1496
|
+
/* @__PURE__ */ jsx("span", { class: "pp-reply-content", children: replyData.deleted ? "Message deleted" : /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
1497
|
+
replyData.hasAttachment && /* @__PURE__ */ jsx("span", { class: "pp-reply-attachment-icon", children: replyData.attachmentType?.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
|
|
1498
|
+
replyData.content ? /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
1499
|
+
(replyData.content || "").slice(0, 50),
|
|
1500
|
+
(replyData.content || "").length > 50 ? "..." : ""
|
|
1501
|
+
] }) : replyData.attachmentType?.startsWith("image/") ? "Photo" : "File"
|
|
1502
|
+
] }) })
|
|
1503
|
+
]
|
|
1504
|
+
}
|
|
1505
|
+
),
|
|
1434
1506
|
isDeleted ? /* @__PURE__ */ jsxs("div", { class: "pp-message-content pp-deleted-content", children: [
|
|
1435
1507
|
/* @__PURE__ */ jsx("span", { class: "pp-deleted-icon", children: "\u{1F5D1}\uFE0F" }),
|
|
1436
1508
|
" Message deleted"
|
|
@@ -1502,8 +1574,11 @@ function ChatWidget({ client: client2, config: initialConfig }) {
|
|
|
1502
1574
|
/* @__PURE__ */ jsxs("div", { class: "pp-reply-preview-content", children: [
|
|
1503
1575
|
/* @__PURE__ */ jsx("span", { class: "pp-reply-label", children: "Replying to" }),
|
|
1504
1576
|
/* @__PURE__ */ jsxs("span", { class: "pp-reply-text", children: [
|
|
1505
|
-
replyingTo.
|
|
1506
|
-
replyingTo.content
|
|
1577
|
+
replyingTo.attachments && replyingTo.attachments.length > 0 && /* @__PURE__ */ jsx("span", { class: "pp-reply-attachment-icon", children: replyingTo.attachments[0].mimeType.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
|
|
1578
|
+
replyingTo.content ? /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
1579
|
+
replyingTo.content.slice(0, 50),
|
|
1580
|
+
replyingTo.content.length > 50 ? "..." : ""
|
|
1581
|
+
] }) : replyingTo.attachments?.[0]?.mimeType.startsWith("image/") ? "Photo" : "File"
|
|
1507
1582
|
] })
|
|
1508
1583
|
] }),
|
|
1509
1584
|
/* @__PURE__ */ jsx("button", { class: "pp-reply-cancel", onClick: handleCancelReply, children: /* @__PURE__ */ jsx(CloseIcon, {}) })
|
|
@@ -2079,12 +2154,12 @@ var PocketPingClient = class {
|
|
|
2079
2154
|
if (!this.session) {
|
|
2080
2155
|
throw new Error("Not connected");
|
|
2081
2156
|
}
|
|
2082
|
-
const response = await this.fetch(
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
}
|
|
2087
|
-
|
|
2157
|
+
const response = await this.fetch(
|
|
2158
|
+
`/message/${messageId}?sessionId=${encodeURIComponent(this.session.sessionId)}`,
|
|
2159
|
+
{
|
|
2160
|
+
method: "DELETE"
|
|
2161
|
+
}
|
|
2162
|
+
);
|
|
2088
2163
|
if (response.deleted) {
|
|
2089
2164
|
const messageIndex = this.session.messages.findIndex((m) => m.id === messageId);
|
|
2090
2165
|
if (messageIndex >= 0) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var PocketPing=(()=>{var xe=Object.defineProperty;var tn=Object.getOwnPropertyDescriptor;var nn=Object.getOwnPropertyNames;var sn=Object.prototype.hasOwnProperty;var on=(t,e)=>{for(var n in e)xe(t,n,{get:e[n],enumerable:!0})},rn=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of nn(e))!sn.call(t,o)&&o!==n&&xe(t,o,{get:()=>e[o],enumerable:!(s=tn(e,o))||s.enumerable});return t};var an=t=>rn(xe({},"__esModule",{value:!0}),t);var In={};on(In,{close:()=>Pt,default:()=>Tn,destroy:()=>St,getIdentity:()=>Ft,getTrackedElements:()=>Rt,identify:()=>Lt,init:()=>Ae,offEvent:()=>Dt,on:()=>Nt,onEvent:()=>Ot,open:()=>Et,reset:()=>Ht,sendMessage:()=>It,setupTrackedElements:()=>At,toggle:()=>Tt,trigger:()=>$t,uploadFile:()=>Ct,uploadFiles:()=>Mt});var le,w,Je,ln,J,Ve,Xe,Ye,Ge,ke,ye,be,pn,Z={},Ke=[],cn=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,pe=Array.isArray;function V(t,e){for(var n in e)t[n]=e[n];return t}function Se(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Ee(t,e,n){var s,o,a,r={};for(a in e)a=="key"?s=e[a]:a=="ref"?o=e[a]:r[a]=e[a];if(arguments.length>2&&(r.children=arguments.length>3?le.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)r[a]===void 0&&(r[a]=t.defaultProps[a]);return ie(t,r,s,o,null)}function ie(t,e,n,s,o){var a={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++Je,__i:-1,__u:0};return o==null&&w.vnode!=null&&w.vnode(a),a}function D(t){return t.children}function re(t,e){this.props=t,this.context=e}function Y(t,e){if(e==null)return t.__?Y(t.__,t.__i+1):null;for(var n;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?Y(t):null}function Qe(t){var e,n;if((t=t.__)!=null&&t.__c!=null){for(t.__e=t.__c.base=null,e=0;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null){t.__e=t.__c.base=n.__e;break}return Qe(t)}}function je(t){(!t.__d&&(t.__d=!0)&&J.push(t)&&!ae.__r++||Ve!=w.debounceRendering)&&((Ve=w.debounceRendering)||Xe)(ae)}function ae(){for(var t,e,n,s,o,a,r,c=1;J.length;)J.length>c&&J.sort(Ye),t=J.shift(),c=J.length,t.__d&&(n=void 0,s=void 0,o=(s=(e=t).__v).__e,a=[],r=[],e.__P&&((n=V({},s)).__v=s.__v+1,w.vnode&&w.vnode(n),Pe(e.__P,n,s,e.__n,e.__P.namespaceURI,32&s.__u?[o]:null,a,o??Y(s),!!(32&s.__u),r),n.__v=s.__v,n.__.__k[n.__i]=n,tt(a,n,r),s.__e=s.__=null,n.__e!=o&&Qe(n)));ae.__r=0}function Ze(t,e,n,s,o,a,r,c,u,p,g){var l,h,f,S,A,k,_,b=s&&s.__k||Ke,L=e.length;for(u=dn(n,e,b,u,L),l=0;l<L;l++)(f=n.__k[l])!=null&&(h=f.__i==-1?Z:b[f.__i]||Z,f.__i=l,k=Pe(t,f,h,o,a,r,c,u,p,g),S=f.__e,f.ref&&h.ref!=f.ref&&(h.ref&&Te(h.ref,null,f),g.push(f.ref,f.__c||S,f)),A==null&&S!=null&&(A=S),(_=!!(4&f.__u))||h.__k===f.__k?u=et(f,u,t,_):typeof f.type=="function"&&k!==void 0?u=k:S&&(u=S.nextSibling),f.__u&=-7);return n.__e=A,u}function dn(t,e,n,s,o){var a,r,c,u,p,g=n.length,l=g,h=0;for(t.__k=new Array(o),a=0;a<o;a++)(r=e[a])!=null&&typeof r!="boolean"&&typeof r!="function"?(typeof r=="string"||typeof r=="number"||typeof r=="bigint"||r.constructor==String?r=t.__k[a]=ie(null,r,null,null,null):pe(r)?r=t.__k[a]=ie(D,{children:r},null,null,null):r.constructor===void 0&&r.__b>0?r=t.__k[a]=ie(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):t.__k[a]=r,u=a+h,r.__=t,r.__b=t.__b+1,c=null,(p=r.__i=un(r,n,u,l))!=-1&&(l--,(c=n[p])&&(c.__u|=2)),c==null||c.__v==null?(p==-1&&(o>g?h--:o<g&&h++),typeof r.type!="function"&&(r.__u|=4)):p!=u&&(p==u-1?h--:p==u+1?h++:(p>u?h--:h++,r.__u|=4))):t.__k[a]=null;if(l)for(a=0;a<g;a++)(c=n[a])!=null&&(2&c.__u)==0&&(c.__e==s&&(s=Y(c)),st(c,c));return s}function et(t,e,n,s){var o,a;if(typeof t.type=="function"){for(o=t.__k,a=0;o&&a<o.length;a++)o[a]&&(o[a].__=t,e=et(o[a],e,n,s));return e}t.__e!=e&&(s&&(e&&t.type&&!e.parentNode&&(e=Y(t)),n.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function un(t,e,n,s){var o,a,r,c=t.key,u=t.type,p=e[n],g=p!=null&&(2&p.__u)==0;if(p===null&&c==null||g&&c==p.key&&u==p.type)return n;if(s>(g?1:0)){for(o=n-1,a=n+1;o>=0||a<e.length;)if((p=e[r=o>=0?o--:a++])!=null&&(2&p.__u)==0&&c==p.key&&u==p.type)return r}return-1}function Be(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||cn.test(e)?n:n+"px"}function oe(t,e,n,s,o){var a,r;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||Be(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||Be(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")a=e!=(e=e.replace(Ge,"$1")),r=e.toLowerCase(),e=r in t||e=="onFocusOut"||e=="onFocusIn"?r.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+a]=n,n?s?n.u=s.u:(n.u=ke,t.addEventListener(e,a?be:ye,a)):t.removeEventListener(e,a?be:ye,a);else{if(o=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function qe(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=ke++;else if(e.t<n.u)return;return n(w.event?w.event(e):e)}}}function Pe(t,e,n,s,o,a,r,c,u,p){var g,l,h,f,S,A,k,_,b,L,H,B,U,X,W,F,O,R=e.type;if(e.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[c=e.__e=n.__e]),(g=w.__b)&&g(e);e:if(typeof R=="function")try{if(_=e.props,b="prototype"in R&&R.prototype.render,L=(g=R.contextType)&&s[g.__c],H=g?L?L.props.value:g.__:s,n.__c?k=(l=e.__c=n.__c).__=l.__E:(b?e.__c=l=new R(_,H):(e.__c=l=new re(_,H),l.constructor=R,l.render=hn),L&&L.sub(l),l.state||(l.state={}),l.__n=s,h=l.__d=!0,l.__h=[],l._sb=[]),b&&l.__s==null&&(l.__s=l.state),b&&R.getDerivedStateFromProps!=null&&(l.__s==l.state&&(l.__s=V({},l.__s)),V(l.__s,R.getDerivedStateFromProps(_,l.__s))),f=l.props,S=l.state,l.__v=e,h)b&&R.getDerivedStateFromProps==null&&l.componentWillMount!=null&&l.componentWillMount(),b&&l.componentDidMount!=null&&l.__h.push(l.componentDidMount);else{if(b&&R.getDerivedStateFromProps==null&&_!==f&&l.componentWillReceiveProps!=null&&l.componentWillReceiveProps(_,H),e.__v==n.__v||!l.__e&&l.shouldComponentUpdate!=null&&l.shouldComponentUpdate(_,l.__s,H)===!1){for(e.__v!=n.__v&&(l.props=_,l.state=l.__s,l.__d=!1),e.__e=n.__e,e.__k=n.__k,e.__k.some(function(z){z&&(z.__=e)}),B=0;B<l._sb.length;B++)l.__h.push(l._sb[B]);l._sb=[],l.__h.length&&r.push(l);break e}l.componentWillUpdate!=null&&l.componentWillUpdate(_,l.__s,H),b&&l.componentDidUpdate!=null&&l.__h.push(function(){l.componentDidUpdate(f,S,A)})}if(l.context=H,l.props=_,l.__P=t,l.__e=!1,U=w.__r,X=0,b){for(l.state=l.__s,l.__d=!1,U&&U(e),g=l.render(l.props,l.state,l.context),W=0;W<l._sb.length;W++)l.__h.push(l._sb[W]);l._sb=[]}else do l.__d=!1,U&&U(e),g=l.render(l.props,l.state,l.context),l.state=l.__s;while(l.__d&&++X<25);l.state=l.__s,l.getChildContext!=null&&(s=V(V({},s),l.getChildContext())),b&&!h&&l.getSnapshotBeforeUpdate!=null&&(A=l.getSnapshotBeforeUpdate(f,S)),F=g,g!=null&&g.type===D&&g.key==null&&(F=nt(g.props.children)),c=Ze(t,pe(F)?F:[F],e,n,s,o,a,r,c,u,p),l.base=e.__e,e.__u&=-161,l.__h.length&&r.push(l),k&&(l.__E=l.__=null)}catch(z){if(e.__v=null,u||a!=null)if(z.then){for(e.__u|=u?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;a[a.indexOf(c)]=null,e.__e=c}else{for(O=a.length;O--;)Se(a[O]);we(e)}else e.__e=n.__e,e.__k=n.__k,z.then||we(e);w.__e(z,e,n)}else a==null&&e.__v==n.__v?(e.__k=n.__k,e.__e=n.__e):c=e.__e=gn(n.__e,e,n,s,o,a,r,u,p);return(g=w.diffed)&&g(e),128&e.__u?void 0:c}function we(t){t&&t.__c&&(t.__c.__e=!0),t&&t.__k&&t.__k.forEach(we)}function tt(t,e,n){for(var s=0;s<n.length;s++)Te(n[s],n[++s],n[++s]);w.__c&&w.__c(e,t),t.some(function(o){try{t=o.__h,o.__h=[],t.some(function(a){a.call(o)})}catch(a){w.__e(a,o.__v)}})}function nt(t){return typeof t!="object"||t==null||t.__b&&t.__b>0?t:pe(t)?t.map(nt):V({},t)}function gn(t,e,n,s,o,a,r,c,u){var p,g,l,h,f,S,A,k=n.props||Z,_=e.props,b=e.type;if(b=="svg"?o="http://www.w3.org/2000/svg":b=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),a!=null){for(p=0;p<a.length;p++)if((f=a[p])&&"setAttribute"in f==!!b&&(b?f.localName==b:f.nodeType==3)){t=f,a[p]=null;break}}if(t==null){if(b==null)return document.createTextNode(_);t=document.createElementNS(o,b,_.is&&_),c&&(w.__m&&w.__m(e,a),c=!1),a=null}if(b==null)k===_||c&&t.data==_||(t.data=_);else{if(a=a&&le.call(t.childNodes),!c&&a!=null)for(k={},p=0;p<t.attributes.length;p++)k[(f=t.attributes[p]).name]=f.value;for(p in k)if(f=k[p],p!="children"){if(p=="dangerouslySetInnerHTML")l=f;else if(!(p in _)){if(p=="value"&&"defaultValue"in _||p=="checked"&&"defaultChecked"in _)continue;oe(t,p,null,f,o)}}for(p in _)f=_[p],p=="children"?h=f:p=="dangerouslySetInnerHTML"?g=f:p=="value"?S=f:p=="checked"?A=f:c&&typeof f!="function"||k[p]===f||oe(t,p,f,k[p],o);if(g)c||l&&(g.__html==l.__html||g.__html==t.innerHTML)||(t.innerHTML=g.__html),e.__k=[];else if(l&&(t.innerHTML=""),Ze(e.type=="template"?t.content:t,pe(h)?h:[h],e,n,s,b=="foreignObject"?"http://www.w3.org/1999/xhtml":o,a,r,a?a[0]:n.__k&&Y(n,0),c,u),a!=null)for(p=a.length;p--;)Se(a[p]);c||(p="value",b=="progress"&&S==null?t.removeAttribute("value"):S!=null&&(S!==t[p]||b=="progress"&&!S||b=="option"&&S!=k[p])&&oe(t,p,S,k[p],o),p="checked",A!=null&&A!=t[p]&&oe(t,p,A,k[p],o))}return t}function Te(t,e,n){try{if(typeof t=="function"){var s=typeof t.__u=="function";s&&t.__u(),s&&e==null||(t.__u=t(e))}else t.current=e}catch(o){w.__e(o,n)}}function st(t,e,n){var s,o;if(w.unmount&&w.unmount(t),(s=t.ref)&&(s.current&&s.current!=t.__e||Te(s,null,e)),(s=t.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(a){w.__e(a,e)}s.base=s.__P=null}if(s=t.__k)for(o=0;o<s.length;o++)s[o]&&st(s[o],e,n||typeof t.type!="function");n||Se(t.__e),t.__c=t.__=t.__e=void 0}function hn(t,e,n){return this.constructor(t,n)}function Ie(t,e,n){var s,o,a,r;e==document&&(e=document.documentElement),w.__&&w.__(t,e),o=(s=typeof n=="function")?null:n&&n.__k||e.__k,a=[],r=[],Pe(e,t=(!s&&n||e).__k=Ee(D,null,[t]),o||Z,Z,e.namespaceURI,!s&&n?[n]:o?null:e.firstChild?le.call(e.childNodes):null,a,!s&&n?n:o?o.__e:e.firstChild,s,r),tt(a,t,r)}le=Ke.slice,w={__e:function(t,e,n,s){for(var o,a,r;e=e.__;)if((o=e.__c)&&!o.__)try{if((a=o.constructor)&&a.getDerivedStateFromError!=null&&(o.setState(a.getDerivedStateFromError(t)),r=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(t,s||{}),r=o.__d),r)return o.__E=o}catch(c){t=c}throw t}},Je=0,ln=function(t){return t!=null&&t.constructor===void 0},re.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=V({},this.state),typeof t=="function"&&(t=t(V({},n),this.props)),t&&V(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),je(this))},re.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),je(this))},re.prototype.render=D,J=[],Xe=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ye=function(t,e){return t.__v.__b-e.__v.__b},ae.__r=0,Ge=/(PointerCapture)$|Capture$/i,ke=0,ye=qe(!1),be=qe(!0),pn=0;var ee,C,Ce,ot,te=0,ut=[],M=w,it=M.__b,rt=M.__r,at=M.diffed,lt=M.__c,pt=M.unmount,ct=M.__;function $e(t,e){M.__h&&M.__h(C,t,te||e),te=0;var n=C.__H||(C.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function $(t){return te=1,fn(mt,t)}function fn(t,e,n){var s=$e(ee++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):mt(void 0,e),function(c){var u=s.__N?s.__N[0]:s.__[0],p=s.t(u,c);u!==p&&(s.__N=[p,s.__[1]],s.__c.setState({}))}],s.__c=C,!C.__f)){var o=function(c,u,p){if(!s.__c.__H)return!0;var g=s.__c.__H.__.filter(function(h){return!!h.__c});if(g.every(function(h){return!h.__N}))return!a||a.call(this,c,u,p);var l=s.__c.props!==c;return g.forEach(function(h){if(h.__N){var f=h.__[0];h.__=h.__N,h.__N=void 0,f!==h.__[0]&&(l=!0)}}),a&&a.call(this,c,u,p)||l};C.__f=!0;var a=C.shouldComponentUpdate,r=C.componentWillUpdate;C.componentWillUpdate=function(c,u,p){if(this.__e){var g=a;a=void 0,o(c,u,p),a=g}r&&r.call(this,c,u,p)},C.shouldComponentUpdate=o}return s.__N||s.__}function j(t,e){var n=$e(ee++,3);!M.__s&&ft(n.__H,e)&&(n.__=t,n.u=e,C.__H.__h.push(n))}function G(t){return te=5,gt(function(){return{current:t}},[])}function gt(t,e){var n=$e(ee++,7);return ft(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function ht(t,e){return te=8,gt(function(){return t},e)}function mn(){for(var t;t=ut.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(ce),t.__H.__h.forEach(Me),t.__H.__h=[]}catch(e){t.__H.__h=[],M.__e(e,t.__v)}}M.__b=function(t){C=null,it&&it(t)},M.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),ct&&ct(t,e)},M.__r=function(t){rt&&rt(t),ee=0;var e=(C=t.__c).__H;e&&(Ce===C?(e.__h=[],C.__h=[],e.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.forEach(ce),e.__h.forEach(Me),e.__h=[],ee=0)),Ce=C},M.diffed=function(t){at&&at(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(ut.push(e)!==1&&ot===M.requestAnimationFrame||((ot=M.requestAnimationFrame)||_n)(mn)),e.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Ce=C=null},M.__c=function(t,e){e.some(function(n){try{n.__h.forEach(ce),n.__h=n.__h.filter(function(s){return!s.__||Me(s)})}catch(s){e.some(function(o){o.__h&&(o.__h=[])}),e=[],M.__e(s,n.__v)}}),lt&<(t,e)},M.unmount=function(t){pt&&pt(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.forEach(function(s){try{ce(s)}catch(o){e=o}}),n.__H=void 0,e&&M.__e(e,n.__v))};var dt=typeof requestAnimationFrame=="function";function _n(t){var e,n=function(){clearTimeout(s),dt&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);dt&&(e=requestAnimationFrame(n))}function ce(t){var e=C,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),C=e}function Me(t){var e=C;t.__c=t.__(),C=e}function ft(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function mt(t,e){return typeof e=="function"?e(t):e}function _t(t,e){let n=e==="dark",s={bg:n?"#1f2937":"#ffffff",bgSecondary:n?"#374151":"#f3f4f6",text:n?"#f9fafb":"#111827",textSecondary:n?"#9ca3af":"#6b7280",border:n?"#4b5563":"#e5e7eb",messageBg:n?"#374151":"#f3f4f6"};return`
|
|
1
|
+
"use strict";var PocketPing=(()=>{var xe=Object.defineProperty;var nn=Object.getOwnPropertyDescriptor;var sn=Object.getOwnPropertyNames;var on=Object.prototype.hasOwnProperty;var rn=(t,e)=>{for(var n in e)xe(t,n,{get:e[n],enumerable:!0})},an=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of sn(e))!on.call(t,i)&&i!==n&&xe(t,i,{get:()=>e[i],enumerable:!(s=nn(e,i))||s.enumerable});return t};var pn=t=>an(xe({},"__esModule",{value:!0}),t);var Mn={};rn(Mn,{close:()=>Tt,default:()=>In,destroy:()=>St,getIdentity:()=>Wt,getTrackedElements:()=>Ot,identify:()=>Ht,init:()=>Ae,offEvent:()=>Lt,on:()=>Nt,onEvent:()=>Dt,open:()=>Pt,reset:()=>Ft,sendMessage:()=>Mt,setupTrackedElements:()=>Rt,toggle:()=>It,trigger:()=>At,uploadFile:()=>Ct,uploadFiles:()=>$t});var pe,w,Xe,ln,J,je,Ye,Ge,Ke,ke,ye,be,cn,Z={},Qe=[],dn=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,le=Array.isArray;function V(t,e){for(var n in e)t[n]=e[n];return t}function Ee(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Se(t,e,n){var s,i,a,r={};for(a in e)a=="key"?s=e[a]:a=="ref"?i=e[a]:r[a]=e[a];if(arguments.length>2&&(r.children=arguments.length>3?pe.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)r[a]===void 0&&(r[a]=t.defaultProps[a]);return oe(t,r,s,i,null)}function oe(t,e,n,s,i){var a={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Xe,__i:-1,__u:0};return i==null&&w.vnode!=null&&w.vnode(a),a}function D(t){return t.children}function re(t,e){this.props=t,this.context=e}function Y(t,e){if(e==null)return t.__?Y(t.__,t.__i+1):null;for(var n;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?Y(t):null}function Ze(t){var e,n;if((t=t.__)!=null&&t.__c!=null){for(t.__e=t.__c.base=null,e=0;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null){t.__e=t.__c.base=n.__e;break}return Ze(t)}}function Be(t){(!t.__d&&(t.__d=!0)&&J.push(t)&&!ae.__r++||je!=w.debounceRendering)&&((je=w.debounceRendering)||Ye)(ae)}function ae(){for(var t,e,n,s,i,a,r,c=1;J.length;)J.length>c&&J.sort(Ge),t=J.shift(),c=J.length,t.__d&&(n=void 0,s=void 0,i=(s=(e=t).__v).__e,a=[],r=[],e.__P&&((n=V({},s)).__v=s.__v+1,w.vnode&&w.vnode(n),Pe(e.__P,n,s,e.__n,e.__P.namespaceURI,32&s.__u?[i]:null,a,i??Y(s),!!(32&s.__u),r),n.__v=s.__v,n.__.__k[n.__i]=n,nt(a,n,r),s.__e=s.__=null,n.__e!=i&&Ze(n)));ae.__r=0}function et(t,e,n,s,i,a,r,c,u,l,g){var p,h,f,E,A,k,x,b=s&&s.__k||Qe,H=e.length;for(u=un(n,e,b,u,H),p=0;p<H;p++)(f=n.__k[p])!=null&&(h=f.__i==-1?Z:b[f.__i]||Z,f.__i=p,k=Pe(t,f,h,i,a,r,c,u,l,g),E=f.__e,f.ref&&h.ref!=f.ref&&(h.ref&&Te(h.ref,null,f),g.push(f.ref,f.__c||E,f)),A==null&&E!=null&&(A=E),(x=!!(4&f.__u))||h.__k===f.__k?u=tt(f,u,t,x):typeof f.type=="function"&&k!==void 0?u=k:E&&(u=E.nextSibling),f.__u&=-7);return n.__e=A,u}function un(t,e,n,s,i){var a,r,c,u,l,g=n.length,p=g,h=0;for(t.__k=new Array(i),a=0;a<i;a++)(r=e[a])!=null&&typeof r!="boolean"&&typeof r!="function"?(typeof r=="string"||typeof r=="number"||typeof r=="bigint"||r.constructor==String?r=t.__k[a]=oe(null,r,null,null,null):le(r)?r=t.__k[a]=oe(D,{children:r},null,null,null):r.constructor===void 0&&r.__b>0?r=t.__k[a]=oe(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):t.__k[a]=r,u=a+h,r.__=t,r.__b=t.__b+1,c=null,(l=r.__i=gn(r,n,u,p))!=-1&&(p--,(c=n[l])&&(c.__u|=2)),c==null||c.__v==null?(l==-1&&(i>g?h--:i<g&&h++),typeof r.type!="function"&&(r.__u|=4)):l!=u&&(l==u-1?h--:l==u+1?h++:(l>u?h--:h++,r.__u|=4))):t.__k[a]=null;if(p)for(a=0;a<g;a++)(c=n[a])!=null&&(2&c.__u)==0&&(c.__e==s&&(s=Y(c)),it(c,c));return s}function tt(t,e,n,s){var i,a;if(typeof t.type=="function"){for(i=t.__k,a=0;i&&a<i.length;a++)i[a]&&(i[a].__=t,e=tt(i[a],e,n,s));return e}t.__e!=e&&(s&&(e&&t.type&&!e.parentNode&&(e=Y(t)),n.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function gn(t,e,n,s){var i,a,r,c=t.key,u=t.type,l=e[n],g=l!=null&&(2&l.__u)==0;if(l===null&&c==null||g&&c==l.key&&u==l.type)return n;if(s>(g?1:0)){for(i=n-1,a=n+1;i>=0||a<e.length;)if((l=e[r=i>=0?i--:a++])!=null&&(2&l.__u)==0&&c==l.key&&u==l.type)return r}return-1}function qe(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||dn.test(e)?n:n+"px"}function ie(t,e,n,s,i){var a,r;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||qe(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||qe(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")a=e!=(e=e.replace(Ke,"$1")),r=e.toLowerCase(),e=r in t||e=="onFocusOut"||e=="onFocusIn"?r.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+a]=n,n?s?n.u=s.u:(n.u=ke,t.addEventListener(e,a?be:ye,a)):t.removeEventListener(e,a?be:ye,a);else{if(i=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function Je(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=ke++;else if(e.t<n.u)return;return n(w.event?w.event(e):e)}}}function Pe(t,e,n,s,i,a,r,c,u,l){var g,p,h,f,E,A,k,x,b,H,R,B,N,X,U,F,L,O=e.type;if(e.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[c=e.__e=n.__e]),(g=w.__b)&&g(e);e:if(typeof O=="function")try{if(x=e.props,b="prototype"in O&&O.prototype.render,H=(g=O.contextType)&&s[g.__c],R=g?H?H.props.value:g.__:s,n.__c?k=(p=e.__c=n.__c).__=p.__E:(b?e.__c=p=new O(x,R):(e.__c=p=new re(x,R),p.constructor=O,p.render=fn),H&&H.sub(p),p.state||(p.state={}),p.__n=s,h=p.__d=!0,p.__h=[],p._sb=[]),b&&p.__s==null&&(p.__s=p.state),b&&O.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=V({},p.__s)),V(p.__s,O.getDerivedStateFromProps(x,p.__s))),f=p.props,E=p.state,p.__v=e,h)b&&O.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),b&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(b&&O.getDerivedStateFromProps==null&&x!==f&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(x,R),e.__v==n.__v||!p.__e&&p.shouldComponentUpdate!=null&&p.shouldComponentUpdate(x,p.__s,R)===!1){for(e.__v!=n.__v&&(p.props=x,p.state=p.__s,p.__d=!1),e.__e=n.__e,e.__k=n.__k,e.__k.some(function(z){z&&(z.__=e)}),B=0;B<p._sb.length;B++)p.__h.push(p._sb[B]);p._sb=[],p.__h.length&&r.push(p);break e}p.componentWillUpdate!=null&&p.componentWillUpdate(x,p.__s,R),b&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(f,E,A)})}if(p.context=R,p.props=x,p.__P=t,p.__e=!1,N=w.__r,X=0,b){for(p.state=p.__s,p.__d=!1,N&&N(e),g=p.render(p.props,p.state,p.context),U=0;U<p._sb.length;U++)p.__h.push(p._sb[U]);p._sb=[]}else do p.__d=!1,N&&N(e),g=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++X<25);p.state=p.__s,p.getChildContext!=null&&(s=V(V({},s),p.getChildContext())),b&&!h&&p.getSnapshotBeforeUpdate!=null&&(A=p.getSnapshotBeforeUpdate(f,E)),F=g,g!=null&&g.type===D&&g.key==null&&(F=st(g.props.children)),c=et(t,le(F)?F:[F],e,n,s,i,a,r,c,u,l),p.base=e.__e,e.__u&=-161,p.__h.length&&r.push(p),k&&(p.__E=p.__=null)}catch(z){if(e.__v=null,u||a!=null)if(z.then){for(e.__u|=u?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;a[a.indexOf(c)]=null,e.__e=c}else{for(L=a.length;L--;)Ee(a[L]);we(e)}else e.__e=n.__e,e.__k=n.__k,z.then||we(e);w.__e(z,e,n)}else a==null&&e.__v==n.__v?(e.__k=n.__k,e.__e=n.__e):c=e.__e=hn(n.__e,e,n,s,i,a,r,u,l);return(g=w.diffed)&&g(e),128&e.__u?void 0:c}function we(t){t&&t.__c&&(t.__c.__e=!0),t&&t.__k&&t.__k.forEach(we)}function nt(t,e,n){for(var s=0;s<n.length;s++)Te(n[s],n[++s],n[++s]);w.__c&&w.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(a){a.call(i)})}catch(a){w.__e(a,i.__v)}})}function st(t){return typeof t!="object"||t==null||t.__b&&t.__b>0?t:le(t)?t.map(st):V({},t)}function hn(t,e,n,s,i,a,r,c,u){var l,g,p,h,f,E,A,k=n.props||Z,x=e.props,b=e.type;if(b=="svg"?i="http://www.w3.org/2000/svg":b=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),a!=null){for(l=0;l<a.length;l++)if((f=a[l])&&"setAttribute"in f==!!b&&(b?f.localName==b:f.nodeType==3)){t=f,a[l]=null;break}}if(t==null){if(b==null)return document.createTextNode(x);t=document.createElementNS(i,b,x.is&&x),c&&(w.__m&&w.__m(e,a),c=!1),a=null}if(b==null)k===x||c&&t.data==x||(t.data=x);else{if(a=a&&pe.call(t.childNodes),!c&&a!=null)for(k={},l=0;l<t.attributes.length;l++)k[(f=t.attributes[l]).name]=f.value;for(l in k)if(f=k[l],l!="children"){if(l=="dangerouslySetInnerHTML")p=f;else if(!(l in x)){if(l=="value"&&"defaultValue"in x||l=="checked"&&"defaultChecked"in x)continue;ie(t,l,null,f,i)}}for(l in x)f=x[l],l=="children"?h=f:l=="dangerouslySetInnerHTML"?g=f:l=="value"?E=f:l=="checked"?A=f:c&&typeof f!="function"||k[l]===f||ie(t,l,f,k[l],i);if(g)c||p&&(g.__html==p.__html||g.__html==t.innerHTML)||(t.innerHTML=g.__html),e.__k=[];else if(p&&(t.innerHTML=""),et(e.type=="template"?t.content:t,le(h)?h:[h],e,n,s,b=="foreignObject"?"http://www.w3.org/1999/xhtml":i,a,r,a?a[0]:n.__k&&Y(n,0),c,u),a!=null)for(l=a.length;l--;)Ee(a[l]);c||(l="value",b=="progress"&&E==null?t.removeAttribute("value"):E!=null&&(E!==t[l]||b=="progress"&&!E||b=="option"&&E!=k[l])&&ie(t,l,E,k[l],i),l="checked",A!=null&&A!=t[l]&&ie(t,l,A,k[l],i))}return t}function Te(t,e,n){try{if(typeof t=="function"){var s=typeof t.__u=="function";s&&t.__u(),s&&e==null||(t.__u=t(e))}else t.current=e}catch(i){w.__e(i,n)}}function it(t,e,n){var s,i;if(w.unmount&&w.unmount(t),(s=t.ref)&&(s.current&&s.current!=t.__e||Te(s,null,e)),(s=t.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(a){w.__e(a,e)}s.base=s.__P=null}if(s=t.__k)for(i=0;i<s.length;i++)s[i]&&it(s[i],e,n||typeof t.type!="function");n||Ee(t.__e),t.__c=t.__=t.__e=void 0}function fn(t,e,n){return this.constructor(t,n)}function Ie(t,e,n){var s,i,a,r;e==document&&(e=document.documentElement),w.__&&w.__(t,e),i=(s=typeof n=="function")?null:n&&n.__k||e.__k,a=[],r=[],Pe(e,t=(!s&&n||e).__k=Se(D,null,[t]),i||Z,Z,e.namespaceURI,!s&&n?[n]:i?null:e.firstChild?pe.call(e.childNodes):null,a,!s&&n?n:i?i.__e:e.firstChild,s,r),nt(a,t,r)}pe=Qe.slice,w={__e:function(t,e,n,s){for(var i,a,r;e=e.__;)if((i=e.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(t)),r=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,s||{}),r=i.__d),r)return i.__E=i}catch(c){t=c}throw t}},Xe=0,ln=function(t){return t!=null&&t.constructor===void 0},re.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=V({},this.state),typeof t=="function"&&(t=t(V({},n),this.props)),t&&V(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),Be(this))},re.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Be(this))},re.prototype.render=D,J=[],Ye=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ge=function(t,e){return t.__v.__b-e.__v.__b},ae.__r=0,Ke=/(PointerCapture)$|Capture$/i,ke=0,ye=Je(!1),be=Je(!0),cn=0;var ee,M,Me,ot,te=0,gt=[],C=w,rt=C.__b,at=C.__r,pt=C.diffed,lt=C.__c,ct=C.unmount,dt=C.__;function $e(t,e){C.__h&&C.__h(M,t,te||e),te=0;var n=M.__H||(M.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function $(t){return te=1,mn(_t,t)}function mn(t,e,n){var s=$e(ee++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):_t(void 0,e),function(c){var u=s.__N?s.__N[0]:s.__[0],l=s.t(u,c);u!==l&&(s.__N=[l,s.__[1]],s.__c.setState({}))}],s.__c=M,!M.__f)){var i=function(c,u,l){if(!s.__c.__H)return!0;var g=s.__c.__H.__.filter(function(h){return!!h.__c});if(g.every(function(h){return!h.__N}))return!a||a.call(this,c,u,l);var p=s.__c.props!==c;return g.forEach(function(h){if(h.__N){var f=h.__[0];h.__=h.__N,h.__N=void 0,f!==h.__[0]&&(p=!0)}}),a&&a.call(this,c,u,l)||p};M.__f=!0;var a=M.shouldComponentUpdate,r=M.componentWillUpdate;M.componentWillUpdate=function(c,u,l){if(this.__e){var g=a;a=void 0,i(c,u,l),a=g}r&&r.call(this,c,u,l)},M.shouldComponentUpdate=i}return s.__N||s.__}function j(t,e){var n=$e(ee++,3);!C.__s&&mt(n.__H,e)&&(n.__=t,n.u=e,M.__H.__h.push(n))}function G(t){return te=5,ht(function(){return{current:t}},[])}function ht(t,e){var n=$e(ee++,7);return mt(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function ft(t,e){return te=8,ht(function(){return t},e)}function _n(){for(var t;t=gt.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(ce),t.__H.__h.forEach(Ce),t.__H.__h=[]}catch(e){t.__H.__h=[],C.__e(e,t.__v)}}C.__b=function(t){M=null,rt&&rt(t)},C.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),dt&&dt(t,e)},C.__r=function(t){at&&at(t),ee=0;var e=(M=t.__c).__H;e&&(Me===M?(e.__h=[],M.__h=[],e.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.forEach(ce),e.__h.forEach(Ce),e.__h=[],ee=0)),Me=M},C.diffed=function(t){pt&&pt(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(gt.push(e)!==1&&ot===C.requestAnimationFrame||((ot=C.requestAnimationFrame)||vn)(_n)),e.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Me=M=null},C.__c=function(t,e){e.some(function(n){try{n.__h.forEach(ce),n.__h=n.__h.filter(function(s){return!s.__||Ce(s)})}catch(s){e.some(function(i){i.__h&&(i.__h=[])}),e=[],C.__e(s,n.__v)}}),lt&<(t,e)},C.unmount=function(t){ct&&ct(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.forEach(function(s){try{ce(s)}catch(i){e=i}}),n.__H=void 0,e&&C.__e(e,n.__v))};var ut=typeof requestAnimationFrame=="function";function vn(t){var e,n=function(){clearTimeout(s),ut&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);ut&&(e=requestAnimationFrame(n))}function ce(t){var e=M,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),M=e}function Ce(t){var e=M;t.__c=t.__(),M=e}function mt(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function _t(t,e){return typeof e=="function"?e(t):e}function vt(t,e){let n=e==="dark",s={bg:n?"#1f2937":"#ffffff",bgSecondary:n?"#374151":"#f3f4f6",text:n?"#f9fafb":"#111827",textSecondary:n?"#9ca3af":"#6b7280",border:n?"#4b5563":"#e5e7eb",messageBg:n?"#374151":"#f3f4f6"};return`
|
|
2
2
|
#pocketping-container {
|
|
3
3
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
4
4
|
font-size: 14px;
|
|
@@ -92,6 +92,7 @@
|
|
|
92
92
|
flex-direction: column;
|
|
93
93
|
overflow: hidden;
|
|
94
94
|
z-index: 9998;
|
|
95
|
+
transition: max-height 0.2s ease, bottom 0.2s ease;
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
.pp-window.pp-bottom-right {
|
|
@@ -108,13 +109,21 @@
|
|
|
108
109
|
.pp-window {
|
|
109
110
|
width: calc(100vw - 20px);
|
|
110
111
|
height: auto;
|
|
112
|
+
min-height: 300px;
|
|
111
113
|
max-height: calc(100vh - 100px);
|
|
112
|
-
max-height: calc(
|
|
114
|
+
max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
|
|
113
115
|
bottom: 80px;
|
|
114
116
|
right: 10px;
|
|
115
117
|
left: 10px;
|
|
116
118
|
border-radius: 12px;
|
|
117
119
|
}
|
|
120
|
+
|
|
121
|
+
/* When keyboard is likely open (input focused), reduce height */
|
|
122
|
+
.pp-window:has(.pp-input:focus) {
|
|
123
|
+
max-height: calc(50vh - 20px);
|
|
124
|
+
max-height: calc(50svh - 20px);
|
|
125
|
+
bottom: 10px;
|
|
126
|
+
}
|
|
118
127
|
}
|
|
119
128
|
|
|
120
129
|
.pp-header {
|
|
@@ -905,17 +914,52 @@
|
|
|
905
914
|
text-overflow: ellipsis;
|
|
906
915
|
}
|
|
907
916
|
|
|
917
|
+
/* Clickable reply quote */
|
|
918
|
+
.pp-reply-quote-clickable {
|
|
919
|
+
cursor: pointer;
|
|
920
|
+
transition: background 0.15s, transform 0.1s;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
.pp-reply-quote-clickable:hover {
|
|
924
|
+
background: ${n?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.08)"};
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
.pp-reply-quote-clickable:active {
|
|
928
|
+
transform: scale(0.98);
|
|
929
|
+
}
|
|
930
|
+
|
|
908
931
|
/* Reply quote in visitor message bubble needs higher contrast */
|
|
909
932
|
.pp-message-visitor .pp-reply-quote {
|
|
910
933
|
background: rgba(255, 255, 255, 0.18);
|
|
911
934
|
border-left-color: rgba(255, 255, 255, 0.7);
|
|
912
935
|
}
|
|
913
936
|
|
|
937
|
+
.pp-message-visitor .pp-reply-quote-clickable:hover {
|
|
938
|
+
background: rgba(255, 255, 255, 0.25);
|
|
939
|
+
}
|
|
940
|
+
|
|
914
941
|
.pp-message-visitor .pp-reply-sender,
|
|
915
942
|
.pp-message-visitor .pp-reply-content {
|
|
916
943
|
color: rgba(255, 255, 255, 0.9);
|
|
917
944
|
}
|
|
918
945
|
|
|
946
|
+
/* Message highlight animation (when scrolling to a message) */
|
|
947
|
+
.pp-message-highlight {
|
|
948
|
+
animation: pp-highlight-pulse 1.5s ease-out;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
@keyframes pp-highlight-pulse {
|
|
952
|
+
0% {
|
|
953
|
+
box-shadow: 0 0 0 0 ${t}80;
|
|
954
|
+
}
|
|
955
|
+
30% {
|
|
956
|
+
box-shadow: 0 0 0 6px ${t}40;
|
|
957
|
+
}
|
|
958
|
+
100% {
|
|
959
|
+
box-shadow: 0 0 0 0 ${t}00;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
919
963
|
/* Deleted Message */
|
|
920
964
|
.pp-message-deleted {
|
|
921
965
|
opacity: 0.6;
|
|
@@ -940,7 +984,7 @@
|
|
|
940
984
|
margin-left: 4px;
|
|
941
985
|
font-style: italic;
|
|
942
986
|
}
|
|
943
|
-
`}var vn=0;function i(t,e,n,s,o,a){e||(e={});var r,c,u=e;if("ref"in u)for(c in u={},e)c=="ref"?r=e[c]:u[c]=e[c];var p={type:t,props:u,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--vn,__i:-1,__u:0,__source:o,__self:a};if(typeof t=="function"&&(r=t.defaultProps))for(c in r)u[c]===void 0&&(u[c]=r[c]);return w.vnode&&w.vnode(p),p}function wt({client:t,config:e}){let[n,s]=$(!1),[o,a]=$([]),[r,c]=$(""),[u,p]=$(!1),[g,l]=$(!1),[h,f]=$(!1),[S,A]=$(0),[k,_]=$([]),[b,L]=$(!1),[H,B]=$(null),[U,X]=$(null),[W,F]=$(""),[O,R]=$(null),[z,ge]=$(!1),[Ut,Re]=$(null),[Oe,De]=$(null),[N,he]=$(e),fe=G(null),me=G(null),Le=G(null),Wt=G(null);j(()=>{let d=t.on("openChange",s),v=t.on("message",()=>{a([...t.getMessages()])}),P=t.on("typing",m=>{p(m.isTyping)}),x=t.on("presence",m=>{l(m.online)}),E=t.on("connect",()=>{f(!0),a(t.getMessages()),l(t.getSession()?.operatorOnline??!1),he(t.getConfig())}),T=t.on("configUpdate",()=>{he(t.getConfig())});return t.isConnected()&&(f(!0),a(t.getMessages()),l(t.getSession()?.operatorOnline??!1),he(t.getConfig())),()=>{d(),v(),P(),x(),E(),T()}},[t]),j(()=>{n&&fe.current?.scrollIntoView({behavior:"smooth"})},[o,n]),j(()=>{n&&(setTimeout(()=>{fe.current?.scrollIntoView({behavior:"auto"})},50),me.current?.focus(),A(0))},[n]),j(()=>{if(!n&&o.length>0){let d=o.filter(v=>v.sender!=="visitor"&&v.status!=="read").length;A(d)}},[o,n]);let se=ht(()=>{if(!n||!h)return;let d=o.filter(v=>v.sender!=="visitor"&&v.status!=="read");if(d.length>0){let v=d.map(P=>P.id);t.sendReadStatus(v,"read")}},[n,h,o,t]);if(j(()=>{if(!n||!h)return;let d=setTimeout(()=>{se()},1e3);return()=>clearTimeout(d)},[n,h,o,se]),j(()=>{let d=()=>{document.visibilityState==="visible"&&n&&se()};return document.addEventListener("visibilitychange",d),()=>document.removeEventListener("visibilitychange",d)},[n,se]),j(()=>{let d=t.on("read",()=>{a([...t.getMessages()])});return()=>d()},[t]),!xn(N))return null;let zt=async d=>{d.preventDefault();let v=r.trim().length>0,P=k.filter(m=>m.status==="ready"&&m.attachment);if(!v&&P.length===0)return;let x=r,E=P.map(m=>m.attachment.id),T=H?.id;c(""),_([]),B(null);try{await t.sendMessage(x,E,T)}catch(m){console.error("[PocketPing] Failed to send message:",m)}},Vt=d=>{let v=d.target;c(v.value),t.sendTyping(!0)},jt=async d=>{let v=d.target,P=v.files;if(!P||P.length===0)return;let x=[];for(let E=0;E<P.length;E++){let T=P[E],m=`pending-${Date.now()}-${E}`,I;T.type.startsWith("image/")&&(I=URL.createObjectURL(T)),x.push({id:m,file:T,preview:I,progress:0,status:"pending"})}_(E=>[...E,...x]),v.value="",L(!0);for(let E of x)try{_(m=>m.map(I=>I.id===E.id?{...I,status:"uploading"}:I));let T=await t.uploadFile(E.file,m=>{_(I=>I.map(ve=>ve.id===E.id?{...ve,progress:m}:ve))});_(m=>m.map(I=>I.id===E.id?{...I,status:"ready",progress:100,attachment:T}:I))}catch(T){console.error("[PocketPing] Failed to upload file:",T),_(m=>m.map(I=>I.id===E.id?{...I,status:"error",error:"Upload failed"}:I))}L(!1)},Bt=d=>{_(v=>{let P=v.find(x=>x.id===d);return P?.preview&&URL.revokeObjectURL(P.preview),v.filter(x=>x.id!==d)})},He=d=>{B(d),R(null),me.current?.focus()},qt=()=>{B(null)},Fe=d=>{d.sender==="visitor"&&(X(d),F(d.content),R(null))},Ne=()=>{X(null),F("")},Jt=async()=>{if(!(!U||!W.trim()))try{await t.editMessage(U.id,W.trim()),X(null),F("")}catch(d){console.error("[PocketPing] Failed to edit message:",d)}},Ue=async d=>{if(d.sender==="visitor"&&(R(null),confirm("Delete this message?")))try{await t.deleteMessage(d.id)}catch(v){console.error("[PocketPing] Failed to delete message:",v)}},Xt=(d,v)=>{d.preventDefault();let P=d;R({message:v,x:P.clientX,y:P.clientY})},Yt=d=>{let v=setTimeout(()=>{navigator.vibrate&&navigator.vibrate(50),R({message:d,x:window.innerWidth/2-60,y:window.innerHeight/2-50})},500);De(v)},We=()=>{Oe&&(clearTimeout(Oe),De(null))};j(()=>{if(!O)return;let d=()=>R(null);return document.addEventListener("click",d),()=>document.removeEventListener("click",d)},[O]);let K=G(0),Gt=d=>{d.preventDefault(),d.stopPropagation(),K.current++,K.current===1&&ge(!0)},Kt=d=>{d.preventDefault(),d.stopPropagation()},Qt=d=>{d.preventDefault(),d.stopPropagation(),K.current--,K.current===0&&ge(!1)},Zt=async d=>{d.preventDefault(),d.stopPropagation(),K.current=0,ge(!1);let v=d.dataTransfer?.files;if(!v||v.length===0)return;let P=[];for(let x=0;x<v.length;x++){let E=v[x],T=`pending-${Date.now()}-${x}`,m;E.type.startsWith("image/")&&(m=URL.createObjectURL(E)),P.push({id:T,file:E,preview:m,progress:0,status:"pending"})}_(x=>[...x,...P]),L(!0);for(let x of P)try{_(T=>T.map(m=>m.id===x.id?{...m,status:"uploading"}:m));let E=await t.uploadFile(x.file,T=>{_(m=>m.map(I=>I.id===x.id?{...I,progress:T}:I))});_(T=>T.map(m=>m.id===x.id?{...m,status:"ready",progress:100,attachment:E}:m))}catch(E){console.error("[PocketPing] Failed to upload dropped file:",E),_(T=>T.map(m=>m.id===x.id?{...m,status:"error",error:"Upload failed"}:m))}L(!1)},ze=N.position??"bottom-right",_e=yn(N.theme??"auto"),en=N.primaryColor??"#6366f1",Q=_e==="dark"?"#9ca3af":"#6b7280";return i(D,{children:[i("style",{children:_t(en,_e)}),i("button",{class:`pp-toggle pp-${ze}`,onClick:()=>t.toggleOpen(),"aria-label":n?"Close chat":"Open chat",children:[n?i(ne,{}):i(wn,{}),!n&&S>0&&i("span",{class:"pp-unread-badge",children:S>9?"9+":S}),!n&&S===0&&g&&i("span",{class:"pp-online-dot"})]}),n&&i("div",{class:`pp-window pp-${ze} pp-theme-${_e} ${z?"pp-dragging":""}`,onDragEnter:Gt,onDragOver:Kt,onDragLeave:Qt,onDrop:Zt,children:[z&&i("div",{class:"pp-drop-overlay",children:[i("div",{class:"pp-drop-icon",children:i(vt,{})}),i("div",{class:"pp-drop-text",children:"Drop files to upload"})]}),i("div",{class:"pp-header",children:[i("div",{class:"pp-header-info",children:[N.operatorAvatar&&i("img",{src:N.operatorAvatar,alt:"",class:"pp-avatar"}),i("div",{children:[i("div",{class:"pp-header-title",children:N.operatorName??"Support"}),i("div",{class:"pp-header-status",children:g?i(D,{children:[i("span",{class:"pp-status-dot pp-online"})," Online"]}):i(D,{children:[i("span",{class:"pp-status-dot"})," Away"]})})]})]}),i("button",{class:"pp-close-btn",onClick:()=>t.setOpen(!1),"aria-label":"Close chat",children:i(ne,{})})]}),i("div",{class:"pp-messages",ref:Wt,children:[N.welcomeMessage&&o.length===0&&i("div",{class:"pp-welcome",children:N.welcomeMessage}),o.map(d=>{let v=!!d.deletedAt,P=!!d.editedAt,x=null;if(d.replyTo)if(typeof d.replyTo=="object")x=d.replyTo;else{let m=o.find(I=>I.id===d.replyTo);m&&(x={sender:m.sender,content:m.content,deleted:!!m.deletedAt})}let T=Ut===d.id&&!v;return i("div",{class:`pp-message pp-message-${d.sender} ${v?"pp-message-deleted":""}`,onContextMenu:m=>Xt(m,d),onMouseEnter:()=>Re(d.id),onMouseLeave:()=>Re(null),onTouchStart:()=>Yt(d),onTouchEnd:We,onTouchCancel:We,children:[T&&i("div",{class:`pp-message-actions ${d.sender==="visitor"?"pp-actions-left":"pp-actions-right"}`,children:[i("button",{class:"pp-action-btn",onClick:()=>He(d),title:"Reply",children:i(xt,{color:Q})}),d.sender==="visitor"&&i(D,{children:[i("button",{class:"pp-action-btn",onClick:()=>Fe(d),title:"Edit",children:i(yt,{color:Q})}),i("button",{class:"pp-action-btn pp-action-delete",onClick:()=>Ue(d),title:"Delete",children:i(bt,{color:Q})})]})]}),x&&x.content&&i("div",{class:"pp-reply-quote",children:[i("span",{class:"pp-reply-sender",children:x.sender==="visitor"?"You":"Support"}),i("span",{class:"pp-reply-content",children:[x.deleted?"Message deleted":(x.content||"").slice(0,50),(x.content||"").length>50?"...":""]})]}),v?i("div",{class:"pp-message-content pp-deleted-content",children:[i("span",{class:"pp-deleted-icon",children:"\u{1F5D1}\uFE0F"})," Message deleted"]}):i(D,{children:[d.content&&i("div",{class:"pp-message-content",children:d.content}),d.attachments&&d.attachments.length>0&&i("div",{class:"pp-message-attachments",children:d.attachments.map(m=>i(En,{attachment:m},m.id))})]}),i("div",{class:"pp-message-time",children:[bn(d.timestamp),P&&!v&&i("span",{class:"pp-edited-badge",children:"edited"}),d.sender==="ai"&&i("span",{class:"pp-ai-badge",children:"AI"}),d.sender==="visitor"&&!v&&i("span",{class:`pp-status pp-status-${d.status??"sent"}`,children:i(Sn,{status:d.status})})]})]},d.id)}),u&&i("div",{class:"pp-message pp-message-operator pp-typing",children:[i("span",{}),i("span",{}),i("span",{})]}),i("div",{ref:fe})]}),O&&i("div",{class:"pp-message-menu",style:{top:`${O.y}px`,left:`${O.x}px`},children:[i("button",{onClick:()=>He(O.message),children:[i(xt,{color:Q})," Reply"]}),O.message.sender==="visitor"&&!O.message.deletedAt&&i(D,{children:[i("button",{onClick:()=>Fe(O.message),children:[i(yt,{color:Q})," Edit"]}),i("button",{class:"pp-menu-delete",onClick:()=>Ue(O.message),children:[i(bt,{color:"#ef4444"})," Delete"]})]})]}),U&&i("div",{class:"pp-edit-modal",children:[i("div",{class:"pp-edit-header",children:[i("span",{children:"Edit message"}),i("button",{onClick:Ne,children:i(ne,{})})]}),i("textarea",{class:"pp-edit-input",value:W,onInput:d=>F(d.target.value),autoFocus:!0}),i("div",{class:"pp-edit-actions",children:[i("button",{class:"pp-edit-cancel",onClick:Ne,children:"Cancel"}),i("button",{class:"pp-edit-save",onClick:Jt,disabled:!W.trim(),children:"Save"})]})]}),H&&i("div",{class:"pp-reply-preview",children:[i("div",{class:"pp-reply-preview-content",children:[i("span",{class:"pp-reply-label",children:"Replying to"}),i("span",{class:"pp-reply-text",children:[H.content.slice(0,50),H.content.length>50?"...":""]})]}),i("button",{class:"pp-reply-cancel",onClick:qt,children:i(ne,{})})]}),k.length>0&&i("div",{class:"pp-attachments-preview",children:k.map(d=>i("div",{class:`pp-attachment-preview pp-attachment-${d.status}`,children:[d.preview?i("img",{src:d.preview,alt:d.file.name,class:"pp-preview-img"}):i("div",{class:"pp-preview-file",children:i(kt,{mimeType:d.file.type})}),i("button",{class:"pp-remove-attachment",onClick:()=>Bt(d.id),"aria-label":"Remove attachment",type:"button",children:i(ne,{})}),d.status==="uploading"&&i("div",{class:"pp-upload-progress",style:{width:`${d.progress}%`}}),d.status==="error"&&i("div",{class:"pp-upload-error",title:d.error,children:"!"})]},d.id))}),i("form",{class:"pp-input-form",onSubmit:zt,children:[i("input",{ref:d=>{Le.current=d,d&&(d.onchange=jt)},type:"file",class:"pp-file-input",accept:"image/*,audio/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt",multiple:!0}),i("button",{type:"button",class:"pp-attach-btn",onClick:()=>Le.current?.click(),disabled:!h||b,"aria-label":"Attach file",children:i(vt,{})}),i("input",{ref:me,type:"text",class:"pp-input",placeholder:N.placeholder??"Type a message...",value:r,onInput:Vt,disabled:!h}),i("button",{type:"submit",class:"pp-send-btn",disabled:!r.trim()&&k.filter(d=>d.status==="ready").length===0||!h||b,"aria-label":"Send message",children:i(kn,{})})]}),i("div",{class:"pp-footer",children:["Powered by ",i("a",{href:"https://pocketping.io",target:"_blank",rel:"noopener",children:"PocketPing"})]})]})]})}function xn(t){let e=window.location.pathname;return t.hideOnPages?.some(n=>new RegExp(n).test(e))?!1:t.showOnPages?.length?t.showOnPages.some(n=>new RegExp(n).test(e)):!0}function yn(t){return t==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":t}function bn(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function wn(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:i("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function ne(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),i("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function kn(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),i("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]})}function Sn({status:t}){return!t||t==="sending"||t==="sent"?i("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check",children:i("polyline",{points:"3 8 7 12 13 4"})}):t==="delivered"?i("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double",children:[i("polyline",{points:"1 8 5 12 11 4"}),i("polyline",{points:"7 8 11 12 17 4"})]}):t==="read"?i("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double pp-check-read",children:[i("polyline",{points:"1 8 5 12 11 4"}),i("polyline",{points:"7 8 11 12 17 4"})]}):null}function vt(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:i("path",{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"})})}function xt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[i("polyline",{points:"9 17 4 12 9 7"}),i("path",{d:"M20 18v-2a4 4 0 0 0-4-4H4"})]})}function yt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:i("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})})}function bt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[i("polyline",{points:"3 6 5 6 21 6"}),i("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})]})}function kt({mimeType:t}){return t==="application/pdf"?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),i("polyline",{points:"14 2 14 8 20 8"}),i("path",{d:"M9 15h6"}),i("path",{d:"M9 11h6"})]}):t.startsWith("audio/")?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M9 18V5l12-2v13"}),i("circle",{cx:"6",cy:"18",r:"3"}),i("circle",{cx:"18",cy:"16",r:"3"})]}):t.startsWith("video/")?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("rect",{x:"2",y:"2",width:"20",height:"20",rx:"2.18",ry:"2.18"}),i("line",{x1:"7",y1:"2",x2:"7",y2:"22"}),i("line",{x1:"17",y1:"2",x2:"17",y2:"22"}),i("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),i("line",{x1:"2",y1:"7",x2:"7",y2:"7"}),i("line",{x1:"2",y1:"17",x2:"7",y2:"17"}),i("line",{x1:"17",y1:"17",x2:"22",y2:"17"}),i("line",{x1:"17",y1:"7",x2:"22",y2:"7"})]}):i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),i("polyline",{points:"14 2 14 8 20 8"})]})}function En({attachment:t}){let e=t.mimeType.startsWith("image/"),n=t.mimeType.startsWith("audio/"),s=t.mimeType.startsWith("video/"),o=a=>a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`;return e?i("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-image",children:i("img",{src:t.thumbnailUrl||t.url,alt:t.filename})}):n?i("div",{class:"pp-attachment pp-attachment-audio",children:[i("audio",{controls:!0,preload:"metadata",children:i("source",{src:t.url,type:t.mimeType})}),i("span",{class:"pp-attachment-name",children:t.filename})]}):s?i("div",{class:"pp-attachment pp-attachment-video",children:i("video",{controls:!0,preload:"metadata",children:i("source",{src:t.url,type:t.mimeType})})}):i("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-file",children:[i(kt,{mimeType:t.mimeType}),i("div",{class:"pp-attachment-info",children:[i("span",{class:"pp-attachment-name",children:t.filename}),i("span",{class:"pp-attachment-size",children:o(t.size)})]})]})}var de="0.3.6";var ue=class{constructor(e){this.session=null;this.ws=null;this.sse=null;this.isOpen=!1;this.listeners=new Map;this.customEventHandlers=new Map;this.reconnectAttempts=0;this.maxReconnectAttempts=5;this.reconnectTimeout=null;this.pollingTimeout=null;this.pollingFailures=0;this.maxPollingFailures=10;this.wsConnectedAt=0;this.quickFailureThreshold=2e3;this.connectionMode="none";this.trackedElementCleanups=[];this.currentTrackedElements=[];this.inspectorMode=!1;this.inspectorCleanup=null;this.config=e}async connect(){let e=this.getOrCreateVisitorId(),n=this.getStoredSessionId(),s=this.getStoredIdentity(),a=new URLSearchParams(window.location.search).get("pp_inspector"),r=await this.fetch("/connect",{method:"POST",body:JSON.stringify({visitorId:e,sessionId:n,inspectorToken:a||void 0,metadata:{url:window.location.href,referrer:document.referrer||void 0,pageTitle:document.title||void 0,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,language:navigator.language,screenResolution:`${window.screen.width}x${window.screen.height}`},identity:s||void 0})});return this.session={sessionId:r.sessionId,visitorId:r.visitorId,operatorOnline:r.operatorOnline??!1,messages:r.messages??[],identity:r.identity||s||void 0},r.operatorName&&(this.config.operatorName=r.operatorName),r.operatorAvatar&&(this.config.operatorAvatar=r.operatorAvatar),r.primaryColor&&(this.config.primaryColor=r.primaryColor),r.welcomeMessage&&(this.config.welcomeMessage=r.welcomeMessage),this.emit("configUpdate",{operatorName:this.config.operatorName,operatorAvatar:this.config.operatorAvatar,primaryColor:this.config.primaryColor,welcomeMessage:this.config.welcomeMessage}),this.storeSessionId(r.sessionId),this.connectRealtime(),r.inspectorMode?this.enableInspectorMode():r.trackedElements?.length&&this.setupTrackedElements(r.trackedElements),this.emit("connect",this.session),this.config.onConnect?.(r.sessionId),this.session}disconnect(){this.ws&&(this.ws.onclose=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null),this.sse&&(this.sse.close(),this.sse=null),this.session=null,this.connectionMode="none",this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.stopPolling(),this.cleanupTrackedElements(),this.disableInspectorMode()}async sendMessage(e,n,s){if(!this.session)throw new Error("Not connected");let o=`temp-${this.generateId()}`,a={id:o,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:new Date().toISOString(),status:"sending",replyTo:s};this.session.messages.push(a),this.emit("message",a);try{let r=await this.fetch("/message",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,content:e,sender:"visitor",attachmentIds:n||[],replyTo:s})}),c=this.session.messages.findIndex(p=>p.id===o);c>=0&&(this.session.messages[c].id=r.messageId,this.session.messages[c].timestamp=r.timestamp,this.session.messages[c].status="sent",r.attachments&&r.attachments.length>0&&(this.session.messages[c].attachments=r.attachments),this.emit("message",this.session.messages[c]));let u=this.session.messages[c]||{id:r.messageId,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:r.timestamp,status:"sent",attachments:r.attachments};return this.config.onMessage?.(u),u}catch(r){let c=this.session.messages.findIndex(u=>u.id===o);throw c>=0&&(this.session.messages.splice(c,1),this.emit("message",a)),r}}async uploadFile(e,n){if(!this.session)throw new Error("Not connected");this.emit("uploadStart",{filename:e.name,size:e.size});try{let s=await this.fetch("/upload",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,filename:e.name,mimeType:e.type||"application/octet-stream",size:e.size})});n?.(10),this.emit("uploadProgress",{filename:e.name,progress:10}),await this.uploadToPresignedUrl(s.uploadUrl,e,a=>{let r=10+a*.8;n?.(r),this.emit("uploadProgress",{filename:e.name,progress:r})});let o=await this.fetch("/upload/complete",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,attachmentId:s.attachmentId})});return n?.(100),this.emit("uploadComplete",o),{id:o.id,filename:o.filename,mimeType:o.mimeType,size:o.size,url:o.url,thumbnailUrl:o.thumbnailUrl,status:o.status}}catch(s){throw this.emit("uploadError",{filename:e.name,error:s}),s}}async uploadFiles(e,n){let s=[],o=e.length;for(let a=0;a<o;a++){let r=e[a],c=a/o*100,u=100/o,p=await this.uploadFile(r,g=>{let l=c+g/100*u;n?.(l)});s.push(p)}return s}uploadToPresignedUrl(e,n,s){return new Promise((o,a)=>{let r=new XMLHttpRequest;r.upload.addEventListener("progress",c=>{if(c.lengthComputable){let u=c.loaded/c.total*100;s?.(u)}}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?o():a(new Error(`Upload failed with status ${r.status}`))}),r.addEventListener("error",()=>{a(new Error("Upload failed"))}),r.open("PUT",e),r.setRequestHeader("Content-Type",n.type||"application/octet-stream"),r.send(n)})}async fetchMessages(e){if(!this.session)throw new Error("Not connected");let n=new URLSearchParams({sessionId:this.session.sessionId});return e&&n.set("after",e),(await this.fetch(`/messages?${n}`,{method:"GET"})).messages}async sendTyping(e=!0){this.session&&await this.fetch("/typing",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,sender:"visitor",isTyping:e})})}async sendReadStatus(e,n){if(!(!this.session||e.length===0))try{await this.fetch("/read",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,messageIds:e,status:n})});for(let s of this.session.messages)e.includes(s.id)&&(s.status=n,n==="delivered"?s.deliveredAt=new Date().toISOString():n==="read"&&(s.readAt=new Date().toISOString()));this.emit("readStatusSent",{messageIds:e,status:n})}catch(s){console.error("[PocketPing] Failed to send read status:",s)}}async editMessage(e,n){if(!this.session)throw new Error("Not connected");let s=await this.fetch(`/message/${e}`,{method:"PATCH",body:JSON.stringify({sessionId:this.session.sessionId,content:n})}),o=this.session.messages.findIndex(a=>a.id===e);return o>=0&&(this.session.messages[o].content=s.message.content,this.session.messages[o].editedAt=s.message.editedAt,this.emit("messageEdited",this.session.messages[o])),this.session.messages[o]}async deleteMessage(e){if(!this.session)throw new Error("Not connected");let n=await this.fetch(`/message/${e}`,{method:"DELETE",body:JSON.stringify({sessionId:this.session.sessionId})});if(n.deleted){let s=this.session.messages.findIndex(o=>o.id===e);s>=0&&(this.session.messages[s].deletedAt=new Date().toISOString(),this.session.messages[s].content="",this.emit("messageDeleted",this.session.messages[s]))}return n.deleted}async getPresence(){return this.fetch("/presence",{method:"GET"})}async identify(e){if(!e?.id)throw new Error("[PocketPing] identity.id is required");if(this.storeIdentity(e),this.session)try{await this.fetch("/identify",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,identity:e})}),this.session.identity=e,this.emit("identify",e)}catch(n){throw console.error("[PocketPing] Failed to identify:",n),n}}async reset(e){this.clearIdentity(),this.session&&(this.session.identity=void 0),e?.newSession&&(localStorage.removeItem("pocketping_session_id"),localStorage.removeItem("pocketping_visitor_id"),this.disconnect(),await this.connect()),this.emit("reset",null)}getIdentity(){return this.session?.identity||this.getStoredIdentity()}getSession(){return this.session}getMessages(){return this.session?.messages??[]}isConnected(){return this.session!==null}isWidgetOpen(){return this.isOpen}getConfig(){return this.config}setOpen(e){this.isOpen=e,this.emit("openChange",e),e?this.config.onOpen?.():this.config.onClose?.()}toggleOpen(){this.setOpen(!this.isOpen)}on(e,n){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(n),()=>{this.listeners.get(e)?.delete(n)}}emit(e,n){this.listeners.get(e)?.forEach(s=>s(n))}trigger(e,n,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN){console.warn("[PocketPing] Cannot trigger event: WebSocket not connected");return}let o={name:e,data:n,timestamp:new Date().toISOString()};this.ws.send(JSON.stringify({type:"event",data:o})),this.emit(`event:${e}`,o),s?.widgetMessage&&(this.setOpen(!0),this.emit("triggerMessage",{message:s.widgetMessage,eventName:e}))}onEvent(e,n){return this.customEventHandlers.has(e)||this.customEventHandlers.set(e,new Set),this.customEventHandlers.get(e).add(n),()=>{this.customEventHandlers.get(e)?.delete(n)}}offEvent(e,n){this.customEventHandlers.get(e)?.delete(n)}emitCustomEvent(e){let n=this.customEventHandlers.get(e.name);n&&n.forEach(s=>s(e.data,e)),this.emit("event",e),this.emit(`event:${e.name}`,e)}setupTrackedElements(e){this.cleanupTrackedElements(),this.currentTrackedElements=e;for(let n of e){let s=n.event||"click",o=r=>{let c={...n.data,selector:n.selector,elementText:r.target?.textContent?.trim().slice(0,100),url:window.location.href};this.trigger(n.name,c,{widgetMessage:n.widgetMessage})},a=r=>{r.target?.closest(n.selector)&&o(r)};document.addEventListener(s,a,!0),this.trackedElementCleanups.push(()=>{document.removeEventListener(s,a,!0)})}e.length>0&&console.info(`[PocketPing] Tracking ${e.length} element(s)`)}cleanupTrackedElements(){for(let e of this.trackedElementCleanups)e();this.trackedElementCleanups=[],this.currentTrackedElements=[]}getTrackedElements(){return[...this.currentTrackedElements]}enableInspectorMode(){if(this.inspectorMode)return;this.inspectorMode=!0,console.info("[PocketPing] \u{1F50D} Inspector mode active - click on any element to select it");let e=document.createElement("div");e.id="pp-inspector-overlay",e.innerHTML=`
|
|
987
|
+
`}var xn=0;function o(t,e,n,s,i,a){e||(e={});var r,c,u=e;if("ref"in u)for(c in u={},e)c=="ref"?r=e[c]:u[c]=e[c];var l={type:t,props:u,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--xn,__i:-1,__u:0,__source:i,__self:a};if(typeof t=="function"&&(r=t.defaultProps))for(c in r)u[c]===void 0&&(u[c]=r[c]);return w.vnode&&w.vnode(l),l}function kt({client:t,config:e}){let[n,s]=$(!1),[i,a]=$([]),[r,c]=$(""),[u,l]=$(!1),[g,p]=$(!1),[h,f]=$(!1),[E,A]=$(0),[k,x]=$([]),[b,H]=$(!1),[R,B]=$(null),[N,X]=$(null),[U,F]=$(""),[L,O]=$(null),[z,ge]=$(!1),[Ut,Re]=$(null),[Oe,De]=$(null),[W,he]=$(e),fe=G(null),me=G(null),Le=G(null),zt=G(null);j(()=>{let d=t.on("openChange",s),_=t.on("message",()=>{a([...t.getMessages()])}),T=t.on("typing",m=>{l(m.isTyping)}),v=t.on("presence",m=>{p(m.online)}),S=t.on("connect",()=>{f(!0),a(t.getMessages()),p(t.getSession()?.operatorOnline??!1),he(t.getConfig())}),I=t.on("configUpdate",()=>{he(t.getConfig())});return t.isConnected()&&(f(!0),a(t.getMessages()),p(t.getSession()?.operatorOnline??!1),he(t.getConfig())),()=>{d(),_(),T(),v(),S(),I()}},[t]),j(()=>{n&&fe.current?.scrollIntoView({behavior:"smooth"})},[i,n]),j(()=>{n&&(setTimeout(()=>{fe.current?.scrollIntoView({behavior:"auto"})},50),me.current?.focus(),A(0))},[n]),j(()=>{if(!n&&i.length>0){let d=i.filter(_=>_.sender!=="visitor"&&_.status!=="read").length;A(d)}},[i,n]);let se=ft(()=>{if(!n||!h)return;let d=i.filter(_=>_.sender!=="visitor"&&_.status!=="read");if(d.length>0){let _=d.map(T=>T.id);t.sendReadStatus(_,"read")}},[n,h,i,t]);if(j(()=>{if(!n||!h)return;let d=setTimeout(()=>{se()},1e3);return()=>clearTimeout(d)},[n,h,i,se]),j(()=>{let d=()=>{document.visibilityState==="visible"&&n&&se()};return document.addEventListener("visibilitychange",d),()=>document.removeEventListener("visibilitychange",d)},[n,se]),j(()=>{let d=t.on("read",()=>{a([...t.getMessages()])});return()=>d()},[t]),!yn(W))return null;let Vt=async d=>{d.preventDefault();let _=r.trim().length>0,T=k.filter(m=>m.status==="ready"&&m.attachment);if(!_&&T.length===0)return;let v=r,S=T.map(m=>m.attachment.id),I=R?.id;c(""),x([]),B(null);try{await t.sendMessage(v,S,I)}catch(m){console.error("[PocketPing] Failed to send message:",m)}},jt=d=>{let _=d.target;c(_.value),t.sendTyping(!0)},Bt=async d=>{let _=d.target,T=_.files;if(!T||T.length===0)return;let v=[];for(let S=0;S<T.length;S++){let I=T[S],m=`pending-${Date.now()}-${S}`,P;I.type.startsWith("image/")&&(P=URL.createObjectURL(I)),v.push({id:m,file:I,preview:P,progress:0,status:"pending"})}x(S=>[...S,...v]),_.value="",H(!0);for(let S of v)try{x(m=>m.map(P=>P.id===S.id?{...P,status:"uploading"}:P));let I=await t.uploadFile(S.file,m=>{x(P=>P.map(ve=>ve.id===S.id?{...ve,progress:m}:ve))});x(m=>m.map(P=>P.id===S.id?{...P,status:"ready",progress:100,attachment:I}:P))}catch(I){console.error("[PocketPing] Failed to upload file:",I),x(m=>m.map(P=>P.id===S.id?{...P,status:"error",error:"Upload failed"}:P))}H(!1)},qt=d=>{x(_=>{let T=_.find(v=>v.id===d);return T?.preview&&URL.revokeObjectURL(T.preview),_.filter(v=>v.id!==d)})},He=d=>{B(d),O(null),me.current?.focus()},Jt=()=>{B(null)},Fe=d=>{d.sender==="visitor"&&(X(d),F(d.content),O(null))},We=()=>{X(null),F("")},Xt=async()=>{if(!(!N||!U.trim()))try{await t.editMessage(N.id,U.trim()),X(null),F("")}catch(d){console.error("[PocketPing] Failed to edit message:",d)}},Ne=async d=>{if(d.sender==="visitor"&&(O(null),confirm("Delete this message?")))try{await t.deleteMessage(d.id)}catch(_){console.error("[PocketPing] Failed to delete message:",_)}},Yt=(d,_)=>{d.preventDefault();let T=d;O({message:_,x:T.clientX,y:T.clientY})},Gt=d=>{let _=setTimeout(()=>{navigator.vibrate&&navigator.vibrate(50),O({message:d,x:window.innerWidth/2-60,y:window.innerHeight/2-50})},500);De(_)},Ue=()=>{Oe&&(clearTimeout(Oe),De(null))};j(()=>{if(!L)return;let d=()=>O(null);return document.addEventListener("click",d),()=>document.removeEventListener("click",d)},[L]);let ze=d=>{let _=document.getElementById(`pp-msg-${d}`);_&&(_.scrollIntoView({behavior:"smooth",block:"center"}),_.classList.add("pp-message-highlight"),setTimeout(()=>{_.classList.remove("pp-message-highlight")},1500))},K=G(0),Kt=d=>{d.preventDefault(),d.stopPropagation(),K.current++,K.current===1&&ge(!0)},Qt=d=>{d.preventDefault(),d.stopPropagation()},Zt=d=>{d.preventDefault(),d.stopPropagation(),K.current--,K.current===0&&ge(!1)},en=async d=>{d.preventDefault(),d.stopPropagation(),K.current=0,ge(!1);let _=d.dataTransfer?.files;if(!_||_.length===0)return;let T=[];for(let v=0;v<_.length;v++){let S=_[v],I=`pending-${Date.now()}-${v}`,m;S.type.startsWith("image/")&&(m=URL.createObjectURL(S)),T.push({id:I,file:S,preview:m,progress:0,status:"pending"})}x(v=>[...v,...T]),H(!0);for(let v of T)try{x(I=>I.map(m=>m.id===v.id?{...m,status:"uploading"}:m));let S=await t.uploadFile(v.file,I=>{x(m=>m.map(P=>P.id===v.id?{...P,progress:I}:P))});x(I=>I.map(m=>m.id===v.id?{...m,status:"ready",progress:100,attachment:S}:m))}catch(S){console.error("[PocketPing] Failed to upload dropped file:",S),x(I=>I.map(m=>m.id===v.id?{...m,status:"error",error:"Upload failed"}:m))}H(!1)},Ve=W.position??"bottom-right",_e=bn(W.theme??"auto"),tn=W.primaryColor??"#6366f1",Q=_e==="dark"?"#9ca3af":"#6b7280";return o(D,{children:[o("style",{children:vt(tn,_e)}),o("button",{class:`pp-toggle pp-${Ve}`,onClick:()=>t.toggleOpen(),"aria-label":n?"Close chat":"Open chat",children:[n?o(ne,{}):o(kn,{}),!n&&E>0&&o("span",{class:"pp-unread-badge",children:E>9?"9+":E}),!n&&E===0&&g&&o("span",{class:"pp-online-dot"})]}),n&&o("div",{class:`pp-window pp-${Ve} pp-theme-${_e} ${z?"pp-dragging":""}`,onDragEnter:Kt,onDragOver:Qt,onDragLeave:Zt,onDrop:en,children:[z&&o("div",{class:"pp-drop-overlay",children:[o("div",{class:"pp-drop-icon",children:o(xt,{})}),o("div",{class:"pp-drop-text",children:"Drop files to upload"})]}),o("div",{class:"pp-header",children:[o("div",{class:"pp-header-info",children:[W.operatorAvatar&&o("img",{src:W.operatorAvatar,alt:"",class:"pp-avatar"}),o("div",{children:[o("div",{class:"pp-header-title",children:W.operatorName??"Support"}),o("div",{class:"pp-header-status",children:g?o(D,{children:[o("span",{class:"pp-status-dot pp-online"})," Online"]}):o(D,{children:[o("span",{class:"pp-status-dot"})," Away"]})})]})]}),o("button",{class:"pp-close-btn",onClick:()=>t.setOpen(!1),"aria-label":"Close chat",children:o(ne,{})})]}),o("div",{class:"pp-messages",ref:zt,children:[W.welcomeMessage&&i.length===0&&o("div",{class:"pp-welcome",children:W.welcomeMessage}),i.map(d=>{let _=!!d.deletedAt,T=!!d.editedAt,v=null;if(d.replyTo)if(typeof d.replyTo=="object")v=d.replyTo;else{let m=i.find(P=>P.id===d.replyTo);if(m){let P=!!(m.attachments&&m.attachments.length>0);v={id:m.id,sender:m.sender,content:m.content,deleted:!!m.deletedAt,hasAttachment:P,attachmentType:P?m.attachments[0].mimeType:void 0}}}let I=Ut===d.id&&!_;return o("div",{id:`pp-msg-${d.id}`,class:`pp-message pp-message-${d.sender} ${_?"pp-message-deleted":""}`,onContextMenu:m=>Yt(m,d),onMouseEnter:()=>Re(d.id),onMouseLeave:()=>Re(null),onTouchStart:()=>Gt(d),onTouchEnd:Ue,onTouchCancel:Ue,children:[I&&o("div",{class:`pp-message-actions ${d.sender==="visitor"?"pp-actions-left":"pp-actions-right"}`,children:[o("button",{class:"pp-action-btn",onClick:()=>He(d),title:"Reply",children:o(yt,{color:Q})}),d.sender==="visitor"&&o(D,{children:[o("button",{class:"pp-action-btn",onClick:()=>Fe(d),title:"Edit",children:o(bt,{color:Q})}),o("button",{class:"pp-action-btn pp-action-delete",onClick:()=>Ne(d),title:"Delete",children:o(wt,{color:Q})})]})]}),v&&(v.content||v.hasAttachment)&&o("div",{class:"pp-reply-quote pp-reply-quote-clickable",onClick:()=>ze(v.id),role:"button",tabIndex:0,onKeyDown:m=>m.key==="Enter"&&ze(v.id),children:[o("span",{class:"pp-reply-sender",children:v.sender==="visitor"?"You":"Support"}),o("span",{class:"pp-reply-content",children:v.deleted?"Message deleted":o(D,{children:[v.hasAttachment&&o("span",{class:"pp-reply-attachment-icon",children:v.attachmentType?.startsWith("image/")?"\u{1F4F7} ":"\u{1F4CE} "}),v.content?o(D,{children:[(v.content||"").slice(0,50),(v.content||"").length>50?"...":""]}):v.attachmentType?.startsWith("image/")?"Photo":"File"]})})]}),_?o("div",{class:"pp-message-content pp-deleted-content",children:[o("span",{class:"pp-deleted-icon",children:"\u{1F5D1}\uFE0F"})," Message deleted"]}):o(D,{children:[d.content&&o("div",{class:"pp-message-content",children:d.content}),d.attachments&&d.attachments.length>0&&o("div",{class:"pp-message-attachments",children:d.attachments.map(m=>o(Pn,{attachment:m},m.id))})]}),o("div",{class:"pp-message-time",children:[wn(d.timestamp),T&&!_&&o("span",{class:"pp-edited-badge",children:"edited"}),d.sender==="ai"&&o("span",{class:"pp-ai-badge",children:"AI"}),d.sender==="visitor"&&!_&&o("span",{class:`pp-status pp-status-${d.status??"sent"}`,children:o(Sn,{status:d.status})})]})]},d.id)}),u&&o("div",{class:"pp-message pp-message-operator pp-typing",children:[o("span",{}),o("span",{}),o("span",{})]}),o("div",{ref:fe})]}),L&&o("div",{class:"pp-message-menu",style:{top:`${L.y}px`,left:`${L.x}px`},children:[o("button",{onClick:()=>He(L.message),children:[o(yt,{color:Q})," Reply"]}),L.message.sender==="visitor"&&!L.message.deletedAt&&o(D,{children:[o("button",{onClick:()=>Fe(L.message),children:[o(bt,{color:Q})," Edit"]}),o("button",{class:"pp-menu-delete",onClick:()=>Ne(L.message),children:[o(wt,{color:"#ef4444"})," Delete"]})]})]}),N&&o("div",{class:"pp-edit-modal",children:[o("div",{class:"pp-edit-header",children:[o("span",{children:"Edit message"}),o("button",{onClick:We,children:o(ne,{})})]}),o("textarea",{class:"pp-edit-input",value:U,onInput:d=>F(d.target.value),autoFocus:!0}),o("div",{class:"pp-edit-actions",children:[o("button",{class:"pp-edit-cancel",onClick:We,children:"Cancel"}),o("button",{class:"pp-edit-save",onClick:Xt,disabled:!U.trim(),children:"Save"})]})]}),R&&o("div",{class:"pp-reply-preview",children:[o("div",{class:"pp-reply-preview-content",children:[o("span",{class:"pp-reply-label",children:"Replying to"}),o("span",{class:"pp-reply-text",children:[R.attachments&&R.attachments.length>0&&o("span",{class:"pp-reply-attachment-icon",children:R.attachments[0].mimeType.startsWith("image/")?"\u{1F4F7} ":"\u{1F4CE} "}),R.content?o(D,{children:[R.content.slice(0,50),R.content.length>50?"...":""]}):R.attachments?.[0]?.mimeType.startsWith("image/")?"Photo":"File"]})]}),o("button",{class:"pp-reply-cancel",onClick:Jt,children:o(ne,{})})]}),k.length>0&&o("div",{class:"pp-attachments-preview",children:k.map(d=>o("div",{class:`pp-attachment-preview pp-attachment-${d.status}`,children:[d.preview?o("img",{src:d.preview,alt:d.file.name,class:"pp-preview-img"}):o("div",{class:"pp-preview-file",children:o(Et,{mimeType:d.file.type})}),o("button",{class:"pp-remove-attachment",onClick:()=>qt(d.id),"aria-label":"Remove attachment",type:"button",children:o(ne,{})}),d.status==="uploading"&&o("div",{class:"pp-upload-progress",style:{width:`${d.progress}%`}}),d.status==="error"&&o("div",{class:"pp-upload-error",title:d.error,children:"!"})]},d.id))}),o("form",{class:"pp-input-form",onSubmit:Vt,children:[o("input",{ref:d=>{Le.current=d,d&&(d.onchange=Bt)},type:"file",class:"pp-file-input",accept:"image/*,audio/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt",multiple:!0}),o("button",{type:"button",class:"pp-attach-btn",onClick:()=>Le.current?.click(),disabled:!h||b,"aria-label":"Attach file",children:o(xt,{})}),o("input",{ref:me,type:"text",class:"pp-input",placeholder:W.placeholder??"Type a message...",value:r,onInput:jt,disabled:!h}),o("button",{type:"submit",class:"pp-send-btn",disabled:!r.trim()&&k.filter(d=>d.status==="ready").length===0||!h||b,"aria-label":"Send message",children:o(En,{})})]}),o("div",{class:"pp-footer",children:["Powered by ",o("a",{href:"https://pocketping.io",target:"_blank",rel:"noopener",children:"PocketPing"})]})]})]})}function yn(t){let e=window.location.pathname;return t.hideOnPages?.some(n=>new RegExp(n).test(e))?!1:t.showOnPages?.length?t.showOnPages.some(n=>new RegExp(n).test(e)):!0}function bn(t){return t==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":t}function wn(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function kn(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:o("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function ne(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),o("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function En(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),o("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]})}function Sn({status:t}){return!t||t==="sending"||t==="sent"?o("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check",children:o("polyline",{points:"3 8 7 12 13 4"})}):t==="delivered"?o("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double",children:[o("polyline",{points:"1 8 5 12 11 4"}),o("polyline",{points:"7 8 11 12 17 4"})]}):t==="read"?o("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double pp-check-read",children:[o("polyline",{points:"1 8 5 12 11 4"}),o("polyline",{points:"7 8 11 12 17 4"})]}):null}function xt(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:o("path",{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"})})}function yt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[o("polyline",{points:"9 17 4 12 9 7"}),o("path",{d:"M20 18v-2a4 4 0 0 0-4-4H4"})]})}function bt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:o("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})})}function wt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[o("polyline",{points:"3 6 5 6 21 6"}),o("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})]})}function Et({mimeType:t}){return t==="application/pdf"?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),o("polyline",{points:"14 2 14 8 20 8"}),o("path",{d:"M9 15h6"}),o("path",{d:"M9 11h6"})]}):t.startsWith("audio/")?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M9 18V5l12-2v13"}),o("circle",{cx:"6",cy:"18",r:"3"}),o("circle",{cx:"18",cy:"16",r:"3"})]}):t.startsWith("video/")?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("rect",{x:"2",y:"2",width:"20",height:"20",rx:"2.18",ry:"2.18"}),o("line",{x1:"7",y1:"2",x2:"7",y2:"22"}),o("line",{x1:"17",y1:"2",x2:"17",y2:"22"}),o("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),o("line",{x1:"2",y1:"7",x2:"7",y2:"7"}),o("line",{x1:"2",y1:"17",x2:"7",y2:"17"}),o("line",{x1:"17",y1:"17",x2:"22",y2:"17"}),o("line",{x1:"17",y1:"7",x2:"22",y2:"7"})]}):o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),o("polyline",{points:"14 2 14 8 20 8"})]})}function Pn({attachment:t}){let e=t.mimeType.startsWith("image/"),n=t.mimeType.startsWith("audio/"),s=t.mimeType.startsWith("video/"),i=a=>a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`;return e?o("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-image",children:o("img",{src:t.thumbnailUrl||t.url,alt:t.filename})}):n?o("div",{class:"pp-attachment pp-attachment-audio",children:[o("audio",{controls:!0,preload:"metadata",children:o("source",{src:t.url,type:t.mimeType})}),o("span",{class:"pp-attachment-name",children:t.filename})]}):s?o("div",{class:"pp-attachment pp-attachment-video",children:o("video",{controls:!0,preload:"metadata",children:o("source",{src:t.url,type:t.mimeType})})}):o("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-file",children:[o(Et,{mimeType:t.mimeType}),o("div",{class:"pp-attachment-info",children:[o("span",{class:"pp-attachment-name",children:t.filename}),o("span",{class:"pp-attachment-size",children:i(t.size)})]})]})}var de="0.3.6";var ue=class{constructor(e){this.session=null;this.ws=null;this.sse=null;this.isOpen=!1;this.listeners=new Map;this.customEventHandlers=new Map;this.reconnectAttempts=0;this.maxReconnectAttempts=5;this.reconnectTimeout=null;this.pollingTimeout=null;this.pollingFailures=0;this.maxPollingFailures=10;this.wsConnectedAt=0;this.quickFailureThreshold=2e3;this.connectionMode="none";this.trackedElementCleanups=[];this.currentTrackedElements=[];this.inspectorMode=!1;this.inspectorCleanup=null;this.config=e}async connect(){let e=this.getOrCreateVisitorId(),n=this.getStoredSessionId(),s=this.getStoredIdentity(),a=new URLSearchParams(window.location.search).get("pp_inspector"),r=await this.fetch("/connect",{method:"POST",body:JSON.stringify({visitorId:e,sessionId:n,inspectorToken:a||void 0,metadata:{url:window.location.href,referrer:document.referrer||void 0,pageTitle:document.title||void 0,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,language:navigator.language,screenResolution:`${window.screen.width}x${window.screen.height}`},identity:s||void 0})});return this.session={sessionId:r.sessionId,visitorId:r.visitorId,operatorOnline:r.operatorOnline??!1,messages:r.messages??[],identity:r.identity||s||void 0},r.operatorName&&(this.config.operatorName=r.operatorName),r.operatorAvatar&&(this.config.operatorAvatar=r.operatorAvatar),r.primaryColor&&(this.config.primaryColor=r.primaryColor),r.welcomeMessage&&(this.config.welcomeMessage=r.welcomeMessage),this.emit("configUpdate",{operatorName:this.config.operatorName,operatorAvatar:this.config.operatorAvatar,primaryColor:this.config.primaryColor,welcomeMessage:this.config.welcomeMessage}),this.storeSessionId(r.sessionId),this.connectRealtime(),r.inspectorMode?this.enableInspectorMode():r.trackedElements?.length&&this.setupTrackedElements(r.trackedElements),this.emit("connect",this.session),this.config.onConnect?.(r.sessionId),this.session}disconnect(){this.ws&&(this.ws.onclose=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null),this.sse&&(this.sse.close(),this.sse=null),this.session=null,this.connectionMode="none",this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.stopPolling(),this.cleanupTrackedElements(),this.disableInspectorMode()}async sendMessage(e,n,s){if(!this.session)throw new Error("Not connected");let i=`temp-${this.generateId()}`,a={id:i,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:new Date().toISOString(),status:"sending",replyTo:s};this.session.messages.push(a),this.emit("message",a);try{let r=await this.fetch("/message",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,content:e,sender:"visitor",attachmentIds:n||[],replyTo:s})}),c=this.session.messages.findIndex(l=>l.id===i);c>=0&&(this.session.messages[c].id=r.messageId,this.session.messages[c].timestamp=r.timestamp,this.session.messages[c].status="sent",r.attachments&&r.attachments.length>0&&(this.session.messages[c].attachments=r.attachments),this.emit("message",this.session.messages[c]));let u=this.session.messages[c]||{id:r.messageId,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:r.timestamp,status:"sent",attachments:r.attachments};return this.config.onMessage?.(u),u}catch(r){let c=this.session.messages.findIndex(u=>u.id===i);throw c>=0&&(this.session.messages.splice(c,1),this.emit("message",a)),r}}async uploadFile(e,n){if(!this.session)throw new Error("Not connected");this.emit("uploadStart",{filename:e.name,size:e.size});try{let s=await this.fetch("/upload",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,filename:e.name,mimeType:e.type||"application/octet-stream",size:e.size})});n?.(10),this.emit("uploadProgress",{filename:e.name,progress:10}),await this.uploadToPresignedUrl(s.uploadUrl,e,a=>{let r=10+a*.8;n?.(r),this.emit("uploadProgress",{filename:e.name,progress:r})});let i=await this.fetch("/upload/complete",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,attachmentId:s.attachmentId})});return n?.(100),this.emit("uploadComplete",i),{id:i.id,filename:i.filename,mimeType:i.mimeType,size:i.size,url:i.url,thumbnailUrl:i.thumbnailUrl,status:i.status}}catch(s){throw this.emit("uploadError",{filename:e.name,error:s}),s}}async uploadFiles(e,n){let s=[],i=e.length;for(let a=0;a<i;a++){let r=e[a],c=a/i*100,u=100/i,l=await this.uploadFile(r,g=>{let p=c+g/100*u;n?.(p)});s.push(l)}return s}uploadToPresignedUrl(e,n,s){return new Promise((i,a)=>{let r=new XMLHttpRequest;r.upload.addEventListener("progress",c=>{if(c.lengthComputable){let u=c.loaded/c.total*100;s?.(u)}}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?i():a(new Error(`Upload failed with status ${r.status}`))}),r.addEventListener("error",()=>{a(new Error("Upload failed"))}),r.open("PUT",e),r.setRequestHeader("Content-Type",n.type||"application/octet-stream"),r.send(n)})}async fetchMessages(e){if(!this.session)throw new Error("Not connected");let n=new URLSearchParams({sessionId:this.session.sessionId});return e&&n.set("after",e),(await this.fetch(`/messages?${n}`,{method:"GET"})).messages}async sendTyping(e=!0){this.session&&await this.fetch("/typing",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,sender:"visitor",isTyping:e})})}async sendReadStatus(e,n){if(!(!this.session||e.length===0))try{await this.fetch("/read",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,messageIds:e,status:n})});for(let s of this.session.messages)e.includes(s.id)&&(s.status=n,n==="delivered"?s.deliveredAt=new Date().toISOString():n==="read"&&(s.readAt=new Date().toISOString()));this.emit("readStatusSent",{messageIds:e,status:n})}catch(s){console.error("[PocketPing] Failed to send read status:",s)}}async editMessage(e,n){if(!this.session)throw new Error("Not connected");let s=await this.fetch(`/message/${e}`,{method:"PATCH",body:JSON.stringify({sessionId:this.session.sessionId,content:n})}),i=this.session.messages.findIndex(a=>a.id===e);return i>=0&&(this.session.messages[i].content=s.message.content,this.session.messages[i].editedAt=s.message.editedAt,this.emit("messageEdited",this.session.messages[i])),this.session.messages[i]}async deleteMessage(e){if(!this.session)throw new Error("Not connected");let n=await this.fetch(`/message/${e}?sessionId=${encodeURIComponent(this.session.sessionId)}`,{method:"DELETE"});if(n.deleted){let s=this.session.messages.findIndex(i=>i.id===e);s>=0&&(this.session.messages[s].deletedAt=new Date().toISOString(),this.session.messages[s].content="",this.emit("messageDeleted",this.session.messages[s]))}return n.deleted}async getPresence(){return this.fetch("/presence",{method:"GET"})}async identify(e){if(!e?.id)throw new Error("[PocketPing] identity.id is required");if(this.storeIdentity(e),this.session)try{await this.fetch("/identify",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,identity:e})}),this.session.identity=e,this.emit("identify",e)}catch(n){throw console.error("[PocketPing] Failed to identify:",n),n}}async reset(e){this.clearIdentity(),this.session&&(this.session.identity=void 0),e?.newSession&&(localStorage.removeItem("pocketping_session_id"),localStorage.removeItem("pocketping_visitor_id"),this.disconnect(),await this.connect()),this.emit("reset",null)}getIdentity(){return this.session?.identity||this.getStoredIdentity()}getSession(){return this.session}getMessages(){return this.session?.messages??[]}isConnected(){return this.session!==null}isWidgetOpen(){return this.isOpen}getConfig(){return this.config}setOpen(e){this.isOpen=e,this.emit("openChange",e),e?this.config.onOpen?.():this.config.onClose?.()}toggleOpen(){this.setOpen(!this.isOpen)}on(e,n){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(n),()=>{this.listeners.get(e)?.delete(n)}}emit(e,n){this.listeners.get(e)?.forEach(s=>s(n))}trigger(e,n,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN){console.warn("[PocketPing] Cannot trigger event: WebSocket not connected");return}let i={name:e,data:n,timestamp:new Date().toISOString()};this.ws.send(JSON.stringify({type:"event",data:i})),this.emit(`event:${e}`,i),s?.widgetMessage&&(this.setOpen(!0),this.emit("triggerMessage",{message:s.widgetMessage,eventName:e}))}onEvent(e,n){return this.customEventHandlers.has(e)||this.customEventHandlers.set(e,new Set),this.customEventHandlers.get(e).add(n),()=>{this.customEventHandlers.get(e)?.delete(n)}}offEvent(e,n){this.customEventHandlers.get(e)?.delete(n)}emitCustomEvent(e){let n=this.customEventHandlers.get(e.name);n&&n.forEach(s=>s(e.data,e)),this.emit("event",e),this.emit(`event:${e.name}`,e)}setupTrackedElements(e){this.cleanupTrackedElements(),this.currentTrackedElements=e;for(let n of e){let s=n.event||"click",i=r=>{let c={...n.data,selector:n.selector,elementText:r.target?.textContent?.trim().slice(0,100),url:window.location.href};this.trigger(n.name,c,{widgetMessage:n.widgetMessage})},a=r=>{r.target?.closest(n.selector)&&i(r)};document.addEventListener(s,a,!0),this.trackedElementCleanups.push(()=>{document.removeEventListener(s,a,!0)})}e.length>0&&console.info(`[PocketPing] Tracking ${e.length} element(s)`)}cleanupTrackedElements(){for(let e of this.trackedElementCleanups)e();this.trackedElementCleanups=[],this.currentTrackedElements=[]}getTrackedElements(){return[...this.currentTrackedElements]}enableInspectorMode(){if(this.inspectorMode)return;this.inspectorMode=!0,console.info("[PocketPing] \u{1F50D} Inspector mode active - click on any element to select it");let e=document.createElement("div");e.id="pp-inspector-overlay",e.innerHTML=`
|
|
944
988
|
<style>
|
|
945
989
|
#pp-inspector-overlay {
|
|
946
990
|
position: fixed;
|
|
@@ -1023,9 +1067,9 @@
|
|
|
1023
1067
|
<button id="pp-inspector-exit">Exit</button>
|
|
1024
1068
|
</div>
|
|
1025
1069
|
<div id="pp-inspector-tooltip"></div>
|
|
1026
|
-
`,document.body.appendChild(e);let n=document.getElementById("pp-inspector-tooltip"),s=null,
|
|
1070
|
+
`,document.body.appendChild(e);let n=document.getElementById("pp-inspector-tooltip"),s=null,i=u=>{if(u.id&&!u.id.startsWith("pp-"))return`#${CSS.escape(u.id)}`;let l=Array.from(u.classList).filter(h=>!h.startsWith("pp-"));if(l.length>0){let h="."+l.map(f=>CSS.escape(f)).join(".");if(document.querySelectorAll(h).length===1)return h}for(let h of Array.from(u.attributes))if(h.name.startsWith("data-")&&h.value){let f=`[${h.name}="${CSS.escape(h.value)}"]`;if(document.querySelectorAll(f).length===1)return f}let g=[],p=u;for(;p&&p!==document.body;){let h=p.tagName.toLowerCase();if(p.id&&!p.id.startsWith("pp-")){h=`#${CSS.escape(p.id)}`,g.unshift(h);break}let f=p.parentElement;if(f){let E=p.tagName,A=Array.from(f.children).filter(k=>k.tagName===E);if(A.length>1){let k=A.indexOf(p)+1;h+=`:nth-of-type(${k})`}}g.unshift(h),p=f}return g.join(" > ")},a=u=>{let l=u.target;if(l.closest("#pp-inspector-overlay")||l.closest("#pocketping-widget"))return;s&&s.classList.remove("pp-inspector-highlight"),l.classList.add("pp-inspector-highlight"),s=l;let g=i(l);n.textContent=g,n.style.display="block",n.style.left=`${u.clientX+15}px`,n.style.top=`${u.clientY+15}px`;let p=n.getBoundingClientRect();p.right>window.innerWidth&&(n.style.left=`${u.clientX-p.width-15}px`),p.bottom>window.innerHeight&&(n.style.top=`${u.clientY-p.height-15}px`)},r=u=>{let l=u.target;l.closest("#pp-inspector-overlay")||(l.classList.remove("pp-inspector-highlight"),n.style.display="none")},c=u=>{let l=u.target;if(l.id==="pp-inspector-exit"){this.disableInspectorMode();return}if(l.closest("#pp-inspector-overlay")||l.closest("#pocketping-widget"))return;u.preventDefault(),u.stopPropagation();let g=i(l);this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"inspector_select",data:{selector:g,tagName:l.tagName.toLowerCase(),text:l.textContent?.trim().slice(0,50)||"",url:window.location.href}})),this.emit("inspectorSelect",{selector:g,element:l}),l.classList.remove("pp-inspector-highlight"),l.classList.add("pp-inspector-highlight"),setTimeout(()=>{l.classList.remove("pp-inspector-highlight")},500);let p=document.getElementById("pp-inspector-banner");if(p){let h=p.innerHTML;p.innerHTML=`
|
|
1027
1071
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
1028
1072
|
<polyline points="20 6 9 17 4 12"/>
|
|
1029
1073
|
</svg>
|
|
1030
1074
|
<span>Selector captured: <code style="background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px;font-family:monospace;">${g}</code></span>
|
|
1031
|
-
`,setTimeout(()=>{l&&this.inspectorMode&&(l.innerHTML=h,document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()}))},2e3)}console.info(`[PocketPing] \u{1F4CC} Selector captured: ${g}`)};document.addEventListener("mouseover",a,!0),document.addEventListener("mouseout",r,!0),document.addEventListener("click",c,!0),this.inspectorCleanup=()=>{document.removeEventListener("mouseover",a,!0),document.removeEventListener("mouseout",r,!0),document.removeEventListener("click",c,!0),e.remove(),s&&s.classList.remove("pp-inspector-highlight")},document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()})}disableInspectorMode(){this.inspectorMode&&(this.inspectorMode=!1,this.inspectorCleanup&&(this.inspectorCleanup(),this.inspectorCleanup=null),console.info("[PocketPing] Inspector mode disabled"),this.emit("inspectorDisabled",null))}isInspectorModeActive(){return this.inspectorMode}connectRealtime(){if(this.session){if(this.connectionMode==="polling"){this.startPolling();return}if(this.connectionMode==="sse"){this.connectSSE();return}this.connectWebSocket()}}connectWebSocket(){if(!this.session)return;let e=this.config.endpoint.replace(/^http/,"ws").replace(/\/$/,"")+`/stream?sessionId=${this.session.sessionId}`;try{this.ws=new WebSocket(e),this.wsConnectedAt=Date.now();let n=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F WebSocket timeout - trying SSE"),this.ws&&this.ws.readyState!==WebSocket.OPEN&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null,this.connectSSE())},5e3);this.ws.onopen=()=>{clearTimeout(n),this.connectionMode="ws",this.reconnectAttempts=0,this.wsConnectedAt=Date.now(),this.emit("wsConnected",null)},this.ws.onmessage=s=>{try{let o=JSON.parse(s.data);this.handleRealtimeEvent(o)}catch(o){console.error("[PocketPing] Failed to parse WS message:",o)}},this.ws.onclose=()=>{clearTimeout(n),this.emit("wsDisconnected",null),this.handleWsFailure()},this.ws.onerror=()=>{clearTimeout(n)}}catch{console.warn("[PocketPing] WebSocket unavailable - trying SSE"),this.connectSSE()}}connectSSE(){if(!this.session)return;let e=new URLSearchParams({sessionId:this.session.sessionId}),n=this.getLastEventTimestamp();n&&e.set("after",n);let s=this.config.endpoint.replace(/\/$/,"")+`/stream?${e.toString()}`;try{this.sse=new EventSource(s);let o=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F SSE timeout - falling back to polling"),this.sse&&this.sse.readyState!==EventSource.OPEN&&(this.sse.close(),this.sse=null,this.connectionMode="polling",this.startPolling())},5e3);this.sse.onopen=()=>{clearTimeout(o),this.connectionMode="sse",this.emit("sseConnected",null)},this.sse.addEventListener("message",a=>{try{let r=JSON.parse(a.data);this.handleRealtimeEvent(r)}catch(r){console.error("[PocketPing] Failed to parse SSE message:",r)}}),this.sse.addEventListener("connected",()=>{}),this.sse.onerror=()=>{clearTimeout(o),console.warn("[PocketPing] \u274C SSE error - falling back to polling"),this.sse&&(this.sse.close(),this.sse=null),this.connectionMode="polling",this.startPolling()}}catch{console.warn("[PocketPing] SSE unavailable - falling back to polling"),this.connectionMode="polling",this.startPolling()}}handleWsFailure(){if(Date.now()-this.wsConnectedAt<this.quickFailureThreshold){console.info("[PocketPing] WebSocket failed quickly - trying SSE"),this.connectSSE();return}this.scheduleReconnect()}handleRealtimeEvent(e){this.handleWebSocketEvent(e)}getLastEventTimestamp(){if(!this.session)return null;let e=null;for(let n of this.session.messages){let s=[n.timestamp,n.editedAt,n.deletedAt,n.deliveredAt,n.readAt].filter(Boolean).map(o=>new Date(o)).filter(o=>!isNaN(o.getTime()));for(let o of s)(!e||o>e)&&(e=o)}return e?e.toISOString():null}handleWebSocketEvent(e){switch(e.type){case"message":let n=e.data;if(this.session){let u=this.session.messages.findIndex(p=>p.id===n.id);if(u<0&&n.sender==="visitor"&&(u=this.session.messages.findIndex(p=>p.id.startsWith("temp-")&&p.content===n.content&&p.sender==="visitor"),u>=0&&(this.session.messages[u].id=n.id)),u<0&&n.sender!=="visitor"){let p=new Date(n.timestamp).getTime();u=this.session.messages.findIndex(g=>g.sender===n.sender&&g.content===n.content&&Math.abs(new Date(g.timestamp).getTime()-p)<2e3)}if(u>=0){let p=this.session.messages[u],g=!1;n.status&&n.status!==p.status&&(p.status=n.status,g=!0,n.deliveredAt&&(p.deliveredAt=n.deliveredAt),n.readAt&&(p.readAt=n.readAt),this.emit("read",{messageIds:[n.id],status:n.status})),n.content!==void 0&&n.content!==p.content&&(p.content=n.content,g=!0),n.editedAt!==void 0&&n.editedAt!==p.editedAt&&(p.editedAt=n.editedAt,g=!0),n.deletedAt!==void 0&&n.deletedAt!==p.deletedAt&&(p.deletedAt=n.deletedAt,g=!0),n.replyTo!==void 0&&(p.replyTo=n.replyTo,g=!0),n.attachments!==void 0&&(p.attachments=n.attachments,g=!0),g&&this.emit("message",p)}else this.session.messages.push(n),this.emit("message",n),this.config.onMessage?.(n)}n.sender!=="visitor"&&this.emit("typing",{isTyping:!1});break;case"typing":let s=e.data;s.sender!=="visitor"&&this.emit("typing",{isTyping:s.isTyping});break;case"presence":this.session&&(this.session.operatorOnline=e.data.online),this.emit("presence",e.data);break;case"ai_takeover":this.emit("aiTakeover",e.data);break;case"read":let o=e.data;if(this.session)for(let u of this.session.messages)o.messageIds.includes(u.id)&&(u.status=o.status,o.deliveredAt&&(u.deliveredAt=o.deliveredAt),o.readAt&&(u.readAt=o.readAt));this.emit("read",o);break;case"message_edited":if(this.session){let u=e.data,p=this.session.messages.findIndex(g=>g.id===u.messageId);if(p>=0){let g=this.session.messages[p];g.content=u.content,g.editedAt=u.editedAt??new Date().toISOString(),this.emit("message",g)}}break;case"message_deleted":if(this.session){let u=e.data,p=this.session.messages.findIndex(g=>g.id===u.messageId);if(p>=0){let g=this.session.messages[p];g.deletedAt=u.deletedAt??new Date().toISOString(),this.emit("message",g)}}break;case"event":let a=e.data;this.emitCustomEvent(a);break;case"version_warning":let r=e.data;this.handleVersionWarning(r);break;case"config_update":let c=e.data;c.trackedElements&&(this.setupTrackedElements(c.trackedElements),this.emit("configUpdate",c));break}}handleVersionWarning(e){let n="[PocketPing]",s=e.upgradeUrl?` Upgrade: ${e.upgradeUrl}`:" Update your widget to the latest version.";switch(e.severity){case"error":console.error(`${n} \u{1F6A8} VERSION ERROR: ${e.message}${s}`),console.error(`${n} Current: ${e.currentVersion}, Required: ${e.minVersion||"unknown"}`);break;case"warning":console.warn(`${n} \u26A0\uFE0F VERSION WARNING: ${e.message}${s}`),console.warn(`${n} Current: ${e.currentVersion}, Latest: ${e.latestVersion||"unknown"}`);break;case"info":console.info(`${n} \u2139\uFE0F ${e.message}`);break}this.emit("versionWarning",e),this.config.onVersionWarning?.(e),e.canContinue||(console.error(`${n} Widget is incompatible with backend. Please update immediately.`),this.disconnect())}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.warn("[PocketPing] Max reconnect attempts reached, trying SSE"),this.connectSSE();return}let e=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);this.reconnectAttempts++,this.reconnectTimeout=setTimeout(()=>{this.connectWebSocket()},e)}startPolling(){let e=async()=>{if(this.session){try{let n=this.getLastEventTimestamp(),s=await this.fetchMessages(n??void 0);this.pollingFailures=0;for(let o of s){let a=this.session.messages.findIndex(r=>r.id===o.id);if(a>=0){let r=this.session.messages[a],c=!1;o.status&&o.status!==r.status&&(r.status=o.status,c=!0,o.deliveredAt&&(r.deliveredAt=o.deliveredAt),o.readAt&&(r.readAt=o.readAt),this.emit("read",{messageIds:[o.id],status:o.status})),o.content!==void 0&&o.content!==r.content&&(r.content=o.content,c=!0),o.editedAt!==void 0&&o.editedAt!==r.editedAt&&(r.editedAt=o.editedAt,c=!0),o.deletedAt!==void 0&&o.deletedAt!==r.deletedAt&&(r.deletedAt=o.deletedAt,c=!0),o.replyTo!==void 0&&(r.replyTo=o.replyTo,c=!0),o.attachments!==void 0&&(r.attachments=o.attachments,c=!0),c&&this.emit("message",r)}else this.session.messages.push(o),this.emit("message",o),this.config.onMessage?.(o)}}catch(n){if(this.pollingFailures++,console.error("[PocketPing] \u274C Polling error:",n),(this.pollingFailures<=3||this.pollingFailures%3===0)&&console.warn(`[PocketPing] Polling failed (${this.pollingFailures}/${this.maxPollingFailures})`),this.pollingFailures>=this.maxPollingFailures){console.error("[PocketPing] Polling disabled after too many failures. Real-time updates unavailable."),this.emit("pollingDisabled",{failures:this.pollingFailures});return}}if(this.session){let n=this.pollingFailures>0?Math.min(2e3*Math.pow(2,this.pollingFailures-1),3e4):2e3;this.pollingTimeout=setTimeout(e,n)}}};this.pollingTimeout=setTimeout(e,500)}stopPolling(){this.pollingTimeout&&(clearTimeout(this.pollingTimeout),this.pollingTimeout=null),this.pollingFailures=0}async fetch(e,n){let s=this.config.endpoint.replace(/\/$/,"")+e,o=await fetch(s,{...n,headers:{"Content-Type":"application/json","X-PocketPing-Version":de,...n.headers}});if(this.checkVersionHeaders(o),!o.ok){let a=await o.text();throw new Error(`PocketPing API error: ${o.status} ${a}`)}return o.json()}checkVersionHeaders(e){let n=e.headers.get("X-PocketPing-Version-Status"),s=e.headers.get("X-PocketPing-Min-Version"),o=e.headers.get("X-PocketPing-Latest-Version"),a=e.headers.get("X-PocketPing-Version-Message");if(!n||n==="ok")return;let r="info",c=!0;n==="deprecated"?r="warning":n==="unsupported"?(r="error",c=!1):n==="outdated"&&(r="info");let u={severity:r,message:a||`Widget version ${de} is ${n}`,currentVersion:de,minVersion:s||void 0,latestVersion:o||void 0,canContinue:c,upgradeUrl:"https://docs.pocketping.io/widget/installation"};this.handleVersionWarning(u)}getOrCreateVisitorId(){let e="pocketping_visitor_id",n=localStorage.getItem(e);return n||(n=this.generateId(),localStorage.setItem(e,n)),n}getStoredSessionId(){return localStorage.getItem("pocketping_session_id")}storeSessionId(e){localStorage.setItem("pocketping_session_id",e)}getStoredIdentity(){try{let e=localStorage.getItem("pocketping_user_identity");return e?JSON.parse(e):null}catch{return null}}storeIdentity(e){localStorage.setItem("pocketping_user_identity",JSON.stringify(e))}clearIdentity(){localStorage.removeItem("pocketping_user_identity")}generateId(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}};var y=null,q=null,Pn="https://app.pocketping.io/api/widget";function Ae(t){if(y)return console.warn("[PocketPing] Already initialized"),y;let e=t.endpoint;if(!e&&t.projectId&&(e=`${Pn}/${t.projectId}`),!e)throw new Error("[PocketPing] endpoint or projectId is required");let n={...t,endpoint:e};return y=new ue(n),q=document.createElement("div"),q.id="pocketping-container",document.body.appendChild(q),Ie(Ee(wt,{client:y,config:t}),q),y.connect().catch(s=>{console.error("[PocketPing] Failed to connect:",s)}),y}function St(){q&&(Ie(null,q),q.remove(),q=null),y&&(y.disconnect(),y=null)}function Et(){y?.setOpen(!0)}function Pt(){y?.setOpen(!1)}function Tt(){y?.toggleOpen()}function It(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.sendMessage(t,e)}async function Ct(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFile(t,e)}async function Mt(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFiles(t,e)}function $t(t,e,n){if(!y){console.warn("[PocketPing] Not initialized, cannot trigger event");return}y.trigger(t,e,n)}function At(t){if(!y){console.warn("[PocketPing] Not initialized, cannot setup tracked elements");return}y.setupTrackedElements(t)}function Rt(){return y?.getTrackedElements()||[]}function Ot(t,e){return y?y.onEvent(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}function Dt(t,e){y?.offEvent(t,e)}async function Lt(t){if(!y)throw new Error("[PocketPing] Not initialized");return y.identify(t)}async function Ht(t){if(!y){console.warn("[PocketPing] Not initialized");return}return y.reset(t)}function Ft(){return y?.getIdentity()||null}function Nt(t,e){return y?y.on(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}if(typeof document<"u"){let t=document.currentScript;if(t){let e=t.dataset.projectId,n=t.dataset.endpoint;(e||n)&&Ae({projectId:e,endpoint:n,theme:t.dataset.theme||"auto",position:t.dataset.position||"bottom-right"})}}var Tn={init:Ae,destroy:St,open:Et,close:Pt,toggle:Tt,sendMessage:It,uploadFile:Ct,uploadFiles:Mt,trigger:$t,onEvent:Ot,offEvent:Dt,on:Nt,identify:Lt,reset:Ht,getIdentity:Ft,setupTrackedElements:At,getTrackedElements:Rt};return an(In);})();
|
|
1075
|
+
`,setTimeout(()=>{p&&this.inspectorMode&&(p.innerHTML=h,document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()}))},2e3)}console.info(`[PocketPing] \u{1F4CC} Selector captured: ${g}`)};document.addEventListener("mouseover",a,!0),document.addEventListener("mouseout",r,!0),document.addEventListener("click",c,!0),this.inspectorCleanup=()=>{document.removeEventListener("mouseover",a,!0),document.removeEventListener("mouseout",r,!0),document.removeEventListener("click",c,!0),e.remove(),s&&s.classList.remove("pp-inspector-highlight")},document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()})}disableInspectorMode(){this.inspectorMode&&(this.inspectorMode=!1,this.inspectorCleanup&&(this.inspectorCleanup(),this.inspectorCleanup=null),console.info("[PocketPing] Inspector mode disabled"),this.emit("inspectorDisabled",null))}isInspectorModeActive(){return this.inspectorMode}connectRealtime(){if(this.session){if(this.connectionMode==="polling"){this.startPolling();return}if(this.connectionMode==="sse"){this.connectSSE();return}this.connectWebSocket()}}connectWebSocket(){if(!this.session)return;let e=this.config.endpoint.replace(/^http/,"ws").replace(/\/$/,"")+`/stream?sessionId=${this.session.sessionId}`;try{this.ws=new WebSocket(e),this.wsConnectedAt=Date.now();let n=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F WebSocket timeout - trying SSE"),this.ws&&this.ws.readyState!==WebSocket.OPEN&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null,this.connectSSE())},5e3);this.ws.onopen=()=>{clearTimeout(n),this.connectionMode="ws",this.reconnectAttempts=0,this.wsConnectedAt=Date.now(),this.emit("wsConnected",null)},this.ws.onmessage=s=>{try{let i=JSON.parse(s.data);this.handleRealtimeEvent(i)}catch(i){console.error("[PocketPing] Failed to parse WS message:",i)}},this.ws.onclose=()=>{clearTimeout(n),this.emit("wsDisconnected",null),this.handleWsFailure()},this.ws.onerror=()=>{clearTimeout(n)}}catch{console.warn("[PocketPing] WebSocket unavailable - trying SSE"),this.connectSSE()}}connectSSE(){if(!this.session)return;let e=new URLSearchParams({sessionId:this.session.sessionId}),n=this.getLastEventTimestamp();n&&e.set("after",n);let s=this.config.endpoint.replace(/\/$/,"")+`/stream?${e.toString()}`;try{this.sse=new EventSource(s);let i=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F SSE timeout - falling back to polling"),this.sse&&this.sse.readyState!==EventSource.OPEN&&(this.sse.close(),this.sse=null,this.connectionMode="polling",this.startPolling())},5e3);this.sse.onopen=()=>{clearTimeout(i),this.connectionMode="sse",this.emit("sseConnected",null)},this.sse.addEventListener("message",a=>{try{let r=JSON.parse(a.data);this.handleRealtimeEvent(r)}catch(r){console.error("[PocketPing] Failed to parse SSE message:",r)}}),this.sse.addEventListener("connected",()=>{}),this.sse.onerror=()=>{clearTimeout(i),console.warn("[PocketPing] \u274C SSE error - falling back to polling"),this.sse&&(this.sse.close(),this.sse=null),this.connectionMode="polling",this.startPolling()}}catch{console.warn("[PocketPing] SSE unavailable - falling back to polling"),this.connectionMode="polling",this.startPolling()}}handleWsFailure(){if(Date.now()-this.wsConnectedAt<this.quickFailureThreshold){console.info("[PocketPing] WebSocket failed quickly - trying SSE"),this.connectSSE();return}this.scheduleReconnect()}handleRealtimeEvent(e){this.handleWebSocketEvent(e)}getLastEventTimestamp(){if(!this.session)return null;let e=null;for(let n of this.session.messages){let s=[n.timestamp,n.editedAt,n.deletedAt,n.deliveredAt,n.readAt].filter(Boolean).map(i=>new Date(i)).filter(i=>!isNaN(i.getTime()));for(let i of s)(!e||i>e)&&(e=i)}return e?e.toISOString():null}handleWebSocketEvent(e){switch(e.type){case"message":let n=e.data;if(this.session){let u=this.session.messages.findIndex(l=>l.id===n.id);if(u<0&&n.sender==="visitor"&&(u=this.session.messages.findIndex(l=>l.id.startsWith("temp-")&&l.content===n.content&&l.sender==="visitor"),u>=0&&(this.session.messages[u].id=n.id)),u<0&&n.sender!=="visitor"){let l=new Date(n.timestamp).getTime();u=this.session.messages.findIndex(g=>g.sender===n.sender&&g.content===n.content&&Math.abs(new Date(g.timestamp).getTime()-l)<2e3)}if(u>=0){let l=this.session.messages[u],g=!1;n.status&&n.status!==l.status&&(l.status=n.status,g=!0,n.deliveredAt&&(l.deliveredAt=n.deliveredAt),n.readAt&&(l.readAt=n.readAt),this.emit("read",{messageIds:[n.id],status:n.status})),n.content!==void 0&&n.content!==l.content&&(l.content=n.content,g=!0),n.editedAt!==void 0&&n.editedAt!==l.editedAt&&(l.editedAt=n.editedAt,g=!0),n.deletedAt!==void 0&&n.deletedAt!==l.deletedAt&&(l.deletedAt=n.deletedAt,g=!0),n.replyTo!==void 0&&(l.replyTo=n.replyTo,g=!0),n.attachments!==void 0&&(l.attachments=n.attachments,g=!0),g&&this.emit("message",l)}else this.session.messages.push(n),this.emit("message",n),this.config.onMessage?.(n)}n.sender!=="visitor"&&this.emit("typing",{isTyping:!1});break;case"typing":let s=e.data;s.sender!=="visitor"&&this.emit("typing",{isTyping:s.isTyping});break;case"presence":this.session&&(this.session.operatorOnline=e.data.online),this.emit("presence",e.data);break;case"ai_takeover":this.emit("aiTakeover",e.data);break;case"read":let i=e.data;if(this.session)for(let u of this.session.messages)i.messageIds.includes(u.id)&&(u.status=i.status,i.deliveredAt&&(u.deliveredAt=i.deliveredAt),i.readAt&&(u.readAt=i.readAt));this.emit("read",i);break;case"message_edited":if(this.session){let u=e.data,l=this.session.messages.findIndex(g=>g.id===u.messageId);if(l>=0){let g=this.session.messages[l];g.content=u.content,g.editedAt=u.editedAt??new Date().toISOString(),this.emit("message",g)}}break;case"message_deleted":if(this.session){let u=e.data,l=this.session.messages.findIndex(g=>g.id===u.messageId);if(l>=0){let g=this.session.messages[l];g.deletedAt=u.deletedAt??new Date().toISOString(),this.emit("message",g)}}break;case"event":let a=e.data;this.emitCustomEvent(a);break;case"version_warning":let r=e.data;this.handleVersionWarning(r);break;case"config_update":let c=e.data;c.trackedElements&&(this.setupTrackedElements(c.trackedElements),this.emit("configUpdate",c));break}}handleVersionWarning(e){let n="[PocketPing]",s=e.upgradeUrl?` Upgrade: ${e.upgradeUrl}`:" Update your widget to the latest version.";switch(e.severity){case"error":console.error(`${n} \u{1F6A8} VERSION ERROR: ${e.message}${s}`),console.error(`${n} Current: ${e.currentVersion}, Required: ${e.minVersion||"unknown"}`);break;case"warning":console.warn(`${n} \u26A0\uFE0F VERSION WARNING: ${e.message}${s}`),console.warn(`${n} Current: ${e.currentVersion}, Latest: ${e.latestVersion||"unknown"}`);break;case"info":console.info(`${n} \u2139\uFE0F ${e.message}`);break}this.emit("versionWarning",e),this.config.onVersionWarning?.(e),e.canContinue||(console.error(`${n} Widget is incompatible with backend. Please update immediately.`),this.disconnect())}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.warn("[PocketPing] Max reconnect attempts reached, trying SSE"),this.connectSSE();return}let e=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);this.reconnectAttempts++,this.reconnectTimeout=setTimeout(()=>{this.connectWebSocket()},e)}startPolling(){let e=async()=>{if(this.session){try{let n=this.getLastEventTimestamp(),s=await this.fetchMessages(n??void 0);this.pollingFailures=0;for(let i of s){let a=this.session.messages.findIndex(r=>r.id===i.id);if(a>=0){let r=this.session.messages[a],c=!1;i.status&&i.status!==r.status&&(r.status=i.status,c=!0,i.deliveredAt&&(r.deliveredAt=i.deliveredAt),i.readAt&&(r.readAt=i.readAt),this.emit("read",{messageIds:[i.id],status:i.status})),i.content!==void 0&&i.content!==r.content&&(r.content=i.content,c=!0),i.editedAt!==void 0&&i.editedAt!==r.editedAt&&(r.editedAt=i.editedAt,c=!0),i.deletedAt!==void 0&&i.deletedAt!==r.deletedAt&&(r.deletedAt=i.deletedAt,c=!0),i.replyTo!==void 0&&(r.replyTo=i.replyTo,c=!0),i.attachments!==void 0&&(r.attachments=i.attachments,c=!0),c&&this.emit("message",r)}else this.session.messages.push(i),this.emit("message",i),this.config.onMessage?.(i)}}catch(n){if(this.pollingFailures++,console.error("[PocketPing] \u274C Polling error:",n),(this.pollingFailures<=3||this.pollingFailures%3===0)&&console.warn(`[PocketPing] Polling failed (${this.pollingFailures}/${this.maxPollingFailures})`),this.pollingFailures>=this.maxPollingFailures){console.error("[PocketPing] Polling disabled after too many failures. Real-time updates unavailable."),this.emit("pollingDisabled",{failures:this.pollingFailures});return}}if(this.session){let n=this.pollingFailures>0?Math.min(2e3*Math.pow(2,this.pollingFailures-1),3e4):2e3;this.pollingTimeout=setTimeout(e,n)}}};this.pollingTimeout=setTimeout(e,500)}stopPolling(){this.pollingTimeout&&(clearTimeout(this.pollingTimeout),this.pollingTimeout=null),this.pollingFailures=0}async fetch(e,n){let s=this.config.endpoint.replace(/\/$/,"")+e,i=await fetch(s,{...n,headers:{"Content-Type":"application/json","X-PocketPing-Version":de,...n.headers}});if(this.checkVersionHeaders(i),!i.ok){let a=await i.text();throw new Error(`PocketPing API error: ${i.status} ${a}`)}return i.json()}checkVersionHeaders(e){let n=e.headers.get("X-PocketPing-Version-Status"),s=e.headers.get("X-PocketPing-Min-Version"),i=e.headers.get("X-PocketPing-Latest-Version"),a=e.headers.get("X-PocketPing-Version-Message");if(!n||n==="ok")return;let r="info",c=!0;n==="deprecated"?r="warning":n==="unsupported"?(r="error",c=!1):n==="outdated"&&(r="info");let u={severity:r,message:a||`Widget version ${de} is ${n}`,currentVersion:de,minVersion:s||void 0,latestVersion:i||void 0,canContinue:c,upgradeUrl:"https://docs.pocketping.io/widget/installation"};this.handleVersionWarning(u)}getOrCreateVisitorId(){let e="pocketping_visitor_id",n=localStorage.getItem(e);return n||(n=this.generateId(),localStorage.setItem(e,n)),n}getStoredSessionId(){return localStorage.getItem("pocketping_session_id")}storeSessionId(e){localStorage.setItem("pocketping_session_id",e)}getStoredIdentity(){try{let e=localStorage.getItem("pocketping_user_identity");return e?JSON.parse(e):null}catch{return null}}storeIdentity(e){localStorage.setItem("pocketping_user_identity",JSON.stringify(e))}clearIdentity(){localStorage.removeItem("pocketping_user_identity")}generateId(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}};var y=null,q=null,Tn="https://app.pocketping.io/api/widget";function Ae(t){if(y)return console.warn("[PocketPing] Already initialized"),y;let e=t.endpoint;if(!e&&t.projectId&&(e=`${Tn}/${t.projectId}`),!e)throw new Error("[PocketPing] endpoint or projectId is required");let n={...t,endpoint:e};return y=new ue(n),q=document.createElement("div"),q.id="pocketping-container",document.body.appendChild(q),Ie(Se(kt,{client:y,config:t}),q),y.connect().catch(s=>{console.error("[PocketPing] Failed to connect:",s)}),y}function St(){q&&(Ie(null,q),q.remove(),q=null),y&&(y.disconnect(),y=null)}function Pt(){y?.setOpen(!0)}function Tt(){y?.setOpen(!1)}function It(){y?.toggleOpen()}function Mt(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.sendMessage(t,e)}async function Ct(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFile(t,e)}async function $t(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFiles(t,e)}function At(t,e,n){if(!y){console.warn("[PocketPing] Not initialized, cannot trigger event");return}y.trigger(t,e,n)}function Rt(t){if(!y){console.warn("[PocketPing] Not initialized, cannot setup tracked elements");return}y.setupTrackedElements(t)}function Ot(){return y?.getTrackedElements()||[]}function Dt(t,e){return y?y.onEvent(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}function Lt(t,e){y?.offEvent(t,e)}async function Ht(t){if(!y)throw new Error("[PocketPing] Not initialized");return y.identify(t)}async function Ft(t){if(!y){console.warn("[PocketPing] Not initialized");return}return y.reset(t)}function Wt(){return y?.getIdentity()||null}function Nt(t,e){return y?y.on(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}if(typeof document<"u"){let t=document.currentScript;if(t){let e=t.dataset.projectId,n=t.dataset.endpoint;(e||n)&&Ae({projectId:e,endpoint:n,theme:t.dataset.theme||"auto",position:t.dataset.position||"bottom-right"})}}var In={init:Ae,destroy:St,open:Pt,close:Tt,toggle:It,sendMessage:Mt,uploadFile:Ct,uploadFiles:$t,trigger:At,onEvent:Dt,offEvent:Lt,on:Nt,identify:Ht,reset:Ft,getIdentity:Wt,setupTrackedElements:Rt,getTrackedElements:Ot};return pn(Mn);})();
|