@buni.ai/chatbot-core 1.0.0 → 1.0.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/dist/index.esm.js CHANGED
@@ -33,66 +33,147 @@ class BuniChatWidget {
33
33
  }
34
34
  async loadWidget() {
35
35
  return new Promise((resolve, reject) => {
36
- // Check if widget is already loaded
37
- if (window.BuniChat) {
38
- resolve();
39
- return;
40
- }
41
- // Load the widget script dynamically
42
- const script = document.createElement("script");
43
- script.src = `${this.getBaseUrl()}/api/embed/widget?token=${encodeURIComponent(this.options.token)}`;
44
- script.async = true;
45
- script.onload = () => {
46
- // Initialize the actual widget
47
- this.initializeWidgetAPI();
36
+ // Create iframe for secure embedding
37
+ const iframe = document.createElement("iframe");
38
+ const config = this.options.config || {};
39
+ // Build URL with configuration parameters
40
+ const params = new URLSearchParams({
41
+ token: this.options.token,
42
+ embedded: "true",
43
+ theme: config.theme || "light",
44
+ width: String(config.width || "350px"),
45
+ height: String(config.height || "650px"),
46
+ primaryColor: config.primaryColor || "#795548",
47
+ secondaryColor: config.secondaryColor || "#A67D67",
48
+ position: config.position || "bottom-right",
49
+ showBranding: String(config.showBranding !== false),
50
+ autoOpen: String(config.autoOpen === true),
51
+ minimized: String(config.minimized === true),
52
+ allowMinimize: String(config.allowMinimize !== false),
53
+ showMinimize: String(config.showMinimize !== false),
54
+ enableFileUpload: String(config.enableFileUpload === true),
55
+ });
56
+ // Add optional parameters
57
+ if (config.customAvatar)
58
+ params.set("customAvatar", config.customAvatar);
59
+ if (config.companyName)
60
+ params.set("companyName", config.companyName);
61
+ if (config.welcomeMessage)
62
+ params.set("welcomeMessage", config.welcomeMessage);
63
+ if (config.triggerText)
64
+ params.set("triggerText", config.triggerText);
65
+ if (config.borderRadius)
66
+ params.set("borderRadius", config.borderRadius);
67
+ iframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;
68
+ iframe.style.cssText = `
69
+ position: fixed;
70
+ border: none;
71
+ z-index: 999999;
72
+ width: ${config.width || "350px"};
73
+ height: ${config.height || "650px"};
74
+ ${this.getPositionStyles(config.position || "bottom-right")}
75
+ display: ${config.hideDefaultTrigger ? "none" : "block"};
76
+ `;
77
+ iframe.setAttribute("allow", "clipboard-write");
78
+ iframe.setAttribute("title", "BuniAI Chat Widget");
79
+ iframe.onload = () => {
80
+ this.widgetElement = iframe;
81
+ this.setupPostMessageAPI(iframe);
48
82
  resolve();
49
83
  };
50
- script.onerror = () => {
51
- reject(new Error("Failed to load BuniAI widget script"));
84
+ iframe.onerror = () => {
85
+ reject(new Error("Failed to load BuniAI widget iframe"));
52
86
  };
53
- document.head.appendChild(script);
87
+ document.body.appendChild(iframe);
54
88
  });
55
89
  }
56
- initializeWidgetAPI() {
57
- // Set up communication with the loaded widget
58
- if (window.BuniChat) {
59
- // Configure the widget with our options
60
- window.BuniChat.configure(this.options.config || {});
61
- // Set up event forwarding from the widget to our event system
62
- window.BuniChat.on("visibility_changed", (data) => {
63
- this.state.isOpen = data.visibility === "visible";
64
- this.emit("visibility_changed", data);
65
- if (this.options.onVisibilityChanged) {
66
- this.options.onVisibilityChanged(data);
67
- }
68
- });
69
- window.BuniChat.on("new_message", (data) => {
70
- if (data.isFromBot) {
71
- this.state.unreadCount++;
72
- }
73
- this.emit("new_message", data);
74
- if (this.options.onNewMessage) {
75
- this.options.onNewMessage(data);
76
- }
77
- });
78
- window.BuniChat.on("minimized", (data) => {
79
- this.state.isMinimized = true;
80
- this.emit("minimized", data);
81
- });
82
- window.BuniChat.on("maximized", (data) => {
83
- this.state.isMinimized = false;
84
- this.emit("maximized", data);
85
- });
90
+ getPositionStyles(position) {
91
+ switch (position) {
92
+ case "bottom-right":
93
+ return "bottom: 20px; right: 20px;";
94
+ case "bottom-left":
95
+ return "bottom: 20px; left: 20px;";
96
+ case "top-right":
97
+ return "top: 20px; right: 20px;";
98
+ case "top-left":
99
+ return "top: 20px; left: 20px;";
100
+ default:
101
+ return "bottom: 20px; right: 20px;";
102
+ }
103
+ }
104
+ setupPostMessageAPI(iframe) {
105
+ // Listen for messages from the iframe
106
+ window.addEventListener("message", (event) => {
107
+ // Verify origin for security
108
+ if (event.origin !== this.getBaseUrl()) {
109
+ return;
110
+ }
111
+ const { type, data } = event.data;
112
+ switch (type) {
113
+ case "ready":
114
+ this.state.isLoaded = true;
115
+ this.emit("ready", data);
116
+ if (this.options.onReady) {
117
+ this.options.onReady(data);
118
+ }
119
+ break;
120
+ case "visibility_changed":
121
+ this.state.isOpen = data.visibility === "visible";
122
+ this.emit("visibility_changed", data);
123
+ if (this.options.onVisibilityChanged) {
124
+ this.options.onVisibilityChanged(data);
125
+ }
126
+ break;
127
+ case "new_message":
128
+ if (data.isFromBot) {
129
+ this.state.unreadCount++;
130
+ }
131
+ this.emit("new_message", data);
132
+ if (this.options.onNewMessage) {
133
+ this.options.onNewMessage(data);
134
+ }
135
+ break;
136
+ case "minimized":
137
+ this.state.isMinimized = true;
138
+ this.emit("minimized", data);
139
+ break;
140
+ case "maximized":
141
+ this.state.isMinimized = false;
142
+ this.emit("maximized", data);
143
+ break;
144
+ case "customer_data_updated":
145
+ this.customerData = data;
146
+ this.emit("customer_data_updated", data);
147
+ break;
148
+ case "session_updated":
149
+ this.sessionVariables = data.variables;
150
+ this.emit("session_updated", data);
151
+ break;
152
+ case "error":
153
+ this.emit("error", data);
154
+ if (this.options.onError) {
155
+ this.options.onError(data.error);
156
+ }
157
+ break;
158
+ }
159
+ });
160
+ }
161
+ postMessageToWidget(type, data) {
162
+ var _a;
163
+ if (this.widgetElement && this.widgetElement instanceof HTMLIFrameElement) {
164
+ (_a = this.widgetElement.contentWindow) === null || _a === void 0 ? void 0 : _a.postMessage({ type, data }, this.getBaseUrl());
86
165
  }
87
166
  }
167
+ initializeWidgetAPI() {
168
+ // Widget API is now handled via postMessage in setupPostMessageAPI
169
+ // This method is kept for backward compatibility but no longer needed
170
+ }
88
171
  getBaseUrl() {
89
172
  // Return the base URL for the BuniAI platform
90
173
  return globalThis.BUNI_API_URL || window.location.origin;
91
174
  }
92
175
  destroy() {
93
- if (window.BuniChat) {
94
- window.BuniChat.destroy();
95
- }
176
+ this.postMessageToWidget("destroy");
96
177
  if (this.widgetElement) {
97
178
  this.widgetElement.remove();
98
179
  this.widgetElement = null;
@@ -103,16 +184,21 @@ class BuniChatWidget {
103
184
  this.sessionVariables = null;
104
185
  }
105
186
  show() {
106
- if (window.BuniChat) {
107
- window.BuniChat.show();
187
+ // Show the iframe if it was hidden (hideDefaultTrigger mode)
188
+ if (this.widgetElement instanceof HTMLIFrameElement) {
189
+ this.widgetElement.style.display = "block";
108
190
  }
191
+ this.postMessageToWidget("show");
109
192
  this.state.isOpen = true;
110
193
  this.state.unreadCount = 0;
111
194
  this.emit("visibility_changed", { visibility: "visible" });
112
195
  }
113
196
  hide() {
114
- if (window.BuniChat) {
115
- window.BuniChat.hide();
197
+ var _a;
198
+ this.postMessageToWidget("hide");
199
+ // If hideDefaultTrigger is enabled, completely hide the iframe
200
+ if (((_a = this.options.config) === null || _a === void 0 ? void 0 : _a.hideDefaultTrigger) && this.widgetElement instanceof HTMLIFrameElement) {
201
+ this.widgetElement.style.display = "none";
116
202
  }
117
203
  this.state.isOpen = false;
118
204
  this.emit("visibility_changed", { visibility: "hidden" });
@@ -121,24 +207,18 @@ class BuniChatWidget {
121
207
  this.state.isOpen ? this.hide() : this.show();
122
208
  }
123
209
  minimize() {
124
- if (window.BuniChat) {
125
- window.BuniChat.minimize();
126
- }
210
+ this.postMessageToWidget("minimize");
127
211
  this.state.isMinimized = true;
128
212
  this.emit("minimized", { timestamp: Date.now() });
129
213
  }
130
214
  maximize() {
131
- if (window.BuniChat) {
132
- window.BuniChat.maximize();
133
- }
215
+ this.postMessageToWidget("maximize");
134
216
  this.state.isMinimized = false;
135
217
  this.emit("maximized", { timestamp: Date.now() });
136
218
  }
137
219
  setCustomerData(data) {
138
220
  this.customerData = { ...this.customerData, ...data };
139
- if (window.BuniChat) {
140
- window.BuniChat.setCustomerData(this.customerData);
141
- }
221
+ this.postMessageToWidget("setCustomerData", this.customerData);
142
222
  this.emit("customer_data_updated", { data: this.customerData });
143
223
  }
144
224
  getCustomerData() {
@@ -146,18 +226,14 @@ class BuniChatWidget {
146
226
  }
147
227
  setSessionVariables(variables) {
148
228
  this.sessionVariables = { ...this.sessionVariables, ...variables };
149
- if (window.BuniChat) {
150
- window.BuniChat.setSessionVariables(this.sessionVariables);
151
- }
229
+ this.postMessageToWidget("setSessionVariables", this.sessionVariables);
152
230
  this.emit("session_updated", { variables: this.sessionVariables });
153
231
  }
154
232
  getSessionVariables() {
155
233
  return this.sessionVariables ? { ...this.sessionVariables } : null;
156
234
  }
157
235
  sendMessage(message) {
158
- if (window.BuniChat) {
159
- window.BuniChat.sendMessage(message);
160
- }
236
+ this.postMessageToWidget("sendMessage", { message });
161
237
  const messageData = {
162
238
  message,
163
239
  isFromBot: false,
@@ -167,9 +243,7 @@ class BuniChatWidget {
167
243
  this.emit("new_message", messageData);
168
244
  }
169
245
  clearChat() {
170
- if (window.BuniChat) {
171
- window.BuniChat.clearChat();
172
- }
246
+ this.postMessageToWidget("clearChat");
173
247
  this.state.unreadCount = 0;
174
248
  }
175
249
  on(event, callback) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private state: BuniChatState;\n private eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if widget is already loaded\n if (window.BuniChat) {\n resolve();\n return;\n }\n\n // Load the widget script dynamically\n const script = document.createElement(\"script\");\n script.src = `${this.getBaseUrl()}/api/embed/widget?token=${encodeURIComponent(this.options.token)}`;\n script.async = true;\n\n script.onload = () => {\n // Initialize the actual widget\n this.initializeWidgetAPI();\n resolve();\n };\n\n script.onerror = () => {\n reject(new Error(\"Failed to load BuniAI widget script\"));\n };\n\n document.head.appendChild(script);\n });\n }\n\n private initializeWidgetAPI(): void {\n // Set up communication with the loaded widget\n if (window.BuniChat) {\n // Configure the widget with our options\n window.BuniChat.configure(this.options.config || {});\n\n // Set up event forwarding from the widget to our event system\n window.BuniChat.on(\"visibility_changed\", (data: any) => {\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n });\n\n window.BuniChat.on(\"new_message\", (data: any) => {\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n });\n\n window.BuniChat.on(\"minimized\", (data: any) => {\n this.state.isMinimized = true;\n this.emit(\"minimized\", data);\n });\n\n window.BuniChat.on(\"maximized\", (data: any) => {\n this.state.isMinimized = false;\n this.emit(\"maximized\", data);\n });\n }\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n return (globalThis as any).BUNI_API_URL || window.location.origin;\n }\n\n destroy(): void {\n if (window.BuniChat) {\n window.BuniChat.destroy();\n }\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n if (window.BuniChat) {\n window.BuniChat.show();\n }\n this.state.isOpen = true;\n this.state.unreadCount = 0;\n this.emit(\"visibility_changed\", { visibility: \"visible\" });\n }\n\n hide(): void {\n if (window.BuniChat) {\n window.BuniChat.hide();\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n this.state.isOpen ? this.hide() : this.show();\n }\n\n minimize(): void {\n if (window.BuniChat) {\n window.BuniChat.minimize();\n }\n this.state.isMinimized = true;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n maximize(): void {\n if (window.BuniChat) {\n window.BuniChat.maximize();\n }\n this.state.isMinimized = false;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n\n if (window.BuniChat) {\n window.BuniChat.setCustomerData(this.customerData);\n }\n\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n\n if (window.BuniChat) {\n window.BuniChat.setSessionVariables(this.sessionVariables);\n }\n\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n if (window.BuniChat) {\n window.BuniChat.sendMessage(message);\n }\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n if (window.BuniChat) {\n window.BuniChat.clearChat();\n }\n this.state.unreadCount = 0;\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private state: BuniChatState;\n private eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Create iframe for secure embedding\n const iframe = document.createElement(\"iframe\");\n const config = this.options.config || {};\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n theme: config.theme || \"light\",\n width: String(config.width || \"350px\"),\n height: String(config.height || \"650px\"),\n primaryColor: config.primaryColor || \"#795548\",\n secondaryColor: config.secondaryColor || \"#A67D67\",\n position: config.position || \"bottom-right\",\n showBranding: String(config.showBranding !== false),\n autoOpen: String(config.autoOpen === true),\n minimized: String(config.minimized === true),\n allowMinimize: String(config.allowMinimize !== false),\n showMinimize: String(config.showMinimize !== false),\n enableFileUpload: String(config.enableFileUpload === true),\n });\n\n // Add optional parameters\n if (config.customAvatar) params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius) params.set(\"borderRadius\", config.borderRadius);\n\n iframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n iframe.style.cssText = `\n position: fixed;\n border: none;\n z-index: 999999;\n width: ${config.width || \"350px\"};\n height: ${config.height || \"650px\"};\n ${this.getPositionStyles(config.position || \"bottom-right\")}\n display: ${config.hideDefaultTrigger ? \"none\" : \"block\"};\n `;\n iframe.setAttribute(\"allow\", \"clipboard-write\");\n iframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n iframe.onload = () => {\n this.widgetElement = iframe;\n this.setupPostMessageAPI(iframe);\n resolve();\n };\n\n iframe.onerror = () => {\n reject(new Error(\"Failed to load BuniAI widget iframe\"));\n };\n\n document.body.appendChild(iframe);\n });\n }\n\n private getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-right\":\n return \"bottom: 20px; right: 20px;\";\n case \"bottom-left\":\n return \"bottom: 20px; left: 20px;\";\n case \"top-right\":\n return \"top: 20px; right: 20px;\";\n case \"top-left\":\n return \"top: 20px; left: 20px;\";\n default:\n return \"bottom: 20px; right: 20px;\";\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const { type, data } = event.data;\n\n switch (type) {\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n this.state.isMinimized = true;\n this.emit(\"minimized\", data);\n break;\n\n case \"maximized\":\n this.state.isMinimized = false;\n this.emit(\"maximized\", data);\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n if (this.widgetElement && this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.contentWindow?.postMessage(\n { type, data },\n this.getBaseUrl()\n );\n }\n }\n\n private initializeWidgetAPI(): void {\n // Widget API is now handled via postMessage in setupPostMessageAPI\n // This method is kept for backward compatibility but no longer needed\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n return (globalThis as any).BUNI_API_URL || window.location.origin;\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the iframe if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.style.display = \"block\";\n }\n this.postMessageToWidget(\"show\");\n this.state.isOpen = true;\n this.state.unreadCount = 0;\n this.emit(\"visibility_changed\", { visibility: \"visible\" });\n }\n\n hide(): void {\n this.postMessageToWidget(\"hide\");\n // If hideDefaultTrigger is enabled, completely hide the iframe\n if (this.options.config?.hideDefaultTrigger && this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n this.state.isOpen ? this.hide() : this.show();\n }\n\n minimize(): void {\n this.postMessageToWidget(\"minimize\");\n this.state.isMinimized = true;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n maximize(): void {\n this.postMessageToWidget(\"maximize\");\n this.state.isMinimized = false;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -37,66 +37,147 @@ class BuniChatWidget {
37
37
  }
38
38
  async loadWidget() {
39
39
  return new Promise((resolve, reject) => {
40
- // Check if widget is already loaded
41
- if (window.BuniChat) {
42
- resolve();
43
- return;
44
- }
45
- // Load the widget script dynamically
46
- const script = document.createElement("script");
47
- script.src = `${this.getBaseUrl()}/api/embed/widget?token=${encodeURIComponent(this.options.token)}`;
48
- script.async = true;
49
- script.onload = () => {
50
- // Initialize the actual widget
51
- this.initializeWidgetAPI();
40
+ // Create iframe for secure embedding
41
+ const iframe = document.createElement("iframe");
42
+ const config = this.options.config || {};
43
+ // Build URL with configuration parameters
44
+ const params = new URLSearchParams({
45
+ token: this.options.token,
46
+ embedded: "true",
47
+ theme: config.theme || "light",
48
+ width: String(config.width || "350px"),
49
+ height: String(config.height || "650px"),
50
+ primaryColor: config.primaryColor || "#795548",
51
+ secondaryColor: config.secondaryColor || "#A67D67",
52
+ position: config.position || "bottom-right",
53
+ showBranding: String(config.showBranding !== false),
54
+ autoOpen: String(config.autoOpen === true),
55
+ minimized: String(config.minimized === true),
56
+ allowMinimize: String(config.allowMinimize !== false),
57
+ showMinimize: String(config.showMinimize !== false),
58
+ enableFileUpload: String(config.enableFileUpload === true),
59
+ });
60
+ // Add optional parameters
61
+ if (config.customAvatar)
62
+ params.set("customAvatar", config.customAvatar);
63
+ if (config.companyName)
64
+ params.set("companyName", config.companyName);
65
+ if (config.welcomeMessage)
66
+ params.set("welcomeMessage", config.welcomeMessage);
67
+ if (config.triggerText)
68
+ params.set("triggerText", config.triggerText);
69
+ if (config.borderRadius)
70
+ params.set("borderRadius", config.borderRadius);
71
+ iframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;
72
+ iframe.style.cssText = `
73
+ position: fixed;
74
+ border: none;
75
+ z-index: 999999;
76
+ width: ${config.width || "350px"};
77
+ height: ${config.height || "650px"};
78
+ ${this.getPositionStyles(config.position || "bottom-right")}
79
+ display: ${config.hideDefaultTrigger ? "none" : "block"};
80
+ `;
81
+ iframe.setAttribute("allow", "clipboard-write");
82
+ iframe.setAttribute("title", "BuniAI Chat Widget");
83
+ iframe.onload = () => {
84
+ this.widgetElement = iframe;
85
+ this.setupPostMessageAPI(iframe);
52
86
  resolve();
53
87
  };
54
- script.onerror = () => {
55
- reject(new Error("Failed to load BuniAI widget script"));
88
+ iframe.onerror = () => {
89
+ reject(new Error("Failed to load BuniAI widget iframe"));
56
90
  };
57
- document.head.appendChild(script);
91
+ document.body.appendChild(iframe);
58
92
  });
59
93
  }
60
- initializeWidgetAPI() {
61
- // Set up communication with the loaded widget
62
- if (window.BuniChat) {
63
- // Configure the widget with our options
64
- window.BuniChat.configure(this.options.config || {});
65
- // Set up event forwarding from the widget to our event system
66
- window.BuniChat.on("visibility_changed", (data) => {
67
- this.state.isOpen = data.visibility === "visible";
68
- this.emit("visibility_changed", data);
69
- if (this.options.onVisibilityChanged) {
70
- this.options.onVisibilityChanged(data);
71
- }
72
- });
73
- window.BuniChat.on("new_message", (data) => {
74
- if (data.isFromBot) {
75
- this.state.unreadCount++;
76
- }
77
- this.emit("new_message", data);
78
- if (this.options.onNewMessage) {
79
- this.options.onNewMessage(data);
80
- }
81
- });
82
- window.BuniChat.on("minimized", (data) => {
83
- this.state.isMinimized = true;
84
- this.emit("minimized", data);
85
- });
86
- window.BuniChat.on("maximized", (data) => {
87
- this.state.isMinimized = false;
88
- this.emit("maximized", data);
89
- });
94
+ getPositionStyles(position) {
95
+ switch (position) {
96
+ case "bottom-right":
97
+ return "bottom: 20px; right: 20px;";
98
+ case "bottom-left":
99
+ return "bottom: 20px; left: 20px;";
100
+ case "top-right":
101
+ return "top: 20px; right: 20px;";
102
+ case "top-left":
103
+ return "top: 20px; left: 20px;";
104
+ default:
105
+ return "bottom: 20px; right: 20px;";
106
+ }
107
+ }
108
+ setupPostMessageAPI(iframe) {
109
+ // Listen for messages from the iframe
110
+ window.addEventListener("message", (event) => {
111
+ // Verify origin for security
112
+ if (event.origin !== this.getBaseUrl()) {
113
+ return;
114
+ }
115
+ const { type, data } = event.data;
116
+ switch (type) {
117
+ case "ready":
118
+ this.state.isLoaded = true;
119
+ this.emit("ready", data);
120
+ if (this.options.onReady) {
121
+ this.options.onReady(data);
122
+ }
123
+ break;
124
+ case "visibility_changed":
125
+ this.state.isOpen = data.visibility === "visible";
126
+ this.emit("visibility_changed", data);
127
+ if (this.options.onVisibilityChanged) {
128
+ this.options.onVisibilityChanged(data);
129
+ }
130
+ break;
131
+ case "new_message":
132
+ if (data.isFromBot) {
133
+ this.state.unreadCount++;
134
+ }
135
+ this.emit("new_message", data);
136
+ if (this.options.onNewMessage) {
137
+ this.options.onNewMessage(data);
138
+ }
139
+ break;
140
+ case "minimized":
141
+ this.state.isMinimized = true;
142
+ this.emit("minimized", data);
143
+ break;
144
+ case "maximized":
145
+ this.state.isMinimized = false;
146
+ this.emit("maximized", data);
147
+ break;
148
+ case "customer_data_updated":
149
+ this.customerData = data;
150
+ this.emit("customer_data_updated", data);
151
+ break;
152
+ case "session_updated":
153
+ this.sessionVariables = data.variables;
154
+ this.emit("session_updated", data);
155
+ break;
156
+ case "error":
157
+ this.emit("error", data);
158
+ if (this.options.onError) {
159
+ this.options.onError(data.error);
160
+ }
161
+ break;
162
+ }
163
+ });
164
+ }
165
+ postMessageToWidget(type, data) {
166
+ var _a;
167
+ if (this.widgetElement && this.widgetElement instanceof HTMLIFrameElement) {
168
+ (_a = this.widgetElement.contentWindow) === null || _a === void 0 ? void 0 : _a.postMessage({ type, data }, this.getBaseUrl());
90
169
  }
91
170
  }
171
+ initializeWidgetAPI() {
172
+ // Widget API is now handled via postMessage in setupPostMessageAPI
173
+ // This method is kept for backward compatibility but no longer needed
174
+ }
92
175
  getBaseUrl() {
93
176
  // Return the base URL for the BuniAI platform
94
177
  return globalThis.BUNI_API_URL || window.location.origin;
95
178
  }
96
179
  destroy() {
97
- if (window.BuniChat) {
98
- window.BuniChat.destroy();
99
- }
180
+ this.postMessageToWidget("destroy");
100
181
  if (this.widgetElement) {
101
182
  this.widgetElement.remove();
102
183
  this.widgetElement = null;
@@ -107,16 +188,21 @@ class BuniChatWidget {
107
188
  this.sessionVariables = null;
108
189
  }
109
190
  show() {
110
- if (window.BuniChat) {
111
- window.BuniChat.show();
191
+ // Show the iframe if it was hidden (hideDefaultTrigger mode)
192
+ if (this.widgetElement instanceof HTMLIFrameElement) {
193
+ this.widgetElement.style.display = "block";
112
194
  }
195
+ this.postMessageToWidget("show");
113
196
  this.state.isOpen = true;
114
197
  this.state.unreadCount = 0;
115
198
  this.emit("visibility_changed", { visibility: "visible" });
116
199
  }
117
200
  hide() {
118
- if (window.BuniChat) {
119
- window.BuniChat.hide();
201
+ var _a;
202
+ this.postMessageToWidget("hide");
203
+ // If hideDefaultTrigger is enabled, completely hide the iframe
204
+ if (((_a = this.options.config) === null || _a === void 0 ? void 0 : _a.hideDefaultTrigger) && this.widgetElement instanceof HTMLIFrameElement) {
205
+ this.widgetElement.style.display = "none";
120
206
  }
121
207
  this.state.isOpen = false;
122
208
  this.emit("visibility_changed", { visibility: "hidden" });
@@ -125,24 +211,18 @@ class BuniChatWidget {
125
211
  this.state.isOpen ? this.hide() : this.show();
126
212
  }
127
213
  minimize() {
128
- if (window.BuniChat) {
129
- window.BuniChat.minimize();
130
- }
214
+ this.postMessageToWidget("minimize");
131
215
  this.state.isMinimized = true;
132
216
  this.emit("minimized", { timestamp: Date.now() });
133
217
  }
134
218
  maximize() {
135
- if (window.BuniChat) {
136
- window.BuniChat.maximize();
137
- }
219
+ this.postMessageToWidget("maximize");
138
220
  this.state.isMinimized = false;
139
221
  this.emit("maximized", { timestamp: Date.now() });
140
222
  }
141
223
  setCustomerData(data) {
142
224
  this.customerData = { ...this.customerData, ...data };
143
- if (window.BuniChat) {
144
- window.BuniChat.setCustomerData(this.customerData);
145
- }
225
+ this.postMessageToWidget("setCustomerData", this.customerData);
146
226
  this.emit("customer_data_updated", { data: this.customerData });
147
227
  }
148
228
  getCustomerData() {
@@ -150,18 +230,14 @@ class BuniChatWidget {
150
230
  }
151
231
  setSessionVariables(variables) {
152
232
  this.sessionVariables = { ...this.sessionVariables, ...variables };
153
- if (window.BuniChat) {
154
- window.BuniChat.setSessionVariables(this.sessionVariables);
155
- }
233
+ this.postMessageToWidget("setSessionVariables", this.sessionVariables);
156
234
  this.emit("session_updated", { variables: this.sessionVariables });
157
235
  }
158
236
  getSessionVariables() {
159
237
  return this.sessionVariables ? { ...this.sessionVariables } : null;
160
238
  }
161
239
  sendMessage(message) {
162
- if (window.BuniChat) {
163
- window.BuniChat.sendMessage(message);
164
- }
240
+ this.postMessageToWidget("sendMessage", { message });
165
241
  const messageData = {
166
242
  message,
167
243
  isFromBot: false,
@@ -171,9 +247,7 @@ class BuniChatWidget {
171
247
  this.emit("new_message", messageData);
172
248
  }
173
249
  clearChat() {
174
- if (window.BuniChat) {
175
- window.BuniChat.clearChat();
176
- }
250
+ this.postMessageToWidget("clearChat");
177
251
  this.state.unreadCount = 0;
178
252
  }
179
253
  on(event, callback) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private state: BuniChatState;\n private eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if widget is already loaded\n if (window.BuniChat) {\n resolve();\n return;\n }\n\n // Load the widget script dynamically\n const script = document.createElement(\"script\");\n script.src = `${this.getBaseUrl()}/api/embed/widget?token=${encodeURIComponent(this.options.token)}`;\n script.async = true;\n\n script.onload = () => {\n // Initialize the actual widget\n this.initializeWidgetAPI();\n resolve();\n };\n\n script.onerror = () => {\n reject(new Error(\"Failed to load BuniAI widget script\"));\n };\n\n document.head.appendChild(script);\n });\n }\n\n private initializeWidgetAPI(): void {\n // Set up communication with the loaded widget\n if (window.BuniChat) {\n // Configure the widget with our options\n window.BuniChat.configure(this.options.config || {});\n\n // Set up event forwarding from the widget to our event system\n window.BuniChat.on(\"visibility_changed\", (data: any) => {\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n });\n\n window.BuniChat.on(\"new_message\", (data: any) => {\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n });\n\n window.BuniChat.on(\"minimized\", (data: any) => {\n this.state.isMinimized = true;\n this.emit(\"minimized\", data);\n });\n\n window.BuniChat.on(\"maximized\", (data: any) => {\n this.state.isMinimized = false;\n this.emit(\"maximized\", data);\n });\n }\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n return (globalThis as any).BUNI_API_URL || window.location.origin;\n }\n\n destroy(): void {\n if (window.BuniChat) {\n window.BuniChat.destroy();\n }\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n if (window.BuniChat) {\n window.BuniChat.show();\n }\n this.state.isOpen = true;\n this.state.unreadCount = 0;\n this.emit(\"visibility_changed\", { visibility: \"visible\" });\n }\n\n hide(): void {\n if (window.BuniChat) {\n window.BuniChat.hide();\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n this.state.isOpen ? this.hide() : this.show();\n }\n\n minimize(): void {\n if (window.BuniChat) {\n window.BuniChat.minimize();\n }\n this.state.isMinimized = true;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n maximize(): void {\n if (window.BuniChat) {\n window.BuniChat.maximize();\n }\n this.state.isMinimized = false;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n\n if (window.BuniChat) {\n window.BuniChat.setCustomerData(this.customerData);\n }\n\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n\n if (window.BuniChat) {\n window.BuniChat.setSessionVariables(this.sessionVariables);\n }\n\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n if (window.BuniChat) {\n window.BuniChat.sendMessage(message);\n }\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n if (window.BuniChat) {\n window.BuniChat.clearChat();\n }\n this.state.unreadCount = 0;\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private state: BuniChatState;\n private eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Create iframe for secure embedding\n const iframe = document.createElement(\"iframe\");\n const config = this.options.config || {};\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n theme: config.theme || \"light\",\n width: String(config.width || \"350px\"),\n height: String(config.height || \"650px\"),\n primaryColor: config.primaryColor || \"#795548\",\n secondaryColor: config.secondaryColor || \"#A67D67\",\n position: config.position || \"bottom-right\",\n showBranding: String(config.showBranding !== false),\n autoOpen: String(config.autoOpen === true),\n minimized: String(config.minimized === true),\n allowMinimize: String(config.allowMinimize !== false),\n showMinimize: String(config.showMinimize !== false),\n enableFileUpload: String(config.enableFileUpload === true),\n });\n\n // Add optional parameters\n if (config.customAvatar) params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius) params.set(\"borderRadius\", config.borderRadius);\n\n iframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n iframe.style.cssText = `\n position: fixed;\n border: none;\n z-index: 999999;\n width: ${config.width || \"350px\"};\n height: ${config.height || \"650px\"};\n ${this.getPositionStyles(config.position || \"bottom-right\")}\n display: ${config.hideDefaultTrigger ? \"none\" : \"block\"};\n `;\n iframe.setAttribute(\"allow\", \"clipboard-write\");\n iframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n iframe.onload = () => {\n this.widgetElement = iframe;\n this.setupPostMessageAPI(iframe);\n resolve();\n };\n\n iframe.onerror = () => {\n reject(new Error(\"Failed to load BuniAI widget iframe\"));\n };\n\n document.body.appendChild(iframe);\n });\n }\n\n private getPositionStyles(position: string): string {\n switch (position) {\n case \"bottom-right\":\n return \"bottom: 20px; right: 20px;\";\n case \"bottom-left\":\n return \"bottom: 20px; left: 20px;\";\n case \"top-right\":\n return \"top: 20px; right: 20px;\";\n case \"top-left\":\n return \"top: 20px; left: 20px;\";\n default:\n return \"bottom: 20px; right: 20px;\";\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const { type, data } = event.data;\n\n switch (type) {\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n this.state.isMinimized = true;\n this.emit(\"minimized\", data);\n break;\n\n case \"maximized\":\n this.state.isMinimized = false;\n this.emit(\"maximized\", data);\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n if (this.widgetElement && this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.contentWindow?.postMessage(\n { type, data },\n this.getBaseUrl()\n );\n }\n }\n\n private initializeWidgetAPI(): void {\n // Widget API is now handled via postMessage in setupPostMessageAPI\n // This method is kept for backward compatibility but no longer needed\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n return (globalThis as any).BUNI_API_URL || window.location.origin;\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the iframe if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.style.display = \"block\";\n }\n this.postMessageToWidget(\"show\");\n this.state.isOpen = true;\n this.state.unreadCount = 0;\n this.emit(\"visibility_changed\", { visibility: \"visible\" });\n }\n\n hide(): void {\n this.postMessageToWidget(\"hide\");\n // If hideDefaultTrigger is enabled, completely hide the iframe\n if (this.options.config?.hideDefaultTrigger && this.widgetElement instanceof HTMLIFrameElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n this.state.isOpen ? this.hide() : this.show();\n }\n\n minimize(): void {\n this.postMessageToWidget(\"minimize\");\n this.state.isMinimized = true;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n maximize(): void {\n this.postMessageToWidget(\"maximize\");\n this.state.isMinimized = false;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -10,9 +10,14 @@ export interface BuniChatConfig {
10
10
  height?: number;
11
11
  triggerText?: string;
12
12
  autoOpen?: boolean;
13
+ minimized?: boolean;
14
+ allowMinimize?: boolean;
13
15
  showMinimize?: boolean;
14
16
  showBranding?: boolean;
15
17
  enableMobile?: boolean;
18
+ enableFileUpload?: boolean;
19
+ borderRadius?: string;
20
+ hideDefaultTrigger?: boolean;
16
21
  }
17
22
  export interface BuniChatOptions {
18
23
  token: string;
package/dist/widget.d.ts CHANGED
@@ -9,6 +9,9 @@ export declare class BuniChatWidget implements BuniChatAPI {
9
9
  constructor();
10
10
  initialize(options: BuniChatOptions): Promise<void>;
11
11
  private loadWidget;
12
+ private getPositionStyles;
13
+ private setupPostMessageAPI;
14
+ private postMessageToWidget;
12
15
  private initializeWidgetAPI;
13
16
  private getBaseUrl;
14
17
  destroy(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buni.ai/chatbot-core",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Core functionality for BuniAI chat widget adapters",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs.js",