@gengage/assistant-fe 0.1.0
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 +61 -0
- package/README.md +232 -0
- package/dist/assistant-fe.css +1 -0
- package/dist/chat/api.d.ts +87 -0
- package/dist/chat/api.d.ts.map +1 -0
- package/dist/chat/attachment-utils.d.ts +10 -0
- package/dist/chat/attachment-utils.d.ts.map +1 -0
- package/dist/chat/catalog.d.ts +1114 -0
- package/dist/chat/catalog.d.ts.map +1 -0
- package/dist/chat/components/AIGroupingCards.d.ts +4 -0
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
- package/dist/chat/components/AITopPicks.d.ts +4 -0
- package/dist/chat/components/AITopPicks.d.ts.map +1 -0
- package/dist/chat/components/CategoriesContainer.d.ts +4 -0
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
- package/dist/chat/components/ChatDrawer.d.ts +140 -0
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
- package/dist/chat/components/ChoicePrompter.d.ts +16 -0
- package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
- package/dist/chat/components/ComparisonTable.d.ts +47 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
- package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +6 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
- package/dist/chat/components/Launcher.d.ts +25 -0
- package/dist/chat/components/Launcher.d.ts.map +1 -0
- package/dist/chat/components/PanelTopBar.d.ts +20 -0
- package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
- package/dist/chat/components/ProactivePopup.d.ts +11 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
- package/dist/chat/components/ProsAndCons.d.ts +9 -0
- package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -0
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
- package/dist/chat/components/actionClassifier.d.ts +13 -0
- package/dist/chat/components/actionClassifier.d.ts.map +1 -0
- package/dist/chat/components/productMentionLinker.d.ts +26 -0
- package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
- package/dist/chat/components/renderUISpec.d.ts +15 -0
- package/dist/chat/components/renderUISpec.d.ts.map +1 -0
- package/dist/chat/components/typewriter.d.ts +25 -0
- package/dist/chat/components/typewriter.d.ts.map +1 -0
- package/dist/chat/extendedModeManager.d.ts +33 -0
- package/dist/chat/extendedModeManager.d.ts.map +1 -0
- package/dist/chat/index.d.ts +192 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts +3 -0
- package/dist/chat/locales/en.d.ts.map +1 -0
- package/dist/chat/locales/index.d.ts +6 -0
- package/dist/chat/locales/index.d.ts.map +1 -0
- package/dist/chat/locales/tr.d.ts +3 -0
- package/dist/chat/locales/tr.d.ts.map +1 -0
- package/dist/chat/types.d.ts +212 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.iife.js +59 -0
- package/dist/chat.iife.js.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/common/action-router.d.ts +30 -0
- package/dist/common/action-router.d.ts.map +1 -0
- package/dist/common/activity-tracker.d.ts +38 -0
- package/dist/common/activity-tracker.d.ts.map +1 -0
- package/dist/common/analytics-events.d.ts +90 -0
- package/dist/common/analytics-events.d.ts.map +1 -0
- package/dist/common/analytics.d.ts +58 -0
- package/dist/common/analytics.d.ts.map +1 -0
- package/dist/common/api-paths.d.ts +14 -0
- package/dist/common/api-paths.d.ts.map +1 -0
- package/dist/common/client.d.ts +20 -0
- package/dist/common/client.d.ts.map +1 -0
- package/dist/common/communication-bridge.d.ts +51 -0
- package/dist/common/communication-bridge.d.ts.map +1 -0
- package/dist/common/config-schema.d.ts +241 -0
- package/dist/common/config-schema.d.ts.map +1 -0
- package/dist/common/context.d.ts +28 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/customization-factories.d.ts +63 -0
- package/dist/common/customization-factories.d.ts.map +1 -0
- package/dist/common/events.d.ts +47 -0
- package/dist/common/events.d.ts.map +1 -0
- package/dist/common/global-error-toast.d.ts +6 -0
- package/dist/common/global-error-toast.d.ts.map +1 -0
- package/dist/common/index.d.ts +36 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/indexed-db.d.ts +74 -0
- package/dist/common/indexed-db.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +64 -0
- package/dist/common/overlay.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +12 -0
- package/dist/common/preflight.d.ts.map +1 -0
- package/dist/common/renderer/dom.d.ts +4 -0
- package/dist/common/renderer/dom.d.ts.map +1 -0
- package/dist/common/renderer/index.d.ts +5 -0
- package/dist/common/renderer/index.d.ts.map +1 -0
- package/dist/common/renderer/overrides.d.ts +24 -0
- package/dist/common/renderer/overrides.d.ts.map +1 -0
- package/dist/common/renderer/registry.d.ts +3 -0
- package/dist/common/renderer/registry.d.ts.map +1 -0
- package/dist/common/renderer/types.d.ts +20 -0
- package/dist/common/renderer/types.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +19 -0
- package/dist/common/safe-html.d.ts.map +1 -0
- package/dist/common/streaming.d.ts +32 -0
- package/dist/common/streaming.d.ts.map +1 -0
- package/dist/common/theme-utils.d.ts +16 -0
- package/dist/common/theme-utils.d.ts.map +1 -0
- package/dist/common/types.d.ts +298 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/ui-theme.d.ts +10 -0
- package/dist/common/ui-theme.d.ts.map +1 -0
- package/dist/common/uuidv7.d.ts +8 -0
- package/dist/common/uuidv7.d.ts.map +1 -0
- package/dist/common/v1-protocol-adapter.d.ts +66 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +75 -0
- package/dist/common/widget-base.d.ts.map +1 -0
- package/dist/common.cjs +2 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.js +584 -0
- package/dist/common.js.map +1 -0
- package/dist/index-CFA70IGF.js +3626 -0
- package/dist/index-CFA70IGF.js.map +1 -0
- package/dist/index-Dfl89zpe.cjs +13 -0
- package/dist/index-Dfl89zpe.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/qna/api.d.ts +22 -0
- package/dist/qna/api.d.ts.map +1 -0
- package/dist/qna/catalog.d.ts +140 -0
- package/dist/qna/catalog.d.ts.map +1 -0
- package/dist/qna/components/ButtonRow.d.ts +16 -0
- package/dist/qna/components/ButtonRow.d.ts.map +1 -0
- package/dist/qna/components/TextInput.d.ts +12 -0
- package/dist/qna/components/TextInput.d.ts.map +1 -0
- package/dist/qna/components/renderUISpec.d.ts +8 -0
- package/dist/qna/components/renderUISpec.d.ts.map +1 -0
- package/dist/qna/index.d.ts +34 -0
- package/dist/qna/index.d.ts.map +1 -0
- package/dist/qna/locales/en.d.ts +3 -0
- package/dist/qna/locales/en.d.ts.map +1 -0
- package/dist/qna/locales/index.d.ts +6 -0
- package/dist/qna/locales/index.d.ts.map +1 -0
- package/dist/qna/locales/tr.d.ts +3 -0
- package/dist/qna/locales/tr.d.ts.map +1 -0
- package/dist/qna/types.d.ts +62 -0
- package/dist/qna/types.d.ts.map +1 -0
- package/dist/qna.cjs +2 -0
- package/dist/qna.cjs.map +1 -0
- package/dist/qna.css +1 -0
- package/dist/qna.iife.js +48 -0
- package/dist/qna.iife.js.map +1 -0
- package/dist/qna.js +435 -0
- package/dist/qna.js.map +1 -0
- package/dist/simrel/api.d.ts +26 -0
- package/dist/simrel/api.d.ts.map +1 -0
- package/dist/simrel/catalog.d.ts +319 -0
- package/dist/simrel/catalog.d.ts.map +1 -0
- package/dist/simrel/components/GroupTabs.d.ts +17 -0
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
- package/dist/simrel/components/ProductCard.d.ts +17 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -0
- package/dist/simrel/components/ProductGrid.d.ts +17 -0
- package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
- package/dist/simrel/components/renderUISpec.d.ts +8 -0
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
- package/dist/simrel/index.d.ts +36 -0
- package/dist/simrel/index.d.ts.map +1 -0
- package/dist/simrel/locales/en.d.ts +3 -0
- package/dist/simrel/locales/en.d.ts.map +1 -0
- package/dist/simrel/locales/index.d.ts +6 -0
- package/dist/simrel/locales/index.d.ts.map +1 -0
- package/dist/simrel/locales/tr.d.ts +3 -0
- package/dist/simrel/locales/tr.d.ts.map +1 -0
- package/dist/simrel/types.d.ts +111 -0
- package/dist/simrel/types.d.ts.map +1 -0
- package/dist/simrel.cjs +2 -0
- package/dist/simrel.cjs.map +1 -0
- package/dist/simrel.css +1 -0
- package/dist/simrel.iife.js +48 -0
- package/dist/simrel.iife.js.map +1 -0
- package/dist/simrel.js +620 -0
- package/dist/simrel.js.map +1 -0
- package/dist/types-CeON7iBO.cjs +48 -0
- package/dist/types-CeON7iBO.cjs.map +1 -0
- package/dist/types-yxW8WA7u.js +4132 -0
- package/dist/types-yxW8WA7u.js.map +1 -0
- package/package.json +100 -0
package/dist/qna.js
ADDED
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { b as w, c as q, a as L, r as Q, o as g, s as p, u as x, d as R, e as B, f as E, g as N, B as O, h as U, i as H, w as P, j as m, k as j, l as D, m as F } from "./types-yxW8WA7u.js";
|
|
2
|
+
async function z(n, e, t) {
|
|
3
|
+
const i = w("launcher_action", e), o = { uiSpecs: [], actions: [] }, s = {
|
|
4
|
+
method: "POST",
|
|
5
|
+
headers: { "Content-Type": "application/json" },
|
|
6
|
+
body: JSON.stringify(n)
|
|
7
|
+
};
|
|
8
|
+
t !== void 0 && (s.signal = t);
|
|
9
|
+
const a = await fetch(i, s);
|
|
10
|
+
if (!a.ok)
|
|
11
|
+
throw new Error(`HTTP ${a.status}: ${a.statusText}`);
|
|
12
|
+
const r = {
|
|
13
|
+
onEvent: (c) => {
|
|
14
|
+
const l = L(c);
|
|
15
|
+
if (l && (l.type === "ui_spec" && o.uiSpecs.push(l.spec), l.type === "ui_spec" && l.spec.elements)) {
|
|
16
|
+
for (const d of Object.values(l.spec.elements))
|
|
17
|
+
if (d.type === "ActionButton" && d.props?.action) {
|
|
18
|
+
const h = d.props.action;
|
|
19
|
+
o.actions.push(h);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
return t !== void 0 && (r.signal = t), await q(a, r), o;
|
|
25
|
+
}
|
|
26
|
+
function A(n) {
|
|
27
|
+
const e = document.createElement("div");
|
|
28
|
+
e.className = "gengage-qna-buttons", e.setAttribute("role", "group"), e.setAttribute("aria-label", n.quickQuestionsAriaLabel ?? "Quick questions"), n.orientation === "vertical" && (e.style.flexDirection = "column");
|
|
29
|
+
for (const t of n.actions) {
|
|
30
|
+
const i = document.createElement("button");
|
|
31
|
+
i.className = "gengage-qna-button", i.textContent = t.title, i.type = "button", i.addEventListener("click", () => {
|
|
32
|
+
const o = {
|
|
33
|
+
title: t.title,
|
|
34
|
+
type: t.type
|
|
35
|
+
};
|
|
36
|
+
t.payload !== void 0 && (o.payload = t.payload), n.onAction(o);
|
|
37
|
+
}), e.appendChild(i);
|
|
38
|
+
}
|
|
39
|
+
if (n.ctaText || n.onOpenChat) {
|
|
40
|
+
const t = document.createElement("button");
|
|
41
|
+
t.className = "gengage-qna-cta", t.textContent = n.ctaText ?? n.defaultCtaText ?? "Başka bir şey sor", t.type = "button", t.addEventListener("click", () => {
|
|
42
|
+
n.onOpenChat?.();
|
|
43
|
+
}), e.appendChild(t);
|
|
44
|
+
}
|
|
45
|
+
return e;
|
|
46
|
+
}
|
|
47
|
+
function W(n) {
|
|
48
|
+
const e = document.createElement("div");
|
|
49
|
+
e.className = "gengage-qna-input-wrapper";
|
|
50
|
+
const t = document.createElement("input");
|
|
51
|
+
t.type = "text", t.className = "gengage-qna-input", t.setAttribute("aria-label", n.askQuestionAriaLabel ?? "Ask a question");
|
|
52
|
+
const i = Array.isArray(n.placeholders) ? n.placeholders : n.placeholders ? [n.placeholders] : [n.defaultInputPlaceholder ?? "Bir soru sorun..."];
|
|
53
|
+
let o = 0;
|
|
54
|
+
t.placeholder = i[0] ?? "";
|
|
55
|
+
let s = null;
|
|
56
|
+
i.length > 1 && (s = setInterval(() => {
|
|
57
|
+
t.classList.add("gengage-qna-input--fade"), setTimeout(() => {
|
|
58
|
+
o = (o + 1) % i.length, t.placeholder = i[o] ?? "", t.classList.remove("gengage-qna-input--fade");
|
|
59
|
+
}, 180);
|
|
60
|
+
}, 3e3));
|
|
61
|
+
const a = document.createElement("button");
|
|
62
|
+
a.className = "gengage-qna-send", a.type = "button", a.textContent = n.ctaLabel ?? n.sendButtonText ?? "Sor", a.setAttribute("aria-label", n.sendQuestionAriaLabel ?? "Send question");
|
|
63
|
+
const r = () => {
|
|
64
|
+
const c = t.value.trim();
|
|
65
|
+
c && (n.onSubmit({
|
|
66
|
+
title: c,
|
|
67
|
+
type: "user_message",
|
|
68
|
+
payload: c
|
|
69
|
+
}), t.value = "");
|
|
70
|
+
};
|
|
71
|
+
return a.addEventListener("click", r), t.addEventListener("keydown", (c) => {
|
|
72
|
+
c.key === "Enter" && (c.preventDefault(), r());
|
|
73
|
+
}), e.appendChild(t), e.appendChild(a), e._cleanup = () => {
|
|
74
|
+
s && clearInterval(s);
|
|
75
|
+
}, e;
|
|
76
|
+
}
|
|
77
|
+
function y(n, e) {
|
|
78
|
+
if (!n || typeof n != "object") return null;
|
|
79
|
+
const t = n, i = t.type;
|
|
80
|
+
if (typeof i != "string" || i.length === 0) return null;
|
|
81
|
+
const o = t.title, s = t.payload, a = typeof o == "string" && o.length > 0 ? o : e;
|
|
82
|
+
if (!a) return null;
|
|
83
|
+
const r = { title: a, type: i };
|
|
84
|
+
return s !== void 0 && (r.payload = s), r;
|
|
85
|
+
}
|
|
86
|
+
function T(n) {
|
|
87
|
+
const e = {
|
|
88
|
+
title: n.title,
|
|
89
|
+
type: n.type
|
|
90
|
+
};
|
|
91
|
+
return n.payload !== void 0 && (e.payload = n.payload), e;
|
|
92
|
+
}
|
|
93
|
+
function C(n, e) {
|
|
94
|
+
const t = [], i = n.props?.actions;
|
|
95
|
+
if (Array.isArray(i))
|
|
96
|
+
for (const a of i) {
|
|
97
|
+
const r = y(a);
|
|
98
|
+
r && t.push(r);
|
|
99
|
+
}
|
|
100
|
+
const o = n.props?.buttons;
|
|
101
|
+
if (Array.isArray(o))
|
|
102
|
+
for (const a of o) {
|
|
103
|
+
if (!a || typeof a != "object") continue;
|
|
104
|
+
const r = a, c = typeof r.label == "string" ? r.label : void 0, l = y(r.action, c);
|
|
105
|
+
l && t.push(l);
|
|
106
|
+
}
|
|
107
|
+
if (n.children)
|
|
108
|
+
for (const a of n.children) {
|
|
109
|
+
const r = e.elements[a];
|
|
110
|
+
if (!r || r.type !== "ActionButton") continue;
|
|
111
|
+
const c = typeof r.props?.label == "string" ? r.props.label : void 0, l = y(r.props?.action, c);
|
|
112
|
+
l && t.push(l);
|
|
113
|
+
}
|
|
114
|
+
const s = /* @__PURE__ */ new Set();
|
|
115
|
+
return t.filter((a) => s.has(a.title) ? !1 : (s.add(a.title), !0));
|
|
116
|
+
}
|
|
117
|
+
const v = {
|
|
118
|
+
ButtonRow: ({ element: n, spec: e, context: t }) => {
|
|
119
|
+
const i = C(n, e).map(T), o = n.props?.orientation, s = {
|
|
120
|
+
actions: i,
|
|
121
|
+
onAction: t.onAction,
|
|
122
|
+
defaultCtaText: t.i18n.defaultCtaText,
|
|
123
|
+
quickQuestionsAriaLabel: t.i18n.quickQuestionsAriaLabel
|
|
124
|
+
};
|
|
125
|
+
return t.onOpenChat !== void 0 && (s.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (s.ctaText = t.ctaText), (o === "horizontal" || o === "vertical") && (s.orientation = o), A(s);
|
|
126
|
+
},
|
|
127
|
+
ActionButtons: ({ element: n, spec: e, context: t }) => {
|
|
128
|
+
const o = {
|
|
129
|
+
actions: C(n, e).map(T),
|
|
130
|
+
onAction: t.onAction,
|
|
131
|
+
defaultCtaText: t.i18n.defaultCtaText,
|
|
132
|
+
quickQuestionsAriaLabel: t.i18n.quickQuestionsAriaLabel
|
|
133
|
+
};
|
|
134
|
+
return t.onOpenChat !== void 0 && (o.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (o.ctaText = t.ctaText), A(o);
|
|
135
|
+
},
|
|
136
|
+
ActionButton: ({ element: n, context: e }) => {
|
|
137
|
+
const t = document.createElement("button");
|
|
138
|
+
t.className = "gengage-qna-button", t.type = "button";
|
|
139
|
+
const i = n.props?.label;
|
|
140
|
+
typeof i == "string" ? t.textContent = i : t.textContent = e.i18n.defaultCtaText;
|
|
141
|
+
const o = y(n.props?.action, typeof i == "string" ? i : void 0);
|
|
142
|
+
return o && t.addEventListener("click", () => e.onAction(o)), t;
|
|
143
|
+
},
|
|
144
|
+
TextInput: ({ element: n, context: e }) => {
|
|
145
|
+
const t = n.props?.placeholder, i = typeof t == "string" || Array.isArray(t) ? t : e.inputPlaceholder, o = typeof n.props?.ctaLabel == "string" ? n.props.ctaLabel : e.ctaText, s = {
|
|
146
|
+
onSubmit: e.onAction,
|
|
147
|
+
askQuestionAriaLabel: e.i18n.askQuestionAriaLabel,
|
|
148
|
+
defaultInputPlaceholder: e.i18n.defaultInputPlaceholder,
|
|
149
|
+
sendButtonText: e.i18n.sendButton,
|
|
150
|
+
sendQuestionAriaLabel: e.i18n.sendQuestionAriaLabel
|
|
151
|
+
};
|
|
152
|
+
return i !== void 0 && (s.placeholders = i), o !== void 0 && (s.ctaLabel = o), W(s);
|
|
153
|
+
},
|
|
154
|
+
QuestionHeading: ({ element: n }) => {
|
|
155
|
+
const e = document.createElement("h3");
|
|
156
|
+
e.className = "gengage-qna-heading";
|
|
157
|
+
const t = n.props?.text;
|
|
158
|
+
return e.textContent = typeof t == "string" ? t : "", e;
|
|
159
|
+
}
|
|
160
|
+
/* ProductCard intentionally omitted — QNA renders only question pills + text input.
|
|
161
|
+
If the backend sends a ProductCard element, the unknownRenderer will render its
|
|
162
|
+
children (if any) or return null. */
|
|
163
|
+
}, S = ({
|
|
164
|
+
element: n,
|
|
165
|
+
renderElement: e
|
|
166
|
+
}) => {
|
|
167
|
+
if (!n.children || n.children.length === 0)
|
|
168
|
+
return null;
|
|
169
|
+
const t = document.createElement("div");
|
|
170
|
+
for (const i of n.children) {
|
|
171
|
+
const o = e(i);
|
|
172
|
+
o && t.appendChild(o);
|
|
173
|
+
}
|
|
174
|
+
return t;
|
|
175
|
+
};
|
|
176
|
+
function M() {
|
|
177
|
+
return { ...v };
|
|
178
|
+
}
|
|
179
|
+
function G(n, e, t = v, i = S) {
|
|
180
|
+
return Q({
|
|
181
|
+
spec: n,
|
|
182
|
+
context: e,
|
|
183
|
+
registry: t,
|
|
184
|
+
containerClassName: "gengage-qna-uispec",
|
|
185
|
+
unknownRenderer: i
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const k = {
|
|
189
|
+
quickQuestionsAriaLabel: "Hızlı sorular",
|
|
190
|
+
askQuestionAriaLabel: "Soru sorun",
|
|
191
|
+
defaultInputPlaceholder: "Bir soru sorun...",
|
|
192
|
+
sendButton: "Sor",
|
|
193
|
+
sendQuestionAriaLabel: "Soruyu gönder",
|
|
194
|
+
defaultCtaText: "Başka bir şey sor"
|
|
195
|
+
}, $ = {
|
|
196
|
+
quickQuestionsAriaLabel: "Quick questions",
|
|
197
|
+
askQuestionAriaLabel: "Ask a question",
|
|
198
|
+
defaultInputPlaceholder: "Ask a question...",
|
|
199
|
+
sendButton: "Ask",
|
|
200
|
+
sendQuestionAriaLabel: "Send question",
|
|
201
|
+
defaultCtaText: "Ask something else"
|
|
202
|
+
};
|
|
203
|
+
function V(n) {
|
|
204
|
+
return n ? n.toLowerCase().split("-")[0] ?? "tr" : "tr";
|
|
205
|
+
}
|
|
206
|
+
function J(n) {
|
|
207
|
+
return V(n) === "en" ? $ : k;
|
|
208
|
+
}
|
|
209
|
+
const Y = g({
|
|
210
|
+
title: p(),
|
|
211
|
+
type: p(),
|
|
212
|
+
payload: N().optional()
|
|
213
|
+
}), K = g({
|
|
214
|
+
label: p(),
|
|
215
|
+
action: Y,
|
|
216
|
+
variant: E(["primary", "outline", "ghost"]).optional()
|
|
217
|
+
}), X = g({
|
|
218
|
+
orientation: E(["horizontal", "vertical"]).optional(),
|
|
219
|
+
wrap: B().optional()
|
|
220
|
+
}), Z = g({
|
|
221
|
+
placeholder: x([p(), R(p())]).optional(),
|
|
222
|
+
ctaLabel: p().optional()
|
|
223
|
+
}), tt = g({
|
|
224
|
+
text: p()
|
|
225
|
+
}), at = {
|
|
226
|
+
components: {
|
|
227
|
+
ActionButton: {
|
|
228
|
+
schema: K,
|
|
229
|
+
description: "A single clickable QNA action button."
|
|
230
|
+
},
|
|
231
|
+
ButtonRow: {
|
|
232
|
+
schema: X,
|
|
233
|
+
description: "Container for a group of QNA action buttons."
|
|
234
|
+
},
|
|
235
|
+
TextInput: {
|
|
236
|
+
schema: Z,
|
|
237
|
+
description: "Free-text input with rotating placeholder and CTA button."
|
|
238
|
+
},
|
|
239
|
+
QuestionHeading: {
|
|
240
|
+
schema: tt,
|
|
241
|
+
description: "A heading displayed above the QNA button group."
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
class et extends O {
|
|
246
|
+
constructor() {
|
|
247
|
+
super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n = k, this._actionHandler = this._handleAction.bind(this), this._openChatHandler = this._handleOpenChat.bind(this);
|
|
248
|
+
}
|
|
249
|
+
async onInit(e) {
|
|
250
|
+
this._i18n = this._resolveI18n(e), this._contentEl = document.createElement("div"), this._contentEl.className = "gengage-qna-container", this.root.appendChild(this._contentEl);
|
|
251
|
+
const t = e.pageContext?.sku;
|
|
252
|
+
t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0;
|
|
253
|
+
}
|
|
254
|
+
onUpdate(e) {
|
|
255
|
+
const t = e.sku;
|
|
256
|
+
!t || t === this._lastSku || (this._debounceTimer && clearTimeout(this._debounceTimer), this._debounceTimer = setTimeout(() => {
|
|
257
|
+
this._debounceTimer = null, this._lastSku = t, this._fetchAndRender(t);
|
|
258
|
+
}, 50));
|
|
259
|
+
}
|
|
260
|
+
onShow() {
|
|
261
|
+
this._contentEl && (this._contentEl.style.opacity = "0", this._contentEl.style.transition = "opacity 0.2s ease-in", requestAnimationFrame(() => {
|
|
262
|
+
this._contentEl && (this._contentEl.style.opacity = "1");
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
onHide() {
|
|
266
|
+
}
|
|
267
|
+
onDestroy() {
|
|
268
|
+
this._abort(), this._debounceTimer && (clearTimeout(this._debounceTimer), this._debounceTimer = null), this._contentEl && (this._contentEl.querySelector(".gengage-qna-input-wrapper")?._cleanup?.(), this._contentEl.remove(), this._contentEl = null);
|
|
269
|
+
}
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Internal
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
_abort() {
|
|
274
|
+
this._abortController?.abort(), this._abortController = null;
|
|
275
|
+
}
|
|
276
|
+
async _fetchAndRender(e) {
|
|
277
|
+
if (this._abort(), this._abortController = new AbortController(), !this._contentEl) return;
|
|
278
|
+
this._contentEl.innerHTML = "";
|
|
279
|
+
const t = this._createLoadingIndicator();
|
|
280
|
+
this._contentEl.appendChild(t);
|
|
281
|
+
const i = {
|
|
282
|
+
middlewareUrl: this.config.middlewareUrl
|
|
283
|
+
}, o = crypto.randomUUID(), s = Date.now();
|
|
284
|
+
this.track(
|
|
285
|
+
U(this.analyticsContext(), {
|
|
286
|
+
endpoint: "launcher_action",
|
|
287
|
+
request_id: o,
|
|
288
|
+
widget: "qna"
|
|
289
|
+
})
|
|
290
|
+
);
|
|
291
|
+
try {
|
|
292
|
+
const a = {
|
|
293
|
+
account_id: this.config.accountId,
|
|
294
|
+
session_id: this.config.session?.sessionId ?? "",
|
|
295
|
+
correlation_id: this.config.session?.sessionId ?? "",
|
|
296
|
+
sku: e,
|
|
297
|
+
locale: this.config.locale ?? "tr"
|
|
298
|
+
}, r = this.config.pageContext?.pageType;
|
|
299
|
+
r !== void 0 && (a.page_type = r);
|
|
300
|
+
const c = await z(a, i, this._abortController.signal);
|
|
301
|
+
if (this.track(
|
|
302
|
+
H(this.analyticsContext(), {
|
|
303
|
+
request_id: o,
|
|
304
|
+
latency_ms: Date.now() - s,
|
|
305
|
+
chunk_count: c.actions.length,
|
|
306
|
+
widget: "qna"
|
|
307
|
+
})
|
|
308
|
+
), this.track(
|
|
309
|
+
P(this.analyticsContext(), {
|
|
310
|
+
message_count: c.actions.length,
|
|
311
|
+
history_ref: o,
|
|
312
|
+
redaction_level: "none",
|
|
313
|
+
widget: "qna"
|
|
314
|
+
})
|
|
315
|
+
), !this._contentEl) return;
|
|
316
|
+
if (this._contentEl.innerHTML = "", !this._specIncludesType(c.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
|
|
317
|
+
const u = document.createElement("h3");
|
|
318
|
+
u.className = "gengage-qna-heading", u.textContent = this.config.staticQuestionText, this._contentEl.appendChild(u);
|
|
319
|
+
}
|
|
320
|
+
const d = this.config.inputPlaceholder, h = c.actions.length > 0 && d === !0 ? c.actions.map((u) => u.title) : d === !0 ? this._i18n.defaultInputPlaceholder : d, f = {
|
|
321
|
+
onAction: this._actionHandler,
|
|
322
|
+
i18n: this._i18n
|
|
323
|
+
};
|
|
324
|
+
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 I = this._buildFallbackActionsSpec(c.actions), _ = (c.uiSpecs.length > 0 ? c.uiSpecs : [I]).filter((u) => Object.keys(u.elements).length > 0);
|
|
326
|
+
for (const u of _) {
|
|
327
|
+
const b = this._renderUISpec(u, f);
|
|
328
|
+
this._contentEl.appendChild(b);
|
|
329
|
+
}
|
|
330
|
+
if (d !== void 0 && !this._specIncludesType(_, "TextInput")) {
|
|
331
|
+
const u = {
|
|
332
|
+
root: "root",
|
|
333
|
+
elements: {
|
|
334
|
+
root: {
|
|
335
|
+
type: "TextInput",
|
|
336
|
+
props: {
|
|
337
|
+
placeholder: h,
|
|
338
|
+
ctaLabel: this.config.ctaText
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}, b = this._renderUISpec(u, f);
|
|
343
|
+
this._contentEl.appendChild(b);
|
|
344
|
+
}
|
|
345
|
+
} catch (a) {
|
|
346
|
+
if (a instanceof DOMException && a.name === "AbortError") return;
|
|
347
|
+
m("gengage:global:error", {
|
|
348
|
+
source: "qna",
|
|
349
|
+
code: "FETCH_ERROR",
|
|
350
|
+
message: j(this.config.locale)
|
|
351
|
+
}), this.track(
|
|
352
|
+
D(this.analyticsContext(), {
|
|
353
|
+
request_id: o,
|
|
354
|
+
error_code: "FETCH_ERROR",
|
|
355
|
+
error_message: a instanceof Error ? a.message : String(a),
|
|
356
|
+
widget: "qna"
|
|
357
|
+
})
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
_createLoadingIndicator() {
|
|
362
|
+
const e = document.createElement("div");
|
|
363
|
+
e.className = "gengage-qna-loading";
|
|
364
|
+
for (let t = 0; t < 3; t++) {
|
|
365
|
+
const i = document.createElement("div");
|
|
366
|
+
i.className = "gengage-qna-loading-dot", e.appendChild(i);
|
|
367
|
+
}
|
|
368
|
+
return e;
|
|
369
|
+
}
|
|
370
|
+
_resolveI18n(e) {
|
|
371
|
+
return { ...J(e.locale), ...e.i18n };
|
|
372
|
+
}
|
|
373
|
+
_resolveUISpecRegistry() {
|
|
374
|
+
const e = M();
|
|
375
|
+
return F(e, this.config.renderer?.registry);
|
|
376
|
+
}
|
|
377
|
+
_renderUISpec(e, t) {
|
|
378
|
+
const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (c, l) => G(c, l, i, o), a = this.config.renderer?.renderUISpec;
|
|
379
|
+
return a ? a(e, t, {
|
|
380
|
+
registry: i,
|
|
381
|
+
unknownRenderer: o,
|
|
382
|
+
defaultRender: s
|
|
383
|
+
}) : s(e, t);
|
|
384
|
+
}
|
|
385
|
+
_specIncludesType(e, t) {
|
|
386
|
+
for (const i of e)
|
|
387
|
+
for (const o of Object.values(i.elements))
|
|
388
|
+
if (o.type === t) return !0;
|
|
389
|
+
return !1;
|
|
390
|
+
}
|
|
391
|
+
_buildFallbackActionsSpec(e) {
|
|
392
|
+
if (e.length === 0)
|
|
393
|
+
return { root: "root", elements: {} };
|
|
394
|
+
const t = {}, i = [];
|
|
395
|
+
for (let o = 0; o < e.length; o++) {
|
|
396
|
+
const s = e[o], a = `action-${o}`;
|
|
397
|
+
i.push(a), t[a] = {
|
|
398
|
+
type: "ActionButton",
|
|
399
|
+
props: {
|
|
400
|
+
label: s.title,
|
|
401
|
+
action: {
|
|
402
|
+
title: s.title,
|
|
403
|
+
type: s.type,
|
|
404
|
+
payload: s.payload
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
return t.root = {
|
|
410
|
+
type: "ButtonRow",
|
|
411
|
+
children: i
|
|
412
|
+
}, {
|
|
413
|
+
root: "root",
|
|
414
|
+
elements: t
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
_handleAction(e) {
|
|
418
|
+
this.config.onActionSelected?.(e), m("gengage:qna:action", e);
|
|
419
|
+
}
|
|
420
|
+
_handleOpenChat() {
|
|
421
|
+
this.config.onOpenChat?.(), m("gengage:qna:open-chat", {});
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function st() {
|
|
425
|
+
return new et();
|
|
426
|
+
}
|
|
427
|
+
export {
|
|
428
|
+
et as GengageQNA,
|
|
429
|
+
M as createDefaultQnaUISpecRegistry,
|
|
430
|
+
st as createQNAWidget,
|
|
431
|
+
S as defaultQnaUnknownUISpecRenderer,
|
|
432
|
+
at as qnaCatalog,
|
|
433
|
+
G as renderQnaUISpec
|
|
434
|
+
};
|
|
435
|
+
//# sourceMappingURL=qna.js.map
|
package/dist/qna.js.map
ADDED
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { NormalizedProduct } from '../common/v1-protocol-adapter.js';
|
|
2
|
+
import { ChatTransportConfig } from '../common/api-paths.js';
|
|
3
|
+
export interface SimilarProductsRequest {
|
|
4
|
+
account_id: string;
|
|
5
|
+
session_id: string;
|
|
6
|
+
correlation_id: string;
|
|
7
|
+
sku: string;
|
|
8
|
+
domain?: string;
|
|
9
|
+
limit?: number;
|
|
10
|
+
output_language?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ProductGroupingsRequest {
|
|
13
|
+
account_id: string;
|
|
14
|
+
session_id: string;
|
|
15
|
+
correlation_id: string;
|
|
16
|
+
skus: string[];
|
|
17
|
+
output_language?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ProductGroup {
|
|
20
|
+
name: string;
|
|
21
|
+
highlight?: string;
|
|
22
|
+
products: NormalizedProduct[];
|
|
23
|
+
}
|
|
24
|
+
export declare function fetchSimilarProducts(request: SimilarProductsRequest, transport: ChatTransportConfig, signal?: AbortSignal): Promise<NormalizedProduct[]>;
|
|
25
|
+
export declare function fetchProductGroupings(request: ProductGroupingsRequest, transport: ChatTransportConfig, signal?: AbortSignal): Promise<ProductGroup[]>;
|
|
26
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/simrel/api.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AA6BD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAC/B,SAAS,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsB9B;AAuCD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB"}
|