@gengage/assistant-fe 0.1.0 → 0.1.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/LICENSE +2 -2
- package/README.md +2 -2
- package/dist/assistant-fe.css +1 -1
- package/dist/chat/api.d.ts +12 -2
- package/dist/chat/api.d.ts.map +1 -1
- package/dist/chat/catalog.d.ts +246 -896
- package/dist/chat/catalog.d.ts.map +1 -1
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -1
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -1
- package/dist/chat/components/AITopPicks.d.ts.map +1 -1
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -1
- package/dist/chat/components/ChatDrawer.d.ts +11 -2
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
- package/dist/chat/components/ComparisonTable.d.ts +9 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -1
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -1
- package/dist/chat/components/HandoffNotice.d.ts +5 -0
- package/dist/chat/components/HandoffNotice.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +1 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -1
- package/dist/chat/components/ProactivePopup.d.ts +2 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -1
- package/dist/chat/components/ProductSummaryCard.d.ts +4 -0
- package/dist/chat/components/ProductSummaryCard.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -1
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -1
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -1
- package/dist/chat/components/renderUISpec.d.ts +4 -3
- package/dist/chat/components/renderUISpec.d.ts.map +1 -1
- package/dist/chat/heartbeat.d.ts +71 -0
- package/dist/chat/heartbeat.d.ts.map +1 -0
- package/dist/chat/index.d.ts +33 -78
- package/dist/chat/index.d.ts.map +1 -1
- package/dist/chat/kvkk.d.ts +21 -0
- package/dist/chat/kvkk.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts.map +1 -1
- package/dist/chat/locales/tr.d.ts.map +1 -1
- package/dist/chat/panel-manager.d.ts +81 -0
- package/dist/chat/panel-manager.d.ts.map +1 -0
- package/dist/chat/session-persistence.d.ts +52 -0
- package/dist/chat/session-persistence.d.ts.map +1 -0
- package/dist/chat/types.d.ts +33 -1
- package/dist/chat/types.d.ts.map +1 -1
- package/dist/chat.cjs +1 -1
- package/dist/chat.iife.js +48 -10
- package/dist/chat.iife.js.map +1 -1
- package/dist/chat.js +9 -8
- package/dist/chat.js.map +1 -1
- package/dist/common/analytics-events.d.ts +2 -0
- package/dist/common/analytics-events.d.ts.map +1 -1
- package/dist/common/analytics.d.ts.map +1 -1
- package/dist/common/api-paths.d.ts +5 -0
- package/dist/common/api-paths.d.ts.map +1 -1
- package/dist/common/client.d.ts +4 -1
- package/dist/common/client.d.ts.map +1 -1
- package/dist/common/communication-bridge.d.ts.map +1 -1
- package/dist/common/config-schema.d.ts +33 -195
- package/dist/common/config-schema.d.ts.map +1 -1
- package/dist/common/ga-datalayer.d.ts +62 -0
- package/dist/common/ga-datalayer.d.ts.map +1 -0
- package/dist/common/index.d.ts +7 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/indexed-db.d.ts +1 -1
- package/dist/common/indexed-db.d.ts.map +1 -1
- package/dist/common/merchant-configs.d.ts +22 -0
- package/dist/common/merchant-configs.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +5 -0
- package/dist/common/overlay.d.ts.map +1 -1
- package/dist/common/page-detect.d.ts +31 -0
- package/dist/common/page-detect.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +3 -1
- package/dist/common/preflight.d.ts.map +1 -1
- package/dist/common/price-formatter.d.ts +33 -0
- package/dist/common/price-formatter.d.ts.map +1 -0
- package/dist/common/product-utils.d.ts +26 -0
- package/dist/common/product-utils.d.ts.map +1 -0
- package/dist/common/quantity-stepper.d.ts +22 -0
- package/dist/common/quantity-stepper.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +10 -6
- package/dist/common/safe-html.d.ts.map +1 -1
- package/dist/common/streaming.d.ts.map +1 -1
- package/dist/common/tts-player.d.ts +12 -0
- package/dist/common/tts-player.d.ts.map +1 -0
- package/dist/common/types.d.ts +51 -0
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/v1-protocol-adapter.d.ts +9 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -1
- package/dist/common/voice-input.d.ts +74 -0
- package/dist/common/voice-input.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +17 -1
- package/dist/common/widget-base.d.ts.map +1 -1
- package/dist/common.cjs +1 -1
- package/dist/common.cjs.map +1 -1
- package/dist/common.js +564 -244
- package/dist/common.js.map +1 -1
- package/dist/index-CmlYMq-h.js +4218 -0
- package/dist/index-CmlYMq-h.js.map +1 -0
- package/dist/index-DK4lqi85.cjs +13 -0
- package/dist/index-DK4lqi85.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -53
- package/dist/qna/catalog.d.ts +30 -96
- package/dist/qna/catalog.d.ts.map +1 -1
- package/dist/qna/components/TextInput.d.ts.map +1 -1
- package/dist/qna/index.d.ts +2 -0
- package/dist/qna/index.d.ts.map +1 -1
- package/dist/qna.cjs +1 -1
- package/dist/qna.cjs.map +1 -1
- package/dist/qna.iife.js +46 -8
- package/dist/qna.iife.js.map +1 -1
- package/dist/qna.js +90 -83
- package/dist/qna.js.map +1 -1
- package/dist/quantity-stepper-B8kX8GbN.js +209 -0
- package/dist/quantity-stepper-B8kX8GbN.js.map +1 -0
- package/dist/quantity-stepper-UbAp53Ow.cjs +2 -0
- package/dist/quantity-stepper-UbAp53Ow.cjs.map +1 -0
- package/dist/schemas-DbbfBnZe.cjs +86 -0
- package/dist/schemas-DbbfBnZe.cjs.map +1 -0
- package/dist/schemas-SGuXpngy.js +4558 -0
- package/dist/schemas-SGuXpngy.js.map +1 -0
- package/dist/simrel/api.d.ts.map +1 -1
- package/dist/simrel/catalog.d.ts +32 -240
- package/dist/simrel/catalog.d.ts.map +1 -1
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -1
- package/dist/simrel/components/ProductCard.d.ts +2 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -1
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -1
- package/dist/simrel/index.d.ts.map +1 -1
- package/dist/simrel/types.d.ts +5 -0
- package/dist/simrel/types.d.ts.map +1 -1
- package/dist/simrel.cjs +1 -1
- package/dist/simrel.cjs.map +1 -1
- package/dist/simrel.css +1 -1
- package/dist/simrel.iife.js +46 -8
- package/dist/simrel.iife.js.map +1 -1
- package/dist/simrel.js +319 -279
- package/dist/simrel.js.map +1 -1
- package/package.json +26 -7
- package/dist/index-CFA70IGF.js +0 -3626
- package/dist/index-CFA70IGF.js.map +0 -1
- package/dist/index-Dfl89zpe.cjs +0 -13
- package/dist/index-Dfl89zpe.cjs.map +0 -1
- package/dist/types-CeON7iBO.cjs +0 -48
- package/dist/types-CeON7iBO.cjs.map +0 -1
- package/dist/types-yxW8WA7u.js +0 -4132
- package/dist/types-yxW8WA7u.js.map +0 -1
package/dist/qna.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { b as w, c as q, a as
|
|
2
|
-
async function
|
|
1
|
+
import { b as w, c as q, a as Q, r as x, o as g, s as p, u as L, d as R, _ as E, e as B, f as N, B as O, t as U, g as H, h as P, w as j, i as D, j as _, k as F, l as z, m as M, n as G } from "./schemas-SGuXpngy.js";
|
|
2
|
+
async function W(n, e, t) {
|
|
3
3
|
const i = w("launcher_action", e), o = { uiSpecs: [], actions: [] }, s = {
|
|
4
4
|
method: "POST",
|
|
5
5
|
headers: { "Content-Type": "application/json" },
|
|
@@ -10,10 +10,10 @@ async function z(n, e, t) {
|
|
|
10
10
|
if (!a.ok)
|
|
11
11
|
throw new Error(`HTTP ${a.status}: ${a.statusText}`);
|
|
12
12
|
const r = {
|
|
13
|
-
onEvent: (
|
|
14
|
-
const
|
|
15
|
-
if (
|
|
16
|
-
for (const d of Object.values(
|
|
13
|
+
onEvent: (l) => {
|
|
14
|
+
const c = Q(l);
|
|
15
|
+
if (c && (c.type === "ui_spec" && o.uiSpecs.push(c.spec), c.type === "ui_spec" && c.spec.elements)) {
|
|
16
|
+
for (const d of Object.values(c.spec.elements))
|
|
17
17
|
if (d.type === "ActionButton" && d.props?.action) {
|
|
18
18
|
const h = d.props.action;
|
|
19
19
|
o.actions.push(h);
|
|
@@ -44,7 +44,7 @@ function A(n) {
|
|
|
44
44
|
}
|
|
45
45
|
return e;
|
|
46
46
|
}
|
|
47
|
-
function
|
|
47
|
+
function $(n) {
|
|
48
48
|
const e = document.createElement("div");
|
|
49
49
|
e.className = "gengage-qna-input-wrapper";
|
|
50
50
|
const t = document.createElement("input");
|
|
@@ -52,29 +52,29 @@ function W(n) {
|
|
|
52
52
|
const i = Array.isArray(n.placeholders) ? n.placeholders : n.placeholders ? [n.placeholders] : [n.defaultInputPlaceholder ?? "Bir soru sorun..."];
|
|
53
53
|
let o = 0;
|
|
54
54
|
t.placeholder = i[0] ?? "";
|
|
55
|
-
let s = null;
|
|
55
|
+
let s = null, a = null;
|
|
56
56
|
i.length > 1 && (s = setInterval(() => {
|
|
57
|
-
t.classList.add("gengage-qna-input--fade"), setTimeout(() => {
|
|
57
|
+
t.classList.add("gengage-qna-input--fade"), a = setTimeout(() => {
|
|
58
58
|
o = (o + 1) % i.length, t.placeholder = i[o] ?? "", t.classList.remove("gengage-qna-input--fade");
|
|
59
59
|
}, 180);
|
|
60
60
|
}, 3e3));
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
const
|
|
61
|
+
const r = document.createElement("button");
|
|
62
|
+
r.className = "gengage-qna-send", r.type = "button", r.textContent = n.ctaLabel ?? n.sendButtonText ?? "Sor", r.setAttribute("aria-label", n.sendQuestionAriaLabel ?? "Send question");
|
|
63
|
+
const l = () => {
|
|
64
64
|
const c = t.value.trim();
|
|
65
65
|
c && (n.onSubmit({
|
|
66
66
|
title: c,
|
|
67
67
|
type: "user_message",
|
|
68
|
-
payload: c
|
|
68
|
+
payload: { text: c }
|
|
69
69
|
}), t.value = "");
|
|
70
70
|
};
|
|
71
|
-
return
|
|
72
|
-
c.key === "Enter" && (c.preventDefault(),
|
|
73
|
-
}), e.appendChild(t), e.appendChild(
|
|
74
|
-
s && clearInterval(s);
|
|
71
|
+
return r.addEventListener("click", l), t.addEventListener("keydown", (c) => {
|
|
72
|
+
c.key === "Enter" && (c.preventDefault(), l());
|
|
73
|
+
}), e.appendChild(t), e.appendChild(r), e._cleanup = () => {
|
|
74
|
+
s && clearInterval(s), a && clearTimeout(a);
|
|
75
75
|
}, e;
|
|
76
76
|
}
|
|
77
|
-
function
|
|
77
|
+
function b(n, e) {
|
|
78
78
|
if (!n || typeof n != "object") return null;
|
|
79
79
|
const t = n, i = t.type;
|
|
80
80
|
if (typeof i != "string" || i.length === 0) return null;
|
|
@@ -94,22 +94,22 @@ function C(n, e) {
|
|
|
94
94
|
const t = [], i = n.props?.actions;
|
|
95
95
|
if (Array.isArray(i))
|
|
96
96
|
for (const a of i) {
|
|
97
|
-
const r =
|
|
97
|
+
const r = b(a);
|
|
98
98
|
r && t.push(r);
|
|
99
99
|
}
|
|
100
100
|
const o = n.props?.buttons;
|
|
101
101
|
if (Array.isArray(o))
|
|
102
102
|
for (const a of o) {
|
|
103
103
|
if (!a || typeof a != "object") continue;
|
|
104
|
-
const r = a,
|
|
105
|
-
|
|
104
|
+
const r = a, l = typeof r.label == "string" ? r.label : void 0, c = b(r.action, l);
|
|
105
|
+
c && t.push(c);
|
|
106
106
|
}
|
|
107
107
|
if (n.children)
|
|
108
108
|
for (const a of n.children) {
|
|
109
109
|
const r = e.elements[a];
|
|
110
110
|
if (!r || r.type !== "ActionButton") continue;
|
|
111
|
-
const
|
|
112
|
-
|
|
111
|
+
const l = typeof r.props?.label == "string" ? r.props.label : void 0, c = b(r.props?.action, l);
|
|
112
|
+
c && t.push(c);
|
|
113
113
|
}
|
|
114
114
|
const s = /* @__PURE__ */ new Set();
|
|
115
115
|
return t.filter((a) => s.has(a.title) ? !1 : (s.add(a.title), !0));
|
|
@@ -138,7 +138,7 @@ const v = {
|
|
|
138
138
|
t.className = "gengage-qna-button", t.type = "button";
|
|
139
139
|
const i = n.props?.label;
|
|
140
140
|
typeof i == "string" ? t.textContent = i : t.textContent = e.i18n.defaultCtaText;
|
|
141
|
-
const o =
|
|
141
|
+
const o = b(n.props?.action, typeof i == "string" ? i : void 0);
|
|
142
142
|
return o && t.addEventListener("click", () => e.onAction(o)), t;
|
|
143
143
|
},
|
|
144
144
|
TextInput: ({ element: n, context: e }) => {
|
|
@@ -149,7 +149,7 @@ const v = {
|
|
|
149
149
|
sendButtonText: e.i18n.sendButton,
|
|
150
150
|
sendQuestionAriaLabel: e.i18n.sendQuestionAriaLabel
|
|
151
151
|
};
|
|
152
|
-
return i !== void 0 && (s.placeholders = i), o !== void 0 && (s.ctaLabel = o),
|
|
152
|
+
return i !== void 0 && (s.placeholders = i), o !== void 0 && (s.ctaLabel = o), $(s);
|
|
153
153
|
},
|
|
154
154
|
QuestionHeading: ({ element: n }) => {
|
|
155
155
|
const e = document.createElement("h3");
|
|
@@ -173,11 +173,11 @@ const v = {
|
|
|
173
173
|
}
|
|
174
174
|
return t;
|
|
175
175
|
};
|
|
176
|
-
function
|
|
176
|
+
function V() {
|
|
177
177
|
return { ...v };
|
|
178
178
|
}
|
|
179
|
-
function
|
|
180
|
-
return
|
|
179
|
+
function J(n, e, t = v, i = S) {
|
|
180
|
+
return x({
|
|
181
181
|
spec: n,
|
|
182
182
|
context: e,
|
|
183
183
|
registry: t,
|
|
@@ -185,14 +185,14 @@ function G(n, e, t = v, i = S) {
|
|
|
185
185
|
unknownRenderer: i
|
|
186
186
|
});
|
|
187
187
|
}
|
|
188
|
-
const
|
|
188
|
+
const I = {
|
|
189
189
|
quickQuestionsAriaLabel: "Hızlı sorular",
|
|
190
190
|
askQuestionAriaLabel: "Soru sorun",
|
|
191
191
|
defaultInputPlaceholder: "Bir soru sorun...",
|
|
192
192
|
sendButton: "Sor",
|
|
193
193
|
sendQuestionAriaLabel: "Soruyu gönder",
|
|
194
194
|
defaultCtaText: "Başka bir şey sor"
|
|
195
|
-
},
|
|
195
|
+
}, Y = {
|
|
196
196
|
quickQuestionsAriaLabel: "Quick questions",
|
|
197
197
|
askQuestionAriaLabel: "Ask a question",
|
|
198
198
|
defaultInputPlaceholder: "Ask a question...",
|
|
@@ -200,56 +200,56 @@ const k = {
|
|
|
200
200
|
sendQuestionAriaLabel: "Send question",
|
|
201
201
|
defaultCtaText: "Ask something else"
|
|
202
202
|
};
|
|
203
|
-
function
|
|
203
|
+
function K(n) {
|
|
204
204
|
return n ? n.toLowerCase().split("-")[0] ?? "tr" : "tr";
|
|
205
205
|
}
|
|
206
|
-
function
|
|
207
|
-
return
|
|
206
|
+
function X(n) {
|
|
207
|
+
return K(n) === "en" ? Y : I;
|
|
208
208
|
}
|
|
209
|
-
const
|
|
209
|
+
const Z = g({
|
|
210
210
|
title: p(),
|
|
211
211
|
type: p(),
|
|
212
|
-
payload:
|
|
213
|
-
}),
|
|
212
|
+
payload: B().optional()
|
|
213
|
+
}), tt = g({
|
|
214
214
|
label: p(),
|
|
215
|
-
action:
|
|
215
|
+
action: Z,
|
|
216
216
|
variant: E(["primary", "outline", "ghost"]).optional()
|
|
217
|
-
}),
|
|
217
|
+
}), et = g({
|
|
218
218
|
orientation: E(["horizontal", "vertical"]).optional(),
|
|
219
|
-
wrap:
|
|
220
|
-
}),
|
|
221
|
-
placeholder:
|
|
219
|
+
wrap: R().optional()
|
|
220
|
+
}), nt = g({
|
|
221
|
+
placeholder: L([p(), N(p())]).optional(),
|
|
222
222
|
ctaLabel: p().optional()
|
|
223
|
-
}),
|
|
223
|
+
}), ot = g({
|
|
224
224
|
text: p()
|
|
225
|
-
}),
|
|
225
|
+
}), ct = {
|
|
226
226
|
components: {
|
|
227
227
|
ActionButton: {
|
|
228
|
-
schema:
|
|
228
|
+
schema: tt,
|
|
229
229
|
description: "A single clickable QNA action button."
|
|
230
230
|
},
|
|
231
231
|
ButtonRow: {
|
|
232
|
-
schema:
|
|
232
|
+
schema: et,
|
|
233
233
|
description: "Container for a group of QNA action buttons."
|
|
234
234
|
},
|
|
235
235
|
TextInput: {
|
|
236
|
-
schema:
|
|
236
|
+
schema: nt,
|
|
237
237
|
description: "Free-text input with rotating placeholder and CTA button."
|
|
238
238
|
},
|
|
239
239
|
QuestionHeading: {
|
|
240
|
-
schema:
|
|
240
|
+
schema: ot,
|
|
241
241
|
description: "A heading displayed above the QNA button group."
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
};
|
|
245
|
-
class
|
|
245
|
+
class it extends O {
|
|
246
246
|
constructor() {
|
|
247
|
-
super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n =
|
|
247
|
+
super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n = I, this._actionHandler = this._handleAction.bind(this), this._openChatHandler = this._handleOpenChat.bind(this);
|
|
248
248
|
}
|
|
249
249
|
async onInit(e) {
|
|
250
250
|
this._i18n = this._resolveI18n(e), this._contentEl = document.createElement("div"), this._contentEl.className = "gengage-qna-container", this.root.appendChild(this._contentEl);
|
|
251
251
|
const t = e.pageContext?.sku;
|
|
252
|
-
t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0;
|
|
252
|
+
t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0, U("qna");
|
|
253
253
|
}
|
|
254
254
|
onUpdate(e) {
|
|
255
255
|
const t = e.sku;
|
|
@@ -265,7 +265,7 @@ class et extends O {
|
|
|
265
265
|
onHide() {
|
|
266
266
|
}
|
|
267
267
|
onDestroy() {
|
|
268
|
-
this._abort(), this._debounceTimer && (clearTimeout(this._debounceTimer), this._debounceTimer = null), this._contentEl && (this.
|
|
268
|
+
this._abort(), this._debounceTimer && (clearTimeout(this._debounceTimer), this._debounceTimer = null), this._contentEl && (this._cleanupTextInputTimers(), this._contentEl.remove(), this._contentEl = null);
|
|
269
269
|
}
|
|
270
270
|
// ---------------------------------------------------------------------------
|
|
271
271
|
// Internal
|
|
@@ -273,16 +273,23 @@ class et extends O {
|
|
|
273
273
|
_abort() {
|
|
274
274
|
this._abortController?.abort(), this._abortController = null;
|
|
275
275
|
}
|
|
276
|
+
/** Clean up TextInput placeholder rotation timers to prevent interval leaks. */
|
|
277
|
+
_cleanupTextInputTimers() {
|
|
278
|
+
if (!this._contentEl) return;
|
|
279
|
+
const e = this._contentEl.querySelectorAll(".gengage-qna-input-wrapper");
|
|
280
|
+
for (const t of e)
|
|
281
|
+
t._cleanup?.();
|
|
282
|
+
}
|
|
276
283
|
async _fetchAndRender(e) {
|
|
277
284
|
if (this._abort(), this._abortController = new AbortController(), !this._contentEl) return;
|
|
278
|
-
this._contentEl.innerHTML = "";
|
|
285
|
+
this._cleanupTextInputTimers(), this._contentEl.innerHTML = "";
|
|
279
286
|
const t = this._createLoadingIndicator();
|
|
280
287
|
this._contentEl.appendChild(t);
|
|
281
288
|
const i = {
|
|
282
289
|
middlewareUrl: this.config.middlewareUrl
|
|
283
290
|
}, o = crypto.randomUUID(), s = Date.now();
|
|
284
291
|
this.track(
|
|
285
|
-
|
|
292
|
+
H(this.analyticsContext(), {
|
|
286
293
|
endpoint: "launcher_action",
|
|
287
294
|
request_id: o,
|
|
288
295
|
widget: "qna"
|
|
@@ -297,37 +304,37 @@ class et extends O {
|
|
|
297
304
|
locale: this.config.locale ?? "tr"
|
|
298
305
|
}, r = this.config.pageContext?.pageType;
|
|
299
306
|
r !== void 0 && (a.page_type = r);
|
|
300
|
-
const
|
|
307
|
+
const l = await W(a, i, this._abortController.signal);
|
|
301
308
|
if (this.track(
|
|
302
|
-
|
|
309
|
+
P(this.analyticsContext(), {
|
|
303
310
|
request_id: o,
|
|
304
311
|
latency_ms: Date.now() - s,
|
|
305
|
-
chunk_count:
|
|
312
|
+
chunk_count: l.actions.length,
|
|
306
313
|
widget: "qna"
|
|
307
314
|
})
|
|
308
315
|
), this.track(
|
|
309
|
-
|
|
310
|
-
message_count:
|
|
316
|
+
j(this.analyticsContext(), {
|
|
317
|
+
message_count: l.actions.length,
|
|
311
318
|
history_ref: o,
|
|
312
319
|
redaction_level: "none",
|
|
313
320
|
widget: "qna"
|
|
314
321
|
})
|
|
315
322
|
), !this._contentEl) return;
|
|
316
|
-
if (this._contentEl.innerHTML = "", !this._specIncludesType(
|
|
323
|
+
if (this._contentEl.innerHTML = "", !this._specIncludesType(l.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
|
|
317
324
|
const u = document.createElement("h3");
|
|
318
325
|
u.className = "gengage-qna-heading", u.textContent = this.config.staticQuestionText, this._contentEl.appendChild(u);
|
|
319
326
|
}
|
|
320
|
-
const d = this.config.inputPlaceholder, h =
|
|
327
|
+
const d = this.config.inputPlaceholder, h = l.actions.length > 0 && d === !0 ? l.actions.map((u) => u.title) : d === !0 ? this._i18n.defaultInputPlaceholder : d, f = {
|
|
321
328
|
onAction: this._actionHandler,
|
|
322
329
|
i18n: this._i18n
|
|
323
330
|
};
|
|
324
331
|
d === void 0 && (f.onOpenChat = this._openChatHandler, this.config.ctaText !== void 0 && (f.ctaText = this.config.ctaText)), h !== void 0 && (f.inputPlaceholder = h);
|
|
325
|
-
const
|
|
326
|
-
for (const u of
|
|
327
|
-
const
|
|
328
|
-
this._contentEl.appendChild(
|
|
332
|
+
const k = this._buildFallbackActionsSpec(l.actions), m = (l.uiSpecs.length > 0 ? l.uiSpecs : [k]).filter((u) => Object.keys(u.elements).length > 0);
|
|
333
|
+
for (const u of m) {
|
|
334
|
+
const y = this._renderUISpec(u, f);
|
|
335
|
+
this._contentEl.appendChild(y);
|
|
329
336
|
}
|
|
330
|
-
if (d !== void 0 && !this._specIncludesType(
|
|
337
|
+
if (m.length > 0 && D("qna"), d !== void 0 && !this._specIncludesType(m, "TextInput")) {
|
|
331
338
|
const u = {
|
|
332
339
|
root: "root",
|
|
333
340
|
elements: {
|
|
@@ -339,17 +346,17 @@ class et extends O {
|
|
|
339
346
|
}
|
|
340
347
|
}
|
|
341
348
|
}
|
|
342
|
-
},
|
|
343
|
-
this._contentEl.appendChild(
|
|
349
|
+
}, y = this._renderUISpec(u, f);
|
|
350
|
+
this._contentEl.appendChild(y);
|
|
344
351
|
}
|
|
345
352
|
} catch (a) {
|
|
346
353
|
if (a instanceof DOMException && a.name === "AbortError") return;
|
|
347
|
-
|
|
354
|
+
_("gengage:global:error", {
|
|
348
355
|
source: "qna",
|
|
349
356
|
code: "FETCH_ERROR",
|
|
350
|
-
message:
|
|
357
|
+
message: F(this.config.locale)
|
|
351
358
|
}), this.track(
|
|
352
|
-
|
|
359
|
+
z(this.analyticsContext(), {
|
|
353
360
|
request_id: o,
|
|
354
361
|
error_code: "FETCH_ERROR",
|
|
355
362
|
error_message: a instanceof Error ? a.message : String(a),
|
|
@@ -368,14 +375,14 @@ class et extends O {
|
|
|
368
375
|
return e;
|
|
369
376
|
}
|
|
370
377
|
_resolveI18n(e) {
|
|
371
|
-
return { ...
|
|
378
|
+
return { ...X(e.locale), ...e.i18n };
|
|
372
379
|
}
|
|
373
380
|
_resolveUISpecRegistry() {
|
|
374
|
-
const e =
|
|
375
|
-
return
|
|
381
|
+
const e = V();
|
|
382
|
+
return M(e, this.config.renderer?.registry);
|
|
376
383
|
}
|
|
377
384
|
_renderUISpec(e, t) {
|
|
378
|
-
const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (
|
|
385
|
+
const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (l, c) => J(l, c, i, o), a = this.config.renderer?.renderUISpec;
|
|
379
386
|
return a ? a(e, t, {
|
|
380
387
|
registry: i,
|
|
381
388
|
unknownRenderer: o,
|
|
@@ -415,21 +422,21 @@ class et extends O {
|
|
|
415
422
|
};
|
|
416
423
|
}
|
|
417
424
|
_handleAction(e) {
|
|
418
|
-
this.config.onActionSelected?.(e),
|
|
425
|
+
G(e.title, e.type), this.config.onActionSelected?.(e), _("gengage:qna:action", e);
|
|
419
426
|
}
|
|
420
427
|
_handleOpenChat() {
|
|
421
|
-
this.config.onOpenChat?.(),
|
|
428
|
+
this.config.onOpenChat?.(), _("gengage:qna:open-chat", {});
|
|
422
429
|
}
|
|
423
430
|
}
|
|
424
|
-
function
|
|
425
|
-
return new
|
|
431
|
+
function lt() {
|
|
432
|
+
return new it();
|
|
426
433
|
}
|
|
427
434
|
export {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
435
|
+
it as GengageQNA,
|
|
436
|
+
V as createDefaultQnaUISpecRegistry,
|
|
437
|
+
lt as createQNAWidget,
|
|
431
438
|
S as defaultQnaUnknownUISpecRenderer,
|
|
432
|
-
|
|
433
|
-
|
|
439
|
+
ct as qnaCatalog,
|
|
440
|
+
J as renderQnaUISpec
|
|
434
441
|
};
|
|
435
442
|
//# sourceMappingURL=qna.js.map
|
package/dist/qna.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qna.js","sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n payload: text,\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : context.ctaText;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n /* ProductCard intentionally omitted — QNA renders only question pills + text input.\n If the backend sends a ProductCard element, the unknownRenderer will render its\n children (if any) or return null. */\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n // Cleanup text input timers\n const inputWrapper = this._contentEl.querySelector('.gengage-qna-input-wrapper') as\n | (HTMLElement & { _cleanup?: () => void })\n | null;\n inputWrapper?._cleanup?.();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : cfgPlaceholders;\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n };\n // When a standalone TextInput will be rendered (inputPlaceholder is set),\n // its submit button takes over the CTA role — don't duplicate in ButtonRow.\n if (cfgPlaceholders === undefined) {\n renderContext.onOpenChat = this._openChatHandler;\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n }\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n const shouldRenderStandaloneInput =\n cfgPlaceholders !== undefined && !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder: effectivePlaceholders,\n ctaLabel: this.config.ctaText,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, renderContext);\n this._contentEl.appendChild(renderedInput);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _handleAction(action: ActionPayload): void {\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"names":["fetchLauncherActions","request","transport","signal","url","buildChatEndpointUrl","result","fetchInit","response","streamOpts","event","normalized","adaptV1Event","el","action","consumeStream","renderButtonRow","options","container","button","actionPayload","cta","renderTextInput","input","placeholders","placeholderIndex","rotateTimer","sendBtn","submit","text","e","toActionPayload","raw","labelFallback","obj","type","titleRaw","payload","title","actionPayloadToRowAction","rowAction","collectButtonRowActions","element","spec","actions","directActions","rawAction","directButtons","rawButton","label","childId","child","seen","DEFAULT_QNA_UI_SPEC_REGISTRY","context","rowActions","orientation","placeholder","ctaLabel","heading","defaultQnaUnknownUISpecRenderer","renderElement","wrapper","rendered","createDefaultQnaUISpecRegistry","renderQnaUISpec","registry","unknownRenderer","renderUISpecWithRegistry","QNA_I18N_TR","QNA_I18N_EN","normalizeLocale","locale","resolveQnaLocale","ActionPayloadSchema","z.object","z.string","z.unknown","ActionButtonSchema","z.enum","ButtonRowSchema","z.boolean","TextInputSchema","z.union","z.array","QuestionHeadingSchema","qnaCatalog","GengageQNA","BaseWidget","config","sku","newSku","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","inputSpec","renderedInput","err","dispatch","getGlobalErrorMessage","streamErrorEvent","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputContext","override","specs","elements","childIds","id","createQNAWidget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qna.js","sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n let fadeTimer: ReturnType<typeof setTimeout> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n fadeTimer = setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n payload: { text },\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n if (fadeTimer) clearTimeout(fadeTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : context.ctaText;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n /* ProductCard intentionally omitted — QNA renders only question pills + text input.\n If the backend sends a ProductCard element, the unknownRenderer will render its\n children (if any) or return null. */\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport * as ga from '../common/ga-datalayer.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n ga.trackInit('qna');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */\n private _cleanupTextInputTimers(): void {\n if (!this._contentEl) return;\n const wrappers = this._contentEl.querySelectorAll('.gengage-qna-input-wrapper');\n for (const wrapper of wrappers) {\n (wrapper as HTMLElement & { _cleanup?: () => void })._cleanup?.();\n }\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n // Clean up TextInput timers before clearing DOM to prevent interval leaks\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : cfgPlaceholders;\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n };\n // When a standalone TextInput will be rendered (inputPlaceholder is set),\n // its submit button takes over the CTA role — don't duplicate in ButtonRow.\n if (cfgPlaceholders === undefined) {\n renderContext.onOpenChat = this._openChatHandler;\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n }\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n if (nonEmptySpecs.length > 0) {\n ga.trackShow('qna');\n }\n\n const shouldRenderStandaloneInput =\n cfgPlaceholders !== undefined && !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder: effectivePlaceholders,\n ctaLabel: this.config.ctaText,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, renderContext);\n this._contentEl.appendChild(renderedInput);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _handleAction(action: ActionPayload): void {\n ga.trackSuggestedQuestion(action.title, action.type);\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"names":["fetchLauncherActions","request","transport","signal","url","buildChatEndpointUrl","result","fetchInit","response","streamOpts","event","normalized","adaptV1Event","el","action","consumeStream","renderButtonRow","options","container","button","actionPayload","cta","renderTextInput","input","placeholders","placeholderIndex","rotateTimer","fadeTimer","sendBtn","submit","text","e","toActionPayload","raw","labelFallback","obj","type","titleRaw","payload","title","actionPayloadToRowAction","rowAction","collectButtonRowActions","element","spec","actions","directActions","rawAction","directButtons","rawButton","label","childId","child","seen","DEFAULT_QNA_UI_SPEC_REGISTRY","context","rowActions","orientation","placeholder","ctaLabel","heading","defaultQnaUnknownUISpecRenderer","renderElement","wrapper","rendered","createDefaultQnaUISpecRegistry","renderQnaUISpec","registry","unknownRenderer","renderUISpecWithRegistry","QNA_I18N_TR","QNA_I18N_EN","normalizeLocale","locale","resolveQnaLocale","ActionPayloadSchema","z.object","z.string","z.unknown","ActionButtonSchema","z.enum","ButtonRowSchema","z.boolean","TextInputSchema","z.union","z.array","QuestionHeadingSchema","qnaCatalog","GengageQNA","BaseWidget","config","sku","ga.trackInit","newSku","wrappers","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","ga.trackShow","inputSpec","renderedInput","err","dispatch","getGlobalErrorMessage","streamErrorEvent","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputContext","override","specs","elements","childIds","id","ga.trackSuggestedQuestion","createQNAWidget"],"mappings":"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"}
|