{"version":3,"file":"spektra-cloudevents-zoho-asap-widget.mjs","sources":["../../../projects/zoho-asap-widget/src/lib/zoho-asap-loader.service.ts","../../../projects/zoho-asap-widget/src/lib/zoho-asap-widget.service.ts","../../../projects/zoho-asap-widget/src/lib/zoho-asap-widget.component.ts","../../../projects/zoho-asap-widget/src/lib/zoho-asap-widget.module.ts","../../../projects/zoho-asap-widget/src/public-api.ts","../../../projects/zoho-asap-widget/src/spektra-cloudevents-zoho-asap-widget.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\nexport interface ZohoAsapConfig {\r\n  appId: string;\r\n  orgId: string;\r\n  nonce?: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ZohoAsapLoaderService {\r\n  private static readonly SCRIPT_ID = 'zohodeskasapscript';\r\n  private static readonly BASE_URL = 'https://desk.zoho.com/portal/api/web/asapApp';\r\n\r\n  private loadPromise: Promise<void> | null = null;\r\n  private readyPromise: Promise<void> | null = null;\r\n\r\n  public load(config: ZohoAsapConfig): Promise<void> {\r\n    if (this.loadPromise) return this.loadPromise;\r\n\r\n    // If already injected\r\n    if (document.getElementById(ZohoAsapLoaderService.SCRIPT_ID)) {\r\n      this.loadPromise = Promise.resolve();\r\n      return this.loadPromise;\r\n    }\r\n\r\n    this.loadPromise = new Promise<void>((resolve, reject) => {\r\n      const script = document.createElement('script');\r\n      script.id = ZohoAsapLoaderService.SCRIPT_ID;\r\n      script.type = 'text/javascript';\r\n      script.defer = true;\r\n      script.src = `${ZohoAsapLoaderService.BASE_URL}/${config.appId}?orgId=${config.orgId}`;\r\n\r\n      if (config.nonce) {\r\n        script.setAttribute('nonce', config.nonce);\r\n      }\r\n\r\n      script.onload = () => resolve();\r\n      script.onerror = () => {\r\n        this.loadPromise = null;\r\n        reject(new Error('Failed to load Zoho ASAP script'));\r\n      };\r\n\r\n      document.head.appendChild(script);\r\n    });\r\n\r\n    return this.loadPromise;\r\n  }\r\n\r\n  /**\r\n   * ✅ Wait until Zoho's official ready function is available + executes callback\r\n   */\r\n  public ready(timeoutMs = 5000): Promise<void> {\r\n    if (this.readyPromise) return this.readyPromise;\r\n\r\n    this.readyPromise = new Promise<void>((resolve, reject) => {\r\n      const start = Date.now();\r\n\r\n      const timer = setInterval(() => {\r\n        const win = window as any;\r\n\r\n        if (typeof win.ZohoDeskAsapReady === 'function') {\r\n          clearInterval(timer);\r\n\r\n          try {\r\n            win.ZohoDeskAsapReady(() => resolve());\r\n          } catch (e) {\r\n            reject(e);\r\n          }\r\n          return;\r\n        }\r\n\r\n        if (Date.now() - start > timeoutMs) {\r\n          clearInterval(timer);\r\n          reject(new Error('ZohoDeskAsapReady not available within timeout'));\r\n        }\r\n      }, 100);\r\n    });\r\n\r\n    return this.readyPromise;\r\n  }\r\n\r\n  public getAsapInstance(): any {\r\n    return (window as any)?.ZohoDeskAsap ?? null;\r\n  }\r\n\r\n  /**\r\n   * ✅ Needed only when you want to hard reload the widget\r\n   */\r\n  public reset(): void {\r\n    this.loadPromise = null;\r\n    this.readyPromise = null;\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ZohoAsapWidgetService {\n\n  constructor() { }\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\nimport { ZohoAsapLoaderService } from './zoho-asap-loader.service';\n\n@Component({\n  selector: 'zoho-asap-widget',\n  template: '',\n  styles: []\n})\nexport class ZohoAsapWidgetComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() appId!: string;\n  @Input() orgId!: string;\n  @Input() enabled: boolean = true;\n\n  // ✅ Fields for prefill\n  @Input() prefillFields?: { [key: string]: any };\n  @Input() departmentId?: string;\n  @Input() layoutId?: string;\n\n  // ✅ Hide the default floating launcher button\n  @Input() hideLauncher: boolean = false;\n\n  @Input() nonce?: string;\n\n  // ✅ Accept Zoho JWT token directly\n  @Input() jwtToken?: string;\n\n  // ✅ Output event when widget is closed\n  @Output() widgetClosed = new EventEmitter<void>();\n\n  private destroyed = false;\n  private reloadInProgress = false;\n\n\n\n  // Script state\n  private scriptLoaded = false;\n  private listenersAttached = false;\n  private isWidgetReady = false;\n  private pendingPrefillOperation = false;\n\n  // Auth state\n  // ✅ Track current JWT token\n  private currentJwtToken?: string;\n  private authOperationInProgress = false;\n\n  // Prefill state\n  private lastLoadedPrefillFields?: { [key: string]: any };\n\n  // Logout/Login event resolvers\n  private loggedOutResolver?: () => void;\n  private loggedInResolver?: () => void;\n\n  constructor(\n    private loader: ZohoAsapLoaderService\n  ) {}\n\n  ngOnInit(): void {\n    // Inject CSS immediately to hide launcher before script even loads\n    if (this.hideLauncher) {\n      this.injectHideLauncherStyles();\n    }\n    \n    this.clearZohoStorage();\n    this.ensureWidgetLoaded();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['enabled'] && this.enabled === false) {\n      this.runAuthSequence(undefined);\n      return;\n    }\n\n    if (!this.enabled) return;\n\n    // If prefillFields changed after script loaded, open widget with new data\n    if (\n      changes['prefillFields'] &&\n      !changes['prefillFields'].firstChange &&\n      this.scriptLoaded &&\n      JSON.stringify(changes['prefillFields'].currentValue) !== JSON.stringify(this.lastLoadedPrefillFields)\n    ) {\n      // Open widget when prefill data changes (queue if not ready)\n      if (this.isWidgetReady) {\n        this.openWidgetWithPrefill();\n      } else {\n        this.pendingPrefillOperation = true;\n      }\n      return;\n    }\n\n    this.ensureWidgetLoaded();\n\n    if (changes['jwtToken']) {\n      const token = changes['jwtToken'].currentValue as string | undefined;\n      this.runAuthSequence(token);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroyed = true;\n  }\n\n  /**\n   * ✅ PUBLIC METHOD: Open widget programmatically (for table row actions)\n   * @param prefillData Optional prefill data to apply before opening\n   */\n  public openWidget(prefillData?: { [key: string]: any }): void {\n    if (prefillData) {\n      this.prefillFields = prefillData;\n      this.applyPrefillAfterReady();\n    }\n    \n    this.showWidget();\n  }\n\n  /**\n   * ✅ PUBLIC METHOD: Close/hide the widget\n   */\n  public closeWidget(): void {\n    this.hideWidget();\n  }\n\n  /**\n   * Public refresh: destroy + re-inject the Zoho widget so the next open\n   * starts fresh. Required to recover from Zoho's iframe SPA caching the\n   * conversation/ticket detail view across tab switches. Triggers a fresh\n   * JWT re-login (~2 s visible delay).\n   */\n  public refresh(): void {\n    this.reloadWidget();\n  }\n\n  /**\n   * Open widget with prefill data and navigate to ticket form\n   */\n  private openWidgetWithPrefill(): void {\n    const win = window as any;\n    if (!win?.ZohoDeskAsap || !this.isWidgetReady) {\n      this.pendingPrefillOperation = true;\n      return;\n    }\n\n    try {\n      // Update last loaded prefill\n      this.lastLoadedPrefillFields = this.prefillFields ? { ...this.prefillFields } : undefined;\n      \n      // Apply prefill\n      this.applyPrefillAfterReady();\n      \n      // Open widget\n      win.ZohoDeskAsap.invoke(\"open\");\n      \n      // Only route to ticket form if not from navbar\n      if (\n        this.departmentId &&\n        this.layoutId &&\n        !(this.prefillFields && (this.prefillFields['_fromNavbar'] === true || this.prefillFields['_fromNavbar'] === 'true'))\n      ) {\n        setTimeout(() => {\n          if (!win.ZohoDeskAsap) return;\n          \n          try {\n            win.ZohoDeskAsap.invoke(\"routeTo\", {\n              page: \"ticket.form\",\n              parameters: {\n                departmentId: this.departmentId,\n                layoutId: this.layoutId\n              }\n            });\n          } catch (e) {\n            console.error('[ZohoAsapWidget] Failed to route to ticket form:', e);\n          }\n        }, 500);\n      }\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Failed to open widget with prefill:', e);\n    }\n  }\n\n  /**\n   * ✅ Load script once\n   * ✅ Set ZohoHCAsapSettings prefill BEFORE load\n   */\n  private ensureWidgetLoaded(): void {\n    if (this.destroyed) return;\n    if (!this.enabled || !this.appId || !this.orgId) return;\n\n    if (this.scriptLoaded) {\n      this.attachListenersOnce();\n      return;\n    }\n\n    // ✅ Apply settings BEFORE loading script\n    this.applySettingsBeforeLoad();\n    this.lastLoadedPrefillFields = this.prefillFields ? { ...this.prefillFields } : undefined;\n\n    this.scriptLoaded = true;\n\n    this.loader\n      .load({ appId: this.appId, orgId: this.orgId, nonce: this.nonce })\n      .then(async () => {\n        await this.loader.ready();\n        this.attachListenersOnce();\n\n        if (this.jwtToken) {\n          this.runAuthSequence(this.jwtToken);\n        }\n      })\n      .catch((err) => {\n        console.error('[ZohoAsapWidget] Script load failed', err);\n        this.scriptLoaded = false;\n      });\n  }\n\n  /**\n   * ✅ Apply all settings BEFORE script load (prefill, hide launcher, etc.)\n   */\n  private applySettingsBeforeLoad(): void {\n    const win = window as any;\n    win.ZohoHCAsapSettings = win.ZohoHCAsapSettings || {};\n    \n    // Set locale to prevent language loading errors\n    win.ZohoHCAsapSettings.locale = 'en';\n    \n    // Hide launcher if requested\n    if (this.hideLauncher) {\n      win.ZohoHCAsapSettings.hideLauncher = true;\n    }\n    \n    // Apply prefill if provided\n    if (this.prefillFields && Object.keys(this.prefillFields).length > 0) {\n      win.ZohoHCAsapSettings.ticketsSettings = win.ZohoHCAsapSettings.ticketsSettings || {};\n      \n      // Convert prefillFields object to Zoho prefill format\n      const preFillFields: { [key: string]: { defaultValue: any } } = {};\n      Object.keys(this.prefillFields).forEach(key => {\n        preFillFields[key] = { defaultValue: this.prefillFields![key] };\n      });\n      \n      win.ZohoHCAsapSettings.ticketsSettings.preFillFields = preFillFields;\n    }\n  }\n\n  /**\n   * ✅ Inject CSS to hide launcher button immediately (before script loads)\n   */\n  private injectHideLauncherStyles(): void {\n    if (document.getElementById('zoho-hide-launcher-styles')) return;\n    \n    const style = document.createElement('style');\n    style.id = 'zoho-hide-launcher-styles';\n    style.innerHTML = `\n      /* Hide launcher button from the start */\n      #zohohc-asap-web-button,\n      .zd-launcher-button,\n      .zd_asap_launcher_button,\n      .zohohc-asap-web-launcherbox-button,\n      button[class*=\"launcher\"],\n      div[id*=\"asapButton\"],\n      .zsiq_floatmain {\n        display: none !important;\n        visibility: hidden !important;\n        opacity: 0 !important;\n        pointer-events: none !important;\n        width: 0 !important;\n        height: 0 !important;\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  /**\n   * \\u2705 Show the widget window (open it)\n   */\n  private showWidget(): void {\n    const win = window as any;\n    if (!win?.ZohoDeskAsap) return;\n\n    try {\n      win.ZohoDeskAsap.invoke(\"open\");\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Failed to show widget:', e);\n    }\n  }\n\n  /**\n   * \\u2705 Hide the widget window (close it)\n   */\n  private hideWidget(): void {\n    const win = window as any;\n    if (!win?.ZohoDeskAsap) return;\n\n    try {\n      win.ZohoDeskAsap.invoke(\"close\");\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Failed to hide widget:', e);\n    }\n  }\n\n  /**   * ✅ Attach Zoho events once\n   * We will wait for these events to safely switch users.\n   */\n  private attachListenersOnce(): void {\n    if (this.destroyed) return;\n    if (this.listenersAttached) return;\n\n    const win = window as any;\n    if (!win?.ZohoDeskAsap || typeof win.ZohoDeskAsap.invoke !== 'function') {\n      // Widget API not ready yet, try again later\n      setTimeout(() => this.attachListenersOnce(), 100);\n      return;\n    }\n\n    if (!win?.ZohoDeskAsapReady) {\n      // Script not loaded yet, wait a bit and retry\n      setTimeout(() => this.attachListenersOnce(), 100);\n      return;\n    }\n\n    win.ZohoDeskAsapReady(() => {\n      if (this.destroyed || this.listenersAttached) return;\n      if (!win.ZohoDeskAsap) return;\n\n      // Mark as attached only after callback fires\n      this.listenersAttached = true;\n      this.isWidgetReady = true;\n\n      // Hide launcher button immediately\n      if (this.hideLauncher) {\n        try {\n          win.ZohoDeskAsap.invoke(\"hide\", \"app.launcher\");\n        } catch (e) {\n          console.error('[ZohoAsapWidget] Failed to hide launcher:', e);\n        }\n      }\n\n      this.applyPrefillAfterReady();\n\n      win.ZohoDeskAsap.on('onAfterUserLoggedOut', () => {\n        this.loggedOutResolver?.();\n        this.loggedOutResolver = undefined;\n      });\n\n      win.ZohoDeskAsap.on('onAfterUserLoggedIn', () => {\n        this.applyPrefillAfterReady();\n        this.loggedInResolver?.();\n        this.loggedInResolver = undefined;\n      });\n\n      // Listen for app close event\n      win.ZohoDeskAsap.on('onAppClose', () => {\n        this.lastLoadedPrefillFields = undefined;\n        this.widgetClosed.emit();\n      });\n\n      // Execute any pending prefill operation now that widget is ready\n      if (this.pendingPrefillOperation) {\n        this.pendingPrefillOperation = false;\n        setTimeout(() => this.openWidgetWithPrefill(), 100);\n      }\n    });\n  }\n\n  /**\n   * Apply prefill using Zoho ASAP 2.0 API (after widget ready)\n   * Requires departmentId and layoutId in format \"departmentId&&&layoutId\"\n   */\n  private applyPrefillAfterReady(): void {\n    const win = window as any;\n    if (!win?.ZohoDeskAsap || !this.isWidgetReady || typeof win.ZohoDeskAsap.set !== 'function') {\n      return;\n    }\n\n    // If prefillFields is empty, clear any existing prefill\n    if (!this.prefillFields || Object.keys(this.prefillFields).length === 0) {\n      if (this.departmentId && this.layoutId) {\n        try {\n          const prefillKey = `${this.departmentId}&&&${this.layoutId}`;\n          const emptyPrefill = {\n            [prefillKey]: {}\n          };\n          win.ZohoDeskAsap.set('ticket.form.prefillValues', emptyPrefill);\n        } catch (e) {\n          console.error('[ZohoAsapWidget] Failed to clear prefill:', e);\n        }\n      }\n      return;\n    }\n\n    if (!this.departmentId || !this.layoutId) {\n      return;\n    }\n\n    try {\n      const prefillKey = `${this.departmentId}&&&${this.layoutId}`;\n      \n      // Convert prefillFields object to Zoho prefill format\n      const fieldValues: { [key: string]: { defaultValue: any } } = {};\n      Object.keys(this.prefillFields).forEach(key => {\n        fieldValues[key] = { defaultValue: this.prefillFields![key] };\n      });\n\n      const prefillData = {\n        [prefillKey]: fieldValues\n      };\n\n      win.ZohoDeskAsap.set('ticket.form.prefillValues', prefillData);\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Prefill failed:', e);\n    }\n  }\n\n  /**\n   * ✅ JWT token change detection and authentication\n   * - Detect user switch via JWT token comparison\n   * - Login/logout as needed\n   */\n  private async runAuthSequence(newJwtToken?: string): Promise<void> {\n    if (this.destroyed) return;\n    \n    if (this.authOperationInProgress) {\n      await new Promise(resolve => setTimeout(resolve, 500));\n      if (this.authOperationInProgress) {\n        return;\n      }\n    }\n\n    this.authOperationInProgress = true;\n\n    try {\n      await this.loader.ready().catch(() => undefined);\n\n      const win = window as any;\n      const asap = win?.ZohoDeskAsap;\n\n      if (!asap) {\n        return;\n      }\n\n      if (!newJwtToken) {\n        if (this.currentJwtToken) {\n          await this.safeLogout(asap);\n        }\n        return;\n      }\n\n      if (this.currentJwtToken === newJwtToken) {\n        return;\n      }\n\n      const oldUserId = this.currentJwtToken ? this.extractUserIdFromToken(this.currentJwtToken) : null;\n      const newUserId = this.extractUserIdFromToken(newJwtToken);\n\n      if (this.currentJwtToken && oldUserId === newUserId) {\n        this.currentJwtToken = newJwtToken;\n        await this.safeLogin(asap, newJwtToken);\n        return;\n      }\n\n      if (this.currentJwtToken) {\n        await this.safeLogout(asap);\n        await new Promise(resolve => setTimeout(resolve, 2000));\n      }\n\n      this.currentJwtToken = newJwtToken;\n\n      try {\n        await this.safeLogin(asap, newJwtToken);\n      } catch (e) {\n        this.currentJwtToken = undefined;\n        throw e;\n      }\n\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Auth sequence failed:', e);\n    } finally {\n      this.authOperationInProgress = false;\n    }\n  }\n\n  private waitForLogout(timeoutMs = 8000): Promise<void> {\n    return new Promise((resolve) => {\n      this.loggedOutResolver = resolve;\n      setTimeout(() => resolve(), timeoutMs);\n    });\n  }\n\n  private waitForLogin(timeoutMs = 8000): Promise<void> {\n    return new Promise((resolve) => {\n      this.loggedInResolver = resolve;\n      setTimeout(() => resolve(), timeoutMs);\n    });\n  }\n\n  /**\n   * ✅ Logout and WAIT for onAfterUserLoggedOut\n   */\n  private async safeLogout(asap: any): Promise<void> {\n    this.clearZohoStorage();\n    \n    const wait = this.waitForLogout();\n\n    try {\n      asap.invoke('logout');\n    } catch (e) {\n      // Silent failure\n    }\n\n    await wait;\n    this.clearZohoStorage();\n    await new Promise(resolve => setTimeout(resolve, 2000));\n    this.clearZohoStorage();\n    \n    this.currentJwtToken = undefined;\n  }\n\n  /**\n   * ✅ Login and WAIT for onAfterUserLoggedIn\n   */\n  private async safeLogin(asap: any, token: string): Promise<void> {\n    const wait = this.waitForLogin();\n\n    try {\n      asap.invoke('login', (successCb: any, failureCb: any) => {\n        try {\n          successCb(token);\n        } catch (e) {\n          console.error('[ZohoAsapWidget] JWT callback failed:', e);\n          failureCb(e);\n        }\n      });\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Login invoke failed:', e);\n    }\n\n    await wait;\n  }\n\n  /**\n   * Hard reload: destroy + re-inject the Zoho script and start a fresh login.\n   * Used to defeat Zoho's iframe SPA cache; also called when the wrapper is\n   * configured with `reloadOnClose` so the next open is always fresh.\n   */\n  private reloadWidget(): void {\n    if (this.destroyed || this.reloadInProgress) return;\n    this.reloadInProgress = true;\n\n    this.clearZohoStorage();\n    document.getElementById('zohodeskasapscript')?.remove();\n\n    this.scriptLoaded = false;\n    this.listenersAttached = false;\n    this.isWidgetReady = false;\n    this.currentJwtToken = undefined;\n    this.lastLoadedPrefillFields = undefined;\n\n    this.loader.reset();\n    setTimeout(() => {\n      this.reloadInProgress = false;\n      this.ensureWidgetLoaded();\n    }, 200);\n  }\n\n  /**\n   * ✅ STANDALONE: Clear ALL Zoho ASAP session data\n   * This library should NOT require app-level storage clearing\n   * All cleanup is handled internally here\n   */\n  private clearZohoStorage(): void {\n    try {\n      const beforeKeys = Object.keys(localStorage);\n      const keysToRemove: string[] = [];\n      \n      beforeKeys.forEach(key => {\n        const lowerKey = key.toLowerCase();\n        if (lowerKey.includes('asap') || \n            lowerKey.includes('zoho') || \n            lowerKey.includes('desk') ||\n            lowerKey.includes('clientinfo') ||\n            lowerKey.includes('currenttabid') ||\n            lowerKey.includes('nooftabs') ||\n            lowerKey.includes('onlyone') ||\n            lowerKey.includes('oauth') ||\n            lowerKey.includes('token')) {\n          keysToRemove.push(key);\n        }\n      });\n      \n      if (keysToRemove.length > 0) {\n        keysToRemove.forEach(key => {\n          try {\n            localStorage.removeItem(key);\n          } catch (e) {\n            // Silent failure\n          }\n        });\n      }\n      \n      const sessionBefore = Object.keys(sessionStorage);\n      const sessionKeysToRemove: string[] = [];\n      sessionBefore.forEach(key => {\n        const lowerKey = key.toLowerCase();\n        if (lowerKey.includes('asap') || \n            lowerKey.includes('zoho') || \n            lowerKey.includes('desk')) {\n          sessionKeysToRemove.push(key);\n        }\n      });\n      \n      if (sessionKeysToRemove.length > 0) {\n        sessionKeysToRemove.forEach(key => {\n          sessionStorage.removeItem(key);\n        });\n      }\n      \n      this.clearZohoCookies();\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Storage clear failed:', e);\n    }\n  }\n\n  /**\n   * Clear Zoho-related cookies\n   * Must try multiple domain/path combinations because we don't know exact cookie settings\n   */\n  private clearZohoCookies(): void {\n    try {\n      const cookies = document.cookie.split(';');\n      const currentDomain = window.location.hostname;\n      \n      cookies.forEach(cookie => {\n        const cookieName = cookie.split('=')[0].trim();\n        const lowerName = cookieName.toLowerCase();\n        \n        if (lowerName.includes('zoho') || \n            lowerName.includes('asap') || \n            lowerName.includes('desk') ||\n            lowerName.includes('oauth')) {\n          \n          const deleteCookie = (domain?: string, path: string = '/') => {\n            const domainPart = domain ? `;domain=${domain}` : '';\n            document.cookie = `${cookieName}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=${path}${domainPart}`;\n          };\n          \n          deleteCookie(undefined, '/');\n          deleteCookie(undefined, '');\n          deleteCookie(currentDomain, '/');\n          \n          const parts = currentDomain.split('.');\n          if (parts.length > 2) {\n            const parentDomain = '.' + parts.slice(-2).join('.');\n            deleteCookie(parentDomain, '/');\n          }\n          \n          deleteCookie('.zoho.com', '/');\n          deleteCookie('.zohodesk.com', '/');\n          deleteCookie('.zohoasap.com', '/');\n        }\n      });\n    } catch (e) {\n      // Silent failure\n    }\n  }\n\n  /**\n   * ✅ Extract user identity from JWT token\n   * Returns unique identifier (oid, sub, or email) to detect user changes\n   * This allows distinguishing token refresh (same user) from user switch (different user)\n   */\n  private extractUserIdFromToken(token: string): string | null {\n    try {\n      const parts = token.split('.');\n      if (parts.length !== 3) {\n        return null;\n      }\n\n      const payload = parts[1];\n      const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n      const claims = JSON.parse(decoded);\n\n      const userId = claims.oid || claims.sub || claims.email || claims.preferred_username;\n      \n      if (!userId) {\n        return null;\n      }\n\n      return userId;\n    } catch (e) {\n      console.error('[ZohoAsapWidget] Failed to extract user ID from token:', e);\n      return null;\n    }\n  }\n}\n\n","import { NgModule } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { ZohoAsapWidgetComponent } from './zoho-asap-widget.component';\n\n@NgModule({\n  declarations: [ZohoAsapWidgetComponent],\n  imports: [HttpClientModule],\n  exports: [ZohoAsapWidgetComponent]\n})\nexport class ZohoAsapWidgetModule { }\n","/*\n * Public API Surface of zoho-asap-widget\n */\n\nexport * from './lib/zoho-asap-loader.service';\nexport * from './lib/zoho-asap-widget.service';\nexport * from './lib/zoho-asap-widget.component';\nexport * from './lib/zoho-asap-widget.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ZohoAsapLoaderService"],"mappings":"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"}