Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions pages/chat/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ const i18n = {
attrTargetUrlDefault: 'app.doctorina.com',
attrChildren: 'Child <code>&lt;p&gt;</code> elements: 1 = static placeholder, 2+ = typing animation',
attrChildrenDefault: 'None',
attrParams: 'JSON object of extra query parameters (e.g. UTM tags)',
attrParamsDefault: 'None',
attrParams: 'JSON object of extra query parameters (e.g. UTM tags). Overrides defaults.',
attrParamsDefault: 'utm_medium=user_message',
examples: 'Examples',
exBasicTitle: 'Basic Usage',
exBasicDesc: 'Minimal setup — just add the container and the script:',
Expand Down Expand Up @@ -63,8 +63,8 @@ const i18n = {
attrTargetUrlDefault: 'app.doctorina.com',
attrChildren: 'Elementos hijos <code>&lt;p&gt;</code>: 1 = placeholder estático, 2+ = animación de escritura',
attrChildrenDefault: 'Ninguno',
attrParams: 'Objeto JSON con parámetros extra (ej. etiquetas UTM)',
attrParamsDefault: 'Ninguno',
attrParams: 'Objeto JSON con parámetros extra (ej. etiquetas UTM). Sobrescribe los valores predeterminados.',
attrParamsDefault: 'utm_medium=user_message',
examples: 'Ejemplos',
exBasicTitle: 'Uso básico',
exBasicDesc: 'Configuración mínima — solo agrega el contenedor y el script:',
Expand Down Expand Up @@ -100,8 +100,8 @@ const i18n = {
attrTargetUrlDefault: 'app.doctorina.com',
attrChildren: 'Дочерние элементы <code>&lt;p&gt;</code>: 1 = статический placeholder, 2+ = анимация печатания',
attrChildrenDefault: 'Нет',
attrParams: 'JSON-объект с дополнительными query-параметрами (напр. UTM-метки)',
attrParamsDefault: 'Нет',
attrParams: 'JSON-объект с дополнительными query-параметрами (напр. UTM-метки). Перекрывает значения по умолчанию.',
attrParamsDefault: 'utm_medium=user_message',
examples: 'Примеры',
exBasicTitle: 'Базовое подключение',
exBasicDesc: 'Минимальная настройка — только контейнер и скрипт:',
Expand Down Expand Up @@ -147,7 +147,7 @@ const SNIPPET_PLACEHOLDER = `<div id="doctorina-chat">
<script defer src="${WIDGET_HOST}/widget/doctorina-chat.js"></script>`;

const SNIPPET_PARAMS = `<div id="doctorina-chat"
data-params='{"utm_source":"website","utm_campaign":"spring"}'>
data-params='{"utm_source":"landing","utm_campaign":"spring"}'>
</div>
<script defer src="${WIDGET_HOST}/widget/doctorina-chat.js"></script>`;

Expand Down
20 changes: 13 additions & 7 deletions src/widget/tab-opener.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
import type { WidgetConfig } from './config';

// The widget *is* the user-message medium — every redirect is the user pressing Send.
// Embedders override by passing utm_medium in data-params.
const DEFAULT_PARAMS: Readonly<Record<string, string>> = Object.freeze({
utm_medium: 'user_message',
});

function normalizeMessage(raw: string): string {
return raw.trim().replace(/\s+/g, ' ');
}

function effectiveParams(config: WidgetConfig): Record<string, string> {
return { ...DEFAULT_PARAMS, ...(config.params ?? {}) };
}

function buildTargetUrl(config: WidgetConfig, message?: string): string {
const url = new URL(config.targetUrl);
url.searchParams.set('auto_accept_policies', '1');
url.searchParams.set('referrer', window.location.href);

if (config.params) {
for (const [key, value] of Object.entries(config.params)) {
url.searchParams.set(key, value);
}
for (const [key, value] of Object.entries(effectiveParams(config))) {
url.searchParams.set(key, value);
}

if (message) {
Expand Down Expand Up @@ -43,9 +51,7 @@ export function openTarget(config: WidgetConfig, message: string): void {
if (text) {
payload.message = text;
}
if (config.params) {
payload.params = config.params;
}
payload.params = effectiveParams(config);
newTab.name = JSON.stringify(payload);
newTab.location.href = buildTargetUrl(config);
} else {
Expand Down
Loading