@tekibo/feedpulse-sdk 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/feedpulse-bot-build.mjs +121 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +171 -93
- package/dist/nuxt.js +2 -2
- package/dist/nuxt.mjs +336 -283
- package/dist/react.js +3 -3
- package/dist/react.mjs +315 -275
- package/dist/server.js +1 -0
- package/dist/server.mjs +18 -0
- package/package.json +11 -2
- package/templates/nuxt-bot-proxy.ts +39 -2
- package/templates/nuxt-config-id-route.ts +15 -0
package/dist/nuxt.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { inject as
|
|
2
|
-
import { CookieManager as
|
|
3
|
-
import { S as
|
|
4
|
-
const
|
|
5
|
-
function
|
|
6
|
-
return V
|
|
1
|
+
import { inject as U, defineComponent as E, ref as u, computed as F, watch as J, createElementBlock as f, openBlock as r, createElementVNode as e, createCommentVNode as h, Fragment as D, renderList as O, normalizeStyle as $, toDisplayString as T, withDirectives as B, vModelText as H, onMounted as N, onBeforeUnmount as Y, createBlock as j, createTextVNode as A, createStaticVNode as G, Teleport as K, vModelCheckbox as q, provide as Q, renderSlot as X } from "vue";
|
|
2
|
+
import { CursorActor as Z, CookieManager as L, FeedPulseTracker as ee } from "./index.mjs";
|
|
3
|
+
import { S as te } from "./struggle-detector-BqTHgw95.mjs";
|
|
4
|
+
const V = /* @__PURE__ */ Symbol("feedpulse");
|
|
5
|
+
function oe() {
|
|
6
|
+
return U(V, null);
|
|
7
7
|
}
|
|
8
|
-
const
|
|
8
|
+
const ne = { style: {
|
|
9
9
|
width: "360px",
|
|
10
10
|
height: "520px",
|
|
11
11
|
background: "#111827",
|
|
@@ -17,20 +17,20 @@ const ee = { style: {
|
|
|
17
17
|
flexDirection: "column",
|
|
18
18
|
overflow: "hidden",
|
|
19
19
|
animation: "fp-panel-open 300ms ease-out"
|
|
20
|
-
} },
|
|
20
|
+
} }, ae = { style: {
|
|
21
21
|
display: "flex",
|
|
22
22
|
justifyContent: "space-between",
|
|
23
23
|
alignItems: "center",
|
|
24
24
|
padding: "12px 14px",
|
|
25
25
|
borderBottom: "1px solid #374151",
|
|
26
26
|
background: "#0f172a"
|
|
27
|
-
} },
|
|
27
|
+
} }, ie = { style: { flex: 1, overflowY: "auto", padding: "12px", display: "grid", gap: "10px" } }, se = {
|
|
28
28
|
key: 0,
|
|
29
29
|
style: { display: "flex", gap: "8px" }
|
|
30
|
-
},
|
|
30
|
+
}, le = ["onClick"], re = ["onClick"], de = {
|
|
31
31
|
key: 0,
|
|
32
32
|
style: { display: "flex", alignItems: "center", gap: "5px", padding: "4px 0" }
|
|
33
|
-
},
|
|
33
|
+
}, ue = {
|
|
34
34
|
key: 1,
|
|
35
35
|
style: {
|
|
36
36
|
border: "1px solid #f59e0b",
|
|
@@ -40,89 +40,125 @@ const ee = { style: {
|
|
|
40
40
|
padding: "10px",
|
|
41
41
|
fontSize: "12px"
|
|
42
42
|
}
|
|
43
|
-
},
|
|
43
|
+
}, pe = {
|
|
44
|
+
key: 2,
|
|
45
|
+
style: {
|
|
46
|
+
margin: "8px 0",
|
|
47
|
+
padding: "12px",
|
|
48
|
+
background: "#f0f0ff",
|
|
49
|
+
border: "1px solid #c7d2fe",
|
|
50
|
+
borderRadius: "10px",
|
|
51
|
+
fontSize: "13px",
|
|
52
|
+
color: "#111827"
|
|
53
|
+
}
|
|
54
|
+
}, ce = { style: { margin: "0 0 8px", fontWeight: "600" } }, fe = { style: { display: "flex", gap: "8px" } }, xe = {
|
|
55
|
+
key: 3,
|
|
56
|
+
style: {
|
|
57
|
+
margin: "0 0 8px",
|
|
58
|
+
padding: "10px",
|
|
59
|
+
background: "#ecfdf5",
|
|
60
|
+
border: "1px solid #6ee7b7",
|
|
61
|
+
borderRadius: "8px",
|
|
62
|
+
fontSize: "13px",
|
|
63
|
+
color: "#065f46"
|
|
64
|
+
}
|
|
65
|
+
}, ge = { style: { display: "flex", gap: "8px" } }, ve = ["disabled"], be = ["disabled"], ye = ["href"], me = /* @__PURE__ */ E({
|
|
44
66
|
__name: "BotPanel",
|
|
45
67
|
props: {
|
|
46
68
|
botSessionId: {},
|
|
47
69
|
config: {},
|
|
70
|
+
configId: {},
|
|
71
|
+
page: {},
|
|
48
72
|
unavailable: { type: Boolean }
|
|
49
73
|
},
|
|
50
74
|
emits: ["close", "helpful", "escalated"],
|
|
51
|
-
setup(
|
|
52
|
-
const
|
|
53
|
-
function
|
|
54
|
-
return
|
|
55
|
-
role:
|
|
56
|
-
content:
|
|
75
|
+
setup(p, { emit: s }) {
|
|
76
|
+
const a = p, o = s, l = u({}), t = u([]), i = u(""), b = u(!1), y = u(!1), g = u(null), x = u(null), m = new Z(), k = F(() => i.value.trim().length > 0 && !b.value && !a.unavailable && !y.value);
|
|
77
|
+
function C() {
|
|
78
|
+
return t.value.map((S) => ({
|
|
79
|
+
role: S.role,
|
|
80
|
+
content: S.content
|
|
57
81
|
}));
|
|
58
82
|
}
|
|
59
|
-
async function
|
|
60
|
-
if (
|
|
83
|
+
async function v(S) {
|
|
84
|
+
if (S.preventDefault(), !k.value)
|
|
61
85
|
return;
|
|
62
|
-
const
|
|
63
|
-
|
|
86
|
+
const c = i.value.trim(), n = [
|
|
87
|
+
...C(),
|
|
88
|
+
{
|
|
89
|
+
role: "user",
|
|
90
|
+
content: c
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
i.value = "", t.value.push({
|
|
64
94
|
id: `user-${Date.now()}`,
|
|
65
95
|
role: "user",
|
|
66
|
-
content:
|
|
96
|
+
content: c
|
|
67
97
|
});
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
id:
|
|
98
|
+
const d = `assistant-${Date.now()}`;
|
|
99
|
+
t.value.push({
|
|
100
|
+
id: d,
|
|
71
101
|
role: "assistant",
|
|
72
102
|
content: ""
|
|
73
|
-
}),
|
|
103
|
+
}), b.value = !0, y.value = !1;
|
|
74
104
|
try {
|
|
75
|
-
const
|
|
105
|
+
const w = await fetch("/api/bot/chat-proxy", {
|
|
76
106
|
method: "POST",
|
|
77
107
|
headers: { "content-type": "application/json" },
|
|
78
108
|
body: JSON.stringify({
|
|
79
|
-
botSessionId:
|
|
80
|
-
config: JSON.parse(JSON.stringify(
|
|
81
|
-
|
|
109
|
+
botSessionId: a.botSessionId,
|
|
110
|
+
config: JSON.parse(JSON.stringify(a.config)),
|
|
111
|
+
configId: a.configId,
|
|
112
|
+
page: a.page,
|
|
113
|
+
messages: n
|
|
82
114
|
})
|
|
83
115
|
});
|
|
84
|
-
if (
|
|
116
|
+
if (w.status === 402) {
|
|
85
117
|
y.value = !0;
|
|
86
|
-
const
|
|
87
|
-
|
|
118
|
+
const _ = t.value.find((W) => W.id === d);
|
|
119
|
+
_ && (_.content = "Service temporarily unavailable.");
|
|
88
120
|
return;
|
|
89
121
|
}
|
|
90
|
-
if (!
|
|
122
|
+
if (!w.ok)
|
|
91
123
|
throw new Error("Chat request failed");
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
throw new Error("Missing stream");
|
|
95
|
-
const h = new TextDecoder();
|
|
96
|
-
let f = !1;
|
|
97
|
-
for (; !f; ) {
|
|
98
|
-
const k = await $.read();
|
|
99
|
-
if (f = k.done, k.value) {
|
|
100
|
-
const z = h.decode(k.value, { stream: !f }), E = e.value.find((H) => H.id === c);
|
|
101
|
-
E && (E.content += z);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
124
|
+
const P = await w.json(), I = t.value.find((_) => _.id === d);
|
|
125
|
+
I && (I.content = P.text || ""), P.action && (g.value = P.action);
|
|
104
126
|
} catch {
|
|
105
|
-
const
|
|
106
|
-
|
|
127
|
+
const w = t.value.find((P) => P.id === d);
|
|
128
|
+
w && !w.content && (w.content = "Sorry, I couldn't process that. Please try again.");
|
|
107
129
|
} finally {
|
|
108
|
-
|
|
130
|
+
b.value = !1;
|
|
109
131
|
}
|
|
110
132
|
}
|
|
111
|
-
function
|
|
112
|
-
|
|
133
|
+
function z(S, c) {
|
|
134
|
+
l.value[S] = c, o("helpful", c);
|
|
113
135
|
}
|
|
114
|
-
function
|
|
136
|
+
function M() {
|
|
115
137
|
o("escalated");
|
|
116
138
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
139
|
+
async function R(S) {
|
|
140
|
+
if (!g.value)
|
|
141
|
+
return;
|
|
142
|
+
if (!S) {
|
|
143
|
+
g.value = null, x.value = "No problem! Let me know if you need anything else.";
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const c = g.value;
|
|
147
|
+
g.value = null;
|
|
148
|
+
const n = await m.perform(c);
|
|
149
|
+
x.value = n.message, setTimeout(() => {
|
|
150
|
+
x.value = null;
|
|
151
|
+
}, 3e3);
|
|
152
|
+
}
|
|
153
|
+
return J(() => a.botSessionId, () => {
|
|
154
|
+
l.value = {}, t.value = [], i.value = "", y.value = !1, g.value = null, x.value = null;
|
|
155
|
+
}), (S, c) => (r(), f("div", ne, [
|
|
156
|
+
e("div", ae, [
|
|
157
|
+
c[4] || (c[4] = e("div", { style: { display: "grid", gap: "2px" } }, [
|
|
158
|
+
e("strong", { style: { fontSize: "14px", color: "#fff" } }, "Pulse Bot"),
|
|
159
|
+
e("span", { style: { fontSize: "11px", color: "#94a3b8" } }, "Powered by FeedPulse AI")
|
|
124
160
|
], -1)),
|
|
125
|
-
|
|
161
|
+
e("button", {
|
|
126
162
|
style: {
|
|
127
163
|
border: "none",
|
|
128
164
|
background: "transparent",
|
|
@@ -131,72 +167,86 @@ const ee = { style: {
|
|
|
131
167
|
fontSize: "18px",
|
|
132
168
|
lineHeight: "1"
|
|
133
169
|
},
|
|
134
|
-
onClick:
|
|
170
|
+
onClick: c[0] || (c[0] = (n) => o("close"))
|
|
135
171
|
}, " × ")
|
|
136
172
|
]),
|
|
137
|
-
|
|
138
|
-
(r(!0),
|
|
139
|
-
key:
|
|
140
|
-
style:
|
|
173
|
+
e("div", ie, [
|
|
174
|
+
(r(!0), f(D, null, O(t.value, (n) => (r(), f("div", {
|
|
175
|
+
key: n.id,
|
|
176
|
+
style: $({
|
|
141
177
|
display: "grid",
|
|
142
|
-
justifyItems:
|
|
178
|
+
justifyItems: n.role === "user" ? "end" : "start",
|
|
143
179
|
gap: "6px"
|
|
144
180
|
})
|
|
145
181
|
}, [
|
|
146
|
-
|
|
147
|
-
style:
|
|
182
|
+
e("div", {
|
|
183
|
+
style: $({
|
|
148
184
|
maxWidth: "85%",
|
|
149
185
|
padding: "9px 11px",
|
|
150
|
-
borderRadius:
|
|
151
|
-
background:
|
|
186
|
+
borderRadius: n.role === "user" ? "14px 14px 2px 14px" : "14px 14px 14px 2px",
|
|
187
|
+
background: n.role === "user" ? "#4f46e5" : "#1f2937",
|
|
152
188
|
color: "#fff",
|
|
153
189
|
fontSize: "13px",
|
|
154
190
|
lineHeight: "1.4",
|
|
155
191
|
whiteSpace: "pre-wrap"
|
|
156
192
|
})
|
|
157
|
-
},
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
style:
|
|
193
|
+
}, T(n.content), 5),
|
|
194
|
+
n.role === "assistant" ? (r(), f("div", se, [
|
|
195
|
+
e("button", {
|
|
196
|
+
style: $({
|
|
161
197
|
border: "1px solid #334155",
|
|
162
|
-
background:
|
|
198
|
+
background: l.value[n.id] === !0 ? "#16a34a" : "#0f172a",
|
|
163
199
|
color: "#e2e8f0",
|
|
164
200
|
borderRadius: "8px",
|
|
165
201
|
fontSize: "12px",
|
|
166
202
|
padding: "4px 8px",
|
|
167
203
|
cursor: "pointer"
|
|
168
204
|
}),
|
|
169
|
-
onClick: (
|
|
170
|
-
}, " 👍 ", 12,
|
|
171
|
-
|
|
172
|
-
style:
|
|
205
|
+
onClick: (d) => z(n.id, !0)
|
|
206
|
+
}, " 👍 ", 12, le),
|
|
207
|
+
e("button", {
|
|
208
|
+
style: $({
|
|
173
209
|
border: "1px solid #334155",
|
|
174
|
-
background:
|
|
210
|
+
background: l.value[n.id] === !1 ? "#dc2626" : "#0f172a",
|
|
175
211
|
color: "#e2e8f0",
|
|
176
212
|
borderRadius: "8px",
|
|
177
213
|
fontSize: "12px",
|
|
178
214
|
padding: "4px 8px",
|
|
179
215
|
cursor: "pointer"
|
|
180
216
|
}),
|
|
181
|
-
onClick: (
|
|
182
|
-
}, " 👎 ", 12,
|
|
183
|
-
])) :
|
|
217
|
+
onClick: (d) => z(n.id, !1)
|
|
218
|
+
}, " 👎 ", 12, re)
|
|
219
|
+
])) : h("", !0)
|
|
184
220
|
], 4))), 128)),
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
])])) :
|
|
190
|
-
|
|
221
|
+
b.value ? (r(), f("div", de, [...c[5] || (c[5] = [
|
|
222
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 0ms" } }, null, -1),
|
|
223
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 160ms" } }, null, -1),
|
|
224
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 320ms" } }, null, -1)
|
|
225
|
+
])])) : h("", !0),
|
|
226
|
+
p.unavailable || y.value ? (r(), f("div", ue, " Service temporarily unavailable. ")) : h("", !0),
|
|
227
|
+
g.value ? (r(), f("div", pe, [
|
|
228
|
+
e("p", ce, " Want me to " + T(g.value.type) + ' "' + T(g.value.label) + '"? ', 1),
|
|
229
|
+
e("div", fe, [
|
|
230
|
+
e("button", {
|
|
231
|
+
style: { padding: "6px 16px", background: "#6366f1", color: "#fff", border: "none", borderRadius: "6px", cursor: "pointer", fontSize: "12px" },
|
|
232
|
+
onClick: c[1] || (c[1] = (n) => R(!0))
|
|
233
|
+
}, " ✓ Yes, do it "),
|
|
234
|
+
e("button", {
|
|
235
|
+
style: { padding: "6px 16px", background: "transparent", border: "1px solid #c7d2fe", borderRadius: "6px", cursor: "pointer", fontSize: "12px", color: "#111827" },
|
|
236
|
+
onClick: c[2] || (c[2] = (n) => R(!1))
|
|
237
|
+
}, " No thanks ")
|
|
238
|
+
])
|
|
239
|
+
])) : h("", !0),
|
|
240
|
+
x.value ? (r(), f("div", xe, T(x.value), 1)) : h("", !0)
|
|
191
241
|
]),
|
|
192
|
-
|
|
242
|
+
e("form", {
|
|
193
243
|
style: { padding: "10px", borderTop: "1px solid #374151", display: "grid", gap: "8px" },
|
|
194
|
-
onSubmit:
|
|
244
|
+
onSubmit: v
|
|
195
245
|
}, [
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
"onUpdate:modelValue":
|
|
199
|
-
disabled:
|
|
246
|
+
e("div", ge, [
|
|
247
|
+
B(e("input", {
|
|
248
|
+
"onUpdate:modelValue": c[3] || (c[3] = (n) => i.value = n),
|
|
249
|
+
disabled: b.value || p.unavailable,
|
|
200
250
|
style: {
|
|
201
251
|
flex: 1,
|
|
202
252
|
borderRadius: "10px",
|
|
@@ -208,34 +258,34 @@ const ee = { style: {
|
|
|
208
258
|
outline: "none"
|
|
209
259
|
},
|
|
210
260
|
placeholder: "Ask a question..."
|
|
211
|
-
}, null, 8,
|
|
212
|
-
[
|
|
261
|
+
}, null, 8, ve), [
|
|
262
|
+
[H, i.value]
|
|
213
263
|
]),
|
|
214
|
-
|
|
264
|
+
e("button", {
|
|
215
265
|
type: "submit",
|
|
216
|
-
disabled: !
|
|
217
|
-
style:
|
|
266
|
+
disabled: !k.value,
|
|
267
|
+
style: $({
|
|
218
268
|
border: "none",
|
|
219
269
|
borderRadius: "10px",
|
|
220
|
-
background:
|
|
270
|
+
background: k.value ? "#6366f1" : "#334155",
|
|
221
271
|
color: "#fff",
|
|
222
272
|
fontWeight: "600",
|
|
223
273
|
fontSize: "12px",
|
|
224
274
|
padding: "0 14px",
|
|
225
|
-
cursor:
|
|
275
|
+
cursor: k.value ? "pointer" : "not-allowed"
|
|
226
276
|
})
|
|
227
|
-
}, " Send ", 12,
|
|
277
|
+
}, " Send ", 12, be)
|
|
228
278
|
]),
|
|
229
|
-
|
|
279
|
+
p.config.escalateTo ? (r(), f("a", {
|
|
230
280
|
key: 0,
|
|
231
|
-
href:
|
|
281
|
+
href: p.config.escalateTo.url,
|
|
232
282
|
style: { color: "#c4b5fd", fontSize: "12px", textDecoration: "none" },
|
|
233
|
-
onClick:
|
|
234
|
-
},
|
|
283
|
+
onClick: M
|
|
284
|
+
}, T(p.config.escalateTo.label), 9, ye)) : h("", !0)
|
|
235
285
|
], 32)
|
|
236
286
|
]));
|
|
237
287
|
}
|
|
238
|
-
}),
|
|
288
|
+
}), Be = /* @__PURE__ */ E({
|
|
239
289
|
__name: "FeedPulseBot",
|
|
240
290
|
props: {
|
|
241
291
|
faq: {},
|
|
@@ -249,33 +299,34 @@ const ee = { style: {
|
|
|
249
299
|
escalateTo: {},
|
|
250
300
|
initialMessage: { default: "👋 Need help?" },
|
|
251
301
|
position: { default: "bottom-right" },
|
|
252
|
-
config: {}
|
|
302
|
+
config: {},
|
|
303
|
+
configId: {}
|
|
253
304
|
},
|
|
254
|
-
setup(
|
|
255
|
-
const
|
|
256
|
-
let
|
|
257
|
-
const C =
|
|
258
|
-
pageContext:
|
|
259
|
-
systemPrompt:
|
|
260
|
-
faq:
|
|
261
|
-
canNavigate:
|
|
262
|
-
navigableElements:
|
|
263
|
-
canHelpForms:
|
|
264
|
-
formGuide:
|
|
265
|
-
features:
|
|
266
|
-
escalateTo:
|
|
267
|
-
initialMessage:
|
|
268
|
-
}),
|
|
305
|
+
setup(p) {
|
|
306
|
+
const s = p, a = new L(), o = u(!1), l = u(!1), t = u(!1), i = u(!1), b = u(""), y = u(""), g = u(null), x = u(!1);
|
|
307
|
+
let m = null, k = null;
|
|
308
|
+
const C = F(() => s.config ?? {
|
|
309
|
+
pageContext: s.pageContext,
|
|
310
|
+
systemPrompt: s.systemPrompt,
|
|
311
|
+
faq: s.faq,
|
|
312
|
+
canNavigate: s.canNavigate,
|
|
313
|
+
navigableElements: s.navigableElements,
|
|
314
|
+
canHelpForms: s.canHelpForms,
|
|
315
|
+
formGuide: s.formGuide,
|
|
316
|
+
features: s.features,
|
|
317
|
+
escalateTo: s.escalateTo,
|
|
318
|
+
initialMessage: s.initialMessage
|
|
319
|
+
}), v = F(() => ({
|
|
269
320
|
position: "fixed",
|
|
270
321
|
bottom: "24px",
|
|
271
322
|
zIndex: "10000",
|
|
272
|
-
...
|
|
323
|
+
...s.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
|
|
273
324
|
}));
|
|
274
|
-
function
|
|
325
|
+
function z() {
|
|
275
326
|
if (typeof document > "u" || document.getElementById("fp-bot-animations"))
|
|
276
327
|
return;
|
|
277
|
-
const
|
|
278
|
-
|
|
328
|
+
const n = document.createElement("style");
|
|
329
|
+
n.id = "fp-bot-animations", n.textContent = `
|
|
279
330
|
@keyframes fp-bubble-in {
|
|
280
331
|
0% { opacity: 0; transform: scale(0.8) translateY(6px); }
|
|
281
332
|
100% { opacity: 1; transform: scale(1) translateY(0); }
|
|
@@ -294,73 +345,73 @@ const ee = { style: {
|
|
|
294
345
|
50% { opacity: 1; transform: translateY(-3px); }
|
|
295
346
|
100% { opacity: 0.2; transform: translateY(0); }
|
|
296
347
|
}
|
|
297
|
-
`, document.head.appendChild(
|
|
348
|
+
`, document.head.appendChild(n);
|
|
298
349
|
}
|
|
299
|
-
async function
|
|
300
|
-
const
|
|
350
|
+
async function M(n, d) {
|
|
351
|
+
const w = a.getAllData(!0);
|
|
301
352
|
try {
|
|
302
|
-
const
|
|
353
|
+
const P = await fetch("/api/bot/session-proxy", {
|
|
303
354
|
method: "POST",
|
|
304
355
|
headers: { "content-type": "application/json" },
|
|
305
356
|
body: JSON.stringify({
|
|
306
357
|
page: window.location.pathname,
|
|
307
|
-
triggerScore:
|
|
308
|
-
triggerReasons:
|
|
309
|
-
sessionId:
|
|
310
|
-
visitorId:
|
|
358
|
+
triggerScore: n,
|
|
359
|
+
triggerReasons: d,
|
|
360
|
+
sessionId: w.sessionId,
|
|
361
|
+
visitorId: w.userId,
|
|
311
362
|
device: navigator.userAgent
|
|
312
363
|
})
|
|
313
364
|
});
|
|
314
|
-
if (!
|
|
315
|
-
|
|
365
|
+
if (!P.ok) {
|
|
366
|
+
P.status === 402 && (i.value = !0);
|
|
316
367
|
return;
|
|
317
368
|
}
|
|
318
|
-
const
|
|
319
|
-
|
|
369
|
+
const I = await P.json().catch(() => null);
|
|
370
|
+
I?.botSessionId && (y.value = I.botSessionId);
|
|
320
371
|
} catch {
|
|
321
372
|
}
|
|
322
373
|
}
|
|
323
|
-
function
|
|
324
|
-
|
|
374
|
+
function R(n, d) {
|
|
375
|
+
l.value = !0, o.value = !0, i.value = !1, g.value = null, x.value = !1, M(n, d), k && clearTimeout(k), k = setTimeout(() => {
|
|
325
376
|
o.value = !1;
|
|
326
377
|
}, 8e3);
|
|
327
378
|
}
|
|
328
379
|
function S() {
|
|
329
|
-
|
|
380
|
+
t.value = !0, o.value = !1;
|
|
330
381
|
}
|
|
331
|
-
async function
|
|
332
|
-
if (
|
|
382
|
+
async function c() {
|
|
383
|
+
if (t.value = !1, !!y.value)
|
|
333
384
|
try {
|
|
334
385
|
await fetch("/api/bot/session-end-proxy", {
|
|
335
386
|
method: "POST",
|
|
336
387
|
headers: { "content-type": "application/json" },
|
|
337
388
|
body: JSON.stringify({
|
|
338
|
-
botSessionId:
|
|
339
|
-
wasHelpful:
|
|
340
|
-
escalated:
|
|
389
|
+
botSessionId: y.value,
|
|
390
|
+
wasHelpful: g.value,
|
|
391
|
+
escalated: x.value
|
|
341
392
|
})
|
|
342
393
|
});
|
|
343
394
|
} catch {
|
|
344
395
|
}
|
|
345
396
|
}
|
|
346
|
-
return
|
|
347
|
-
|
|
348
|
-
onTrigger: (
|
|
349
|
-
|
|
397
|
+
return N(() => {
|
|
398
|
+
z(), b.value = window.location.pathname, m = new te({
|
|
399
|
+
onTrigger: (n, d) => {
|
|
400
|
+
R(n, d);
|
|
350
401
|
}
|
|
351
|
-
}),
|
|
352
|
-
}),
|
|
353
|
-
|
|
354
|
-
}), (
|
|
355
|
-
style:
|
|
402
|
+
}), m.start();
|
|
403
|
+
}), Y(() => {
|
|
404
|
+
m?.stop(), k && clearTimeout(k);
|
|
405
|
+
}), (n, d) => (r(), f("div", {
|
|
406
|
+
style: $(v.value)
|
|
356
407
|
}, [
|
|
357
|
-
o.value && !
|
|
408
|
+
o.value && !t.value ? (r(), f("div", {
|
|
358
409
|
key: 0,
|
|
359
|
-
style:
|
|
410
|
+
style: $({
|
|
360
411
|
position: "absolute",
|
|
361
412
|
bottom: "62px",
|
|
362
|
-
right:
|
|
363
|
-
left:
|
|
413
|
+
right: p.position === "bottom-right" ? "0" : "auto",
|
|
414
|
+
left: p.position === "bottom-left" ? "0" : "auto",
|
|
364
415
|
background: "#fff",
|
|
365
416
|
border: "2px solid #6366f1",
|
|
366
417
|
color: "#1f2937",
|
|
@@ -372,8 +423,8 @@ const ee = { style: {
|
|
|
372
423
|
animation: "fp-bubble-in 300ms ease-out"
|
|
373
424
|
})
|
|
374
425
|
}, [
|
|
375
|
-
A(
|
|
376
|
-
|
|
426
|
+
A(T(C.value.initialMessage || p.initialMessage) + " ", 1),
|
|
427
|
+
d[2] || (d[2] = e("span", { style: {
|
|
377
428
|
position: "absolute",
|
|
378
429
|
right: "10px",
|
|
379
430
|
bottom: "-12px",
|
|
@@ -382,7 +433,7 @@ const ee = { style: {
|
|
|
382
433
|
borderLeft: "10px solid transparent",
|
|
383
434
|
borderTop: "12px solid #6366f1"
|
|
384
435
|
} }, null, -1)),
|
|
385
|
-
|
|
436
|
+
d[3] || (d[3] = e("span", { style: {
|
|
386
437
|
position: "absolute",
|
|
387
438
|
right: "11px",
|
|
388
439
|
bottom: "-9px",
|
|
@@ -391,8 +442,8 @@ const ee = { style: {
|
|
|
391
442
|
borderLeft: "9px solid transparent",
|
|
392
443
|
borderTop: "11px solid #fff"
|
|
393
444
|
} }, null, -1))
|
|
394
|
-
], 4)) :
|
|
395
|
-
|
|
445
|
+
], 4)) : h("", !0),
|
|
446
|
+
l.value && !t.value ? (r(), f("button", {
|
|
396
447
|
key: 1,
|
|
397
448
|
style: {
|
|
398
449
|
width: "48px",
|
|
@@ -407,212 +458,214 @@ const ee = { style: {
|
|
|
407
458
|
animation: "fp-bounce 600ms ease-out"
|
|
408
459
|
},
|
|
409
460
|
onClick: S
|
|
410
|
-
}, [...
|
|
411
|
-
|
|
412
|
-
])])) :
|
|
413
|
-
|
|
461
|
+
}, [...d[4] || (d[4] = [
|
|
462
|
+
G('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2"><rect x="3" y="8" width="18" height="13" rx="2"></rect><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle><circle cx="8" cy="13" r="1.5" fill="white" stroke="none"></circle><circle cx="16" cy="13" r="1.5" fill="white" stroke="none"></circle><path d="M9 17h6" stroke-linecap="round"></path></svg>', 1)
|
|
463
|
+
])])) : h("", !0),
|
|
464
|
+
t.value && y.value ? (r(), j(me, {
|
|
414
465
|
key: 2,
|
|
415
|
-
"bot-session-id":
|
|
466
|
+
"bot-session-id": y.value,
|
|
416
467
|
config: C.value,
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
468
|
+
"config-id": p.configId,
|
|
469
|
+
page: b.value,
|
|
470
|
+
unavailable: i.value,
|
|
471
|
+
onClose: c,
|
|
472
|
+
onHelpful: d[0] || (d[0] = (w) => g.value = w),
|
|
473
|
+
onEscalated: d[1] || (d[1] = (w) => x.value = !0)
|
|
474
|
+
}, null, 8, ["bot-session-id", "config", "config-id", "page", "unavailable"])) : h("", !0)
|
|
422
475
|
], 4));
|
|
423
476
|
}
|
|
424
|
-
}),
|
|
477
|
+
}), ke = {
|
|
425
478
|
key: 0,
|
|
426
479
|
style: { position: "fixed", bottom: "0", left: "0", right: "0", "z-index": "99999", background: "#1a1a1a", color: "#fff", padding: "20px 24px", "border-top": "1px solid #333", "font-family": "sans-serif" }
|
|
427
|
-
},
|
|
480
|
+
}, he = { style: { "max-width": "900px", margin: "0 auto" } }, we = {
|
|
428
481
|
key: 0,
|
|
429
482
|
style: { "margin-bottom": "12px", "font-size": "13px" }
|
|
430
|
-
},
|
|
483
|
+
}, Se = { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px" } }, Ce = { style: { display: "flex", "align-items": "center", gap: "8px" } }, ze = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap", "align-items": "center" } }, Pe = /* @__PURE__ */ E({
|
|
431
484
|
__name: "consent-banner",
|
|
432
485
|
emits: ["consent"],
|
|
433
|
-
setup(
|
|
434
|
-
const
|
|
486
|
+
setup(p, { emit: s }) {
|
|
487
|
+
const a = s, o = new L(), l = u(!1), t = u(!1), i = u(!1), b = u(!1);
|
|
435
488
|
function y() {
|
|
436
|
-
|
|
489
|
+
l.value = !0, t.value = !0;
|
|
437
490
|
}
|
|
438
|
-
|
|
439
|
-
const
|
|
440
|
-
|
|
491
|
+
N(() => {
|
|
492
|
+
const C = o.getConsent();
|
|
493
|
+
l.value = !C || o.isConsentExpired(), C && (i.value = C.analytics, b.value = C.marketing), typeof window < "u" && (window.addEventListener("feedpulse:open-consent", y), window.addEventListener("feedpulse:withdraw-consent", k));
|
|
441
494
|
});
|
|
442
|
-
function
|
|
443
|
-
o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }),
|
|
495
|
+
function g() {
|
|
496
|
+
o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), a("consent", { analytics: !0, marketing: !0, action: "accept_all" }), l.value = !1;
|
|
444
497
|
}
|
|
445
|
-
function
|
|
446
|
-
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(),
|
|
498
|
+
function x() {
|
|
499
|
+
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), a("consent", { analytics: !1, marketing: !1, action: "reject_all" }), l.value = !1;
|
|
447
500
|
}
|
|
448
|
-
function
|
|
449
|
-
o.setConsent({ analytics:
|
|
501
|
+
function m() {
|
|
502
|
+
o.setConsent({ analytics: i.value, marketing: b.value, version: "1.0" }), i.value || o.clearAnalyticsCookies(), a("consent", { analytics: i.value, marketing: b.value, action: "custom" }), l.value = !1;
|
|
450
503
|
}
|
|
451
|
-
function
|
|
452
|
-
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(),
|
|
504
|
+
function k() {
|
|
505
|
+
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), i.value = !1, b.value = !1, a("consent", { analytics: !1, marketing: !1, action: "withdraw" }), l.value = !0;
|
|
453
506
|
}
|
|
454
|
-
return
|
|
455
|
-
typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", y), window.removeEventListener("feedpulse:withdraw-consent",
|
|
456
|
-
}), (
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
507
|
+
return Y(() => {
|
|
508
|
+
typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", y), window.removeEventListener("feedpulse:withdraw-consent", k));
|
|
509
|
+
}), (C, v) => (r(), j(K, { to: "body" }, [
|
|
510
|
+
l.value ? (r(), f("div", ke, [
|
|
511
|
+
e("div", he, [
|
|
512
|
+
v[6] || (v[6] = e("p", { style: { margin: "0 0 12px", "font-size": "14px", "line-height": "1.5" } }, [
|
|
460
513
|
A(" We use cookies to improve reliability and understand usage. "),
|
|
461
|
-
|
|
514
|
+
e("a", {
|
|
462
515
|
href: "/privacy",
|
|
463
516
|
style: { color: "#818cf8" }
|
|
464
517
|
}, "Privacy Policy")
|
|
465
518
|
], -1)),
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
519
|
+
t.value ? (r(), f("div", we, [
|
|
520
|
+
v[5] || (v[5] = e("label", { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px", opacity: "0.75" } }, [
|
|
521
|
+
e("input", {
|
|
469
522
|
type: "checkbox",
|
|
470
523
|
checked: "",
|
|
471
524
|
disabled: ""
|
|
472
525
|
}),
|
|
473
526
|
A(" Necessary (always on) ")
|
|
474
527
|
], -1)),
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
"onUpdate:modelValue":
|
|
528
|
+
e("label", Se, [
|
|
529
|
+
B(e("input", {
|
|
530
|
+
"onUpdate:modelValue": v[0] || (v[0] = (z) => i.value = z),
|
|
478
531
|
type: "checkbox"
|
|
479
532
|
}, null, 512), [
|
|
480
|
-
[
|
|
533
|
+
[q, i.value]
|
|
481
534
|
]),
|
|
482
|
-
|
|
535
|
+
v[3] || (v[3] = A(" Analytics ", -1))
|
|
483
536
|
]),
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
"onUpdate:modelValue":
|
|
537
|
+
e("label", Ce, [
|
|
538
|
+
B(e("input", {
|
|
539
|
+
"onUpdate:modelValue": v[1] || (v[1] = (z) => b.value = z),
|
|
487
540
|
type: "checkbox"
|
|
488
541
|
}, null, 512), [
|
|
489
|
-
[
|
|
542
|
+
[q, b.value]
|
|
490
543
|
]),
|
|
491
|
-
|
|
544
|
+
v[4] || (v[4] = A(" Marketing ", -1))
|
|
492
545
|
])
|
|
493
|
-
])) :
|
|
494
|
-
|
|
495
|
-
|
|
546
|
+
])) : h("", !0),
|
|
547
|
+
e("div", ze, [
|
|
548
|
+
e("button", {
|
|
496
549
|
style: { width: "130px", padding: "9px 12px", background: "#4f46e5", color: "#fff", border: "1px solid #4f46e5", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
|
|
497
|
-
onClick:
|
|
550
|
+
onClick: g
|
|
498
551
|
}, " Accept All "),
|
|
499
|
-
|
|
552
|
+
e("button", {
|
|
500
553
|
style: { width: "130px", padding: "9px 12px", background: "transparent", color: "#fff", border: "1px solid #555", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
|
|
501
|
-
onClick:
|
|
554
|
+
onClick: x
|
|
502
555
|
}, " Reject All "),
|
|
503
|
-
|
|
556
|
+
e("button", {
|
|
504
557
|
style: { padding: "9px 16px", background: "transparent", color: "#aaa", border: "1px solid #333", "border-radius": "6px", "font-size": "13px", cursor: "pointer" },
|
|
505
|
-
onClick:
|
|
506
|
-
},
|
|
558
|
+
onClick: v[2] || (v[2] = (z) => t.value ? m() : t.value = !0)
|
|
559
|
+
}, T(t.value ? "Save Preferences" : "Customize"), 1)
|
|
507
560
|
])
|
|
508
561
|
])
|
|
509
|
-
])) :
|
|
562
|
+
])) : h("", !0)
|
|
510
563
|
]));
|
|
511
564
|
}
|
|
512
|
-
}),
|
|
565
|
+
}), Me = /* @__PURE__ */ E({
|
|
513
566
|
__name: "FeedPulseProvider",
|
|
514
567
|
props: {
|
|
515
568
|
proxyEndpoint: { default: "/api/fp-proxy" },
|
|
516
569
|
debug: { type: Boolean },
|
|
517
570
|
consentRequired: { type: Boolean, default: !0 }
|
|
518
571
|
},
|
|
519
|
-
setup(
|
|
520
|
-
const
|
|
521
|
-
proxyEndpoint:
|
|
522
|
-
debug:
|
|
572
|
+
setup(p) {
|
|
573
|
+
const s = p, a = new L(), o = new ee({
|
|
574
|
+
proxyEndpoint: s.proxyEndpoint,
|
|
575
|
+
debug: s.debug
|
|
523
576
|
});
|
|
524
|
-
|
|
525
|
-
function
|
|
526
|
-
const
|
|
527
|
-
analytics:
|
|
528
|
-
marketing:
|
|
577
|
+
Q(V, o);
|
|
578
|
+
function l(t) {
|
|
579
|
+
const i = a.setConsent({
|
|
580
|
+
analytics: t.analytics,
|
|
581
|
+
marketing: t.marketing,
|
|
529
582
|
version: "1.0"
|
|
530
583
|
});
|
|
531
|
-
|
|
532
|
-
analytics:
|
|
533
|
-
marketing:
|
|
534
|
-
action:
|
|
584
|
+
t.analytics || a.clearAnalyticsCookies(), o.updateCookieData(a.getAllData(t.analytics)), o.track("consent", "__consent__", {
|
|
585
|
+
analytics: t.analytics,
|
|
586
|
+
marketing: t.marketing,
|
|
587
|
+
action: t.action,
|
|
535
588
|
userAgent: navigator.userAgent,
|
|
536
|
-
version:
|
|
589
|
+
version: i.version
|
|
537
590
|
});
|
|
538
591
|
}
|
|
539
|
-
return
|
|
540
|
-
const
|
|
541
|
-
|
|
542
|
-
}),
|
|
543
|
-
|
|
544
|
-
|
|
592
|
+
return N(() => {
|
|
593
|
+
const t = a.getConsent();
|
|
594
|
+
s.consentRequired === !1 ? (a.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), o.updateCookieData(a.getAllData(!0))) : t && !a.isConsentExpired() ? o.updateCookieData(a.getAllData(t.analytics)) : o.updateCookieData(a.getAllData(!1)), o.init();
|
|
595
|
+
}), Y(() => o.destroy()), (t, i) => (r(), f(D, null, [
|
|
596
|
+
X(t.$slots, "default"),
|
|
597
|
+
p.consentRequired !== !1 ? (r(), j(Pe, {
|
|
545
598
|
key: 0,
|
|
546
|
-
onConsent:
|
|
547
|
-
})) :
|
|
599
|
+
onConsent: l
|
|
600
|
+
})) : h("", !0)
|
|
548
601
|
], 64));
|
|
549
602
|
}
|
|
550
|
-
}),
|
|
603
|
+
}), $e = {
|
|
551
604
|
key: 1,
|
|
552
605
|
style: { background: "#fff", border: "1px solid #e5e7eb", "border-radius": "12px", padding: "16px", width: "280px", "box-shadow": "0 10px 25px rgba(0,0,0,0.15)" }
|
|
553
|
-
},
|
|
606
|
+
}, Te = { style: { margin: "0 0 12px", "font-weight": "600", color: "#111" } }, Ie = { style: { display: "flex", gap: "6px", "margin-bottom": "12px" } }, Ae = ["onClick"], Ee = {
|
|
554
607
|
key: 1,
|
|
555
608
|
style: { "text-align": "center", padding: "16px", color: "#111" }
|
|
556
|
-
},
|
|
609
|
+
}, Fe = /* @__PURE__ */ E({
|
|
557
610
|
__name: "FeedPulseWidget",
|
|
558
611
|
props: {
|
|
559
612
|
id: {},
|
|
560
613
|
placeholder: {},
|
|
561
614
|
position: { default: "bottom-right" }
|
|
562
615
|
},
|
|
563
|
-
setup(
|
|
564
|
-
const
|
|
565
|
-
function
|
|
566
|
-
|
|
616
|
+
setup(p) {
|
|
617
|
+
const s = p, a = oe(), o = u(s.position === "inline"), l = u(null), t = u(""), i = u(!1);
|
|
618
|
+
function b(g) {
|
|
619
|
+
l.value = g;
|
|
567
620
|
}
|
|
568
621
|
function y() {
|
|
569
|
-
!
|
|
570
|
-
o.value =
|
|
622
|
+
!l.value && !t.value.trim() || (a?.trackFeedback(s.id ?? null, l.value, t.value || null), i.value = !0, setTimeout(() => {
|
|
623
|
+
o.value = s.position === "inline", i.value = !1, l.value = null, t.value = "";
|
|
571
624
|
}, 2e3));
|
|
572
625
|
}
|
|
573
|
-
return (
|
|
626
|
+
return (g, x) => (r(), f("div", {
|
|
574
627
|
class: "feedpulse-widget",
|
|
575
|
-
style:
|
|
628
|
+
style: $(p.position !== "inline" ? `position:fixed; ${p.position === "bottom-right" ? "right:24px" : "left:24px"}; bottom:24px; z-index:9999;` : "")
|
|
576
629
|
}, [
|
|
577
|
-
|
|
630
|
+
p.position !== "inline" ? (r(), f("button", {
|
|
578
631
|
key: 0,
|
|
579
632
|
style: { background: "#6366f1", color: "#fff", border: "none", "border-radius": "50%", width: "48px", height: "48px", "font-size": "20px", cursor: "pointer" },
|
|
580
|
-
onClick:
|
|
581
|
-
}, " 💬 ")) :
|
|
582
|
-
o.value ? (r(),
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
])])) : (r(),
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
(r(),
|
|
590
|
-
key:
|
|
591
|
-
style:
|
|
592
|
-
onClick: (
|
|
593
|
-
}, " ⭐ ", 12,
|
|
633
|
+
onClick: x[0] || (x[0] = (m) => o.value = !o.value)
|
|
634
|
+
}, " 💬 ")) : h("", !0),
|
|
635
|
+
o.value ? (r(), f("div", $e, [
|
|
636
|
+
i.value ? (r(), f("div", Ee, [...x[2] || (x[2] = [
|
|
637
|
+
e("p", { style: { "font-size": "28px", margin: "0" } }, " 🎉 ", -1),
|
|
638
|
+
e("p", { style: { margin: "8px 0 0", "font-weight": "600" } }, " Thanks for your feedback! ", -1)
|
|
639
|
+
])])) : (r(), f(D, { key: 0 }, [
|
|
640
|
+
e("p", Te, T(p.placeholder ?? "How was your experience?"), 1),
|
|
641
|
+
e("div", Ie, [
|
|
642
|
+
(r(), f(D, null, O(5, (m) => e("button", {
|
|
643
|
+
key: m,
|
|
644
|
+
style: $({ background: "none", border: "none", cursor: "pointer", fontSize: "24px", opacity: l.value !== null && m <= l.value ? 1 : 0.3 }),
|
|
645
|
+
onClick: (k) => b(m)
|
|
646
|
+
}, " ⭐ ", 12, Ae)), 64))
|
|
594
647
|
]),
|
|
595
|
-
|
|
596
|
-
"onUpdate:modelValue":
|
|
648
|
+
B(e("textarea", {
|
|
649
|
+
"onUpdate:modelValue": x[1] || (x[1] = (m) => t.value = m),
|
|
597
650
|
placeholder: "Tell us more (optional)...",
|
|
598
651
|
rows: "3",
|
|
599
652
|
style: { width: "100%", padding: "8px", border: "1px solid #d1d5db", "border-radius": "8px", resize: "none", "font-size": "14px" }
|
|
600
653
|
}, null, 512), [
|
|
601
|
-
[
|
|
654
|
+
[H, t.value]
|
|
602
655
|
]),
|
|
603
|
-
|
|
656
|
+
e("button", {
|
|
604
657
|
style: { "margin-top": "10px", width: "100%", background: "#6366f1", color: "#fff", border: "none", "border-radius": "8px", padding: "10px", "font-weight": "600", cursor: "pointer" },
|
|
605
658
|
onClick: y
|
|
606
659
|
}, " Submit Feedback ")
|
|
607
660
|
], 64))
|
|
608
|
-
])) :
|
|
661
|
+
])) : h("", !0)
|
|
609
662
|
], 4));
|
|
610
663
|
}
|
|
611
664
|
});
|
|
612
665
|
export {
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
666
|
+
Pe as ConsentBanner,
|
|
667
|
+
Be as FeedPulseBot,
|
|
668
|
+
Me as FeedPulseProvider,
|
|
669
|
+
Fe as FeedPulseWidget,
|
|
670
|
+
oe as useFeedPulse
|
|
618
671
|
};
|