-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwidget-loader.service.ts
More file actions
61 lines (52 loc) · 1.83 KB
/
Copy pathwidget-loader.service.ts
File metadata and controls
61 lines (52 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { Injectable } from '@angular/core';
declare global {
interface Window {
YGC_WIDGET_ID?: string;
YGC_WIDGET_RENDER_MODE?: 'floating' | 'embedded';
YGC_WIDGET?: {
renderEmbedded?: (root: HTMLElement) => void;
};
}
}
export type WidgetMode = 'floating' | 'embedded';
@Injectable({ providedIn: 'root' })
export class WidgetLoaderService {
private loadedMode: WidgetMode | null = null;
load(widgetUid: string, mode: WidgetMode, rootElementId = 'yourgpt_root'): void {
if (this.loadedMode === mode && document.getElementById('yourgpt-chatbot')) return;
if (this.loadedMode && this.loadedMode !== mode) {
console.warn(
`[WidgetLoaderService] Widget already loaded in "${this.loadedMode}" mode. ` +
`Switching modes requires a full page reload — use <a href="…"> not routerLink.`,
);
return;
}
window.YGC_WIDGET_ID = widgetUid;
window.YGC_WIDGET_RENDER_MODE = mode;
const script = document.createElement('script');
script.id = 'yourgpt-chatbot';
script.src = 'https://widget.yourgpt.ai/script.js';
script.async = true;
document.body.appendChild(script);
this.loadedMode = mode;
if (mode === 'embedded') {
this.renderEmbeddedWhenReady(rootElementId);
}
}
private renderEmbeddedWhenReady(rootElementId: string, attempts = 0): void {
const root = document.getElementById(rootElementId);
const render = window.YGC_WIDGET?.renderEmbedded;
if (root && render) {
render(root);
return;
}
if (attempts > 100) {
console.error(
`[WidgetLoaderService] Gave up after 10s — embedded widget never became ready. ` +
`Make sure #${rootElementId} exists in the DOM.`,
);
return;
}
window.setTimeout(() => this.renderEmbeddedWhenReady(rootElementId, attempts + 1), 100);
}
}