@mptransformation/omisdk 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -204,3 +204,101 @@ npm run serve-examples
204
204
  ## License
205
205
 
206
206
  MIT
207
+
208
+ ## Using Types with ESLint in ReactJS Projects
209
+
210
+ This SDK provides TypeScript type definitions that can be used with ESLint in ReactJS projects. This helps with type checking and autocompletion when using the SDK in your React application.
211
+
212
+ ### Installation
213
+
214
+ ```bash
215
+ npm install @mptransformation/omisdk
216
+ ```
217
+
218
+ ### Basic Usage with TypeScript and ESLint
219
+
220
+ 1. Import the types in your React component:
221
+
222
+ ```tsx
223
+ import React, { useEffect } from "react";
224
+ import omisdk from "@mptransformation/omisdk";
225
+ import type { SDKOptions, SDKTheme } from "@mptransformation/omisdk";
226
+
227
+ const MyComponent: React.FC = () => {
228
+ useEffect(() => {
229
+ // Configure the SDK with proper typing
230
+ const options: SDKOptions = {
231
+ targetElementId: "sdk-container",
232
+ mode: "bubble",
233
+ theme: {
234
+ primaryColor: "#007bff",
235
+ textColor: "#333333",
236
+ },
237
+ };
238
+
239
+ // Initialize the SDK
240
+ omisdk.init(options);
241
+
242
+ // Clean up on unmount
243
+ return () => {
244
+ omisdk.destroy();
245
+ };
246
+ }, []);
247
+
248
+ return <div id="sdk-container">{/* SDK will be mounted here */}</div>;
249
+ };
250
+
251
+ export default MyComponent;
252
+ ```
253
+
254
+ 2. For ESLint configuration, add the following to your `.eslintrc.js` file:
255
+
256
+ ```js
257
+ module.exports = {
258
+ // ... your existing ESLint config
259
+ settings: {
260
+ "import/resolver": {
261
+ typescript: {
262
+ alwaysTryTypes: true,
263
+ },
264
+ },
265
+ },
266
+ rules: {
267
+ // ... your existing rules
268
+ },
269
+ };
270
+ ```
271
+
272
+ 3. If you need to access the global instance in a non-TypeScript file, you can use the global type:
273
+
274
+ ```tsx
275
+ // The window.omisdk type is already defined in the SDK's type definitions
276
+ window.omisdk.init({
277
+ targetElementId: "sdk-container",
278
+ mode: "bubble",
279
+ });
280
+ ```
281
+
282
+ ### Advanced Type Usage
283
+
284
+ For more advanced type usage, you can import specific types:
285
+
286
+ ```tsx
287
+ import type {
288
+ SDKOptions,
289
+ SDKTheme,
290
+ SocketEvent,
291
+ CallEventType,
292
+ CallEvent,
293
+ } from "@mptransformation/omisdk";
294
+
295
+ // Use the types in your code
296
+ const handleCallEvent = (event: CallEvent) => {
297
+ if (event.type === CallEventType.CALL_INCOMING) {
298
+ console.log("Incoming call from:", event.senderId);
299
+ }
300
+ };
301
+
302
+ // Subscribe to events with proper typing
303
+ omisdk.on("call", handleCallEvent);
304
+ ```
package/dist/omisdk.es.js CHANGED
@@ -523,7 +523,7 @@ const DEFAULT_OPTIONS = {
523
523
  debug: false
524
524
  };
525
525
  const SDK_NAMESPACE = "OmiSDK";
526
- const SDK_VERSION = "0.1.0";
526
+ const SDK_VERSION = "0.1.1";
527
527
  class OmiSDK {
528
528
  /**
529
529
  * Creates a new SDK instance
@@ -1 +1 @@
1
- {"version":3,"file":"omisdk.es.js","sources":["../src/types/index.ts","../src/utils/dom.ts","../src/utils/logger.ts","../src/utils/theme.ts","../src/utils/event-emitter.ts","../src/utils/bubble.ts","../src/core/sdk.ts","../src/index.ts"],"sourcesContent":["/**\n * Configuration options for the SDK\n */\nexport interface SDKOptions {\n /** Target element ID where the SDK will be mounted */\n targetElementId?: string;\n /** Display mode for the SDK: 'none' (headless) or 'bubble' (UI visible) */\n mode?: SDKMode;\n /** Custom theme for the SDK */\n theme?: SDKTheme;\n /** Socket URL for real-time communication */\n baseUrl?: string;\n /** Debug mode flag */\n debug?: boolean;\n}\n\n/**\n * SDK display modes\n */\nexport type SDKMode = \"none\" | \"bubble\";\n\n/**\n * Theme options for customizing the SDK appearance\n */\nexport interface SDKTheme {\n /** Primary color */\n primaryColor?: string;\n /** Secondary color */\n secondaryColor?: string;\n /** Text color */\n textColor?: string;\n /** Background color */\n backgroundColor?: string;\n /** Font family */\n fontFamily?: string;\n /** Border radius for elements */\n borderRadius?: string;\n /** Bubble position (for bubble mode) */\n bubblePosition?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Custom CSS classes */\n customClasses?: Record<string, string>;\n}\n\n/**\n * Action event data\n */\nexport interface SDKAction {\n /** Type of action */\n type: string;\n /** Payload data for the action */\n payload?: any;\n /** Timestamp when the action occurred */\n timestamp: number;\n}\n\n/**\n * Socket event data\n */\nexport interface SocketEvent {\n /** Event name */\n name: string;\n /** Event data */\n data?: any;\n /** Timestamp when the event occurred */\n timestamp: number;\n}\n\n/**\n * Socket connection states\n */\nexport enum SocketConnectionState {\n DISCONNECTED = \"disconnected\",\n CONNECTING = \"connecting\",\n CONNECTED = \"connected\",\n RECONNECTING = \"reconnecting\",\n RECONNECTION_FAILED = \"reconnection_failed\",\n}\n\n/**\n * Socket options for configuration\n */\nexport interface SocketOptions {\n /** Whether to enable reconnection */\n reconnection?: boolean;\n /** Maximum number of reconnection attempts */\n reconnectionAttempts?: number;\n /** Delay between reconnection attempts in milliseconds */\n reconnectionDelay?: number;\n /** Connection timeout in milliseconds */\n timeout?: number;\n /** Whether to connect automatically on initialization */\n autoConnect?: boolean;\n}\n\n/**\n * Event emitter interface\n */\nexport interface EventEmitter {\n /** Subscribe to an event */\n on(eventName: string, callback: (data: any) => void): void;\n /** Unsubscribe from an event */\n off(eventName: string, callback: (data: any) => void): void;\n /** Emit an event */\n emit(eventName: string, data: any): void;\n}\n\nexport interface LoginRequest {\n tenantId: number;\n username: string;\n password: string;\n}\n\nexport interface LoginSSORequest {\n ssoToken: string;\n organization: string;\n}\n\nexport interface SdkResponse {\n success: boolean;\n message: string;\n data?: any;\n}\n\nexport interface CallOptions {\n did?: string;\n enableVideo?: boolean;\n remoteVideoId?: string;\n localVideoId?: string;\n extraVariables?: Record<string, string>;\n}\n\nexport interface SdkEvent {\n name: string;\n type?: any;\n timestamp: number;\n}\n\nexport enum CallEventType {\n CALL_INCOMING = \"call_incoming\",\n CALL_OUTGOING = \"call_outgoing\",\n CALL_HANGUP = \"call_hangup\",\n CALL_ANSWERED = \"call_answered\",\n CALL_REJECTED = \"call_rejected\",\n CALL_HOLD = \"call_hold\",\n CALL_UNHOLD = \"call_unhold\",\n CALL_MUTE = \"call_mute\",\n CALL_UNMUTE = \"call_unmute\",\n CALL_TRANSFER = \"call_transfer\",\n CALL_STATUS_CHANGE = \"call_status_change\",\n}\n\nexport interface CallEvent extends SdkEvent {\n type: CallEventType;\n senderId: string;\n applicationId: string;\n}\n\nexport enum AgentStatusEventType {\n AGENT_STATUS_CHANGE = \"agent_status_change\",\n}\n\nexport interface AgentStatusEvent extends SdkEvent {\n type: AgentStatusEventType;\n status: string;\n agentId: string;\n tenantId: string;\n changeTime: number;\n reasonCode: string;\n reasonCodeId: number;\n}\n\nexport enum AppEventType {\n READY = \"ready\",\n DISPLAY_CHANGED = \"display_changed\",\n BUBBLE_HIDDEN = \"bubble_hidden\",\n BUBBLE_SHOWN = \"bubble_shown\",\n LOGGED_IN = \"logged_in\",\n LOGGED_OUT = \"logged_out\",\n TOKEN_EXPIRED = \"token_expired\",\n ERROR = \"error\",\n}\n\nexport interface AppEvent extends SdkEvent {\n type: AppEventType;\n message: string;\n error?: Error;\n}\n\nexport interface InteractionEvent extends SdkEvent {\n type: InteractionEventType;\n message: string;\n senderId: string;\n applicationId: string;\n conversationId: string;\n}\n\nexport enum InteractionEventType {\n NEW_CONVERSATION = \"new_conversation\",\n NEW_MESSAGE = \"new_message\",\n CLOSE_CONVERSATION = \"close_conversation\",\n MESSAGE_RECEIVED = \"message_received\",\n MESSAGE_SENT = \"message_sent\",\n MESSAGE_DELIVERED = \"message_delivered\",\n MESSAGE_READ = \"message_read\",\n CONVERSATION_ENDED = \"conversation_ended\",\n}\n/**\n * SDK instance interface\n */\nexport interface SDK {\n /** Initialize the SDK with options */\n init(options?: SDKOptions): void;\n /** Login with username and password **/\n login(request: LoginRequest): Promise<SdkResponse>;\n /** Login with SSO token**/\n loginSSO(request: LoginSSORequest): Promise<SdkResponse>;\n /** Logout the current user**/\n logout(): Promise<SdkResponse>;\n /** Make a call to a destination**/\n makeCall(destination: string, options?: CallOptions): Promise<SdkResponse>;\n /** Hangup the current call**/\n hangup(): Promise<SdkResponse>;\n /** Answer an incoming call**/\n answerCall(options?: CallOptions): Promise<SdkResponse>;\n /** Reject an incoming call**/\n rejectCall(): Promise<SdkResponse>;\n /** Hold the current call**/\n hold(): Promise<SdkResponse>;\n /** Resume the current call**/\n unhold(): Promise<SdkResponse>;\n /** Mute the current call**/\n mute(): Promise<SdkResponse>;\n /** Unmute the current call**/\n unmute(): Promise<SdkResponse>;\n /** Turn on the camera**/\n cameraOn(): Promise<SdkResponse>;\n /** Turn off the camera**/\n cameraOff(): Promise<SdkResponse>;\n /** Transfer the current call to a different destination**/\n transfer(destination: string): Promise<SdkResponse>;\n /** Change the agent status**/\n changeAgentStatus(status: string): Promise<SdkResponse>;\n /** Get the agent status**/\n getAgentStatus(): Promise<SdkResponse>;\n /** Hide the bubble**/\n hideBubble(): Promise<SdkResponse>;\n /** Show the bubble**/\n showBubble(): Promise<SdkResponse>;\n /** Destroy the SDK instance and clean up resources */\n destroy(): void;\n /** Update SDK options */\n updateOptions(options: Partial<SDKOptions>): void;\n /** Get the current SDK version */\n getVersion(): string;\n /** Get the current SDK options */\n getOptions(): SDKOptions;\n /** Subscribe to an event */\n on(eventName: string, callback: (data: SdkEvent) => void): void;\n /** Unsubscribe from an event */\n off(eventName: string, callback: (data: SdkEvent) => void): void;\n}\n","/**\n * Creates a DOM element with the specified attributes and properties\n * @param tag HTML tag name\n * @param attributes Element attributes\n * @param children Child elements or text content\n * @returns The created DOM element\n */\nexport function createElement<T extends HTMLElement>(\n tag: string,\n attributes: Record<string, string> = {},\n children: (HTMLElement | string)[] = []\n): T {\n const element = document.createElement(tag) as T;\n\n // Set attributes\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n\n // Append children\n children.forEach((child) => {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n });\n\n return element;\n}\n\n/**\n * Finds an element in the DOM by its ID\n * @param id Element ID\n * @returns The found element or null\n */\nexport function getElementById<T extends HTMLElement>(id: string): T | null {\n return document.getElementById(id) as T | null;\n}\n\n/**\n * Creates a style element with the provided CSS\n * @param css CSS content\n * @param id Optional ID for the style element\n * @returns The created style element\n */\nexport function createStyleElement(css: string, id?: string): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = css;\n\n if (id) {\n style.id = id;\n }\n\n return style;\n}\n\n/**\n * Adds a style element to the document head\n * @param css CSS content\n * @param id Optional ID for the style element\n * @returns The created style element\n */\nexport function addStyleToDocument(css: string, id?: string): HTMLStyleElement {\n const style = createStyleElement(css, id);\n document.head.appendChild(style);\n return style;\n}\n\n/**\n * Removes an element from the DOM\n * @param element Element to remove\n */\nexport function removeElement(element: HTMLElement): void {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\n/**\n * Checks if an element exists in the DOM\n * @param id Element ID\n * @returns True if the element exists\n */\nexport function elementExists(id: string): boolean {\n return !!document.getElementById(id);\n}\n","/**\n * Log levels for the SDK\n */\nexport enum LogLevel {\n DEBUG = \"debug\",\n INFO = \"info\",\n WARN = \"warn\",\n ERROR = \"error\",\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled: boolean;\n /** Minimum log level to display */\n level: LogLevel;\n /** Custom prefix for log messages */\n prefix: string;\n}\n\n/**\n * Default logger configuration\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n enabled: false,\n level: LogLevel.INFO,\n prefix: \"[OmiSDK]\",\n};\n\n/**\n * Logger class for SDK debugging\n */\nexport class Logger {\n private config: LoggerConfig;\n\n /**\n * Creates a new Logger instance\n * @param config Logger configuration\n */\n constructor(config: Partial<LoggerConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Updates the logger configuration\n * @param config New configuration\n */\n public updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Logs a debug message\n * @param message Message to log\n * @param args Additional arguments\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Logs an info message\n * @param message Message to log\n * @param args Additional arguments\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Logs a warning message\n * @param message Message to log\n * @param args Additional arguments\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Logs an error message\n * @param message Message to log\n * @param args Additional arguments\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Internal log method\n * @param level Log level\n * @param message Message to log\n * @param args Additional arguments\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n if (!this.config.enabled) return;\n\n const logLevels = Object.values(LogLevel);\n const configLevelIndex = logLevels.indexOf(this.config.level);\n const messageLevelIndex = logLevels.indexOf(level);\n\n if (messageLevelIndex < configLevelIndex) return;\n\n const formattedMessage = `${this.config.prefix} ${message}`;\n\n switch (level) {\n case LogLevel.DEBUG:\n console.debug(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n }\n }\n}\n","import { SDKTheme } from \"../types\";\nimport { addStyleToDocument } from \"./dom\";\n\n/**\n * Default theme for the SDK\n */\nexport const DEFAULT_THEME: SDKTheme = {\n primaryColor: \"#3498db\",\n secondaryColor: \"#2ecc71\",\n textColor: \"#333333\",\n backgroundColor: \"#ffffff\",\n fontFamily: \"Arial, sans-serif\",\n borderRadius: \"4px\",\n customClasses: {},\n};\n\n/**\n * Generates CSS from a theme object\n * @param theme Theme object\n * @param namespace CSS namespace for the SDK\n * @returns Generated CSS string\n */\nexport function generateThemeCSS(theme: SDKTheme, namespace: string): string {\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n\n return `\n .${namespace} {\n --primary-color: ${mergedTheme.primaryColor};\n --secondary-color: ${mergedTheme.secondaryColor};\n --text-color: ${mergedTheme.textColor};\n --background-color: ${mergedTheme.backgroundColor};\n --font-family: ${mergedTheme.fontFamily};\n --border-radius: ${mergedTheme.borderRadius};\n \n font-family: var(--font-family);\n color: var(--text-color);\n background-color: var(--background-color);\n }\n \n .${namespace} .btn {\n background-color: var(--primary-color);\n color: white;\n border: none;\n border-radius: var(--border-radius);\n padding: 8px 16px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n \n .${namespace} .btn:hover {\n background-color: var(--secondary-color);\n }\n \n .${namespace} .container {\n border-radius: var(--border-radius);\n border: 1px solid #e0e0e0;\n padding: 16px;\n margin: 8px 0;\n }\n \n .${namespace} .header {\n font-weight: bold;\n margin-bottom: 8px;\n }\n \n ${Object.entries(mergedTheme.customClasses || {})\n .map(([className, css]) => `.${namespace} .${className} { ${css} }`)\n .join(\"\\n\")}\n `;\n}\n\n/**\n * Applies a theme to the document\n * @param theme Theme object\n * @param namespace CSS namespace for the SDK\n * @returns The created style element\n */\nexport function applyTheme(\n theme: SDKTheme,\n namespace: string\n): HTMLStyleElement {\n const css = generateThemeCSS(theme, namespace);\n const styleId = `${namespace}-theme`;\n\n // Remove existing theme if present\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n return addStyleToDocument(css, styleId);\n}\n","import { EventEmitter } from \"../types\";\n\n/**\n * Simple event emitter implementation\n */\nexport class SimpleEventEmitter implements EventEmitter {\n private events: Map<string, Array<(data: any) => void>> = new Map();\n\n /**\n * Subscribe to an event\n * @param eventName Event name\n * @param callback Callback function\n */\n public on(eventName: string, callback: (data: any) => void): void {\n if (!this.events.has(eventName)) {\n this.events.set(eventName, []);\n }\n\n this.events.get(eventName)!.push(callback);\n }\n\n /**\n * Unsubscribe from an event\n * @param eventName Event name\n * @param callback Callback function\n */\n public off(eventName: string, callback: (data: any) => void): void {\n if (!this.events.has(eventName)) {\n return;\n }\n\n const callbacks = this.events.get(eventName)!;\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n this.events.delete(eventName);\n }\n }\n\n /**\n * Emit an event\n * @param eventName Event name\n * @param data Event data\n */\n public emit(eventName: string, data: any): void {\n if (!this.events.has(eventName)) {\n return;\n }\n\n const callbacks = this.events.get(eventName)!;\n\n for (const callback of callbacks) {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${eventName}\":`, error);\n }\n }\n }\n}\n","import { createElement } from \"./dom\";\nimport { SDKTheme } from \"../types\";\n\n/**\n * Default bubble CSS\n */\nconst BUBBLE_CSS = `\n .sdk-bubble {\n position: fixed;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background-color: var(--primary-color);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.3s ease;\n z-index: 9999;\n }\n\n .sdk-bubble:hover {\n transform: scale(1.1);\n background-color: var(--secondary-color);\n }\n\n .sdk-bubble-icon {\n width: 30px;\n height: 30px;\n fill: white;\n }\n\n .sdk-bubble-content {\n position: fixed;\n width: 300px;\n max-height: 400px;\n background-color: var(--background-color);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: none;\n flex-direction: column;\n z-index: 9998;\n }\n\n .sdk-bubble-content.active {\n display: flex;\n }\n\n .sdk-bubble-header {\n padding: 12px 16px;\n background-color: var(--primary-color);\n color: white;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .sdk-bubble-close {\n cursor: pointer;\n font-size: 18px;\n }\n\n .sdk-bubble-body {\n padding: 16px;\n overflow-y: auto;\n flex-grow: 1;\n }\n\n .sdk-bubble-footer {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n }\n`;\n\n/**\n * Bubble positions\n */\nconst BUBBLE_POSITIONS = {\n \"top-left\": { top: \"20px\", left: \"20px\" },\n \"top-right\": { top: \"20px\", right: \"20px\" },\n \"bottom-left\": { bottom: \"20px\", left: \"20px\" },\n \"bottom-right\": { bottom: \"20px\", right: \"20px\" },\n};\n\n/**\n * Bubble content positions\n */\nconst CONTENT_POSITIONS = {\n \"top-left\": { top: \"90px\", left: \"20px\" },\n \"top-right\": { top: \"90px\", right: \"20px\" },\n \"bottom-left\": { bottom: \"90px\", left: \"20px\" },\n \"bottom-right\": { bottom: \"90px\", right: \"20px\" },\n};\n\n/**\n * Bubble UI manager\n */\nexport class BubbleUI {\n private container: HTMLElement;\n private bubble: HTMLElement | null = null;\n private content: HTMLElement | null = null;\n private isOpen = false;\n private theme: SDKTheme;\n private position: string;\n\n /**\n * Creates a new BubbleUI instance\n * @param container Container element\n * @param theme Theme options\n */\n constructor(container: HTMLElement, theme: SDKTheme = {}) {\n this.container = container;\n this.theme = theme;\n this.position = theme.bubblePosition || \"bottom-right\";\n }\n\n /**\n * Creates and renders the bubble UI\n */\n public render(): void {\n // Create bubble button\n this.bubble = createElement<HTMLDivElement>(\"div\", { class: \"sdk-bubble\" });\n\n // Set position\n const bubblePosition =\n BUBBLE_POSITIONS[this.position as keyof typeof BUBBLE_POSITIONS];\n Object.entries(bubblePosition).forEach(([key, value]) => {\n (this.bubble!.style as any)[key] = value;\n });\n\n // Apply custom styles from theme if provided\n if (this.theme.primaryColor) {\n this.bubble.style.setProperty(\"--primary-color\", this.theme.primaryColor);\n }\n\n if (this.theme.secondaryColor) {\n this.bubble.style.setProperty(\n \"--secondary-color\",\n this.theme.secondaryColor\n );\n }\n\n // Add icon\n const icon = this.createBubbleIcon();\n this.bubble.appendChild(icon);\n\n // Create content container\n this.content = this.createContentContainer();\n\n // Add click event to bubble\n this.bubble.addEventListener(\"click\", () => this.toggleContent());\n\n // Append to container\n this.container.appendChild(this.bubble);\n this.container.appendChild(this.content);\n }\n\n /**\n * Updates the bubble UI with new content\n * @param title Content title\n * @param body Content body\n */\n public updateContent(title: string, body: string): void {\n if (!this.content) return;\n\n const headerText = this.content.querySelector(\".sdk-bubble-header-text\");\n if (headerText) {\n headerText.textContent = title;\n }\n\n const bodyElement = this.content.querySelector(\".sdk-bubble-body\");\n if (bodyElement) {\n bodyElement.innerHTML = body;\n }\n }\n\n /**\n * Shows the bubble UI\n */\n public show(): void {\n if (this.bubble) {\n this.bubble.style.display = \"flex\";\n }\n }\n\n /**\n * Hides the bubble UI\n */\n public hide(): void {\n if (this.bubble) {\n this.bubble.style.display = \"none\";\n }\n this.closeContent();\n }\n\n /**\n * Destroys the bubble UI\n */\n public destroy(): void {\n if (this.bubble && this.bubble.parentNode) {\n this.bubble.parentNode.removeChild(this.bubble);\n }\n\n if (this.content && this.content.parentNode) {\n this.content.parentNode.removeChild(this.content);\n }\n\n this.bubble = null;\n this.content = null;\n }\n\n /**\n * Creates the bubble icon\n * @returns The bubble icon element\n */\n private createBubbleIcon(): SVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"sdk-bubble-icon\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n \"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"\n );\n\n svg.appendChild(path);\n return svg;\n }\n\n /**\n * Creates the content container\n * @returns The content container element\n */\n private createContentContainer(): HTMLElement {\n const content = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-content\",\n });\n\n // Set position\n const contentPosition =\n CONTENT_POSITIONS[this.position as keyof typeof CONTENT_POSITIONS];\n Object.entries(contentPosition).forEach(([key, value]) => {\n (content.style as any)[key] = value;\n });\n\n // Create header\n const header = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-header\",\n });\n const headerText = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-header-text\" },\n [\"SDK\"]\n );\n const closeButton = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-close\" },\n [\"×\"]\n );\n\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.closeContent();\n });\n\n header.appendChild(headerText);\n header.appendChild(closeButton);\n\n // Create body\n const body = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-body\" },\n [\"SDK content goes here.\"]\n );\n\n // Create footer\n const footer = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-footer\",\n });\n\n // Assemble content\n content.appendChild(header);\n content.appendChild(body);\n content.appendChild(footer);\n\n return content;\n }\n\n /**\n * Toggles the content visibility\n */\n private toggleContent(): void {\n if (this.isOpen) {\n this.closeContent();\n } else {\n this.openContent();\n }\n }\n\n /**\n * Opens the content\n */\n private openContent(): void {\n if (!this.content) return;\n\n this.content.classList.add(\"active\");\n this.isOpen = true;\n }\n\n /**\n * Closes the content\n */\n private closeContent(): void {\n if (!this.content) return;\n\n this.content.classList.remove(\"active\");\n this.isOpen = false;\n }\n\n /**\n * Gets the bubble CSS\n * @returns The bubble CSS\n */\n public static getCSS(): string {\n return BUBBLE_CSS;\n }\n}\n","import {\n SDK,\n SDKOptions,\n AppEventType,\n CallOptions,\n LoginRequest,\n LoginSSORequest,\n SdkEvent,\n SdkResponse,\n} from \"../types\";\nimport {\n createElement,\n getElementById,\n removeElement,\n addStyleToDocument,\n} from \"../utils/dom\";\nimport { Logger, LogLevel } from \"../utils/logger\";\nimport { applyTheme } from \"../utils/theme\";\nimport { SimpleEventEmitter } from \"../utils/event-emitter\";\nimport { BubbleUI } from \"../utils/bubble\";\n\n/**\n * Default SDK options\n */\nconst DEFAULT_OPTIONS: SDKOptions = {\n targetElementId: \"omi-sdk-container\",\n mode: \"bubble\",\n debug: false,\n};\n\n/**\n * CSS namespace for the SDK\n */\nconst SDK_NAMESPACE = \"OmiSDK\";\n\n/**\n * SDK version\n */\nconst SDK_VERSION = \"0.1.0\";\n\n/**\n * Core SDK implementation\n */\nexport class OmiSDK implements SDK {\n private options: SDKOptions;\n private container: HTMLElement | null = null;\n private logger: Logger;\n private initialized = false;\n private styleElement: HTMLStyleElement | null = null;\n private eventEmitter: SimpleEventEmitter;\n private bubbleUI: BubbleUI | null = null;\n\n /**\n * Creates a new SDK instance\n * @param options SDK options\n */\n constructor(options: SDKOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.logger = new Logger({\n enabled: !!this.options.debug,\n prefix: \"[OmiSDK]\",\n level: LogLevel.DEBUG,\n });\n this.eventEmitter = new SimpleEventEmitter();\n }\n login(_: LoginRequest): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged in\" });\n }\n loginSSO(_: LoginSSORequest): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged in\" });\n }\n logout(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged out\" });\n }\n makeCall(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call made\" });\n }\n hangup(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call hung up\" });\n }\n answerCall(_: CallOptions): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call answered\" });\n }\n rejectCall(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call rejected\" });\n }\n hold(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Held\" });\n }\n unhold(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Unheld\" });\n }\n mute(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Muted\" });\n }\n unmute(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Unmuted\" });\n }\n cameraOn(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Camera on\" });\n }\n cameraOff(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Camera off\" });\n }\n transfer(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call transferred\" });\n }\n changeAgentStatus(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Agent status changed\" });\n }\n getAgentStatus(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Agent status\" });\n }\n hideBubble(): Promise<SdkResponse> {\n this.bubbleUI?.hide();\n return Promise.resolve({ success: true, message: \"Bubble hidden\" });\n }\n showBubble(): Promise<SdkResponse> {\n this.bubbleUI?.show();\n return Promise.resolve({ success: true, message: \"Bubble shown\" });\n }\n on(eventName: string, callback: (data: SdkEvent) => void): void {\n this.eventEmitter.on(eventName, callback);\n }\n off(eventName: string, callback: (data: SdkEvent) => void): void {\n this.eventEmitter.off(eventName, callback);\n }\n\n /**\n * Initializes the SDK\n * @param options SDK options\n */\n public init(options: SDKOptions = {}): void {\n if (this.initialized) {\n this.logger.warn(\"SDK is already initialized\");\n return;\n }\n\n this.updateOptions(options);\n this.logger.debug(\"Initializing SDK with options:\", this.options);\n\n try {\n // Create container if it doesn't exist\n const targetId =\n this.options.targetElementId || DEFAULT_OPTIONS.targetElementId!;\n let targetElement = getElementById<HTMLElement>(targetId);\n\n if (!targetElement) {\n this.logger.debug(\n `Target element with ID \"${targetId}\" not found, creating it`\n );\n targetElement = createElement<HTMLElement>(\"div\", { id: targetId });\n document.body.appendChild(targetElement);\n }\n\n // Create SDK container\n this.container = createElement<HTMLElement>(\"div\", {\n class: SDK_NAMESPACE,\n \"data-version\": SDK_VERSION,\n \"data-mode\": this.options.mode || DEFAULT_OPTIONS.mode!,\n });\n\n targetElement.appendChild(this.container);\n\n // Apply theme\n if (this.options.theme) {\n this.styleElement = applyTheme(this.options.theme, SDK_NAMESPACE);\n }\n\n // Initialize UI based on mode\n this.initializeUI();\n\n this.initialized = true;\n this.logger.info(\"SDK initialized successfully\");\n\n // Emit ready event\n setTimeout(() => {\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"ready\",\n type: AppEventType.READY,\n message: \"SDK initialized successfully\",\n timestamp: Date.now(),\n });\n }, 0);\n } catch (error) {\n this.logger.error(\"Failed to initialize SDK:\", error);\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"error\",\n type: AppEventType.ERROR,\n message: \"Failed to initialize SDK\",\n error: error,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Destroys the SDK instance\n */\n public destroy(): void {\n if (!this.initialized) {\n this.logger.warn(\"SDK is not initialized\");\n return;\n }\n\n this.logger.debug(\"Destroying SDK\");\n\n try {\n // Destroy bubble UI\n if (this.bubbleUI) {\n this.bubbleUI.destroy();\n this.bubbleUI = null;\n }\n\n // Remove container\n if (this.container) {\n removeElement(this.container);\n this.container = null;\n }\n\n // Remove style element\n if (this.styleElement) {\n removeElement(this.styleElement);\n this.styleElement = null;\n }\n\n this.initialized = false;\n this.logger.info(\"SDK destroyed successfully\");\n } catch (error) {\n this.logger.error(\"Failed to destroy SDK:\", error);\n\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"error\",\n type: AppEventType.ERROR,\n message: \"Failed to destroy SDK\",\n error: error,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Updates SDK options\n * @param options New options\n */\n public updateOptions(options: Partial<SDKOptions>): void {\n const previousMode = this.options.mode;\n this.options = { ...this.options, ...options };\n\n // Update logger config\n this.logger.updateConfig({\n enabled: !!this.options.debug,\n });\n\n this.logger.debug(\"Options updated:\", this.options);\n\n // Update theme if initialized\n if (this.initialized && this.options.theme) {\n this.styleElement = applyTheme(this.options.theme, SDK_NAMESPACE);\n }\n\n // Update mode if changed and initialized\n if (this.initialized && previousMode !== this.options.mode) {\n this.initializeUI();\n }\n }\n\n /**\n * Gets the SDK version\n * @returns SDK version\n */\n public getVersion(): string {\n return SDK_VERSION;\n }\n\n /**\n * Gets the current SDK options\n * @returns SDK options\n */\n public getOptions(): SDKOptions {\n return { ...this.options };\n }\n /**\n * Initializes the UI based on the mode\n */\n private initializeUI(): void {\n if (!this.container) return;\n\n // Clear container\n this.container.innerHTML = \"\";\n\n // Remove any existing bubble UI\n if (this.bubbleUI) {\n this.bubbleUI.destroy();\n this.bubbleUI = null;\n }\n\n if (this.options.mode === \"bubble\") {\n // Add bubble CSS if in bubble mode\n const bubbleCSS = BubbleUI.getCSS();\n addStyleToDocument(bubbleCSS, `${SDK_NAMESPACE}-bubble-style`);\n\n // Create bubble UI\n this.bubbleUI = new BubbleUI(this.container, this.options.theme);\n this.bubbleUI.render();\n this.bubbleUI.updateContent(\"SDK\", \"Connected and ready to use.\");\n } else {\n // In \"none\" mode, we don't render any UI\n this.logger.debug(\"SDK initialized in headless mode\");\n\n // Remove bubble CSS if it exists\n const existingStyle = document.getElementById(\n `${SDK_NAMESPACE}-bubble-style`\n );\n if (existingStyle && existingStyle.parentNode) {\n existingStyle.parentNode.removeChild(existingStyle);\n }\n }\n }\n}\n","import { OmiSDK } from \"./core/sdk\";\nimport type {\n SDK,\n SDKAction,\n SDKOptions,\n SDKTheme,\n SDKMode,\n SocketEvent,\n EventEmitter,\n} from \"./types\";\n\n// Export types\nexport type {\n SDK,\n SDKAction,\n SDKOptions,\n SDKTheme,\n SDKMode,\n SocketEvent,\n EventEmitter,\n};\n\n// Create a singleton instance\nconst sdkInstance = new OmiSDK();\n\n// Auto-initialize if the script is loaded with data-auto-init attribute\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const scriptTag = document.querySelector(\"script[data-auto-init]\");\n\n if (scriptTag) {\n // Get options from data attributes\n const options: SDKOptions = {};\n\n const targetElementId = scriptTag.getAttribute(\"data-target-element-id\");\n if (targetElementId) {\n options.targetElementId = targetElementId;\n }\n\n const mode = scriptTag.getAttribute(\"data-mode\") as SDKMode | null;\n if (mode && (mode === \"none\" || mode === \"bubble\")) {\n options.mode = mode;\n }\n\n const baseUrl = scriptTag.getAttribute(\"data-base-url\");\n if (baseUrl) {\n options.baseUrl = baseUrl;\n }\n\n const debug = scriptTag.getAttribute(\"data-debug\") === \"true\";\n if (debug) {\n options.debug = debug;\n }\n\n // Initialize SDK\n sdkInstance.init(options);\n }\n});\n\n// Export the SDK instance\nexport default sdkInstance;\n\n// Also export the SDK class for custom instantiation\nexport { OmiSDK };\n"],"names":["AppEventType","LogLevel"],"mappings":"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"}
1
+ {"version":3,"file":"omisdk.es.js","sources":["../src/types/index.ts","../src/utils/dom.ts","../src/utils/logger.ts","../src/utils/theme.ts","../src/utils/event-emitter.ts","../src/utils/bubble.ts","../src/core/sdk.ts","../src/index.ts"],"sourcesContent":["/**\n * Configuration options for the SDK\n */\nexport interface SDKOptions {\n /** Target element ID where the SDK will be mounted */\n targetElementId?: string;\n /** Display mode for the SDK: 'none' (headless) or 'bubble' (UI visible) */\n mode?: SDKMode;\n /** Custom theme for the SDK */\n theme?: SDKTheme;\n /** Socket URL for real-time communication */\n baseUrl?: string;\n /** Debug mode flag */\n debug?: boolean;\n}\n\n/**\n * SDK display modes\n */\nexport type SDKMode = \"none\" | \"bubble\";\n\n/**\n * Theme options for customizing the SDK appearance\n */\nexport interface SDKTheme {\n /** Primary color */\n primaryColor?: string;\n /** Secondary color */\n secondaryColor?: string;\n /** Text color */\n textColor?: string;\n /** Background color */\n backgroundColor?: string;\n /** Font family */\n fontFamily?: string;\n /** Border radius for elements */\n borderRadius?: string;\n /** Bubble position (for bubble mode) */\n bubblePosition?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Custom CSS classes */\n customClasses?: Record<string, string>;\n}\n\n/**\n * Action event data\n */\nexport interface SDKAction {\n /** Type of action */\n type: string;\n /** Payload data for the action */\n payload?: any;\n /** Timestamp when the action occurred */\n timestamp: number;\n}\n\n/**\n * Socket event data\n */\nexport interface SocketEvent {\n /** Event name */\n name: string;\n /** Event data */\n data?: any;\n /** Timestamp when the event occurred */\n timestamp: number;\n}\n\n/**\n * Socket connection states\n */\nexport enum SocketConnectionState {\n DISCONNECTED = \"disconnected\",\n CONNECTING = \"connecting\",\n CONNECTED = \"connected\",\n RECONNECTING = \"reconnecting\",\n RECONNECTION_FAILED = \"reconnection_failed\",\n}\n\n/**\n * Socket options for configuration\n */\nexport interface SocketOptions {\n /** Whether to enable reconnection */\n reconnection?: boolean;\n /** Maximum number of reconnection attempts */\n reconnectionAttempts?: number;\n /** Delay between reconnection attempts in milliseconds */\n reconnectionDelay?: number;\n /** Connection timeout in milliseconds */\n timeout?: number;\n /** Whether to connect automatically on initialization */\n autoConnect?: boolean;\n}\n\n/**\n * Event emitter interface\n */\nexport interface EventEmitter {\n /** Subscribe to an event */\n on(eventName: string, callback: (data: any) => void): void;\n /** Unsubscribe from an event */\n off(eventName: string, callback: (data: any) => void): void;\n /** Emit an event */\n emit(eventName: string, data: any): void;\n}\n\nexport interface LoginRequest {\n tenantId: number;\n username: string;\n password: string;\n}\n\nexport interface LoginSSORequest {\n ssoToken: string;\n organization: string;\n}\n\nexport interface SdkResponse {\n success: boolean;\n message: string;\n data?: any;\n}\n\nexport interface CallOptions {\n did?: string;\n enableVideo?: boolean;\n remoteVideoId?: string;\n localVideoId?: string;\n extraVariables?: Record<string, string>;\n}\n\nexport interface SdkEvent {\n name: string;\n type?: any;\n timestamp: number;\n}\n\nexport enum CallEventType {\n CALL_INCOMING = \"call_incoming\",\n CALL_OUTGOING = \"call_outgoing\",\n CALL_HANGUP = \"call_hangup\",\n CALL_ANSWERED = \"call_answered\",\n CALL_REJECTED = \"call_rejected\",\n CALL_HOLD = \"call_hold\",\n CALL_UNHOLD = \"call_unhold\",\n CALL_MUTE = \"call_mute\",\n CALL_UNMUTE = \"call_unmute\",\n CALL_TRANSFER = \"call_transfer\",\n CALL_STATUS_CHANGE = \"call_status_change\",\n}\n\nexport interface CallEvent extends SdkEvent {\n type: CallEventType;\n senderId: string;\n applicationId: string;\n}\n\nexport enum AgentStatusEventType {\n AGENT_STATUS_CHANGE = \"agent_status_change\",\n}\n\nexport interface AgentStatusEvent extends SdkEvent {\n type: AgentStatusEventType;\n status: string;\n agentId: string;\n tenantId: string;\n changeTime: number;\n reasonCode: string;\n reasonCodeId: number;\n}\n\nexport enum AppEventType {\n READY = \"ready\",\n DISPLAY_CHANGED = \"display_changed\",\n BUBBLE_HIDDEN = \"bubble_hidden\",\n BUBBLE_SHOWN = \"bubble_shown\",\n LOGGED_IN = \"logged_in\",\n LOGGED_OUT = \"logged_out\",\n TOKEN_EXPIRED = \"token_expired\",\n ERROR = \"error\",\n}\n\nexport interface AppEvent extends SdkEvent {\n type: AppEventType;\n message: string;\n error?: Error;\n}\n\nexport interface InteractionEvent extends SdkEvent {\n type: InteractionEventType;\n message: string;\n senderId: string;\n applicationId: string;\n conversationId: string;\n}\n\nexport enum InteractionEventType {\n NEW_CONVERSATION = \"new_conversation\",\n NEW_MESSAGE = \"new_message\",\n CLOSE_CONVERSATION = \"close_conversation\",\n MESSAGE_RECEIVED = \"message_received\",\n MESSAGE_SENT = \"message_sent\",\n MESSAGE_DELIVERED = \"message_delivered\",\n MESSAGE_READ = \"message_read\",\n CONVERSATION_ENDED = \"conversation_ended\",\n}\n/**\n * SDK instance interface\n */\nexport interface SDK {\n /** Initialize the SDK with options */\n init(options?: SDKOptions): void;\n /** Login with username and password **/\n login(request: LoginRequest): Promise<SdkResponse>;\n /** Login with SSO token**/\n loginSSO(request: LoginSSORequest): Promise<SdkResponse>;\n /** Logout the current user**/\n logout(): Promise<SdkResponse>;\n /** Make a call to a destination**/\n makeCall(destination: string, options?: CallOptions): Promise<SdkResponse>;\n /** Hangup the current call**/\n hangup(): Promise<SdkResponse>;\n /** Answer an incoming call**/\n answerCall(options?: CallOptions): Promise<SdkResponse>;\n /** Reject an incoming call**/\n rejectCall(): Promise<SdkResponse>;\n /** Hold the current call**/\n hold(): Promise<SdkResponse>;\n /** Resume the current call**/\n unhold(): Promise<SdkResponse>;\n /** Mute the current call**/\n mute(): Promise<SdkResponse>;\n /** Unmute the current call**/\n unmute(): Promise<SdkResponse>;\n /** Turn on the camera**/\n cameraOn(): Promise<SdkResponse>;\n /** Turn off the camera**/\n cameraOff(): Promise<SdkResponse>;\n /** Transfer the current call to a different destination**/\n transfer(destination: string): Promise<SdkResponse>;\n /** Change the agent status**/\n changeAgentStatus(status: string): Promise<SdkResponse>;\n /** Get the agent status**/\n getAgentStatus(): Promise<SdkResponse>;\n /** Hide the bubble**/\n hideBubble(): Promise<SdkResponse>;\n /** Show the bubble**/\n showBubble(): Promise<SdkResponse>;\n /** Destroy the SDK instance and clean up resources */\n destroy(): void;\n /** Update SDK options */\n updateOptions(options: Partial<SDKOptions>): void;\n /** Get the current SDK version */\n getVersion(): string;\n /** Get the current SDK options */\n getOptions(): SDKOptions;\n /** Subscribe to an event */\n on(eventName: string, callback: (data: SdkEvent) => void): void;\n /** Unsubscribe from an event */\n off(eventName: string, callback: (data: SdkEvent) => void): void;\n}\n","/**\n * Creates a DOM element with the specified attributes and properties\n * @param tag HTML tag name\n * @param attributes Element attributes\n * @param children Child elements or text content\n * @returns The created DOM element\n */\nexport function createElement<T extends HTMLElement>(\n tag: string,\n attributes: Record<string, string> = {},\n children: (HTMLElement | string)[] = []\n): T {\n const element = document.createElement(tag) as T;\n\n // Set attributes\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n\n // Append children\n children.forEach((child) => {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n });\n\n return element;\n}\n\n/**\n * Finds an element in the DOM by its ID\n * @param id Element ID\n * @returns The found element or null\n */\nexport function getElementById<T extends HTMLElement>(id: string): T | null {\n return document.getElementById(id) as T | null;\n}\n\n/**\n * Creates a style element with the provided CSS\n * @param css CSS content\n * @param id Optional ID for the style element\n * @returns The created style element\n */\nexport function createStyleElement(css: string, id?: string): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = css;\n\n if (id) {\n style.id = id;\n }\n\n return style;\n}\n\n/**\n * Adds a style element to the document head\n * @param css CSS content\n * @param id Optional ID for the style element\n * @returns The created style element\n */\nexport function addStyleToDocument(css: string, id?: string): HTMLStyleElement {\n const style = createStyleElement(css, id);\n document.head.appendChild(style);\n return style;\n}\n\n/**\n * Removes an element from the DOM\n * @param element Element to remove\n */\nexport function removeElement(element: HTMLElement): void {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\n/**\n * Checks if an element exists in the DOM\n * @param id Element ID\n * @returns True if the element exists\n */\nexport function elementExists(id: string): boolean {\n return !!document.getElementById(id);\n}\n","/**\n * Log levels for the SDK\n */\nexport enum LogLevel {\n DEBUG = \"debug\",\n INFO = \"info\",\n WARN = \"warn\",\n ERROR = \"error\",\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled: boolean;\n /** Minimum log level to display */\n level: LogLevel;\n /** Custom prefix for log messages */\n prefix: string;\n}\n\n/**\n * Default logger configuration\n */\nconst DEFAULT_CONFIG: LoggerConfig = {\n enabled: false,\n level: LogLevel.INFO,\n prefix: \"[OmiSDK]\",\n};\n\n/**\n * Logger class for SDK debugging\n */\nexport class Logger {\n private config: LoggerConfig;\n\n /**\n * Creates a new Logger instance\n * @param config Logger configuration\n */\n constructor(config: Partial<LoggerConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Updates the logger configuration\n * @param config New configuration\n */\n public updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Logs a debug message\n * @param message Message to log\n * @param args Additional arguments\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Logs an info message\n * @param message Message to log\n * @param args Additional arguments\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Logs a warning message\n * @param message Message to log\n * @param args Additional arguments\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Logs an error message\n * @param message Message to log\n * @param args Additional arguments\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Internal log method\n * @param level Log level\n * @param message Message to log\n * @param args Additional arguments\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n if (!this.config.enabled) return;\n\n const logLevels = Object.values(LogLevel);\n const configLevelIndex = logLevels.indexOf(this.config.level);\n const messageLevelIndex = logLevels.indexOf(level);\n\n if (messageLevelIndex < configLevelIndex) return;\n\n const formattedMessage = `${this.config.prefix} ${message}`;\n\n switch (level) {\n case LogLevel.DEBUG:\n console.debug(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n }\n }\n}\n","import { SDKTheme } from \"../types\";\nimport { addStyleToDocument } from \"./dom\";\n\n/**\n * Default theme for the SDK\n */\nexport const DEFAULT_THEME: SDKTheme = {\n primaryColor: \"#3498db\",\n secondaryColor: \"#2ecc71\",\n textColor: \"#333333\",\n backgroundColor: \"#ffffff\",\n fontFamily: \"Arial, sans-serif\",\n borderRadius: \"4px\",\n customClasses: {},\n};\n\n/**\n * Generates CSS from a theme object\n * @param theme Theme object\n * @param namespace CSS namespace for the SDK\n * @returns Generated CSS string\n */\nexport function generateThemeCSS(theme: SDKTheme, namespace: string): string {\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n\n return `\n .${namespace} {\n --primary-color: ${mergedTheme.primaryColor};\n --secondary-color: ${mergedTheme.secondaryColor};\n --text-color: ${mergedTheme.textColor};\n --background-color: ${mergedTheme.backgroundColor};\n --font-family: ${mergedTheme.fontFamily};\n --border-radius: ${mergedTheme.borderRadius};\n \n font-family: var(--font-family);\n color: var(--text-color);\n background-color: var(--background-color);\n }\n \n .${namespace} .btn {\n background-color: var(--primary-color);\n color: white;\n border: none;\n border-radius: var(--border-radius);\n padding: 8px 16px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n \n .${namespace} .btn:hover {\n background-color: var(--secondary-color);\n }\n \n .${namespace} .container {\n border-radius: var(--border-radius);\n border: 1px solid #e0e0e0;\n padding: 16px;\n margin: 8px 0;\n }\n \n .${namespace} .header {\n font-weight: bold;\n margin-bottom: 8px;\n }\n \n ${Object.entries(mergedTheme.customClasses || {})\n .map(([className, css]) => `.${namespace} .${className} { ${css} }`)\n .join(\"\\n\")}\n `;\n}\n\n/**\n * Applies a theme to the document\n * @param theme Theme object\n * @param namespace CSS namespace for the SDK\n * @returns The created style element\n */\nexport function applyTheme(\n theme: SDKTheme,\n namespace: string\n): HTMLStyleElement {\n const css = generateThemeCSS(theme, namespace);\n const styleId = `${namespace}-theme`;\n\n // Remove existing theme if present\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n return addStyleToDocument(css, styleId);\n}\n","import { EventEmitter } from \"../types\";\n\n/**\n * Simple event emitter implementation\n */\nexport class SimpleEventEmitter implements EventEmitter {\n private events: Map<string, Array<(data: any) => void>> = new Map();\n\n /**\n * Subscribe to an event\n * @param eventName Event name\n * @param callback Callback function\n */\n public on(eventName: string, callback: (data: any) => void): void {\n if (!this.events.has(eventName)) {\n this.events.set(eventName, []);\n }\n\n this.events.get(eventName)!.push(callback);\n }\n\n /**\n * Unsubscribe from an event\n * @param eventName Event name\n * @param callback Callback function\n */\n public off(eventName: string, callback: (data: any) => void): void {\n if (!this.events.has(eventName)) {\n return;\n }\n\n const callbacks = this.events.get(eventName)!;\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n this.events.delete(eventName);\n }\n }\n\n /**\n * Emit an event\n * @param eventName Event name\n * @param data Event data\n */\n public emit(eventName: string, data: any): void {\n if (!this.events.has(eventName)) {\n return;\n }\n\n const callbacks = this.events.get(eventName)!;\n\n for (const callback of callbacks) {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${eventName}\":`, error);\n }\n }\n }\n}\n","import { createElement } from \"./dom\";\nimport { SDKTheme } from \"../types\";\n\n/**\n * Default bubble CSS\n */\nconst BUBBLE_CSS = `\n .sdk-bubble {\n position: fixed;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background-color: var(--primary-color);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.3s ease;\n z-index: 9999;\n }\n\n .sdk-bubble:hover {\n transform: scale(1.1);\n background-color: var(--secondary-color);\n }\n\n .sdk-bubble-icon {\n width: 30px;\n height: 30px;\n fill: white;\n }\n\n .sdk-bubble-content {\n position: fixed;\n width: 300px;\n max-height: 400px;\n background-color: var(--background-color);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: none;\n flex-direction: column;\n z-index: 9998;\n }\n\n .sdk-bubble-content.active {\n display: flex;\n }\n\n .sdk-bubble-header {\n padding: 12px 16px;\n background-color: var(--primary-color);\n color: white;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .sdk-bubble-close {\n cursor: pointer;\n font-size: 18px;\n }\n\n .sdk-bubble-body {\n padding: 16px;\n overflow-y: auto;\n flex-grow: 1;\n }\n\n .sdk-bubble-footer {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n }\n`;\n\n/**\n * Bubble positions\n */\nconst BUBBLE_POSITIONS = {\n \"top-left\": { top: \"20px\", left: \"20px\" },\n \"top-right\": { top: \"20px\", right: \"20px\" },\n \"bottom-left\": { bottom: \"20px\", left: \"20px\" },\n \"bottom-right\": { bottom: \"20px\", right: \"20px\" },\n};\n\n/**\n * Bubble content positions\n */\nconst CONTENT_POSITIONS = {\n \"top-left\": { top: \"90px\", left: \"20px\" },\n \"top-right\": { top: \"90px\", right: \"20px\" },\n \"bottom-left\": { bottom: \"90px\", left: \"20px\" },\n \"bottom-right\": { bottom: \"90px\", right: \"20px\" },\n};\n\n/**\n * Bubble UI manager\n */\nexport class BubbleUI {\n private container: HTMLElement;\n private bubble: HTMLElement | null = null;\n private content: HTMLElement | null = null;\n private isOpen = false;\n private theme: SDKTheme;\n private position: string;\n\n /**\n * Creates a new BubbleUI instance\n * @param container Container element\n * @param theme Theme options\n */\n constructor(container: HTMLElement, theme: SDKTheme = {}) {\n this.container = container;\n this.theme = theme;\n this.position = theme.bubblePosition || \"bottom-right\";\n }\n\n /**\n * Creates and renders the bubble UI\n */\n public render(): void {\n // Create bubble button\n this.bubble = createElement<HTMLDivElement>(\"div\", { class: \"sdk-bubble\" });\n\n // Set position\n const bubblePosition =\n BUBBLE_POSITIONS[this.position as keyof typeof BUBBLE_POSITIONS];\n Object.entries(bubblePosition).forEach(([key, value]) => {\n (this.bubble!.style as any)[key] = value;\n });\n\n // Apply custom styles from theme if provided\n if (this.theme.primaryColor) {\n this.bubble.style.setProperty(\"--primary-color\", this.theme.primaryColor);\n }\n\n if (this.theme.secondaryColor) {\n this.bubble.style.setProperty(\n \"--secondary-color\",\n this.theme.secondaryColor\n );\n }\n\n // Add icon\n const icon = this.createBubbleIcon();\n this.bubble.appendChild(icon);\n\n // Create content container\n this.content = this.createContentContainer();\n\n // Add click event to bubble\n this.bubble.addEventListener(\"click\", () => this.toggleContent());\n\n // Append to container\n this.container.appendChild(this.bubble);\n this.container.appendChild(this.content);\n }\n\n /**\n * Updates the bubble UI with new content\n * @param title Content title\n * @param body Content body\n */\n public updateContent(title: string, body: string): void {\n if (!this.content) return;\n\n const headerText = this.content.querySelector(\".sdk-bubble-header-text\");\n if (headerText) {\n headerText.textContent = title;\n }\n\n const bodyElement = this.content.querySelector(\".sdk-bubble-body\");\n if (bodyElement) {\n bodyElement.innerHTML = body;\n }\n }\n\n /**\n * Shows the bubble UI\n */\n public show(): void {\n if (this.bubble) {\n this.bubble.style.display = \"flex\";\n }\n }\n\n /**\n * Hides the bubble UI\n */\n public hide(): void {\n if (this.bubble) {\n this.bubble.style.display = \"none\";\n }\n this.closeContent();\n }\n\n /**\n * Destroys the bubble UI\n */\n public destroy(): void {\n if (this.bubble && this.bubble.parentNode) {\n this.bubble.parentNode.removeChild(this.bubble);\n }\n\n if (this.content && this.content.parentNode) {\n this.content.parentNode.removeChild(this.content);\n }\n\n this.bubble = null;\n this.content = null;\n }\n\n /**\n * Creates the bubble icon\n * @returns The bubble icon element\n */\n private createBubbleIcon(): SVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"sdk-bubble-icon\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n \"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"\n );\n\n svg.appendChild(path);\n return svg;\n }\n\n /**\n * Creates the content container\n * @returns The content container element\n */\n private createContentContainer(): HTMLElement {\n const content = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-content\",\n });\n\n // Set position\n const contentPosition =\n CONTENT_POSITIONS[this.position as keyof typeof CONTENT_POSITIONS];\n Object.entries(contentPosition).forEach(([key, value]) => {\n (content.style as any)[key] = value;\n });\n\n // Create header\n const header = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-header\",\n });\n const headerText = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-header-text\" },\n [\"SDK\"]\n );\n const closeButton = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-close\" },\n [\"×\"]\n );\n\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.closeContent();\n });\n\n header.appendChild(headerText);\n header.appendChild(closeButton);\n\n // Create body\n const body = createElement<HTMLDivElement>(\n \"div\",\n { class: \"sdk-bubble-body\" },\n [\"SDK content goes here.\"]\n );\n\n // Create footer\n const footer = createElement<HTMLDivElement>(\"div\", {\n class: \"sdk-bubble-footer\",\n });\n\n // Assemble content\n content.appendChild(header);\n content.appendChild(body);\n content.appendChild(footer);\n\n return content;\n }\n\n /**\n * Toggles the content visibility\n */\n private toggleContent(): void {\n if (this.isOpen) {\n this.closeContent();\n } else {\n this.openContent();\n }\n }\n\n /**\n * Opens the content\n */\n private openContent(): void {\n if (!this.content) return;\n\n this.content.classList.add(\"active\");\n this.isOpen = true;\n }\n\n /**\n * Closes the content\n */\n private closeContent(): void {\n if (!this.content) return;\n\n this.content.classList.remove(\"active\");\n this.isOpen = false;\n }\n\n /**\n * Gets the bubble CSS\n * @returns The bubble CSS\n */\n public static getCSS(): string {\n return BUBBLE_CSS;\n }\n}\n","import {\n SDK,\n SDKOptions,\n AppEventType,\n CallOptions,\n LoginRequest,\n LoginSSORequest,\n SdkEvent,\n SdkResponse,\n} from \"../types\";\nimport {\n createElement,\n getElementById,\n removeElement,\n addStyleToDocument,\n} from \"../utils/dom\";\nimport { Logger, LogLevel } from \"../utils/logger\";\nimport { applyTheme } from \"../utils/theme\";\nimport { SimpleEventEmitter } from \"../utils/event-emitter\";\nimport { BubbleUI } from \"../utils/bubble\";\n\n/**\n * Default SDK options\n */\nconst DEFAULT_OPTIONS: SDKOptions = {\n targetElementId: \"omi-sdk-container\",\n mode: \"bubble\",\n debug: false,\n};\n\n/**\n * CSS namespace for the SDK\n */\nconst SDK_NAMESPACE = \"OmiSDK\";\n\n/**\n * SDK version\n */\nconst SDK_VERSION = \"0.1.1\";\n\n/**\n * Core SDK implementation\n */\nexport class OmiSDK implements SDK {\n private options: SDKOptions;\n private container: HTMLElement | null = null;\n private logger: Logger;\n private initialized = false;\n private styleElement: HTMLStyleElement | null = null;\n private eventEmitter: SimpleEventEmitter;\n private bubbleUI: BubbleUI | null = null;\n\n /**\n * Creates a new SDK instance\n * @param options SDK options\n */\n constructor(options: SDKOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.logger = new Logger({\n enabled: !!this.options.debug,\n prefix: \"[OmiSDK]\",\n level: LogLevel.DEBUG,\n });\n this.eventEmitter = new SimpleEventEmitter();\n }\n login(_: LoginRequest): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged in\" });\n }\n loginSSO(_: LoginSSORequest): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged in\" });\n }\n logout(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Logged out\" });\n }\n makeCall(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call made\" });\n }\n hangup(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call hung up\" });\n }\n answerCall(_: CallOptions): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call answered\" });\n }\n rejectCall(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call rejected\" });\n }\n hold(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Held\" });\n }\n unhold(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Unheld\" });\n }\n mute(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Muted\" });\n }\n unmute(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Unmuted\" });\n }\n cameraOn(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Camera on\" });\n }\n cameraOff(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Camera off\" });\n }\n transfer(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Call transferred\" });\n }\n changeAgentStatus(_: string): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Agent status changed\" });\n }\n getAgentStatus(): Promise<SdkResponse> {\n return Promise.resolve({ success: true, message: \"Agent status\" });\n }\n hideBubble(): Promise<SdkResponse> {\n this.bubbleUI?.hide();\n return Promise.resolve({ success: true, message: \"Bubble hidden\" });\n }\n showBubble(): Promise<SdkResponse> {\n this.bubbleUI?.show();\n return Promise.resolve({ success: true, message: \"Bubble shown\" });\n }\n on(eventName: string, callback: (data: SdkEvent) => void): void {\n this.eventEmitter.on(eventName, callback);\n }\n off(eventName: string, callback: (data: SdkEvent) => void): void {\n this.eventEmitter.off(eventName, callback);\n }\n\n /**\n * Initializes the SDK\n * @param options SDK options\n */\n public init(options: SDKOptions = {}): void {\n if (this.initialized) {\n this.logger.warn(\"SDK is already initialized\");\n return;\n }\n\n this.updateOptions(options);\n this.logger.debug(\"Initializing SDK with options:\", this.options);\n\n try {\n // Create container if it doesn't exist\n const targetId =\n this.options.targetElementId || DEFAULT_OPTIONS.targetElementId!;\n let targetElement = getElementById<HTMLElement>(targetId);\n\n if (!targetElement) {\n this.logger.debug(\n `Target element with ID \"${targetId}\" not found, creating it`\n );\n targetElement = createElement<HTMLElement>(\"div\", { id: targetId });\n document.body.appendChild(targetElement);\n }\n\n // Create SDK container\n this.container = createElement<HTMLElement>(\"div\", {\n class: SDK_NAMESPACE,\n \"data-version\": SDK_VERSION,\n \"data-mode\": this.options.mode || DEFAULT_OPTIONS.mode!,\n });\n\n targetElement.appendChild(this.container);\n\n // Apply theme\n if (this.options.theme) {\n this.styleElement = applyTheme(this.options.theme, SDK_NAMESPACE);\n }\n\n // Initialize UI based on mode\n this.initializeUI();\n\n this.initialized = true;\n this.logger.info(\"SDK initialized successfully\");\n\n // Emit ready event\n setTimeout(() => {\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"ready\",\n type: AppEventType.READY,\n message: \"SDK initialized successfully\",\n timestamp: Date.now(),\n });\n }, 0);\n } catch (error) {\n this.logger.error(\"Failed to initialize SDK:\", error);\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"error\",\n type: AppEventType.ERROR,\n message: \"Failed to initialize SDK\",\n error: error,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Destroys the SDK instance\n */\n public destroy(): void {\n if (!this.initialized) {\n this.logger.warn(\"SDK is not initialized\");\n return;\n }\n\n this.logger.debug(\"Destroying SDK\");\n\n try {\n // Destroy bubble UI\n if (this.bubbleUI) {\n this.bubbleUI.destroy();\n this.bubbleUI = null;\n }\n\n // Remove container\n if (this.container) {\n removeElement(this.container);\n this.container = null;\n }\n\n // Remove style element\n if (this.styleElement) {\n removeElement(this.styleElement);\n this.styleElement = null;\n }\n\n this.initialized = false;\n this.logger.info(\"SDK destroyed successfully\");\n } catch (error) {\n this.logger.error(\"Failed to destroy SDK:\", error);\n\n this.eventEmitter.emit(\"AppEvent\", {\n name: \"error\",\n type: AppEventType.ERROR,\n message: \"Failed to destroy SDK\",\n error: error,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Updates SDK options\n * @param options New options\n */\n public updateOptions(options: Partial<SDKOptions>): void {\n const previousMode = this.options.mode;\n this.options = { ...this.options, ...options };\n\n // Update logger config\n this.logger.updateConfig({\n enabled: !!this.options.debug,\n });\n\n this.logger.debug(\"Options updated:\", this.options);\n\n // Update theme if initialized\n if (this.initialized && this.options.theme) {\n this.styleElement = applyTheme(this.options.theme, SDK_NAMESPACE);\n }\n\n // Update mode if changed and initialized\n if (this.initialized && previousMode !== this.options.mode) {\n this.initializeUI();\n }\n }\n\n /**\n * Gets the SDK version\n * @returns SDK version\n */\n public getVersion(): string {\n return SDK_VERSION;\n }\n\n /**\n * Gets the current SDK options\n * @returns SDK options\n */\n public getOptions(): SDKOptions {\n return { ...this.options };\n }\n /**\n * Initializes the UI based on the mode\n */\n private initializeUI(): void {\n if (!this.container) return;\n\n // Clear container\n this.container.innerHTML = \"\";\n\n // Remove any existing bubble UI\n if (this.bubbleUI) {\n this.bubbleUI.destroy();\n this.bubbleUI = null;\n }\n\n if (this.options.mode === \"bubble\") {\n // Add bubble CSS if in bubble mode\n const bubbleCSS = BubbleUI.getCSS();\n addStyleToDocument(bubbleCSS, `${SDK_NAMESPACE}-bubble-style`);\n\n // Create bubble UI\n this.bubbleUI = new BubbleUI(this.container, this.options.theme);\n this.bubbleUI.render();\n this.bubbleUI.updateContent(\"SDK\", \"Connected and ready to use.\");\n } else {\n // In \"none\" mode, we don't render any UI\n this.logger.debug(\"SDK initialized in headless mode\");\n\n // Remove bubble CSS if it exists\n const existingStyle = document.getElementById(\n `${SDK_NAMESPACE}-bubble-style`\n );\n if (existingStyle && existingStyle.parentNode) {\n existingStyle.parentNode.removeChild(existingStyle);\n }\n }\n }\n}\n","import { OmiSDK } from \"./core/sdk\";\nimport type {\n SDK,\n SDKAction,\n SDKOptions,\n SDKTheme,\n SDKMode,\n SocketEvent,\n EventEmitter,\n SocketConnectionState,\n SocketOptions,\n LoginRequest,\n LoginSSORequest,\n SdkResponse,\n CallOptions,\n SdkEvent,\n CallEventType,\n CallEvent,\n AgentStatusEventType,\n AgentStatusEvent,\n AppEventType,\n AppEvent,\n InteractionEvent,\n InteractionEventType,\n} from \"./types\";\n\n// Export types\nexport type {\n SDK,\n SDKAction,\n SDKOptions,\n SDKTheme,\n SDKMode,\n SocketEvent,\n EventEmitter,\n SocketConnectionState,\n SocketOptions,\n LoginRequest,\n LoginSSORequest,\n SdkResponse,\n CallOptions,\n SdkEvent,\n CallEventType,\n CallEvent,\n AgentStatusEventType,\n AgentStatusEvent,\n AppEventType,\n AppEvent,\n InteractionEvent,\n InteractionEventType,\n};\n\n// Create a singleton instance\nconst sdkInstance = new OmiSDK();\n\n// Auto-initialize if the script is loaded with data-auto-init attribute\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const scriptTag = document.querySelector(\"script[data-auto-init]\");\n\n if (scriptTag) {\n // Get options from data attributes\n const options: SDKOptions = {};\n\n const targetElementId = scriptTag.getAttribute(\"data-target-element-id\");\n if (targetElementId) {\n options.targetElementId = targetElementId;\n }\n\n const mode = scriptTag.getAttribute(\"data-mode\") as SDKMode | null;\n if (mode && (mode === \"none\" || mode === \"bubble\")) {\n options.mode = mode;\n }\n\n const baseUrl = scriptTag.getAttribute(\"data-base-url\");\n if (baseUrl) {\n options.baseUrl = baseUrl;\n }\n\n const debug = scriptTag.getAttribute(\"data-debug\") === \"true\";\n if (debug) {\n options.debug = debug;\n }\n\n // Initialize SDK\n sdkInstance.init(options);\n }\n});\n\n// Export the SDK instance\nexport default sdkInstance;\n\n// Also export the SDK class for custom instantiation\nexport { OmiSDK };\n"],"names":["AppEventType","LogLevel"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var omisdk=function(e){"use strict";var t=Object.defineProperty,n=(e,n,s)=>((e,n,s)=>n in e?t(e,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[n]=s)(e,"symbol"!=typeof n?n+"":n,s),s=(e=>(e.READY="ready",e.DISPLAY_CHANGED="display_changed",e.BUBBLE_HIDDEN="bubble_hidden",e.BUBBLE_SHOWN="bubble_shown",e.LOGGED_IN="logged_in",e.LOGGED_OUT="logged_out",e.TOKEN_EXPIRED="token_expired",e.ERROR="error",e))(s||{});function o(e,t={},n=[]){const s=document.createElement(e);return Object.entries(t).forEach((([e,t])=>{s.setAttribute(e,t)})),n.forEach((e=>{"string"==typeof e?s.appendChild(document.createTextNode(e)):s.appendChild(e)})),s}function i(e,t){const n=function(e,t){const n=document.createElement("style");return n.textContent=e,t&&(n.id=t),n}(e,t);return document.head.appendChild(n),n}function r(e){e&&e.parentNode&&e.parentNode.removeChild(e)}var l=(e=>(e.DEBUG="debug",e.INFO="info",e.WARN="warn",e.ERROR="error",e))(l||{});const a={enabled:!1,level:"info",prefix:"[OmiSDK]"};class d{constructor(e={}){n(this,"config"),this.config={...a,...e}}updateConfig(e){this.config={...this.config,...e}}debug(e,...t){this.log("debug",e,...t)}info(e,...t){this.log("info",e,...t)}warn(e,...t){this.log("warn",e,...t)}error(e,...t){this.log("error",e,...t)}log(e,t,...n){if(!this.config.enabled)return;const s=Object.values(l),o=s.indexOf(this.config.level);if(s.indexOf(e)<o)return;const i=`${this.config.prefix} ${t}`;switch(e){case"debug":console.debug(i,...n);break;case"info":console.info(i,...n);break;case"warn":console.warn(i,...n);break;case"error":console.error(i,...n)}}}const c={primaryColor:"#3498db",secondaryColor:"#2ecc71",textColor:"#333333",backgroundColor:"#ffffff",fontFamily:"Arial, sans-serif",borderRadius:"4px",customClasses:{}};function b(e,t){const n=function(e,t){const n={...c,...e};return`\n .${t} {\n --primary-color: ${n.primaryColor};\n --secondary-color: ${n.secondaryColor};\n --text-color: ${n.textColor};\n --background-color: ${n.backgroundColor};\n --font-family: ${n.fontFamily};\n --border-radius: ${n.borderRadius};\n \n font-family: var(--font-family);\n color: var(--text-color);\n background-color: var(--background-color);\n }\n \n .${t} .btn {\n background-color: var(--primary-color);\n color: white;\n border: none;\n border-radius: var(--border-radius);\n padding: 8px 16px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n \n .${t} .btn:hover {\n background-color: var(--secondary-color);\n }\n \n .${t} .container {\n border-radius: var(--border-radius);\n border: 1px solid #e0e0e0;\n padding: 16px;\n margin: 8px 0;\n }\n \n .${t} .header {\n font-weight: bold;\n margin-bottom: 8px;\n }\n \n ${Object.entries(n.customClasses||{}).map((([e,n])=>`.${t} .${e} { ${n} }`)).join("\n")}\n `}(e,t),s=`${t}-theme`,o=document.getElementById(s);return o&&o.remove(),i(n,s)}class h{constructor(){n(this,"events",new Map)}on(e,t){this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t)}off(e,t){if(!this.events.has(e))return;const n=this.events.get(e),s=n.indexOf(t);-1!==s&&n.splice(s,1),0===n.length&&this.events.delete(e)}emit(e,t){if(!this.events.has(e))return;const n=this.events.get(e);for(const o of n)try{o(t)}catch(s){console.error(`Error in event listener for "${e}":`,s)}}}const u={"top-left":{top:"20px",left:"20px"},"top-right":{top:"20px",right:"20px"},"bottom-left":{bottom:"20px",left:"20px"},"bottom-right":{bottom:"20px",right:"20px"}},p={"top-left":{top:"90px",left:"20px"},"top-right":{top:"90px",right:"20px"},"bottom-left":{bottom:"90px",left:"20px"},"bottom-right":{bottom:"90px",right:"20px"}};class g{constructor(e,t={}){n(this,"container"),n(this,"bubble",null),n(this,"content",null),n(this,"isOpen",!1),n(this,"theme"),n(this,"position"),this.container=e,this.theme=t,this.position=t.bubblePosition||"bottom-right"}render(){this.bubble=o("div",{class:"sdk-bubble"});const e=u[this.position];Object.entries(e).forEach((([e,t])=>{this.bubble.style[e]=t})),this.theme.primaryColor&&this.bubble.style.setProperty("--primary-color",this.theme.primaryColor),this.theme.secondaryColor&&this.bubble.style.setProperty("--secondary-color",this.theme.secondaryColor);const t=this.createBubbleIcon();this.bubble.appendChild(t),this.content=this.createContentContainer(),this.bubble.addEventListener("click",(()=>this.toggleContent())),this.container.appendChild(this.bubble),this.container.appendChild(this.content)}updateContent(e,t){if(!this.content)return;const n=this.content.querySelector(".sdk-bubble-header-text");n&&(n.textContent=e);const s=this.content.querySelector(".sdk-bubble-body");s&&(s.innerHTML=t)}show(){this.bubble&&(this.bubble.style.display="flex")}hide(){this.bubble&&(this.bubble.style.display="none"),this.closeContent()}destroy(){this.bubble&&this.bubble.parentNode&&this.bubble.parentNode.removeChild(this.bubble),this.content&&this.content.parentNode&&this.content.parentNode.removeChild(this.content),this.bubble=null,this.content=null}createBubbleIcon(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("class","sdk-bubble-icon"),e.setAttribute("viewBox","0 0 24 24");const t=document.createElementNS("http://www.w3.org/2000/svg","path");return t.setAttribute("d","M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z"),e.appendChild(t),e}createContentContainer(){const e=o("div",{class:"sdk-bubble-content"}),t=p[this.position];Object.entries(t).forEach((([t,n])=>{e.style[t]=n}));const n=o("div",{class:"sdk-bubble-header"}),s=o("div",{class:"sdk-bubble-header-text"},["SDK"]),i=o("div",{class:"sdk-bubble-close"},["×"]);i.addEventListener("click",(e=>{e.stopPropagation(),this.closeContent()})),n.appendChild(s),n.appendChild(i);const r=o("div",{class:"sdk-bubble-body"},["SDK content goes here."]),l=o("div",{class:"sdk-bubble-footer"});return e.appendChild(n),e.appendChild(r),e.appendChild(l),e}toggleContent(){this.isOpen?this.closeContent():this.openContent()}openContent(){this.content&&(this.content.classList.add("active"),this.isOpen=!0)}closeContent(){this.content&&(this.content.classList.remove("active"),this.isOpen=!1)}static getCSS(){return"\n .sdk-bubble {\n position: fixed;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background-color: var(--primary-color);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.3s ease;\n z-index: 9999;\n }\n\n .sdk-bubble:hover {\n transform: scale(1.1);\n background-color: var(--secondary-color);\n }\n\n .sdk-bubble-icon {\n width: 30px;\n height: 30px;\n fill: white;\n }\n\n .sdk-bubble-content {\n position: fixed;\n width: 300px;\n max-height: 400px;\n background-color: var(--background-color);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: none;\n flex-direction: column;\n z-index: 9998;\n }\n\n .sdk-bubble-content.active {\n display: flex;\n }\n\n .sdk-bubble-header {\n padding: 12px 16px;\n background-color: var(--primary-color);\n color: white;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .sdk-bubble-close {\n cursor: pointer;\n font-size: 18px;\n }\n\n .sdk-bubble-body {\n padding: 16px;\n overflow-y: auto;\n flex-grow: 1;\n }\n\n .sdk-bubble-footer {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n }\n"}}const m={targetElementId:"omi-sdk-container",mode:"bubble",debug:!1},f="OmiSDK",v="0.1.0";class y{constructor(e={}){n(this,"options"),n(this,"container",null),n(this,"logger"),n(this,"initialized",!1),n(this,"styleElement",null),n(this,"eventEmitter"),n(this,"bubbleUI",null),this.options={...m,...e},this.logger=new d({enabled:!!this.options.debug,prefix:"[OmiSDK]",level:l.DEBUG}),this.eventEmitter=new h}login(e){return Promise.resolve({success:!0,message:"Logged in"})}loginSSO(e){return Promise.resolve({success:!0,message:"Logged in"})}logout(){return Promise.resolve({success:!0,message:"Logged out"})}makeCall(e){return Promise.resolve({success:!0,message:"Call made"})}hangup(){return Promise.resolve({success:!0,message:"Call hung up"})}answerCall(e){return Promise.resolve({success:!0,message:"Call answered"})}rejectCall(){return Promise.resolve({success:!0,message:"Call rejected"})}hold(){return Promise.resolve({success:!0,message:"Held"})}unhold(){return Promise.resolve({success:!0,message:"Unheld"})}mute(){return Promise.resolve({success:!0,message:"Muted"})}unmute(){return Promise.resolve({success:!0,message:"Unmuted"})}cameraOn(){return Promise.resolve({success:!0,message:"Camera on"})}cameraOff(){return Promise.resolve({success:!0,message:"Camera off"})}transfer(e){return Promise.resolve({success:!0,message:"Call transferred"})}changeAgentStatus(e){return Promise.resolve({success:!0,message:"Agent status changed"})}getAgentStatus(){return Promise.resolve({success:!0,message:"Agent status"})}hideBubble(){var e;return null==(e=this.bubbleUI)||e.hide(),Promise.resolve({success:!0,message:"Bubble hidden"})}showBubble(){var e;return null==(e=this.bubbleUI)||e.show(),Promise.resolve({success:!0,message:"Bubble shown"})}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}init(e={}){if(this.initialized)this.logger.warn("SDK is already initialized");else{this.updateOptions(e),this.logger.debug("Initializing SDK with options:",this.options);try{const e=this.options.targetElementId||m.targetElementId;let n=(t=e,document.getElementById(t));n||(this.logger.debug(`Target element with ID "${e}" not found, creating it`),n=o("div",{id:e}),document.body.appendChild(n)),this.container=o("div",{class:f,"data-version":v,"data-mode":this.options.mode||m.mode}),n.appendChild(this.container),this.options.theme&&(this.styleElement=b(this.options.theme,f)),this.initializeUI(),this.initialized=!0,this.logger.info("SDK initialized successfully"),setTimeout((()=>{this.eventEmitter.emit("AppEvent",{name:"ready",type:s.READY,message:"SDK initialized successfully",timestamp:Date.now()})}),0)}catch(n){this.logger.error("Failed to initialize SDK:",n),this.eventEmitter.emit("AppEvent",{name:"error",type:s.ERROR,message:"Failed to initialize SDK",error:n,timestamp:Date.now()})}var t}}destroy(){if(this.initialized){this.logger.debug("Destroying SDK");try{this.bubbleUI&&(this.bubbleUI.destroy(),this.bubbleUI=null),this.container&&(r(this.container),this.container=null),this.styleElement&&(r(this.styleElement),this.styleElement=null),this.initialized=!1,this.logger.info("SDK destroyed successfully")}catch(e){this.logger.error("Failed to destroy SDK:",e),this.eventEmitter.emit("AppEvent",{name:"error",type:s.ERROR,message:"Failed to destroy SDK",error:e,timestamp:Date.now()})}}else this.logger.warn("SDK is not initialized")}updateOptions(e){const t=this.options.mode;this.options={...this.options,...e},this.logger.updateConfig({enabled:!!this.options.debug}),this.logger.debug("Options updated:",this.options),this.initialized&&this.options.theme&&(this.styleElement=b(this.options.theme,f)),this.initialized&&t!==this.options.mode&&this.initializeUI()}getVersion(){return v}getOptions(){return{...this.options}}initializeUI(){if(this.container)if(this.container.innerHTML="",this.bubbleUI&&(this.bubbleUI.destroy(),this.bubbleUI=null),"bubble"===this.options.mode){i(g.getCSS(),`${f}-bubble-style`),this.bubbleUI=new g(this.container,this.options.theme),this.bubbleUI.render(),this.bubbleUI.updateContent("SDK","Connected and ready to use.")}else{this.logger.debug("SDK initialized in headless mode");const e=document.getElementById(`${f}-bubble-style`);e&&e.parentNode&&e.parentNode.removeChild(e)}}}const x=new y;return document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("script[data-auto-init]");if(e){const t={},n=e.getAttribute("data-target-element-id");n&&(t.targetElementId=n);const s=e.getAttribute("data-mode");!s||"none"!==s&&"bubble"!==s||(t.mode=s);const o=e.getAttribute("data-base-url");o&&(t.baseUrl=o);const i="true"===e.getAttribute("data-debug");i&&(t.debug=i),x.init(t)}})),e.OmiSDK=y,e.default=x,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),e}({});
1
+ var omisdk=function(e){"use strict";var t=Object.defineProperty,n=(e,n,s)=>((e,n,s)=>n in e?t(e,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[n]=s)(e,"symbol"!=typeof n?n+"":n,s),s=(e=>(e.READY="ready",e.DISPLAY_CHANGED="display_changed",e.BUBBLE_HIDDEN="bubble_hidden",e.BUBBLE_SHOWN="bubble_shown",e.LOGGED_IN="logged_in",e.LOGGED_OUT="logged_out",e.TOKEN_EXPIRED="token_expired",e.ERROR="error",e))(s||{});function o(e,t={},n=[]){const s=document.createElement(e);return Object.entries(t).forEach((([e,t])=>{s.setAttribute(e,t)})),n.forEach((e=>{"string"==typeof e?s.appendChild(document.createTextNode(e)):s.appendChild(e)})),s}function i(e,t){const n=function(e,t){const n=document.createElement("style");return n.textContent=e,t&&(n.id=t),n}(e,t);return document.head.appendChild(n),n}function r(e){e&&e.parentNode&&e.parentNode.removeChild(e)}var l=(e=>(e.DEBUG="debug",e.INFO="info",e.WARN="warn",e.ERROR="error",e))(l||{});const a={enabled:!1,level:"info",prefix:"[OmiSDK]"};class d{constructor(e={}){n(this,"config"),this.config={...a,...e}}updateConfig(e){this.config={...this.config,...e}}debug(e,...t){this.log("debug",e,...t)}info(e,...t){this.log("info",e,...t)}warn(e,...t){this.log("warn",e,...t)}error(e,...t){this.log("error",e,...t)}log(e,t,...n){if(!this.config.enabled)return;const s=Object.values(l),o=s.indexOf(this.config.level);if(s.indexOf(e)<o)return;const i=`${this.config.prefix} ${t}`;switch(e){case"debug":console.debug(i,...n);break;case"info":console.info(i,...n);break;case"warn":console.warn(i,...n);break;case"error":console.error(i,...n)}}}const c={primaryColor:"#3498db",secondaryColor:"#2ecc71",textColor:"#333333",backgroundColor:"#ffffff",fontFamily:"Arial, sans-serif",borderRadius:"4px",customClasses:{}};function b(e,t){const n=function(e,t){const n={...c,...e};return`\n .${t} {\n --primary-color: ${n.primaryColor};\n --secondary-color: ${n.secondaryColor};\n --text-color: ${n.textColor};\n --background-color: ${n.backgroundColor};\n --font-family: ${n.fontFamily};\n --border-radius: ${n.borderRadius};\n \n font-family: var(--font-family);\n color: var(--text-color);\n background-color: var(--background-color);\n }\n \n .${t} .btn {\n background-color: var(--primary-color);\n color: white;\n border: none;\n border-radius: var(--border-radius);\n padding: 8px 16px;\n cursor: pointer;\n transition: background-color 0.3s ease;\n }\n \n .${t} .btn:hover {\n background-color: var(--secondary-color);\n }\n \n .${t} .container {\n border-radius: var(--border-radius);\n border: 1px solid #e0e0e0;\n padding: 16px;\n margin: 8px 0;\n }\n \n .${t} .header {\n font-weight: bold;\n margin-bottom: 8px;\n }\n \n ${Object.entries(n.customClasses||{}).map((([e,n])=>`.${t} .${e} { ${n} }`)).join("\n")}\n `}(e,t),s=`${t}-theme`,o=document.getElementById(s);return o&&o.remove(),i(n,s)}class h{constructor(){n(this,"events",new Map)}on(e,t){this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t)}off(e,t){if(!this.events.has(e))return;const n=this.events.get(e),s=n.indexOf(t);-1!==s&&n.splice(s,1),0===n.length&&this.events.delete(e)}emit(e,t){if(!this.events.has(e))return;const n=this.events.get(e);for(const o of n)try{o(t)}catch(s){console.error(`Error in event listener for "${e}":`,s)}}}const u={"top-left":{top:"20px",left:"20px"},"top-right":{top:"20px",right:"20px"},"bottom-left":{bottom:"20px",left:"20px"},"bottom-right":{bottom:"20px",right:"20px"}},p={"top-left":{top:"90px",left:"20px"},"top-right":{top:"90px",right:"20px"},"bottom-left":{bottom:"90px",left:"20px"},"bottom-right":{bottom:"90px",right:"20px"}};class g{constructor(e,t={}){n(this,"container"),n(this,"bubble",null),n(this,"content",null),n(this,"isOpen",!1),n(this,"theme"),n(this,"position"),this.container=e,this.theme=t,this.position=t.bubblePosition||"bottom-right"}render(){this.bubble=o("div",{class:"sdk-bubble"});const e=u[this.position];Object.entries(e).forEach((([e,t])=>{this.bubble.style[e]=t})),this.theme.primaryColor&&this.bubble.style.setProperty("--primary-color",this.theme.primaryColor),this.theme.secondaryColor&&this.bubble.style.setProperty("--secondary-color",this.theme.secondaryColor);const t=this.createBubbleIcon();this.bubble.appendChild(t),this.content=this.createContentContainer(),this.bubble.addEventListener("click",(()=>this.toggleContent())),this.container.appendChild(this.bubble),this.container.appendChild(this.content)}updateContent(e,t){if(!this.content)return;const n=this.content.querySelector(".sdk-bubble-header-text");n&&(n.textContent=e);const s=this.content.querySelector(".sdk-bubble-body");s&&(s.innerHTML=t)}show(){this.bubble&&(this.bubble.style.display="flex")}hide(){this.bubble&&(this.bubble.style.display="none"),this.closeContent()}destroy(){this.bubble&&this.bubble.parentNode&&this.bubble.parentNode.removeChild(this.bubble),this.content&&this.content.parentNode&&this.content.parentNode.removeChild(this.content),this.bubble=null,this.content=null}createBubbleIcon(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("class","sdk-bubble-icon"),e.setAttribute("viewBox","0 0 24 24");const t=document.createElementNS("http://www.w3.org/2000/svg","path");return t.setAttribute("d","M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z"),e.appendChild(t),e}createContentContainer(){const e=o("div",{class:"sdk-bubble-content"}),t=p[this.position];Object.entries(t).forEach((([t,n])=>{e.style[t]=n}));const n=o("div",{class:"sdk-bubble-header"}),s=o("div",{class:"sdk-bubble-header-text"},["SDK"]),i=o("div",{class:"sdk-bubble-close"},["×"]);i.addEventListener("click",(e=>{e.stopPropagation(),this.closeContent()})),n.appendChild(s),n.appendChild(i);const r=o("div",{class:"sdk-bubble-body"},["SDK content goes here."]),l=o("div",{class:"sdk-bubble-footer"});return e.appendChild(n),e.appendChild(r),e.appendChild(l),e}toggleContent(){this.isOpen?this.closeContent():this.openContent()}openContent(){this.content&&(this.content.classList.add("active"),this.isOpen=!0)}closeContent(){this.content&&(this.content.classList.remove("active"),this.isOpen=!1)}static getCSS(){return"\n .sdk-bubble {\n position: fixed;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background-color: var(--primary-color);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.3s ease;\n z-index: 9999;\n }\n\n .sdk-bubble:hover {\n transform: scale(1.1);\n background-color: var(--secondary-color);\n }\n\n .sdk-bubble-icon {\n width: 30px;\n height: 30px;\n fill: white;\n }\n\n .sdk-bubble-content {\n position: fixed;\n width: 300px;\n max-height: 400px;\n background-color: var(--background-color);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: none;\n flex-direction: column;\n z-index: 9998;\n }\n\n .sdk-bubble-content.active {\n display: flex;\n }\n\n .sdk-bubble-header {\n padding: 12px 16px;\n background-color: var(--primary-color);\n color: white;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .sdk-bubble-close {\n cursor: pointer;\n font-size: 18px;\n }\n\n .sdk-bubble-body {\n padding: 16px;\n overflow-y: auto;\n flex-grow: 1;\n }\n\n .sdk-bubble-footer {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n }\n"}}const m={targetElementId:"omi-sdk-container",mode:"bubble",debug:!1},f="OmiSDK",v="0.1.1";class y{constructor(e={}){n(this,"options"),n(this,"container",null),n(this,"logger"),n(this,"initialized",!1),n(this,"styleElement",null),n(this,"eventEmitter"),n(this,"bubbleUI",null),this.options={...m,...e},this.logger=new d({enabled:!!this.options.debug,prefix:"[OmiSDK]",level:l.DEBUG}),this.eventEmitter=new h}login(e){return Promise.resolve({success:!0,message:"Logged in"})}loginSSO(e){return Promise.resolve({success:!0,message:"Logged in"})}logout(){return Promise.resolve({success:!0,message:"Logged out"})}makeCall(e){return Promise.resolve({success:!0,message:"Call made"})}hangup(){return Promise.resolve({success:!0,message:"Call hung up"})}answerCall(e){return Promise.resolve({success:!0,message:"Call answered"})}rejectCall(){return Promise.resolve({success:!0,message:"Call rejected"})}hold(){return Promise.resolve({success:!0,message:"Held"})}unhold(){return Promise.resolve({success:!0,message:"Unheld"})}mute(){return Promise.resolve({success:!0,message:"Muted"})}unmute(){return Promise.resolve({success:!0,message:"Unmuted"})}cameraOn(){return Promise.resolve({success:!0,message:"Camera on"})}cameraOff(){return Promise.resolve({success:!0,message:"Camera off"})}transfer(e){return Promise.resolve({success:!0,message:"Call transferred"})}changeAgentStatus(e){return Promise.resolve({success:!0,message:"Agent status changed"})}getAgentStatus(){return Promise.resolve({success:!0,message:"Agent status"})}hideBubble(){var e;return null==(e=this.bubbleUI)||e.hide(),Promise.resolve({success:!0,message:"Bubble hidden"})}showBubble(){var e;return null==(e=this.bubbleUI)||e.show(),Promise.resolve({success:!0,message:"Bubble shown"})}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}init(e={}){if(this.initialized)this.logger.warn("SDK is already initialized");else{this.updateOptions(e),this.logger.debug("Initializing SDK with options:",this.options);try{const e=this.options.targetElementId||m.targetElementId;let n=(t=e,document.getElementById(t));n||(this.logger.debug(`Target element with ID "${e}" not found, creating it`),n=o("div",{id:e}),document.body.appendChild(n)),this.container=o("div",{class:f,"data-version":v,"data-mode":this.options.mode||m.mode}),n.appendChild(this.container),this.options.theme&&(this.styleElement=b(this.options.theme,f)),this.initializeUI(),this.initialized=!0,this.logger.info("SDK initialized successfully"),setTimeout((()=>{this.eventEmitter.emit("AppEvent",{name:"ready",type:s.READY,message:"SDK initialized successfully",timestamp:Date.now()})}),0)}catch(n){this.logger.error("Failed to initialize SDK:",n),this.eventEmitter.emit("AppEvent",{name:"error",type:s.ERROR,message:"Failed to initialize SDK",error:n,timestamp:Date.now()})}var t}}destroy(){if(this.initialized){this.logger.debug("Destroying SDK");try{this.bubbleUI&&(this.bubbleUI.destroy(),this.bubbleUI=null),this.container&&(r(this.container),this.container=null),this.styleElement&&(r(this.styleElement),this.styleElement=null),this.initialized=!1,this.logger.info("SDK destroyed successfully")}catch(e){this.logger.error("Failed to destroy SDK:",e),this.eventEmitter.emit("AppEvent",{name:"error",type:s.ERROR,message:"Failed to destroy SDK",error:e,timestamp:Date.now()})}}else this.logger.warn("SDK is not initialized")}updateOptions(e){const t=this.options.mode;this.options={...this.options,...e},this.logger.updateConfig({enabled:!!this.options.debug}),this.logger.debug("Options updated:",this.options),this.initialized&&this.options.theme&&(this.styleElement=b(this.options.theme,f)),this.initialized&&t!==this.options.mode&&this.initializeUI()}getVersion(){return v}getOptions(){return{...this.options}}initializeUI(){if(this.container)if(this.container.innerHTML="",this.bubbleUI&&(this.bubbleUI.destroy(),this.bubbleUI=null),"bubble"===this.options.mode){i(g.getCSS(),`${f}-bubble-style`),this.bubbleUI=new g(this.container,this.options.theme),this.bubbleUI.render(),this.bubbleUI.updateContent("SDK","Connected and ready to use.")}else{this.logger.debug("SDK initialized in headless mode");const e=document.getElementById(`${f}-bubble-style`);e&&e.parentNode&&e.parentNode.removeChild(e)}}}const x=new y;return document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("script[data-auto-init]");if(e){const t={},n=e.getAttribute("data-target-element-id");n&&(t.targetElementId=n);const s=e.getAttribute("data-mode");!s||"none"!==s&&"bubble"!==s||(t.mode=s);const o=e.getAttribute("data-base-url");o&&(t.baseUrl=o);const i="true"===e.getAttribute("data-debug");i&&(t.debug=i),x.init(t)}})),e.OmiSDK=y,e.default=x,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),e}({});
2
2
  //# sourceMappingURL=omisdk.iife.js.map