@aakash58/chatbot 1.0.77 β 1.0.78
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.
|
@@ -667,7 +667,14 @@ class ThemeService {
|
|
|
667
667
|
const body = document.body;
|
|
668
668
|
const html = document.documentElement;
|
|
669
669
|
// Check for common class names
|
|
670
|
-
const darkClasses = [
|
|
670
|
+
const darkClasses = [
|
|
671
|
+
'dark',
|
|
672
|
+
'dark-theme',
|
|
673
|
+
'dark-mode',
|
|
674
|
+
'night-mode',
|
|
675
|
+
'data-bs-theme-light',
|
|
676
|
+
'data-bs-theme-dark',
|
|
677
|
+
];
|
|
671
678
|
const hasDarkClass = (el) => darkClasses.some((c) => el.classList.contains(c));
|
|
672
679
|
if (hasDarkClass(body) || hasDarkClass(html))
|
|
673
680
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aakash58-chatbot.mjs","sources":["../../../projects/doohbot/src/lib/model/doohbot.intents.ts","../../../projects/doohbot/src/lib/model/api-config.model.ts","../../../projects/doohbot/src/lib/core/services/tenant-context.service.ts","../../../projects/doohbot/src/lib/core/services/doohbot-api.service.ts","../../../projects/doohbot/src/lib/components/message-input/messaging.service.ts","../../../projects/doohbot/src/lib/core/services/theme.service.ts","../../../projects/doohbot/src/lib/constant/constant.ts","../../../projects/doohbot/src/lib/inputs/doohbot-input.ts","../../../projects/doohbot/src/lib/helpers/predefined_messages.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.html","../../../projects/doohbot/src/lib/shared/chips/chips.component.ts","../../../projects/doohbot/src/lib/shared/chips/chips.component.html","../../../projects/doohbot/src/lib/components/message-list/message-list.component.ts","../../../projects/doohbot/src/lib/components/message-list/message-list.component.html","../../../projects/doohbot/src/lib/components/message-input/message-input.component.ts","../../../projects/doohbot/src/lib/components/message-input/message-input.component.html","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.html","../../../projects/doohbot/src/lib/directives/draggable/draggable-dialog.directive.ts","../../../projects/doohbot/src/lib/directives/resizable/resizable-dialog.directive.ts","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.ts","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.html","../../../projects/doohbot/src/lib/core/environments/environment.ts","../../../projects/doohbot/src/lib/core/app-const.ts","../../../projects/doohbot/src/lib/core/services/http.service.ts","../../../projects/doohbot/src/lib/core/services/account.service.ts","../../../projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts","../../../projects/doohbot/src/lib/core/services/auth.service.ts","../../../projects/doohbot/src/lib/doohbot.component.ts","../../../projects/doohbot/src/lib/doohbot.component.html","../../../projects/doohbot/src/lib/model/token.ts","../../../projects/doohbot/src/public-api.ts","../../../projects/doohbot/src/aakash58-chatbot.ts"],"sourcesContent":["import { ChatIntent } from './message';\r\n\r\nexport const CHAT_INTENTS: ChatIntent[] = [\r\n {\r\n patterns: ['hello', 'hi', 'hey', 'greetings', 'good morning', 'good afternoon', 'good evening'],\r\n response: 'πHello! How can I help you today?',\r\n },\r\n {\r\n patterns: ['how are you', 'how are you doing'],\r\n response: \"I'm just a bot, but I'm doing great! How about you?\",\r\n },\r\n {\r\n patterns: ['help', 'support', 'problem', 'about', 'issue', 'question', 'assist', 'Contact'],\r\n response: 'Sure! Please tell me your issue, and I will try to assist you.',\r\n },\r\n {\r\n patterns: ['bye', 'goodbye', 'see you', 'thanks', 'thank you', 'bye bye', 'see you later'],\r\n response: 'Goodbye! Have a nice day!',\r\n },\r\n {\r\n patterns: ['news and updates', 'updates', 'news', 'new'],\r\n response: 'Stay tuned for the latest news and updates from our team!',\r\n },\r\n];\r\n","import { InjectionToken } from '@angular/core';\r\nimport { environment } from '../core/environments/environment.prod';\r\n\r\n/**\r\n * Configuration for Doohbot API integration\r\n */\r\nexport interface DoohbotApiConfig {\r\n /**\r\n * Backend API endpoint URL\r\n * Example: 'https://api.example.com/chat'\r\n */\r\n apiUrl: string;\r\n\r\n /**\r\n * Optional API key for authentication\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000 (30 seconds)\r\n */\r\n timeout?: number;\r\n\r\n /**\r\n * Enable API mode (true) or use local intent matching (false)\r\n * @default false\r\n */\r\n enableApi?: boolean;\r\n\r\n /**\r\n * Include message history in API requests\r\n * @default false\r\n */\r\n includeHistory?: boolean;\r\n\r\n /**\r\n * Maximum number of history messages to include in requests\r\n * @default 10\r\n */\r\n maxHistoryMessages?: number;\r\n\r\n /**\r\n * Custom headers to include in API requests\r\n */\r\n customHeaders?: Record<string, string>;\r\n\r\n /**\r\n * Enable retry on failure\r\n * @default true\r\n */\r\n enableRetry?: boolean;\r\n\r\n /**\r\n * Number of retry attempts\r\n * @default 2\r\n */\r\n retryAttempts?: number;\r\n\r\n /**\r\n * Delay between retries in milliseconds\r\n * @default 1000\r\n */\r\n retryDelay?: number;\r\n}\r\n\r\n/**\r\n * Injection token for providing Doohbot API configuration\r\n */\r\nexport const DOOHBOT_API_CONFIG = new InjectionToken<DoohbotApiConfig>('DOOHBOT_API_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({\r\n apiUrl: '',\r\n timeout: 30000,\r\n enableApi: false,\r\n includeHistory: false,\r\n maxHistoryMessages: 10,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n }),\r\n});\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface ChatContext {\r\n platformTenant: string;\r\n subTenant: string;\r\n agent: string;\r\n}\r\n\r\nexport interface ContextChangeEvent {\r\n previous: ChatContext | null;\r\n current: ChatContext;\r\n contextKey: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TenantContextService {\r\n // Current context state\r\n private platformTenant = signal<string>('');\r\n private subTenant = signal<string>('');\r\n private agent = signal<string>('');\r\n\r\n // Computed context object\r\n public currentContext = computed<ChatContext>(() => ({\r\n platformTenant: this.platformTenant(),\r\n subTenant: this.subTenant(),\r\n agent: this.agent(),\r\n }));\r\n\r\n // Computed unique context key for storage\r\n public contextKey = computed<string>(() => {\r\n const pt = this.platformTenant() || 'default';\r\n const st = this.subTenant() || 'default';\r\n const ag = this.agent() || 'default';\r\n return `${pt}_${st}_${ag}`;\r\n });\r\n\r\n // Observable for context changes\r\n private contextChangeSubject = new Subject<ContextChangeEvent>();\r\n public contextChange$ = this.contextChangeSubject.asObservable();\r\n\r\n private previousContext: ChatContext | null = null;\r\n\r\n constructor() {\r\n // Effect to emit context changes\r\n effect(() => {\r\n const current = this.currentContext();\r\n const key = this.contextKey();\r\n\r\n // Only emit if context actually changed\r\n if (this.hasContextChanged(current)) {\r\n this.contextChangeSubject.next({\r\n previous: this.previousContext,\r\n current: current,\r\n contextKey: key,\r\n });\r\n this.previousContext = { ...current };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the complete context\r\n */\r\n public setContext(context: Partial<ChatContext>): void {\r\n if (context.platformTenant !== undefined) {\r\n this.platformTenant.set(context.platformTenant);\r\n }\r\n if (context.subTenant !== undefined) {\r\n this.subTenant.set(context.subTenant);\r\n }\r\n if (context.agent !== undefined) {\r\n this.agent.set(context.agent);\r\n }\r\n }\r\n\r\n /**\r\n * Update individual context properties\r\n */\r\n public setPlatformTenant(platformTenant: string): void {\r\n this.platformTenant.set(platformTenant);\r\n }\r\n\r\n public setSubTenant(subTenant: string): void {\r\n this.subTenant.set(subTenant);\r\n }\r\n\r\n public setAgent(agent: string): void {\r\n this.agent.set(agent);\r\n }\r\n\r\n /**\r\n * Get current context values\r\n */\r\n public getPlatformTenant(): string {\r\n return this.platformTenant();\r\n }\r\n\r\n public getSubTenant(): string {\r\n return this.subTenant();\r\n }\r\n\r\n public getAgent(): string {\r\n return this.agent();\r\n }\r\n\r\n public getContextKey(): string {\r\n return this.contextKey();\r\n }\r\n\r\n public getContext(): ChatContext {\r\n return this.currentContext();\r\n }\r\n\r\n /**\r\n * Check if context has changed\r\n */\r\n private hasContextChanged(current: ChatContext): boolean {\r\n if (!this.previousContext) {\r\n // First time initialization - only emit if we have valid values\r\n return current.platformTenant !== '' || current.subTenant !== '' || current.agent !== '';\r\n }\r\n\r\n return (\r\n this.previousContext.platformTenant !== current.platformTenant ||\r\n this.previousContext.subTenant !== current.subTenant ||\r\n this.previousContext.agent !== current.agent\r\n );\r\n }\r\n\r\n /**\r\n * Reset context to default\r\n */\r\n public resetContext(): void {\r\n this.platformTenant.set('');\r\n this.subTenant.set('');\r\n this.agent.set('');\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, timer } from 'rxjs';\r\nimport { catchError, retry, timeout, map } from 'rxjs/operators';\r\nimport { DOOHBOT_API_CONFIG, DoohbotApiConfig } from '../../model/api-config.model';\r\nimport { ChatApiRequest, ChatApiResponse, ChatApiError } from '../../model/api-request.model';\r\nimport { Message } from '../../model/message';\r\nimport { TenantContextService } from './tenant-context.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatbotApiService {\r\n private http = inject(HttpClient);\r\n private tenantContext = inject(TenantContextService);\r\n private config = inject(DOOHBOT_API_CONFIG);\r\n\r\n /**\r\n * Send a chat message to the API\r\n * @param message User's message text\r\n * @param history Optional message history for context\r\n * @returns Observable of the API response\r\n */\r\n sendMessage(message: string, history?: Message[]): Observable<ChatApiResponse> {\r\n if (!this.config.apiUrl) {\r\n return throwError(\r\n () =>\r\n ({\r\n message: 'API URL not configured',\r\n code: 'CONFIG_ERROR',\r\n }) as ChatApiError,\r\n );\r\n }\r\n\r\n // Build request payload with tenant context\r\n const request = this.buildRequest(message, history);\r\n\r\n // Build headers\r\n const headers = this.buildHeaders();\r\n\r\n // Configure timeout\r\n const timeoutMs = this.config.timeout || 30000;\r\n\r\n // Make HTTP request\r\n return this.http.post<ChatApiResponse>(this.config.apiUrl, request, { headers }).pipe(\r\n timeout(timeoutMs),\r\n this.applyRetryStrategy(),\r\n map((response) => this.validateResponse(response)),\r\n catchError((error) => this.handleError(error)),\r\n );\r\n }\r\n\r\n /**\r\n * Build request payload with current tenant context\r\n */\r\n private buildRequest(message: string, history?: Message[]): ChatApiRequest {\r\n const context = this.tenantContext.getContext();\r\n\r\n const request: ChatApiRequest = {\r\n message,\r\n platformTenant: context.platformTenant,\r\n subTenant: context.subTenant,\r\n agent: context.agent,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Include history if enabled and provided\r\n if (this.config.includeHistory && history && history.length > 0) {\r\n const maxMessages = this.config.maxHistoryMessages || 10;\r\n request.history = history.slice(-maxMessages);\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Build HTTP headers\r\n */\r\n private buildHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n });\r\n\r\n // Add API key if provided\r\n if (this.config.apiKey) {\r\n headers = headers.set('Authorization', `Bearer ${this.config.apiKey}`);\r\n }\r\n\r\n // Add custom headers if provided\r\n if (this.config.customHeaders) {\r\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\r\n headers = headers.set(key, value);\r\n });\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Apply retry strategy based on configuration\r\n */\r\n private applyRetryStrategy() {\r\n return (source: Observable<ChatApiResponse>) => {\r\n if (!this.config.enableRetry) {\r\n return source;\r\n }\r\n\r\n const retryAttempts = this.config.retryAttempts || 2;\r\n const retryDelay = this.config.retryDelay || 1000;\r\n\r\n return source.pipe(\r\n retry({\r\n count: retryAttempts,\r\n delay: (error, retryCount) => {\r\n // Only retry on network errors or 5xx server errors\r\n if (this.shouldRetry(error)) {\r\n console.warn(`Retrying API request (attempt ${retryCount}/${retryAttempts})...`);\r\n return timer(retryDelay * retryCount);\r\n }\r\n // Don't retry on client errors (4xx)\r\n return throwError(() => error);\r\n },\r\n }),\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Determine if error should trigger a retry\r\n */\r\n private shouldRetry(error: any): boolean {\r\n if (error instanceof HttpErrorResponse) {\r\n // Retry on network errors or 5xx server errors\r\n return error.status === 0 || error.status >= 500;\r\n }\r\n // Retry on timeout errors\r\n if (error.name === 'TimeoutError') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Validate API response\r\n */\r\n private validateResponse(response: ChatApiResponse): ChatApiResponse {\r\n if (!response || !response.reply) {\r\n throw {\r\n message: 'Invalid API response: missing reply field',\r\n code: 'INVALID_RESPONSE',\r\n } as ChatApiError;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Handle API errors\r\n */\r\n private handleError(error: any): Observable<never> {\r\n let apiError: ChatApiError;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n // HTTP error\r\n apiError = {\r\n message: error.error?.message || error.message || 'API request failed',\r\n code: error.error?.code || 'HTTP_ERROR',\r\n statusCode: error.status,\r\n details: error.error,\r\n };\r\n } else if (error.name === 'TimeoutError') {\r\n // Timeout error\r\n apiError = {\r\n message: 'Request timeout - please try again',\r\n code: 'TIMEOUT',\r\n statusCode: 408,\r\n };\r\n } else {\r\n // Other errors\r\n apiError = {\r\n message: error.message || 'Unknown error occurred',\r\n code: error.code || 'UNKNOWN_ERROR',\r\n details: error,\r\n };\r\n }\r\n\r\n console.error('Chatbot API Error:', apiError);\r\n return throwError(() => apiError);\r\n }\r\n\r\n /**\r\n * Check if API is enabled\r\n */\r\n isApiEnabled(): boolean {\r\n return this.config.enableApi === true && !!this.config.apiUrl;\r\n }\r\n\r\n /**\r\n * Get current API configuration\r\n */\r\n getConfig(): DoohbotApiConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n","import { Injectable, signal, inject } from '@angular/core';\r\nimport { Message } from '../../model/message';\r\nimport { CHAT_INTENTS } from '../../model/doohbot.intents';\r\nimport { ChatApiError } from '../../model/api-request.model';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { ChatbotApiService } from '../../core/services/doohbot-api.service';\r\nimport { UserContext } from '../../core/models/user-context.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MessageService {\r\n // Context-aware message storage\r\n private messageStore = new Map<string, Message[]>();\r\n private currentContextKey = signal<string>('default');\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n public audioUnlocked = false;\r\n\r\n // Enable/disable localStorage persistence\r\n private enablePersistence = true;\r\n private readonly STORAGE_PREFIX = 'doohbot_messages_';\r\n\r\n // API service (optional)\r\n private apiService = inject(ChatbotApiService, { optional: true });\r\n\r\n // User context for backend proxy mode\r\n private userContext?: UserContext;\r\n\r\n // API state signals\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n\r\n constructor() {\r\n // Load persisted messages on initialization\r\n this.loadPersistedMessages();\r\n }\r\n\r\n /**\r\n * Switch to a new context\r\n */\r\n public switchContext(contextKey: string): void {\r\n // Save current context messages before switching\r\n if (this.currentContextKey()) {\r\n this.saveContextMessages(this.currentContextKey(), this.messages());\r\n }\r\n\r\n // Update context key\r\n this.currentContextKey.set(contextKey);\r\n\r\n // Load messages for new context\r\n const contextMessages = this.messageStore.get(contextKey) || [];\r\n this.messages.set([...contextMessages]);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n public getCurrentContextKey(): string {\r\n return this.currentContextKey();\r\n }\r\n\r\n /**\r\n * Set user context for backend proxy mode\r\n * This allows tracking which user sent each message\r\n */\r\n public setUserContext(context: UserContext): void {\r\n this.userContext = context;\r\n }\r\n\r\n /**\r\n * Get current user context\r\n */\r\n public getUserContext(): UserContext | undefined {\r\n return this.userContext;\r\n }\r\n\r\n /**\r\n * Clear messages for current context\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n const contextKey = this.currentContextKey();\r\n this.messageStore.set(contextKey, []);\r\n this.persistMessages(contextKey, []);\r\n }\r\n\r\n /**\r\n * Clear all messages across all contexts\r\n */\r\n clearAllMessages(): void {\r\n this.messages.set([]);\r\n this.messageStore.clear();\r\n if (this.enablePersistence) {\r\n this.clearAllPersistedMessages();\r\n }\r\n }\r\n\r\n /**\r\n * Add message to current context\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n\r\n // Update message store for current context\r\n const contextKey = this.currentContextKey();\r\n const contextMessages = this.messageStore.get(contextKey) || [];\r\n const updatedMessages = [...contextMessages, newMessage];\r\n this.saveContextMessages(contextKey, updatedMessages);\r\n\r\n if (message.sender === 'bot') {\r\n this.playBotSound();\r\n }\r\n }\r\n\r\n /**\r\n * Get messages for a specific context\r\n */\r\n public getMessagesForContext(contextKey: string): Message[] {\r\n return this.messageStore.get(contextKey) || [];\r\n }\r\n\r\n /**\r\n * Get all context keys that have messages\r\n */\r\n public getAllContextKeys(): string[] {\r\n return Array.from(this.messageStore.keys());\r\n }\r\n\r\n /**\r\n * Get bot reply - supports both API and local modes\r\n * @param userText User's message\r\n * @returns Promise with bot reply\r\n */\r\n async getBotReply(userText: string): Promise<string> {\r\n // Check if API mode is enabled\r\n if (this.apiService?.isApiEnabled()) {\r\n return this.getBotReplyFromApi(userText);\r\n }\r\n // Fall back to local intent matching\r\n return this.getBotReplyLocal(userText);\r\n }\r\n\r\n /**\r\n * Get bot reply from API\r\n */\r\n private async getBotReplyFromApi(userText: string): Promise<string> {\r\n if (!this.apiService) {\r\n return this.getFallbackReply();\r\n }\r\n\r\n try {\r\n this.isLoadingApi.set(true);\r\n this.apiError.set(null);\r\n\r\n // Get message history if API config includes history\r\n const history = this.apiService.getConfig().includeHistory ? this.messages() : undefined;\r\n\r\n // Call API\r\n const response = await firstValueFrom(this.apiService.sendMessage(userText, history));\r\n\r\n this.isLoadingApi.set(false);\r\n return response.reply;\r\n } catch (error) {\r\n this.isLoadingApi.set(false);\r\n const apiError = error as ChatApiError;\r\n this.apiError.set(apiError);\r\n console.error('API error, falling back to local mode:', apiError);\r\n\r\n // Fallback to local mode on API error\r\n return this.getBotReplyLocal(userText);\r\n }\r\n }\r\n\r\n /**\r\n * Get bot reply using local intent matching\r\n */\r\n private getBotReplyLocal(userText: string): string {\r\n const text = userText.toLowerCase();\r\n for (const intent of CHAT_INTENTS) {\r\n if (intent.patterns.some((pattern) => text.includes(pattern))) {\r\n return intent.response;\r\n }\r\n }\r\n return this.getFallbackReply();\r\n }\r\n\r\n getFallbackReply(): string {\r\n return \"I'm sorry π, I didn't understand that.\";\r\n }\r\n\r\n // method that tells you if it's a fallback\r\n isFallbackIntent(userText: string): boolean {\r\n const text = userText.toLowerCase();\r\n return !CHAT_INTENTS.some((intent) =>\r\n intent.patterns.some((pattern) => text.includes(pattern)),\r\n );\r\n }\r\n\r\n public unlockAudio(): void {\r\n if (this.audioUnlocked) return;\r\n const audio = new Audio();\r\n audio.volume = 1.0;\r\n audio\r\n .play()\r\n .then(() => (this.audioUnlocked = true))\r\n .catch(() => {});\r\n }\r\n\r\n public playBotSound(): void {\r\n if (!this.audioUnlocked) return;\r\n try {\r\n const audio = new Audio('assets/bot.mp3');\r\n audio.play();\r\n } catch (error) {\r\n console.error('Error playing bot sound:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable localStorage persistence\r\n */\r\n public setPersistence(enabled: boolean): void {\r\n this.enablePersistence = enabled;\r\n }\r\n\r\n /**\r\n * Private: Save context messages to store and persist\r\n */\r\n private saveContextMessages(contextKey: string, messages: Message[]): void {\r\n this.messageStore.set(contextKey, messages);\r\n this.persistMessages(contextKey, messages);\r\n }\r\n\r\n /**\r\n * Private: Persist messages to localStorage\r\n */\r\n private persistMessages(contextKey: string, messages: Message[]): void {\r\n if (!this.enablePersistence) return;\r\n try {\r\n const key = this.STORAGE_PREFIX + contextKey;\r\n localStorage.setItem(key, JSON.stringify(messages));\r\n } catch (error) {\r\n console.error('Error persisting messages:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Private: Load all persisted messages from localStorage\r\n */\r\n private loadPersistedMessages(): void {\r\n if (!this.enablePersistence) return;\r\n try {\r\n const keys = Object.keys(localStorage);\r\n keys.forEach((key) => {\r\n if (key.startsWith(this.STORAGE_PREFIX)) {\r\n const contextKey = key.replace(this.STORAGE_PREFIX, '');\r\n const messagesJson = localStorage.getItem(key);\r\n if (messagesJson) {\r\n const messages = JSON.parse(messagesJson) as Message[];\r\n // Convert timestamp strings back to Date objects\r\n messages.forEach((msg) => {\r\n if (msg.timestamp && typeof msg.timestamp === 'string') {\r\n msg.timestamp = new Date(msg.timestamp);\r\n }\r\n });\r\n this.messageStore.set(contextKey, messages);\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error loading persisted messages:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Private: Clear all persisted messages from localStorage\r\n */\r\n private clearAllPersistedMessages(): void {\r\n try {\r\n const keys = Object.keys(localStorage);\r\n keys.forEach((key) => {\r\n if (key.startsWith(this.STORAGE_PREFIX)) {\r\n localStorage.removeItem(key);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error clearing persisted messages:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n // Initialize theme from local storage or default to auto\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n this.setTheme(savedTheme || 'auto');\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this._theme.set(mode);\r\n localStorage.setItem('theme', mode);\r\n this.updateActiveTheme(mode);\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n // Also listen to system preference as a fallback or if parent doesn't specify\r\n // const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n // this.mediaQueryListener = (e) => {\r\n // // Re-run detection which prioritizes parent classes but falls back to system\r\n // this.detectAndApplyParentTheme();\r\n // };\r\n // mediaQuery.addEventListener('change', this.mediaQueryListener);\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Fallback to system preference\r\n // return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n // We do NOT touch document.body anymore to avoid conflicts\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Only apply to overlay container (for menus/dialogs)\r\n // The main chat window handles its own theme via the host binding in doohbot.component.ts\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n // if (this.mediaQueryListener) {\r\n // window\r\n // .matchMedia('(prefers-color-scheme: dark)')\r\n // .removeEventListener('change', this.mediaQueryListener);\r\n // this.mediaQueryListener = null;\r\n // }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n}\r\n","export const appConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n APP_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDI1MCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MCA1MS45MDE0QzgxLjczMTcgNDcuNDIzIDExNS4wMzggNTAuOTI5MiAxNDIuNTkzIDYxLjY0OTRDMTcwLjE0NyA3Mi4zNjk2IDE4OS42OTIgODkuNDI1NSAxOTYuOTI4IDEwOS4wNjRDMjA0LjE2NCAxMjguNzAzIDE5OC40OTggMTQ5LjMxNyAxODEuMTc3IDE2Ni4zNzFDMTYzLjg1NiAxODMuNDI1IDEzNi4yOTggMTk1LjUyMiAxMDQuNTY2IDIwMEw3OC43MTk3IDEyOS44NUM5OC40Mjk4IDEzNC4xNjQgMTEyLjkxNyAxNDcuMTY4IDExMy43NjQgMTYyLjc1NEwxMTMuODUzIDE2NC4zODFMMTEzLjk0IDE2Mi43NTRDMTE0Ljk1NiAxNDQuMDY5IDEzNS41NzYgMTI5LjA5IDE2MS4yOTkgMTI4LjM1M0wxNjMuNTM5IDEyOC4yODhMMTYxLjI5OSAxMjguMjI0QzEzNS41NzYgMTI3LjQ4NiAxMTQuOTU0IDExMi41MDcgMTEzLjk0IDkzLjgyMTNMMTEzLjg1MyA5Mi4xOTQzTDExMy43NjQgOTMuODIxM0MxMTIuOTAzIDEwOS42ODcgOTcuOTA0OSAxMjIuODc4IDc3LjY1MTQgMTI2Ljk1TDc3LjI4MzIgMTI1Ljk1TDUwIDUxLjkwMTRaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMjM0MV81ODQ0KSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzIzNDFfNTg0NCIgeDE9IjUwIiB5MT0iNTEuMjA4IiB4Mj0iMjAwIiB5Mj0iMTk4Ljc5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNEY0NkU1Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzg4NzhGRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n USER_AVATAR:\r\n 'data:image/png;base64,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',\r\n BOT_AVATAR:\r\n 'data:image/png;base64,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',\r\n};\r\n","import { appConst } from '../constant/constant';\r\nimport { DOOHBOT_API_URL } from './../model/token';\r\n\r\nexport class DoohbotInput {\r\n username = '';\r\n password = '';\r\n authToken?: string;\r\n\r\n DOOHBOT_API_URL?: string;\r\n skipAuthentication?: boolean;\r\n\r\n // inputs\r\n userAvatarUrl: string = appConst.USER_AVATAR;\r\n\r\n // Application Constants Text\r\n readonly appTitle? = 'DoohBot';\r\n readonly appSubtitle? = 'Welcome to DoohBot';\r\n readonly welcomeDesc? =\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.';\r\n readonly chatIcon? = 'chat';\r\n readonly sendIcon? = 'send';\r\n readonly closeIcon? = 'close';\r\n readonly clear? = 'clear_all';\r\n readonly minimizeIcon? = 'remove';\r\n readonly moreIcon? = 'more_vert';\r\n readonly fullscreenIcon? = 'fullscreen';\r\n readonly fullscreenExitIcon? = 'fullscreen_exit';\r\n readonly hintText? = 'Please Enter Here';\r\n readonly errorMessage? = 'The message you submitted was too long.';\r\n\r\n // Application Constants Images\r\n readonly appLogoUrl? = appConst.APP_LOGO;\r\n readonly botAvatarUrl? = appConst.BOT_AVATAR;\r\n}\r\n","export const PredefinedMessages = ['Hello!', 'I need help', 'Contact support', 'News and Updates'];\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() isChatOpen: boolean = false;\r\n @Input() unreadCount: number = 0;\r\n @Input() chatIcon: string = 'chat';\r\n @Input() appTitle: string = 'Chat';\r\n\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n get isSidebar(): boolean {\r\n return this.buttonStyle.startsWith('sidebar');\r\n }\r\n\r\n get sidebarPosition(): 'top' | 'center' | 'bottom' {\r\n if (!this.isSidebar) return 'center';\r\n if (this.buttonStyle === 'sidebar') return 'center';\r\n return this.buttonStyle.split('-')[1] as 'top' | 'center' | 'bottom';\r\n }\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <mat-icon>{{ chatIcon }}</mat-icon>\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2>\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TrackByFunction,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { Message } from '../../model/message';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appLogoUrl: string = '';\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => this.scrollToBottom());\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 24px\" />\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'user'\"\r\n class=\"user-avatar\"\r\n [src]=\"userAvatarUrl\"\r\n alt=\"User Avatar\"\r\n />\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n @Input() isBotTyping: boolean = false;\r\n @Input() hintText: string = 'Type a message...';\r\n @Input() sendIcon: string = 'send';\r\n\r\n @Output() send = new EventEmitter<string>();\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\"\r\n (keydown.enter)=\"onSend(messageInput.value); messageInput.value = ''\" [placeholder]=\"hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping\" (click)=\"onSend(messageInput.value); messageInput.value = ''\">\r\n <mat-icon>{{ sendIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule],\r\n})\r\nexport class SnackBar implements OnInit, OnDestroy {\r\n @Input() message: string | null = null;\r\n @Input() autoDismiss: boolean = true;\r\n @Input() dismissDelay: number = 5000;\r\n @Input() show: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n public timeoutId: number | null = null;\r\n\r\n ngOnInit() {\r\n if (this.autoDismiss) {\r\n this.timeoutId = setTimeout(() => {\r\n this.close();\r\n }, this.dismissDelay) as any;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.clearTimeout();\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.message = null;\r\n this.closed.emit();\r\n }\r\n public clearTimeout() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n}\r\n","<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableDrag) {\r\n this.el.nativeElement.removeAttribute('draggableDialog');\r\n return;\r\n }\r\n\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.dragHandle || event.target !== this.dragHandle) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableResize) {\r\n this.el.nativeElement.removeAttribute('resizableDialog');\r\n return;\r\n }\r\n\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '10');\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '12px');\r\n this.renderer.setStyle(handle, 'height', '12px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, TrackByFunction } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { SnackBar } from '../../shared/snackbar/snackbar.component';\r\nimport { DraggableDialogDirective } from '../../directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../model/message';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n SnackBar,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent {\r\n @Input() isChatOpen: boolean = false;\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() appTitle: string = '';\r\n @Input() appLogoUrl: string = '';\r\n @Input() moreIcon: string = 'more_vert';\r\n @Input() minimizeIcon: string = 'minimize';\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n @Input() hintText: string = '';\r\n @Input() sendIcon: string = '';\r\n @Input() messageError: string | null = null;\r\n @Input() showSuggestionChips: boolean = false;\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() openSettings = new EventEmitter<void>();\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() send = new EventEmitter<string>();\r\n @Output() clearMessageError = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n}\r\n","<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" style=\"border-radius: 14px\" [src]=\"appLogoUrl\" alt=\"Logo\" />\r\n <h2>{{ appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Inline error message -->\r\n <app-snackbar\r\n *ngIf=\"messageError\"\r\n [message]=\"messageError\"\r\n [show]=\"!messageError\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\" class=\"mat-menu-override\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n</mat-menu>\r\n","// export const environment = {\r\n// staging: false,\r\n// development: false,\r\n// production: true,\r\n// chatApiUrl: 'https://api.production.com',\r\n// apiKey: '',\r\n// };\r\nexport const environment = {\r\n config: 'const/app-const.json',\r\n production: false,\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './environments/environment';\r\nimport { environment as environmentprod } from './environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AppConst {\r\n static data: any;\r\n\r\n constructor() {}\r\n\r\n async load(): Promise<any> {\r\n const filePath = `../assets/${environment.production ? environmentprod.config : environment.config}?t=${new Date().getTime()}`;\r\n const response = await fetch(filePath);\r\n\r\n if (response.ok) {\r\n try {\r\n AppConst.data = await response.json();\r\n } catch (error: any) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`Could not find file ${filePath}.\\nMESSAGE: ${error.message}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n\r\n if (AppConst.data && !Object.keys(AppConst.data).length) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`No data found in file ${filePath}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n } else {\r\n console.error('============================ ERROR ============================');\r\n console.error(\r\n `Failed to load file ${filePath}.\\nMESSAGE: Request failed with ${response.status} / ${response.statusText}`,\r\n );\r\n console.error('============================ ERROR ============================');\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, delay, retry, map, catchError, of } from 'rxjs';\r\nimport { AppConst } from '../app-const';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n // @BlockUI() blockUI!: NgBlockUI;\r\n\r\n apiUrl: string;\r\n\r\n constructor(private http: HttpClient) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n }\r\n\r\n get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n ): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n let params = {};\r\n\r\n if (nestedParam) {\r\n this.buildHttpParams(params, param, '');\r\n } else {\r\n params = param as HttpParams;\r\n }\r\n\r\n return this.http.get(`${this.apiUrl}${url}`, { params: params, withCredentials: true }).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n post(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n return this.http.post(`${this.apiUrl}${url}`, param as HttpParams).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private returnResponse(value: any, showLoader: boolean = true): any {\r\n // if (showLoader && this.blockUI.isActive) {\r\n\r\n // this.blockUI.reset();\r\n\r\n // }\r\n\r\n return value;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpService } from './http.service';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { LoginRequest } from '../models/login-request.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AccountService {\r\n constructor(private http: HttpService) {}\r\n\r\n login(param?: LoginRequest, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('Account/Login', param, showLoader);\r\n }\r\n\r\n // refreshLogin(param?: object, showLoader = false): Observable<MvResponse<MvLoginResult>> {\r\n\r\n // return this.http.post('Account/RefreshToken', param, showLoader);\r\n\r\n // }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CryptoHelperService {\r\n private encoder = new TextEncoder();\r\n private decoder = new TextDecoder();\r\n private secretKey = ''; // Will be set by AuthService\r\n\r\n setSecretKey(key: string) {\r\n this.secretKey = key;\r\n }\r\n\r\n private async getKey() {\r\n const salt = this.encoder.encode('fixed_salt'); // Keep constant\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw',\r\n this.encoder.encode(this.secretKey),\r\n 'PBKDF2',\r\n false,\r\n ['deriveKey'],\r\n );\r\n\r\n return crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt,\r\n iterations: 100000,\r\n hash: 'SHA-256',\r\n },\r\n baseKey,\r\n { name: 'AES-GCM', length: 256 },\r\n false,\r\n ['encrypt', 'decrypt'],\r\n );\r\n }\r\n\r\n async encrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const key = await this.getKey();\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n { name: 'AES-GCM', iv },\r\n key,\r\n this.encoder.encode(value),\r\n );\r\n\r\n const merged = new Uint8Array(iv.length + encrypted.byteLength);\r\n merged.set(iv, 0);\r\n merged.set(new Uint8Array(encrypted), iv.length);\r\n\r\n return btoa(String.fromCharCode(...merged));\r\n }\r\n\r\n async decrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n\r\n const iv = raw.slice(0, 12);\r\n const data = raw.slice(12);\r\n\r\n const key = await this.getKey();\r\n\r\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\r\n\r\n return this.decoder.decode(decrypted);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppConst } from '../app-const';\r\nimport { map, Observable } from 'rxjs';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { Router } from '@angular/router';\r\nimport { CryptoHelperService } from '../helpers/crypto-helper.service';\r\n\r\n//!! inherit Window storageEventAdded for duplicate tab detection\r\ndeclare global {\r\n interface Window {\r\n storageEventAdded?: boolean;\r\n tabCLoseEventAdded?: boolean;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n apiUrl: string;\r\n storageKey: string;\r\n secretKey: string;\r\n companyCode: string;\r\n jwtHelper: JwtHelperService = new JwtHelperService();\r\n\r\n constructor(\r\n private router: Router,\r\n private http: HttpClient,\r\n private cryptoHelper: CryptoHelperService,\r\n // private cacheService: NgxCacheService,\r\n // private snackBar: MatSnackBar,\r\n ) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n this.storageKey = AppConst?.data?.storageKey;\r\n this.secretKey = AppConst?.data?.secretKey;\r\n this.companyCode = AppConst?.data?.companyCode;\r\n this.cryptoHelper.setSecretKey(this.secretKey);\r\n }\r\n\r\n logout(): Observable<boolean> {\r\n const url = `${this.apiUrl}Account/Logout`;\r\n return this.http.post(url, {}).pipe(\r\n map((response: any) => {\r\n if (response && response.success) {\r\n this.clearAuth();\r\n // this.redirectOut();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // redirectIn() {\r\n // let redirectUrl = this.getCurrentNavigationUrl();\r\n // redirectUrl = redirectUrl || AppConst?.data?.redirectUrl || '/login';\r\n // this.router.navigate([redirectUrl], { replaceUrl: true });\r\n // }\r\n\r\n // redirectOut() {\r\n // this.router.navigate(['/login'], { replaceUrl: true });\r\n // }\r\n\r\n // Utility\r\n setSession(session: AuthResult) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n this.setLocalStorage('access_token', session.access_token);\r\n this.setLocalStorage('refresh_token', session.refresh_token);\r\n this.setLocalStorage('user_id', Number(user?.user_id));\r\n this.setLocalStorage('username', user?.username);\r\n this.setLocalStorage('roles', Number(user?.roles));\r\n this.setLocalStorage('permissions', Number(user?.permissions));\r\n this.setLocalStorage('company_id', user?.company_id);\r\n this.setLocalStorage('office_id', user?.office_id);\r\n }\r\n\r\n setLocalStorage(key: string, value: any) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n dataJson = Object.assign(dataJson, { [key]: value });\r\n localStorage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));\r\n } else {\r\n let dataNew = Object.assign({}, { [key]: value });\r\n let dataEnc = this.encrypt(JSON.stringify(dataNew));\r\n localStorage.setItem(this.storageKey, dataEnc);\r\n }\r\n }\r\n\r\n getLocalStorage(key: string) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n return dataJson![key] || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n let token = this.getLocalStorage('access_token');\r\n if (token && !this.isTokenExpired()) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n let token = (this.getLocalStorage('access_token') ?? '') as string;\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n encrypt(value: string): any {\r\n if (value) {\r\n return CryptoJS.AES.encrypt(value, this.secretKey);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n decrypt(value: string) {\r\n if (value) {\r\n let bytes = CryptoJS.AES.decrypt(value, this.secretKey);\r\n let decryptedText = bytes.toString(CryptoJS.enc.Utf8);\r\n return decryptedText;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n clearAuth() {\r\n this.clearSession();\r\n this.clearStorage();\r\n this.clearCache();\r\n }\r\n\r\n clearSession() {\r\n sessionStorage.clear();\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n\r\n clearStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n clearCache() {\r\n // this.cacheService.clearCache();\r\n }\r\n\r\n getUserId() {\r\n return this.getLocalStorage('user_id') || 0;\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n signal,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { MessageService } from './components/message-input/messaging.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotInput } from './inputs/doohbot-input';\r\nimport { PredefinedMessages } from './helpers/predefined_messages';\r\nimport { ChatButtonComponent } from './components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './components/chat-window/chat-window.component';\r\nimport { DoohbotApiConfig } from './model/api-config.model';\r\nimport { TenantContextService } from './core/services/tenant-context.service';\r\nimport { AccountService } from './core/services/account.service';\r\nimport { AuthService } from './core/services/auth.service';\r\nimport { LoginRequest } from './core/models/login-request.model';\r\nimport { AppConst } from './core/app-const';\r\nimport { UserContext } from './core/models/user-context.model';\r\n\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n AppConst,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: (appConst: AppConst) => () => appConst.load(),\r\n deps: [AppConst],\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class Doohbot extends DoohbotInput implements OnDestroy {\r\n @Input() config: DoohbotInput = new DoohbotInput();\r\n @Input() platformTenant!: string;\r\n @Input() subTenant!: string;\r\n @Input() agent!: string;\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() primaryColor: string | undefined;\r\n @Input() apiConfig?: DoohbotApiConfig;\r\n @Input() userContext?: UserContext; // User context for backend proxy mode\r\n\r\n // @Input() theme: 'light' | 'dark' = 'light';\r\n\r\n isFullScreen = false;\r\n public isChatOpen = signal(false);\r\n public isBotTyping = signal(false);\r\n public isAuthenticated = signal(false);\r\n private messageService = inject(MessageService);\r\n public messages = this.messageService.messages;\r\n private lastReadMessageId = signal<string | null>(null);\r\n public themeService = inject(ThemeService);\r\n private tenantContextService = inject(TenantContextService);\r\n private contextSubscription?: Subscription;\r\n\r\n maxMessageLength = 1000;\r\n messageError = signal<string | null>(null);\r\n dismissTimeout: number | null = null;\r\n\r\n // Predefined messages\r\n public predefinedMessages: string[] = PredefinedMessages;\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n private accountService: AccountService,\r\n private authService: AuthService,\r\n ) {\r\n super();\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['primaryColor']) {\r\n this.updateCssVariables();\r\n }\r\n\r\n // Handle context changes (platformTenant, subTenant, agent)\r\n const contextChanged = changes['platformTenant'] || changes['subTenant'] || changes['agent'];\r\n\r\n if (contextChanged) {\r\n this.updateContext();\r\n }\r\n\r\n // Handle API config changes\r\n if (changes['apiConfig'] && this.apiConfig) {\r\n this.updateApiConfig();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.updateCssVariables();\r\n this.userAvatarUrl = this.config.userAvatarUrl || '';\r\n\r\n // Initialize context\r\n this.updateContext();\r\n\r\n // Initialize API config if provided\r\n if (this.apiConfig) {\r\n this.updateApiConfig();\r\n }\r\n\r\n // Initialize theme from input\r\n // this.themeService.setTheme(this.theme);\r\n\r\n // Subscribe to context changes\r\n this.contextSubscription = this.tenantContextService.contextChange$.subscribe((event) => {\r\n // Sync message service with new context\r\n this.messageService.switchContext(event.contextKey);\r\n\r\n // Reset last read message when context changes\r\n this.lastReadMessageId.set(null);\r\n\r\n // Optionally close chat on context switch (uncomment if desired)\r\n // this.isChatOpen.set(false);\r\n });\r\n\r\n // TODO: 'Remove later - for mock testing only';\r\n // Set initial authentication status\r\n this.isAuthenticated.set(this.authService.isAuthenticated());\r\n\r\n if (!this.authService.isAuthenticated()) {\r\n this.loginUser();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up subscription\r\n this.contextSubscription?.unsubscribe();\r\n }\r\n\r\n private loginUser() {\r\n // TODO: 'Remove later - for mock testing only';\r\n // Check if authentication should be skipped (for testing without backend)\r\n if (this.config.skipAuthentication) {\r\n console.log(' Authentication skipped - Mock mode enabled');\r\n this.isAuthenticated.set(true);\r\n return;\r\n }\r\n\r\n let param = {\r\n username: this.config.username || AppConst.data?.username,\r\n password: this.config.password || AppConst.data?.password,\r\n } as LoginRequest;\r\n this.accountService.login(param).subscribe({\r\n // TODO: 'Remove later - for mock testing only';\r\n\r\n next: (response) => {\r\n if (response && response.success) {\r\n this.isAuthenticated.set(true);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('Login failed:', error);\r\n this.isAuthenticated.set(false);\r\n },\r\n });\r\n }\r\n\r\n private updateCssVariables() {\r\n const host = this.elementRef.nativeElement;\r\n if (this.primaryColor) {\r\n host.style.setProperty('--primary-color', this.primaryColor);\r\n } else {\r\n host.style.removeProperty('--primary-color');\r\n }\r\n }\r\n\r\n /**\r\n * Update context when tenant or agent inputs change\r\n */\r\n private updateContext() {\r\n this.tenantContextService.setContext({\r\n platformTenant: this.platformTenant || '',\r\n subTenant: this.subTenant || '',\r\n agent: this.agent || '',\r\n });\r\n }\r\n\r\n /**\r\n * Update API configuration\r\n */\r\n private updateApiConfig() {\r\n if (!this.apiConfig) return;\r\n\r\n // Merge with default config and update the injection token\r\n const config: DoohbotApiConfig = {\r\n ...this.apiConfig,\r\n };\r\n\r\n // Update the provider (this will be picked up by the API service)\r\n // Note: For dynamic config updates, you may need to use a service\r\n console.log('API Config updated:', config);\r\n }\r\n\r\n toggleChat() {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n if (!currentlyOpen) {\r\n const messages = this.messages();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n clearChat() {\r\n this.messageService.clearMessages();\r\n }\r\n\r\n public async sendMessage(text: string): Promise<void> {\r\n const trimmedText = text.trim();\r\n this.messageError.set(null);\r\n\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > this.maxMessageLength) {\r\n this.messageError.set(this.errorMessage ?? 'Message too long.');\r\n setTimeout(() => {\r\n this.messageError.set(null);\r\n }, 5000);\r\n return;\r\n }\r\n\r\n this.messageService.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n id: Date.now().toString(),\r\n timestamp: new Date(),\r\n });\r\n this.isBotTyping.set(true);\r\n\r\n // Small delay for better UX\r\n setTimeout(async () => {\r\n try {\r\n const botReply = await this.messageService.getBotReply(trimmedText);\r\n const isFallback = botReply === this.messageService.getFallbackReply();\r\n this.messageService.addMessage({\r\n sender: 'bot',\r\n text: botReply,\r\n id: Date.now().toString(),\r\n showSuggestions: isFallback,\r\n });\r\n } catch (error) {\r\n console.error('Error getting bot reply:', error);\r\n // Add fallback message on error\r\n this.messageService.addMessage({\r\n sender: 'bot',\r\n text: this.messageService.getFallbackReply(),\r\n id: Date.now().toString(),\r\n showSuggestions: true,\r\n });\r\n } finally {\r\n this.isBotTyping.set(false);\r\n }\r\n }, 1000);\r\n }\r\n\r\n public clearMessageError(): void {\r\n this.messageError.set(null);\r\n if (this.dismissTimeout) {\r\n clearTimeout(this.dismissTimeout);\r\n this.dismissTimeout = null;\r\n }\r\n }\r\n\r\n showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'bot');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messages();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0;\r\n }\r\n const messages = this.messages();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'bot');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n public preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n toggleFullScreen() {\r\n const chatWindowEl = this.chatWindowRef?.nativeElement.querySelector('.chat-window');\r\n if (!chatWindowEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: chatWindowEl.style.width,\r\n height: chatWindowEl.style.height,\r\n left: chatWindowEl.style.left,\r\n top: chatWindowEl.style.top,\r\n };\r\n\r\n chatWindowEl.style.width = '';\r\n chatWindowEl.style.height = '';\r\n chatWindowEl.style.left = '';\r\n chatWindowEl.style.top = '';\r\n chatWindowEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n chatWindowEl.style.width = this.preFullscreenState.width || '400px';\r\n chatWindowEl.style.height = this.preFullscreenState.height || '500px';\r\n chatWindowEl.style.left = this.preFullscreenState.left || 'auto';\r\n chatWindowEl.style.top = this.preFullscreenState.top || 'auto';\r\n chatWindowEl.style.transform = 'none';\r\n }\r\n }\r\n }\r\n}\r\n","<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n></app-chat-window>\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const DOOHBOT_API_URL = new InjectionToken<string>('DOOHBOT_API_URL');\r\n","/*\r\n * Public API Surface of chatbot\r\n */\r\n\r\n// Main component\r\nexport * from './lib/doohbot.component';\r\n\r\nexport * from './lib/inputs/doohbot-input';\r\nexport * from './lib/model/api-config.model';\r\nexport * from './lib/core/models/user-context.model';\r\nexport * from './lib/core/services/doohbot-api.service';\r\nexport * from './lib/core/services/auth.service';\r\nexport * from './lib/core/services/account.service';\r\nexport * from './lib/constant/constant';\r\nexport * from './lib/model/token';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","environmentprod","retry","map","catchError","i1.HttpService","i3.CryptoHelperService","i1.AccountService","i2.AuthService","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aakash58-chatbot.mjs","sources":["../../../projects/doohbot/src/lib/model/doohbot.intents.ts","../../../projects/doohbot/src/lib/model/api-config.model.ts","../../../projects/doohbot/src/lib/core/services/tenant-context.service.ts","../../../projects/doohbot/src/lib/core/services/doohbot-api.service.ts","../../../projects/doohbot/src/lib/components/message-input/messaging.service.ts","../../../projects/doohbot/src/lib/core/services/theme.service.ts","../../../projects/doohbot/src/lib/constant/constant.ts","../../../projects/doohbot/src/lib/inputs/doohbot-input.ts","../../../projects/doohbot/src/lib/helpers/predefined_messages.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.html","../../../projects/doohbot/src/lib/shared/chips/chips.component.ts","../../../projects/doohbot/src/lib/shared/chips/chips.component.html","../../../projects/doohbot/src/lib/components/message-list/message-list.component.ts","../../../projects/doohbot/src/lib/components/message-list/message-list.component.html","../../../projects/doohbot/src/lib/components/message-input/message-input.component.ts","../../../projects/doohbot/src/lib/components/message-input/message-input.component.html","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.html","../../../projects/doohbot/src/lib/directives/draggable/draggable-dialog.directive.ts","../../../projects/doohbot/src/lib/directives/resizable/resizable-dialog.directive.ts","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.ts","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.html","../../../projects/doohbot/src/lib/core/environments/environment.ts","../../../projects/doohbot/src/lib/core/app-const.ts","../../../projects/doohbot/src/lib/core/services/http.service.ts","../../../projects/doohbot/src/lib/core/services/account.service.ts","../../../projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts","../../../projects/doohbot/src/lib/core/services/auth.service.ts","../../../projects/doohbot/src/lib/doohbot.component.ts","../../../projects/doohbot/src/lib/doohbot.component.html","../../../projects/doohbot/src/lib/model/token.ts","../../../projects/doohbot/src/public-api.ts","../../../projects/doohbot/src/aakash58-chatbot.ts"],"sourcesContent":["import { ChatIntent } from './message';\r\n\r\nexport const CHAT_INTENTS: ChatIntent[] = [\r\n {\r\n patterns: ['hello', 'hi', 'hey', 'greetings', 'good morning', 'good afternoon', 'good evening'],\r\n response: 'πHello! How can I help you today?',\r\n },\r\n {\r\n patterns: ['how are you', 'how are you doing'],\r\n response: \"I'm just a bot, but I'm doing great! How about you?\",\r\n },\r\n {\r\n patterns: ['help', 'support', 'problem', 'about', 'issue', 'question', 'assist', 'Contact'],\r\n response: 'Sure! Please tell me your issue, and I will try to assist you.',\r\n },\r\n {\r\n patterns: ['bye', 'goodbye', 'see you', 'thanks', 'thank you', 'bye bye', 'see you later'],\r\n response: 'Goodbye! Have a nice day!',\r\n },\r\n {\r\n patterns: ['news and updates', 'updates', 'news', 'new'],\r\n response: 'Stay tuned for the latest news and updates from our team!',\r\n },\r\n];\r\n","import { InjectionToken } from '@angular/core';\r\nimport { environment } from '../core/environments/environment.prod';\r\n\r\n/**\r\n * Configuration for Doohbot API integration\r\n */\r\nexport interface DoohbotApiConfig {\r\n /**\r\n * Backend API endpoint URL\r\n * Example: 'https://api.example.com/chat'\r\n */\r\n apiUrl: string;\r\n\r\n /**\r\n * Optional API key for authentication\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000 (30 seconds)\r\n */\r\n timeout?: number;\r\n\r\n /**\r\n * Enable API mode (true) or use local intent matching (false)\r\n * @default false\r\n */\r\n enableApi?: boolean;\r\n\r\n /**\r\n * Include message history in API requests\r\n * @default false\r\n */\r\n includeHistory?: boolean;\r\n\r\n /**\r\n * Maximum number of history messages to include in requests\r\n * @default 10\r\n */\r\n maxHistoryMessages?: number;\r\n\r\n /**\r\n * Custom headers to include in API requests\r\n */\r\n customHeaders?: Record<string, string>;\r\n\r\n /**\r\n * Enable retry on failure\r\n * @default true\r\n */\r\n enableRetry?: boolean;\r\n\r\n /**\r\n * Number of retry attempts\r\n * @default 2\r\n */\r\n retryAttempts?: number;\r\n\r\n /**\r\n * Delay between retries in milliseconds\r\n * @default 1000\r\n */\r\n retryDelay?: number;\r\n}\r\n\r\n/**\r\n * Injection token for providing Doohbot API configuration\r\n */\r\nexport const DOOHBOT_API_CONFIG = new InjectionToken<DoohbotApiConfig>('DOOHBOT_API_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({\r\n apiUrl: '',\r\n timeout: 30000,\r\n enableApi: false,\r\n includeHistory: false,\r\n maxHistoryMessages: 10,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n }),\r\n});\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface ChatContext {\r\n platformTenant: string;\r\n subTenant: string;\r\n agent: string;\r\n}\r\n\r\nexport interface ContextChangeEvent {\r\n previous: ChatContext | null;\r\n current: ChatContext;\r\n contextKey: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TenantContextService {\r\n // Current context state\r\n private platformTenant = signal<string>('');\r\n private subTenant = signal<string>('');\r\n private agent = signal<string>('');\r\n\r\n // Computed context object\r\n public currentContext = computed<ChatContext>(() => ({\r\n platformTenant: this.platformTenant(),\r\n subTenant: this.subTenant(),\r\n agent: this.agent(),\r\n }));\r\n\r\n // Computed unique context key for storage\r\n public contextKey = computed<string>(() => {\r\n const pt = this.platformTenant() || 'default';\r\n const st = this.subTenant() || 'default';\r\n const ag = this.agent() || 'default';\r\n return `${pt}_${st}_${ag}`;\r\n });\r\n\r\n // Observable for context changes\r\n private contextChangeSubject = new Subject<ContextChangeEvent>();\r\n public contextChange$ = this.contextChangeSubject.asObservable();\r\n\r\n private previousContext: ChatContext | null = null;\r\n\r\n constructor() {\r\n // Effect to emit context changes\r\n effect(() => {\r\n const current = this.currentContext();\r\n const key = this.contextKey();\r\n\r\n // Only emit if context actually changed\r\n if (this.hasContextChanged(current)) {\r\n this.contextChangeSubject.next({\r\n previous: this.previousContext,\r\n current: current,\r\n contextKey: key,\r\n });\r\n this.previousContext = { ...current };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the complete context\r\n */\r\n public setContext(context: Partial<ChatContext>): void {\r\n if (context.platformTenant !== undefined) {\r\n this.platformTenant.set(context.platformTenant);\r\n }\r\n if (context.subTenant !== undefined) {\r\n this.subTenant.set(context.subTenant);\r\n }\r\n if (context.agent !== undefined) {\r\n this.agent.set(context.agent);\r\n }\r\n }\r\n\r\n /**\r\n * Update individual context properties\r\n */\r\n public setPlatformTenant(platformTenant: string): void {\r\n this.platformTenant.set(platformTenant);\r\n }\r\n\r\n public setSubTenant(subTenant: string): void {\r\n this.subTenant.set(subTenant);\r\n }\r\n\r\n public setAgent(agent: string): void {\r\n this.agent.set(agent);\r\n }\r\n\r\n /**\r\n * Get current context values\r\n */\r\n public getPlatformTenant(): string {\r\n return this.platformTenant();\r\n }\r\n\r\n public getSubTenant(): string {\r\n return this.subTenant();\r\n }\r\n\r\n public getAgent(): string {\r\n return this.agent();\r\n }\r\n\r\n public getContextKey(): string {\r\n return this.contextKey();\r\n }\r\n\r\n public getContext(): ChatContext {\r\n return this.currentContext();\r\n }\r\n\r\n /**\r\n * Check if context has changed\r\n */\r\n private hasContextChanged(current: ChatContext): boolean {\r\n if (!this.previousContext) {\r\n // First time initialization - only emit if we have valid values\r\n return current.platformTenant !== '' || current.subTenant !== '' || current.agent !== '';\r\n }\r\n\r\n return (\r\n this.previousContext.platformTenant !== current.platformTenant ||\r\n this.previousContext.subTenant !== current.subTenant ||\r\n this.previousContext.agent !== current.agent\r\n );\r\n }\r\n\r\n /**\r\n * Reset context to default\r\n */\r\n public resetContext(): void {\r\n this.platformTenant.set('');\r\n this.subTenant.set('');\r\n this.agent.set('');\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, timer } from 'rxjs';\r\nimport { catchError, retry, timeout, map } from 'rxjs/operators';\r\nimport { DOOHBOT_API_CONFIG, DoohbotApiConfig } from '../../model/api-config.model';\r\nimport { ChatApiRequest, ChatApiResponse, ChatApiError } from '../../model/api-request.model';\r\nimport { Message } from '../../model/message';\r\nimport { TenantContextService } from './tenant-context.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatbotApiService {\r\n private http = inject(HttpClient);\r\n private tenantContext = inject(TenantContextService);\r\n private config = inject(DOOHBOT_API_CONFIG);\r\n\r\n /**\r\n * Send a chat message to the API\r\n * @param message User's message text\r\n * @param history Optional message history for context\r\n * @returns Observable of the API response\r\n */\r\n sendMessage(message: string, history?: Message[]): Observable<ChatApiResponse> {\r\n if (!this.config.apiUrl) {\r\n return throwError(\r\n () =>\r\n ({\r\n message: 'API URL not configured',\r\n code: 'CONFIG_ERROR',\r\n }) as ChatApiError,\r\n );\r\n }\r\n\r\n // Build request payload with tenant context\r\n const request = this.buildRequest(message, history);\r\n\r\n // Build headers\r\n const headers = this.buildHeaders();\r\n\r\n // Configure timeout\r\n const timeoutMs = this.config.timeout || 30000;\r\n\r\n // Make HTTP request\r\n return this.http.post<ChatApiResponse>(this.config.apiUrl, request, { headers }).pipe(\r\n timeout(timeoutMs),\r\n this.applyRetryStrategy(),\r\n map((response) => this.validateResponse(response)),\r\n catchError((error) => this.handleError(error)),\r\n );\r\n }\r\n\r\n /**\r\n * Build request payload with current tenant context\r\n */\r\n private buildRequest(message: string, history?: Message[]): ChatApiRequest {\r\n const context = this.tenantContext.getContext();\r\n\r\n const request: ChatApiRequest = {\r\n message,\r\n platformTenant: context.platformTenant,\r\n subTenant: context.subTenant,\r\n agent: context.agent,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Include history if enabled and provided\r\n if (this.config.includeHistory && history && history.length > 0) {\r\n const maxMessages = this.config.maxHistoryMessages || 10;\r\n request.history = history.slice(-maxMessages);\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Build HTTP headers\r\n */\r\n private buildHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n });\r\n\r\n // Add API key if provided\r\n if (this.config.apiKey) {\r\n headers = headers.set('Authorization', `Bearer ${this.config.apiKey}`);\r\n }\r\n\r\n // Add custom headers if provided\r\n if (this.config.customHeaders) {\r\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\r\n headers = headers.set(key, value);\r\n });\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Apply retry strategy based on configuration\r\n */\r\n private applyRetryStrategy() {\r\n return (source: Observable<ChatApiResponse>) => {\r\n if (!this.config.enableRetry) {\r\n return source;\r\n }\r\n\r\n const retryAttempts = this.config.retryAttempts || 2;\r\n const retryDelay = this.config.retryDelay || 1000;\r\n\r\n return source.pipe(\r\n retry({\r\n count: retryAttempts,\r\n delay: (error, retryCount) => {\r\n // Only retry on network errors or 5xx server errors\r\n if (this.shouldRetry(error)) {\r\n console.warn(`Retrying API request (attempt ${retryCount}/${retryAttempts})...`);\r\n return timer(retryDelay * retryCount);\r\n }\r\n // Don't retry on client errors (4xx)\r\n return throwError(() => error);\r\n },\r\n }),\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Determine if error should trigger a retry\r\n */\r\n private shouldRetry(error: any): boolean {\r\n if (error instanceof HttpErrorResponse) {\r\n // Retry on network errors or 5xx server errors\r\n return error.status === 0 || error.status >= 500;\r\n }\r\n // Retry on timeout errors\r\n if (error.name === 'TimeoutError') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Validate API response\r\n */\r\n private validateResponse(response: ChatApiResponse): ChatApiResponse {\r\n if (!response || !response.reply) {\r\n throw {\r\n message: 'Invalid API response: missing reply field',\r\n code: 'INVALID_RESPONSE',\r\n } as ChatApiError;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Handle API errors\r\n */\r\n private handleError(error: any): Observable<never> {\r\n let apiError: ChatApiError;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n // HTTP error\r\n apiError = {\r\n message: error.error?.message || error.message || 'API request failed',\r\n code: error.error?.code || 'HTTP_ERROR',\r\n statusCode: error.status,\r\n details: error.error,\r\n };\r\n } else if (error.name === 'TimeoutError') {\r\n // Timeout error\r\n apiError = {\r\n message: 'Request timeout - please try again',\r\n code: 'TIMEOUT',\r\n statusCode: 408,\r\n };\r\n } else {\r\n // Other errors\r\n apiError = {\r\n message: error.message || 'Unknown error occurred',\r\n code: error.code || 'UNKNOWN_ERROR',\r\n details: error,\r\n };\r\n }\r\n\r\n console.error('Chatbot API Error:', apiError);\r\n return throwError(() => apiError);\r\n }\r\n\r\n /**\r\n * Check if API is enabled\r\n */\r\n isApiEnabled(): boolean {\r\n return this.config.enableApi === true && !!this.config.apiUrl;\r\n }\r\n\r\n /**\r\n * Get current API configuration\r\n */\r\n getConfig(): DoohbotApiConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n","import { Injectable, signal, inject } from '@angular/core';\r\nimport { Message } from '../../model/message';\r\nimport { CHAT_INTENTS } from '../../model/doohbot.intents';\r\nimport { ChatApiError } from '../../model/api-request.model';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { ChatbotApiService } from '../../core/services/doohbot-api.service';\r\nimport { UserContext } from '../../core/models/user-context.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MessageService {\r\n // Context-aware message storage\r\n private messageStore = new Map<string, Message[]>();\r\n private currentContextKey = signal<string>('default');\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n public audioUnlocked = false;\r\n\r\n // Enable/disable localStorage persistence\r\n private enablePersistence = true;\r\n private readonly STORAGE_PREFIX = 'doohbot_messages_';\r\n\r\n // API service (optional)\r\n private apiService = inject(ChatbotApiService, { optional: true });\r\n\r\n // User context for backend proxy mode\r\n private userContext?: UserContext;\r\n\r\n // API state signals\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n\r\n constructor() {\r\n // Load persisted messages on initialization\r\n this.loadPersistedMessages();\r\n }\r\n\r\n /**\r\n * Switch to a new context\r\n */\r\n public switchContext(contextKey: string): void {\r\n // Save current context messages before switching\r\n if (this.currentContextKey()) {\r\n this.saveContextMessages(this.currentContextKey(), this.messages());\r\n }\r\n\r\n // Update context key\r\n this.currentContextKey.set(contextKey);\r\n\r\n // Load messages for new context\r\n const contextMessages = this.messageStore.get(contextKey) || [];\r\n this.messages.set([...contextMessages]);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n public getCurrentContextKey(): string {\r\n return this.currentContextKey();\r\n }\r\n\r\n /**\r\n * Set user context for backend proxy mode\r\n * This allows tracking which user sent each message\r\n */\r\n public setUserContext(context: UserContext): void {\r\n this.userContext = context;\r\n }\r\n\r\n /**\r\n * Get current user context\r\n */\r\n public getUserContext(): UserContext | undefined {\r\n return this.userContext;\r\n }\r\n\r\n /**\r\n * Clear messages for current context\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n const contextKey = this.currentContextKey();\r\n this.messageStore.set(contextKey, []);\r\n this.persistMessages(contextKey, []);\r\n }\r\n\r\n /**\r\n * Clear all messages across all contexts\r\n */\r\n clearAllMessages(): void {\r\n this.messages.set([]);\r\n this.messageStore.clear();\r\n if (this.enablePersistence) {\r\n this.clearAllPersistedMessages();\r\n }\r\n }\r\n\r\n /**\r\n * Add message to current context\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n\r\n // Update message store for current context\r\n const contextKey = this.currentContextKey();\r\n const contextMessages = this.messageStore.get(contextKey) || [];\r\n const updatedMessages = [...contextMessages, newMessage];\r\n this.saveContextMessages(contextKey, updatedMessages);\r\n\r\n if (message.sender === 'bot') {\r\n this.playBotSound();\r\n }\r\n }\r\n\r\n /**\r\n * Get messages for a specific context\r\n */\r\n public getMessagesForContext(contextKey: string): Message[] {\r\n return this.messageStore.get(contextKey) || [];\r\n }\r\n\r\n /**\r\n * Get all context keys that have messages\r\n */\r\n public getAllContextKeys(): string[] {\r\n return Array.from(this.messageStore.keys());\r\n }\r\n\r\n /**\r\n * Get bot reply - supports both API and local modes\r\n * @param userText User's message\r\n * @returns Promise with bot reply\r\n */\r\n async getBotReply(userText: string): Promise<string> {\r\n // Check if API mode is enabled\r\n if (this.apiService?.isApiEnabled()) {\r\n return this.getBotReplyFromApi(userText);\r\n }\r\n // Fall back to local intent matching\r\n return this.getBotReplyLocal(userText);\r\n }\r\n\r\n /**\r\n * Get bot reply from API\r\n */\r\n private async getBotReplyFromApi(userText: string): Promise<string> {\r\n if (!this.apiService) {\r\n return this.getFallbackReply();\r\n }\r\n\r\n try {\r\n this.isLoadingApi.set(true);\r\n this.apiError.set(null);\r\n\r\n // Get message history if API config includes history\r\n const history = this.apiService.getConfig().includeHistory ? this.messages() : undefined;\r\n\r\n // Call API\r\n const response = await firstValueFrom(this.apiService.sendMessage(userText, history));\r\n\r\n this.isLoadingApi.set(false);\r\n return response.reply;\r\n } catch (error) {\r\n this.isLoadingApi.set(false);\r\n const apiError = error as ChatApiError;\r\n this.apiError.set(apiError);\r\n console.error('API error, falling back to local mode:', apiError);\r\n\r\n // Fallback to local mode on API error\r\n return this.getBotReplyLocal(userText);\r\n }\r\n }\r\n\r\n /**\r\n * Get bot reply using local intent matching\r\n */\r\n private getBotReplyLocal(userText: string): string {\r\n const text = userText.toLowerCase();\r\n for (const intent of CHAT_INTENTS) {\r\n if (intent.patterns.some((pattern) => text.includes(pattern))) {\r\n return intent.response;\r\n }\r\n }\r\n return this.getFallbackReply();\r\n }\r\n\r\n getFallbackReply(): string {\r\n return \"I'm sorry π, I didn't understand that.\";\r\n }\r\n\r\n // method that tells you if it's a fallback\r\n isFallbackIntent(userText: string): boolean {\r\n const text = userText.toLowerCase();\r\n return !CHAT_INTENTS.some((intent) =>\r\n intent.patterns.some((pattern) => text.includes(pattern)),\r\n );\r\n }\r\n\r\n public unlockAudio(): void {\r\n if (this.audioUnlocked) return;\r\n const audio = new Audio();\r\n audio.volume = 1.0;\r\n audio\r\n .play()\r\n .then(() => (this.audioUnlocked = true))\r\n .catch(() => {});\r\n }\r\n\r\n public playBotSound(): void {\r\n if (!this.audioUnlocked) return;\r\n try {\r\n const audio = new Audio('assets/bot.mp3');\r\n audio.play();\r\n } catch (error) {\r\n console.error('Error playing bot sound:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable localStorage persistence\r\n */\r\n public setPersistence(enabled: boolean): void {\r\n this.enablePersistence = enabled;\r\n }\r\n\r\n /**\r\n * Private: Save context messages to store and persist\r\n */\r\n private saveContextMessages(contextKey: string, messages: Message[]): void {\r\n this.messageStore.set(contextKey, messages);\r\n this.persistMessages(contextKey, messages);\r\n }\r\n\r\n /**\r\n * Private: Persist messages to localStorage\r\n */\r\n private persistMessages(contextKey: string, messages: Message[]): void {\r\n if (!this.enablePersistence) return;\r\n try {\r\n const key = this.STORAGE_PREFIX + contextKey;\r\n localStorage.setItem(key, JSON.stringify(messages));\r\n } catch (error) {\r\n console.error('Error persisting messages:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Private: Load all persisted messages from localStorage\r\n */\r\n private loadPersistedMessages(): void {\r\n if (!this.enablePersistence) return;\r\n try {\r\n const keys = Object.keys(localStorage);\r\n keys.forEach((key) => {\r\n if (key.startsWith(this.STORAGE_PREFIX)) {\r\n const contextKey = key.replace(this.STORAGE_PREFIX, '');\r\n const messagesJson = localStorage.getItem(key);\r\n if (messagesJson) {\r\n const messages = JSON.parse(messagesJson) as Message[];\r\n // Convert timestamp strings back to Date objects\r\n messages.forEach((msg) => {\r\n if (msg.timestamp && typeof msg.timestamp === 'string') {\r\n msg.timestamp = new Date(msg.timestamp);\r\n }\r\n });\r\n this.messageStore.set(contextKey, messages);\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error loading persisted messages:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Private: Clear all persisted messages from localStorage\r\n */\r\n private clearAllPersistedMessages(): void {\r\n try {\r\n const keys = Object.keys(localStorage);\r\n keys.forEach((key) => {\r\n if (key.startsWith(this.STORAGE_PREFIX)) {\r\n localStorage.removeItem(key);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error clearing persisted messages:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n // Initialize theme from local storage or default to auto\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n this.setTheme(savedTheme || 'auto');\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this._theme.set(mode);\r\n localStorage.setItem('theme', mode);\r\n this.updateActiveTheme(mode);\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n // Also listen to system preference as a fallback or if parent doesn't specify\r\n // const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n // this.mediaQueryListener = (e) => {\r\n // // Re-run detection which prioritizes parent classes but falls back to system\r\n // this.detectAndApplyParentTheme();\r\n // };\r\n // mediaQuery.addEventListener('change', this.mediaQueryListener);\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = [\r\n 'dark',\r\n 'dark-theme',\r\n 'dark-mode',\r\n 'night-mode',\r\n 'data-bs-theme-light',\r\n 'data-bs-theme-dark',\r\n ];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Fallback to system preference\r\n // return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n // We do NOT touch document.body anymore to avoid conflicts\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Only apply to overlay container (for menus/dialogs)\r\n // The main chat window handles its own theme via the host binding in doohbot.component.ts\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n // if (this.mediaQueryListener) {\r\n // window\r\n // .matchMedia('(prefers-color-scheme: dark)')\r\n // .removeEventListener('change', this.mediaQueryListener);\r\n // this.mediaQueryListener = null;\r\n // }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n}\r\n","export const appConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n APP_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDI1MCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MCA1MS45MDE0QzgxLjczMTcgNDcuNDIzIDExNS4wMzggNTAuOTI5MiAxNDIuNTkzIDYxLjY0OTRDMTcwLjE0NyA3Mi4zNjk2IDE4OS42OTIgODkuNDI1NSAxOTYuOTI4IDEwOS4wNjRDMjA0LjE2NCAxMjguNzAzIDE5OC40OTggMTQ5LjMxNyAxODEuMTc3IDE2Ni4zNzFDMTYzLjg1NiAxODMuNDI1IDEzNi4yOTggMTk1LjUyMiAxMDQuNTY2IDIwMEw3OC43MTk3IDEyOS44NUM5OC40Mjk4IDEzNC4xNjQgMTEyLjkxNyAxNDcuMTY4IDExMy43NjQgMTYyLjc1NEwxMTMuODUzIDE2NC4zODFMMTEzLjk0IDE2Mi43NTRDMTE0Ljk1NiAxNDQuMDY5IDEzNS41NzYgMTI5LjA5IDE2MS4yOTkgMTI4LjM1M0wxNjMuNTM5IDEyOC4yODhMMTYxLjI5OSAxMjguMjI0QzEzNS41NzYgMTI3LjQ4NiAxMTQuOTU0IDExMi41MDcgMTEzLjk0IDkzLjgyMTNMMTEzLjg1MyA5Mi4xOTQzTDExMy43NjQgOTMuODIxM0MxMTIuOTAzIDEwOS42ODcgOTcuOTA0OSAxMjIuODc4IDc3LjY1MTQgMTI2Ljk1TDc3LjI4MzIgMTI1Ljk1TDUwIDUxLjkwMTRaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMjM0MV81ODQ0KSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzIzNDFfNTg0NCIgeDE9IjUwIiB5MT0iNTEuMjA4IiB4Mj0iMjAwIiB5Mj0iMTk4Ljc5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNEY0NkU1Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzg4NzhGRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n USER_AVATAR:\r\n 'data:image/png;base64,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',\r\n BOT_AVATAR:\r\n 'data:image/png;base64,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',\r\n};\r\n","import { appConst } from '../constant/constant';\r\nimport { DOOHBOT_API_URL } from './../model/token';\r\n\r\nexport class DoohbotInput {\r\n username = '';\r\n password = '';\r\n authToken?: string;\r\n\r\n DOOHBOT_API_URL?: string;\r\n skipAuthentication?: boolean;\r\n\r\n // inputs\r\n userAvatarUrl: string = appConst.USER_AVATAR;\r\n\r\n // Application Constants Text\r\n readonly appTitle? = 'DoohBot';\r\n readonly appSubtitle? = 'Welcome to DoohBot';\r\n readonly welcomeDesc? =\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.';\r\n readonly chatIcon? = 'chat';\r\n readonly sendIcon? = 'send';\r\n readonly closeIcon? = 'close';\r\n readonly clear? = 'clear_all';\r\n readonly minimizeIcon? = 'remove';\r\n readonly moreIcon? = 'more_vert';\r\n readonly fullscreenIcon? = 'fullscreen';\r\n readonly fullscreenExitIcon? = 'fullscreen_exit';\r\n readonly hintText? = 'Please Enter Here';\r\n readonly errorMessage? = 'The message you submitted was too long.';\r\n\r\n // Application Constants Images\r\n readonly appLogoUrl? = appConst.APP_LOGO;\r\n readonly botAvatarUrl? = appConst.BOT_AVATAR;\r\n}\r\n","export const PredefinedMessages = ['Hello!', 'I need help', 'Contact support', 'News and Updates'];\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() isChatOpen: boolean = false;\r\n @Input() unreadCount: number = 0;\r\n @Input() chatIcon: string = 'chat';\r\n @Input() appTitle: string = 'Chat';\r\n\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n get isSidebar(): boolean {\r\n return this.buttonStyle.startsWith('sidebar');\r\n }\r\n\r\n get sidebarPosition(): 'top' | 'center' | 'bottom' {\r\n if (!this.isSidebar) return 'center';\r\n if (this.buttonStyle === 'sidebar') return 'center';\r\n return this.buttonStyle.split('-')[1] as 'top' | 'center' | 'bottom';\r\n }\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <mat-icon>{{ chatIcon }}</mat-icon>\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2>\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TrackByFunction,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { Message } from '../../model/message';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appLogoUrl: string = '';\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => this.scrollToBottom());\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 24px\" />\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'user'\"\r\n class=\"user-avatar\"\r\n [src]=\"userAvatarUrl\"\r\n alt=\"User Avatar\"\r\n />\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n @Input() isBotTyping: boolean = false;\r\n @Input() hintText: string = 'Type a message...';\r\n @Input() sendIcon: string = 'send';\r\n\r\n @Output() send = new EventEmitter<string>();\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\"\r\n (keydown.enter)=\"onSend(messageInput.value); messageInput.value = ''\" [placeholder]=\"hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping\" (click)=\"onSend(messageInput.value); messageInput.value = ''\">\r\n <mat-icon>{{ sendIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule],\r\n})\r\nexport class SnackBar implements OnInit, OnDestroy {\r\n @Input() message: string | null = null;\r\n @Input() autoDismiss: boolean = true;\r\n @Input() dismissDelay: number = 5000;\r\n @Input() show: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n public timeoutId: number | null = null;\r\n\r\n ngOnInit() {\r\n if (this.autoDismiss) {\r\n this.timeoutId = setTimeout(() => {\r\n this.close();\r\n }, this.dismissDelay) as any;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.clearTimeout();\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.message = null;\r\n this.closed.emit();\r\n }\r\n public clearTimeout() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n}\r\n","<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableDrag) {\r\n this.el.nativeElement.removeAttribute('draggableDialog');\r\n return;\r\n }\r\n\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.dragHandle || event.target !== this.dragHandle) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableResize) {\r\n this.el.nativeElement.removeAttribute('resizableDialog');\r\n return;\r\n }\r\n\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '10');\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '12px');\r\n this.renderer.setStyle(handle, 'height', '12px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, TrackByFunction } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { SnackBar } from '../../shared/snackbar/snackbar.component';\r\nimport { DraggableDialogDirective } from '../../directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../model/message';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n SnackBar,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent {\r\n @Input() isChatOpen: boolean = false;\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() appTitle: string = '';\r\n @Input() appLogoUrl: string = '';\r\n @Input() moreIcon: string = 'more_vert';\r\n @Input() minimizeIcon: string = 'minimize';\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n @Input() hintText: string = '';\r\n @Input() sendIcon: string = '';\r\n @Input() messageError: string | null = null;\r\n @Input() showSuggestionChips: boolean = false;\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() openSettings = new EventEmitter<void>();\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() send = new EventEmitter<string>();\r\n @Output() clearMessageError = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n}\r\n","<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" style=\"border-radius: 14px\" [src]=\"appLogoUrl\" alt=\"Logo\" />\r\n <h2>{{ appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Inline error message -->\r\n <app-snackbar\r\n *ngIf=\"messageError\"\r\n [message]=\"messageError\"\r\n [show]=\"!messageError\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\" class=\"mat-menu-override\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n</mat-menu>\r\n","// export const environment = {\r\n// staging: false,\r\n// development: false,\r\n// production: true,\r\n// chatApiUrl: 'https://api.production.com',\r\n// apiKey: '',\r\n// };\r\nexport const environment = {\r\n config: 'const/app-const.json',\r\n production: false,\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './environments/environment';\r\nimport { environment as environmentprod } from './environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AppConst {\r\n static data: any;\r\n\r\n constructor() {}\r\n\r\n async load(): Promise<any> {\r\n const filePath = `../assets/${environment.production ? environmentprod.config : environment.config}?t=${new Date().getTime()}`;\r\n const response = await fetch(filePath);\r\n\r\n if (response.ok) {\r\n try {\r\n AppConst.data = await response.json();\r\n } catch (error: any) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`Could not find file ${filePath}.\\nMESSAGE: ${error.message}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n\r\n if (AppConst.data && !Object.keys(AppConst.data).length) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`No data found in file ${filePath}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n } else {\r\n console.error('============================ ERROR ============================');\r\n console.error(\r\n `Failed to load file ${filePath}.\\nMESSAGE: Request failed with ${response.status} / ${response.statusText}`,\r\n );\r\n console.error('============================ ERROR ============================');\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, delay, retry, map, catchError, of } from 'rxjs';\r\nimport { AppConst } from '../app-const';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n // @BlockUI() blockUI!: NgBlockUI;\r\n\r\n apiUrl: string;\r\n\r\n constructor(private http: HttpClient) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n }\r\n\r\n get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n ): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n let params = {};\r\n\r\n if (nestedParam) {\r\n this.buildHttpParams(params, param, '');\r\n } else {\r\n params = param as HttpParams;\r\n }\r\n\r\n return this.http.get(`${this.apiUrl}${url}`, { params: params, withCredentials: true }).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n post(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n return this.http.post(`${this.apiUrl}${url}`, param as HttpParams).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private returnResponse(value: any, showLoader: boolean = true): any {\r\n // if (showLoader && this.blockUI.isActive) {\r\n\r\n // this.blockUI.reset();\r\n\r\n // }\r\n\r\n return value;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpService } from './http.service';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { LoginRequest } from '../models/login-request.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AccountService {\r\n constructor(private http: HttpService) {}\r\n\r\n login(param?: LoginRequest, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('Account/Login', param, showLoader);\r\n }\r\n\r\n // refreshLogin(param?: object, showLoader = false): Observable<MvResponse<MvLoginResult>> {\r\n\r\n // return this.http.post('Account/RefreshToken', param, showLoader);\r\n\r\n // }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CryptoHelperService {\r\n private encoder = new TextEncoder();\r\n private decoder = new TextDecoder();\r\n private secretKey = ''; // Will be set by AuthService\r\n\r\n setSecretKey(key: string) {\r\n this.secretKey = key;\r\n }\r\n\r\n private async getKey() {\r\n const salt = this.encoder.encode('fixed_salt'); // Keep constant\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw',\r\n this.encoder.encode(this.secretKey),\r\n 'PBKDF2',\r\n false,\r\n ['deriveKey'],\r\n );\r\n\r\n return crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt,\r\n iterations: 100000,\r\n hash: 'SHA-256',\r\n },\r\n baseKey,\r\n { name: 'AES-GCM', length: 256 },\r\n false,\r\n ['encrypt', 'decrypt'],\r\n );\r\n }\r\n\r\n async encrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const key = await this.getKey();\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n { name: 'AES-GCM', iv },\r\n key,\r\n this.encoder.encode(value),\r\n );\r\n\r\n const merged = new Uint8Array(iv.length + encrypted.byteLength);\r\n merged.set(iv, 0);\r\n merged.set(new Uint8Array(encrypted), iv.length);\r\n\r\n return btoa(String.fromCharCode(...merged));\r\n }\r\n\r\n async decrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n\r\n const iv = raw.slice(0, 12);\r\n const data = raw.slice(12);\r\n\r\n const key = await this.getKey();\r\n\r\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\r\n\r\n return this.decoder.decode(decrypted);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppConst } from '../app-const';\r\nimport { map, Observable } from 'rxjs';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { Router } from '@angular/router';\r\nimport { CryptoHelperService } from '../helpers/crypto-helper.service';\r\n\r\n//!! inherit Window storageEventAdded for duplicate tab detection\r\ndeclare global {\r\n interface Window {\r\n storageEventAdded?: boolean;\r\n tabCLoseEventAdded?: boolean;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n apiUrl: string;\r\n storageKey: string;\r\n secretKey: string;\r\n companyCode: string;\r\n jwtHelper: JwtHelperService = new JwtHelperService();\r\n\r\n constructor(\r\n private router: Router,\r\n private http: HttpClient,\r\n private cryptoHelper: CryptoHelperService,\r\n // private cacheService: NgxCacheService,\r\n // private snackBar: MatSnackBar,\r\n ) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n this.storageKey = AppConst?.data?.storageKey;\r\n this.secretKey = AppConst?.data?.secretKey;\r\n this.companyCode = AppConst?.data?.companyCode;\r\n this.cryptoHelper.setSecretKey(this.secretKey);\r\n }\r\n\r\n logout(): Observable<boolean> {\r\n const url = `${this.apiUrl}Account/Logout`;\r\n return this.http.post(url, {}).pipe(\r\n map((response: any) => {\r\n if (response && response.success) {\r\n this.clearAuth();\r\n // this.redirectOut();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // redirectIn() {\r\n // let redirectUrl = this.getCurrentNavigationUrl();\r\n // redirectUrl = redirectUrl || AppConst?.data?.redirectUrl || '/login';\r\n // this.router.navigate([redirectUrl], { replaceUrl: true });\r\n // }\r\n\r\n // redirectOut() {\r\n // this.router.navigate(['/login'], { replaceUrl: true });\r\n // }\r\n\r\n // Utility\r\n setSession(session: AuthResult) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n this.setLocalStorage('access_token', session.access_token);\r\n this.setLocalStorage('refresh_token', session.refresh_token);\r\n this.setLocalStorage('user_id', Number(user?.user_id));\r\n this.setLocalStorage('username', user?.username);\r\n this.setLocalStorage('roles', Number(user?.roles));\r\n this.setLocalStorage('permissions', Number(user?.permissions));\r\n this.setLocalStorage('company_id', user?.company_id);\r\n this.setLocalStorage('office_id', user?.office_id);\r\n }\r\n\r\n setLocalStorage(key: string, value: any) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n dataJson = Object.assign(dataJson, { [key]: value });\r\n localStorage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));\r\n } else {\r\n let dataNew = Object.assign({}, { [key]: value });\r\n let dataEnc = this.encrypt(JSON.stringify(dataNew));\r\n localStorage.setItem(this.storageKey, dataEnc);\r\n }\r\n }\r\n\r\n getLocalStorage(key: string) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n return dataJson![key] || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n let token = this.getLocalStorage('access_token');\r\n if (token && !this.isTokenExpired()) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n let token = (this.getLocalStorage('access_token') ?? '') as string;\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n encrypt(value: string): any {\r\n if (value) {\r\n return CryptoJS.AES.encrypt(value, this.secretKey);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n decrypt(value: string) {\r\n if (value) {\r\n let bytes = CryptoJS.AES.decrypt(value, this.secretKey);\r\n let decryptedText = bytes.toString(CryptoJS.enc.Utf8);\r\n return decryptedText;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n clearAuth() {\r\n this.clearSession();\r\n this.clearStorage();\r\n this.clearCache();\r\n }\r\n\r\n clearSession() {\r\n sessionStorage.clear();\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n\r\n clearStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n clearCache() {\r\n // this.cacheService.clearCache();\r\n }\r\n\r\n getUserId() {\r\n return this.getLocalStorage('user_id') || 0;\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n signal,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { MessageService } from './components/message-input/messaging.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotInput } from './inputs/doohbot-input';\r\nimport { PredefinedMessages } from './helpers/predefined_messages';\r\nimport { ChatButtonComponent } from './components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './components/chat-window/chat-window.component';\r\nimport { DoohbotApiConfig } from './model/api-config.model';\r\nimport { TenantContextService } from './core/services/tenant-context.service';\r\nimport { AccountService } from './core/services/account.service';\r\nimport { AuthService } from './core/services/auth.service';\r\nimport { LoginRequest } from './core/models/login-request.model';\r\nimport { AppConst } from './core/app-const';\r\nimport { UserContext } from './core/models/user-context.model';\r\n\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n AppConst,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: (appConst: AppConst) => () => appConst.load(),\r\n deps: [AppConst],\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class Doohbot extends DoohbotInput implements OnDestroy {\r\n @Input() config: DoohbotInput = new DoohbotInput();\r\n @Input() platformTenant!: string;\r\n @Input() subTenant!: string;\r\n @Input() agent!: string;\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() primaryColor: string | undefined;\r\n @Input() apiConfig?: DoohbotApiConfig;\r\n @Input() userContext?: UserContext; // User context for backend proxy mode\r\n\r\n // @Input() theme: 'light' | 'dark' = 'light';\r\n\r\n isFullScreen = false;\r\n public isChatOpen = signal(false);\r\n public isBotTyping = signal(false);\r\n public isAuthenticated = signal(false);\r\n private messageService = inject(MessageService);\r\n public messages = this.messageService.messages;\r\n private lastReadMessageId = signal<string | null>(null);\r\n public themeService = inject(ThemeService);\r\n private tenantContextService = inject(TenantContextService);\r\n private contextSubscription?: Subscription;\r\n\r\n maxMessageLength = 1000;\r\n messageError = signal<string | null>(null);\r\n dismissTimeout: number | null = null;\r\n\r\n // Predefined messages\r\n public predefinedMessages: string[] = PredefinedMessages;\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n private accountService: AccountService,\r\n private authService: AuthService,\r\n ) {\r\n super();\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['primaryColor']) {\r\n this.updateCssVariables();\r\n }\r\n\r\n // Handle context changes (platformTenant, subTenant, agent)\r\n const contextChanged = changes['platformTenant'] || changes['subTenant'] || changes['agent'];\r\n\r\n if (contextChanged) {\r\n this.updateContext();\r\n }\r\n\r\n // Handle API config changes\r\n if (changes['apiConfig'] && this.apiConfig) {\r\n this.updateApiConfig();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.updateCssVariables();\r\n this.userAvatarUrl = this.config.userAvatarUrl || '';\r\n\r\n // Initialize context\r\n this.updateContext();\r\n\r\n // Initialize API config if provided\r\n if (this.apiConfig) {\r\n this.updateApiConfig();\r\n }\r\n\r\n // Initialize theme from input\r\n // this.themeService.setTheme(this.theme);\r\n\r\n // Subscribe to context changes\r\n this.contextSubscription = this.tenantContextService.contextChange$.subscribe((event) => {\r\n // Sync message service with new context\r\n this.messageService.switchContext(event.contextKey);\r\n\r\n // Reset last read message when context changes\r\n this.lastReadMessageId.set(null);\r\n\r\n // Optionally close chat on context switch (uncomment if desired)\r\n // this.isChatOpen.set(false);\r\n });\r\n\r\n // TODO: 'Remove later - for mock testing only';\r\n // Set initial authentication status\r\n this.isAuthenticated.set(this.authService.isAuthenticated());\r\n\r\n if (!this.authService.isAuthenticated()) {\r\n this.loginUser();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up subscription\r\n this.contextSubscription?.unsubscribe();\r\n }\r\n\r\n private loginUser() {\r\n // TODO: 'Remove later - for mock testing only';\r\n // Check if authentication should be skipped (for testing without backend)\r\n if (this.config.skipAuthentication) {\r\n console.log(' Authentication skipped - Mock mode enabled');\r\n this.isAuthenticated.set(true);\r\n return;\r\n }\r\n\r\n let param = {\r\n username: this.config.username || AppConst.data?.username,\r\n password: this.config.password || AppConst.data?.password,\r\n } as LoginRequest;\r\n this.accountService.login(param).subscribe({\r\n // TODO: 'Remove later - for mock testing only';\r\n\r\n next: (response) => {\r\n if (response && response.success) {\r\n this.isAuthenticated.set(true);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('Login failed:', error);\r\n this.isAuthenticated.set(false);\r\n },\r\n });\r\n }\r\n\r\n private updateCssVariables() {\r\n const host = this.elementRef.nativeElement;\r\n if (this.primaryColor) {\r\n host.style.setProperty('--primary-color', this.primaryColor);\r\n } else {\r\n host.style.removeProperty('--primary-color');\r\n }\r\n }\r\n\r\n /**\r\n * Update context when tenant or agent inputs change\r\n */\r\n private updateContext() {\r\n this.tenantContextService.setContext({\r\n platformTenant: this.platformTenant || '',\r\n subTenant: this.subTenant || '',\r\n agent: this.agent || '',\r\n });\r\n }\r\n\r\n /**\r\n * Update API configuration\r\n */\r\n private updateApiConfig() {\r\n if (!this.apiConfig) return;\r\n\r\n // Merge with default config and update the injection token\r\n const config: DoohbotApiConfig = {\r\n ...this.apiConfig,\r\n };\r\n\r\n // Update the provider (this will be picked up by the API service)\r\n // Note: For dynamic config updates, you may need to use a service\r\n console.log('API Config updated:', config);\r\n }\r\n\r\n toggleChat() {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n if (!currentlyOpen) {\r\n const messages = this.messages();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n clearChat() {\r\n this.messageService.clearMessages();\r\n }\r\n\r\n public async sendMessage(text: string): Promise<void> {\r\n const trimmedText = text.trim();\r\n this.messageError.set(null);\r\n\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > this.maxMessageLength) {\r\n this.messageError.set(this.errorMessage ?? 'Message too long.');\r\n setTimeout(() => {\r\n this.messageError.set(null);\r\n }, 5000);\r\n return;\r\n }\r\n\r\n this.messageService.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n id: Date.now().toString(),\r\n timestamp: new Date(),\r\n });\r\n this.isBotTyping.set(true);\r\n\r\n // Small delay for better UX\r\n setTimeout(async () => {\r\n try {\r\n const botReply = await this.messageService.getBotReply(trimmedText);\r\n const isFallback = botReply === this.messageService.getFallbackReply();\r\n this.messageService.addMessage({\r\n sender: 'bot',\r\n text: botReply,\r\n id: Date.now().toString(),\r\n showSuggestions: isFallback,\r\n });\r\n } catch (error) {\r\n console.error('Error getting bot reply:', error);\r\n // Add fallback message on error\r\n this.messageService.addMessage({\r\n sender: 'bot',\r\n text: this.messageService.getFallbackReply(),\r\n id: Date.now().toString(),\r\n showSuggestions: true,\r\n });\r\n } finally {\r\n this.isBotTyping.set(false);\r\n }\r\n }, 1000);\r\n }\r\n\r\n public clearMessageError(): void {\r\n this.messageError.set(null);\r\n if (this.dismissTimeout) {\r\n clearTimeout(this.dismissTimeout);\r\n this.dismissTimeout = null;\r\n }\r\n }\r\n\r\n showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'bot');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messages();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0;\r\n }\r\n const messages = this.messages();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'bot');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n public preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n toggleFullScreen() {\r\n const chatWindowEl = this.chatWindowRef?.nativeElement.querySelector('.chat-window');\r\n if (!chatWindowEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: chatWindowEl.style.width,\r\n height: chatWindowEl.style.height,\r\n left: chatWindowEl.style.left,\r\n top: chatWindowEl.style.top,\r\n };\r\n\r\n chatWindowEl.style.width = '';\r\n chatWindowEl.style.height = '';\r\n chatWindowEl.style.left = '';\r\n chatWindowEl.style.top = '';\r\n chatWindowEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n chatWindowEl.style.width = this.preFullscreenState.width || '400px';\r\n chatWindowEl.style.height = this.preFullscreenState.height || '500px';\r\n chatWindowEl.style.left = this.preFullscreenState.left || 'auto';\r\n chatWindowEl.style.top = this.preFullscreenState.top || 'auto';\r\n chatWindowEl.style.transform = 'none';\r\n }\r\n }\r\n }\r\n}\r\n","<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n></app-chat-window>\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const DOOHBOT_API_URL = new InjectionToken<string>('DOOHBOT_API_URL');\r\n","/*\r\n * Public API Surface of chatbot\r\n */\r\n\r\n// Main component\r\nexport * from './lib/doohbot.component';\r\n\r\nexport * from './lib/inputs/doohbot-input';\r\nexport * from './lib/model/api-config.model';\r\nexport * from './lib/core/models/user-context.model';\r\nexport * from './lib/core/services/doohbot-api.service';\r\nexport * from './lib/core/services/auth.service';\r\nexport * from './lib/core/services/account.service';\r\nexport * from './lib/constant/constant';\r\nexport * from './lib/model/token';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","environmentprod","retry","map","catchError","i1.HttpService","i3.CryptoHelperService","i1.AccountService","i2.AuthService","i3"],"mappings":"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"}
|