tas-uell-sdk 0.2.0 → 0.3.0

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.
Files changed (27) hide show
  1. package/README.md +2 -0
  2. package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +2 -13
  3. package/esm2020/lib/components/tas-feedback-modal/tas-feedback-modal.component.mjs +229 -0
  4. package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +38 -3
  5. package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +46 -8
  6. package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +41 -6
  7. package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +18 -3
  8. package/esm2020/lib/interfaces/tas.interfaces.mjs +6 -1
  9. package/esm2020/lib/services/tas.service.mjs +40 -1
  10. package/esm2020/lib/tas-uell-sdk.module.mjs +8 -3
  11. package/esm2020/public-api.mjs +2 -1
  12. package/fesm2015/tas-uell-sdk.mjs +421 -36
  13. package/fesm2015/tas-uell-sdk.mjs.map +1 -1
  14. package/fesm2020/tas-uell-sdk.mjs +416 -36
  15. package/fesm2020/tas-uell-sdk.mjs.map +1 -1
  16. package/lib/components/tas-btn/tas-btn.component.d.ts +1 -2
  17. package/lib/components/tas-feedback-modal/tas-feedback-modal.component.d.ts +101 -0
  18. package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -0
  19. package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +12 -1
  20. package/lib/components/tas-videocall/tas-videocall.component.d.ts +8 -2
  21. package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +9 -0
  22. package/lib/interfaces/tas.interfaces.d.ts +17 -0
  23. package/lib/services/tas.service.d.ts +15 -1
  24. package/lib/tas-uell-sdk.module.d.ts +5 -4
  25. package/package.json +1 -1
  26. package/public-api.d.ts +1 -0
  27. package/src/lib/styles/tas-global.scss +17 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tas-uell-sdk.mjs","sources":["../../../projects/tas-uell-sdk/src/lib/config/tas.config.ts","../../../projects/tas-uell-sdk/src/lib/interfaces/tas.interfaces.ts","../../../projects/tas-uell-sdk/src/lib/services/tas-utility.service.ts","../../../projects/tas-uell-sdk/src/lib/services/tas.service.ts","../../../projects/tas-uell-sdk/src/lib/services/geolocation.service.ts","../../../projects/tas-uell-sdk/src/lib/icons/tas-icons.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-avatar/tas-avatar.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.html","../../../projects/tas-uell-sdk/src/lib/tas-uell-sdk.module.ts","../../../projects/tas-uell-sdk/src/public-api.ts","../../../projects/tas-uell-sdk/src/tas-uell-sdk.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Configuration interface for the TAS module\n */\nexport interface TasConfig {\n /** TokBox/Vonage API Key */\n tokBoxApiKey: string;\n /** Optional API base URL for room/token endpoints */\n apiBaseUrl?: string;\n}\n\n/**\n * HTTP client interface that consuming apps must implement\n */\nexport interface TasHttpClient {\n get<T>(\n url: string,\n options: { headers?: Record<string, string> }\n ): Observable<T>;\n post<T>(\n url: string,\n options: { body: any; headers?: Record<string, string> }\n ): Observable<T>;\n patch<T>(\n url: string,\n options: { body: any; headers?: Record<string, string> }\n ): Observable<T>;\n}\n\n/**\n * Injection token for TAS configuration\n */\nexport const TAS_CONFIG = new InjectionToken<TasConfig>('TAS_CONFIG');\n\n/**\n * Injection token for HTTP client adapter\n */\nexport const TAS_HTTP_CLIENT = new InjectionToken<TasHttpClient>('TAS_HTTP_CLIENT');\n","// Enums\nexport enum TasRoomType {\n TAS = 'TAS',\n JM = 'JM',\n WEBINAR = 'WEBINAR',\n WELLNESS_MANAGER = 'WELLNESS_MANAGER',\n}\n\nexport enum TasSessionType {\n SPONTANEOUS = 'SPONTANEOUS',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport enum TasUserRole {\n OWNER = 'OWNER',\n USER = 'USER',\n MODERATOR = 'MODERATOR',\n}\n\nexport enum TasBusinessRole {\n ADMIN_MANAGER = 'ADMIN_MANAGER',\n MANAGER = 'MANAGER',\n BACKOFFICE = 'BACKOFFICE',\n USER = 'USER',\n}\n\nexport enum VideoSessionStatus {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n PENDING = 'PENDING',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport enum UserStatus {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n ASSIGNED = 'ASSIGNED',\n}\n\nexport enum UserCallAction {\n WAITING_ROOM_ENTER = 'WAITING_ROOM_ENTER',\n WAITING_ROOM_LEAVE = 'WAITING_ROOM_LEAVE',\n BAN = 'BAN',\n CHANGE_STATUS = 'CHANGE_STATUS',\n REQUEST_GEOLOCALIZATION = 'REQUEST_GEOLOCALIZATION',\n ACTIVATE_GEOLOCATION = 'ACTIVATE_GEOLOCATION',\n DENY_GEOLOCATION = 'DENY_GEOLOCATION',\n}\n\nexport enum GeoStatus {\n PENDING = 'PENDING',\n GRANTED = 'GRANTED',\n DENIED = 'DENIED',\n}\n\nexport enum RoomUserStatus {\n ASSIGNED = 'ASSIGNED',\n WAITING = 'WAITING',\n JOINED = 'JOINED',\n FINISHED = 'FINISHED',\n}\n\nexport enum CallState {\n IDLE = 'IDLE',\n CONNECTING = 'CONNECTING',\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n ERROR = 'ERROR',\n}\n\nexport enum ViewMode {\n FULLSCREEN = 'FULLSCREEN',\n PIP = 'PIP',\n}\n\n// User interfaces\nexport interface TasCurrentUser {\n id: number;\n name: string;\n lastname: string;\n role: TasUserRole;\n}\n\n/** Input configuration for the TAS video call library */\nexport interface TasCallConfig {\n // Status endpoint params\n appointmentId?: number;\n sessionId?: string;\n roomType: TasRoomType;\n entityId: number;\n tenant: string;\n businessRole: TasBusinessRole;\n // Current user info (for token request)\n currentUser: TasCurrentUser;\n}\n\n// API Request/Response interfaces\nexport interface StartSessionRequest {\n sessionId: string;\n name: string;\n lastname: string;\n}\n\nexport interface GenerateTokenRequest {\n sessionId: string;\n name: string;\n lastname: string;\n roleVC: TasUserRole;\n}\n\nexport interface GenerateTokenResponse {\n content: {\n token: string;\n };\n}\n\nexport interface ProxyVideoStatusRequest {\n appointmentId?: number;\n businessRole?: TasBusinessRole;\n tenant?: string;\n sessionId?: string;\n roomType?: TasRoomType;\n entityId?: number;\n}\n\nexport interface ProxyVideoStatusUser {\n userId: number;\n rol: TasUserRole;\n status: UserStatus;\n geoStatus: GeoStatus;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport interface ProxyVideoStatusResponse {\n content: {\n videoCallId: number;\n sessionId: string;\n statusVL: VideoSessionStatus;\n joinable: boolean;\n waitingRoomAvailable: boolean;\n appointmentId: number;\n activateGeo: boolean;\n geoRequestActive: boolean | null; // Owner sent geo request, waiting for user response\n allGeoGranted: boolean; // All users have responded with geo\n users: ProxyVideoStatusUser[];\n };\n}\n\nexport interface ProxyVideoFinishRequest {\n sessionId: string;\n businessRole: TasBusinessRole;\n}\n\nexport interface FinishSessionResponse {\n content: {\n message: string;\n callStatus: string;\n };\n}\n\nexport interface ProxyVideoUserModifyRequest {\n userId?: number;\n videoCallId: number;\n action?: UserCallAction;\n newStatus?: RoomUserStatus;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface WaitingRoomUser {\n userId: number;\n name: string;\n status: RoomUserStatus;\n}\n\n/** User geolocation info for owner panel */\nexport interface UserGeoInfo {\n userId: number;\n geoStatus: GeoStatus;\n latitude: number | null;\n longitude: number | null;\n}\n\n// Appointment types\nexport enum AppointmentStatus {\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n RESCHEDULED = 'RESCHEDULED',\n ACTIVE = 'ACTIVE',\n}\n\nexport interface TasParticipant {\n userId: number;\n name: string;\n}\n\nexport interface TasAppointment {\n id: number;\n agendaId: number;\n date: string; // \"YYYY-MM-DD\"\n startTime: string; // \"HH:mm\"\n endTime: string; // \"HH:mm\"\n bookingType: string;\n status: AppointmentStatus;\n title: string;\n notes: string;\n entityId: number;\n roomType: TasRoomType;\n participants: TasParticipant[];\n}\n\nexport interface GetAppointmentsRequest {\n fromDate: string; // YYYY-MM-DD\n toDate: string; // YYYY-MM-DD\n entityId?: number; // Optional entity ID filter\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TasUtilityService {\n /**\n * Determines if the button should be shown based on the error message.\n * Returns false if the error message matches any of the patterns that indicate\n * the button should be hidden (but polling should continue).\n *\n * @param errorMessage The error message from the status call\n * @returns true if button should be shown, false if it should be hidden\n */\n shouldShowButton(errorMessage: string | null | undefined): boolean {\n if (!errorMessage) {\n return true;\n }\n\n const message = errorMessage.trim();\n\n // List of error messages that should hide the button\n const hideButtonMessages = [\n 'Debe enviarse sessionId o roomType + entityId',\n 'No existe videollamada con ese sessionId',\n 'Usuario no pertenece a la llamada',\n ];\n\n // Check exact matches\n if (hideButtonMessages.some((msg) => message === msg)) {\n return false;\n }\n\n // Check pattern match for \"No existe videocall vigente para roomType=x y entityId=x\"\n // Using startsWith as primary check to handle any variations\n if (message.startsWith('No existe videocall vigente para roomType=')) {\n return false;\n }\n\n // Also check regex pattern as backup\n const vigentePattern = /^No existe videocall vigente para roomType=.+ y entityId=\\s*\\d+$/;\n if (vigentePattern.test(message)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if at least one OWNER has joined the call.\n */\n checkIfOwnerJoined(\n users: { userId: number; rol: string; status: string }[]\n ): boolean {\n return users.some((u) => u.rol === 'OWNER' && u.status === 'JOINED');\n }\n\n /**\n * Extract error message from various error structures.\n */\n extractErrorMessage(err: any, fallback = 'Error desconocido'): string {\n return err?.error?.message || err?.message || fallback;\n }\n}\n\n","import { Injectable, Inject } from '@angular/core';\nimport { TasUtilityService } from './tas-utility.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { catchError, map, finalize, shareReplay } from 'rxjs/operators';\nimport * as OT from '@opentok/client';\nimport {\n GenerateTokenResponse,\n StartSessionRequest,\n FinishSessionResponse,\n ProxyVideoStatusRequest,\n ProxyVideoStatusResponse,\n ProxyVideoFinishRequest,\n ProxyVideoUserModifyRequest,\n UserCallAction,\n RoomUserStatus,\n GeoStatus,\n TasBusinessRole,\n CallState,\n ViewMode,\n WaitingRoomUser,\n UserGeoInfo,\n TasAppointment,\n GetAppointmentsRequest,\n} from '../interfaces/tas.interfaces';\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from '../config/tas.config';\n\n// Re-export enums for backward compatibility\nexport { CallState, ViewMode, TasBusinessRole, UserCallAction, RoomUserStatus, GeoStatus };\n\n@Injectable({\n providedIn: 'root',\n})\n \nexport class TasService {\n private session: OT.Session | null = null;\n private publisher: OT.Publisher | null = null;\n private subscribers: OT.Subscriber[] = [];\n\n private callStateSubject = new BehaviorSubject<CallState>(CallState.IDLE);\n public callState$ = this.callStateSubject.asObservable();\n\n private viewModeSubject = new BehaviorSubject<ViewMode>(ViewMode.FULLSCREEN);\n public viewMode$ = this.viewModeSubject.asObservable();\n\n private isMutedSubject = new BehaviorSubject<boolean>(false);\n public isMuted$ = this.isMutedSubject.asObservable();\n\n // Session info for PiP mode restoration\n private currentSessionId: string | null = null;\n private currentToken: string | null = null;\n private readonly STORAGE_KEY = 'tas_session_state';\n private readonly DISCONNECTED_FLAG_KEY = 'tas_session_disconnected';\n private isFinishingSession: boolean = false;\n\n // Proxy-video circuit state\n private proxyVideoSessionId: string | null = null;\n private proxyVideoToken: string | null = null;\n private currentBusinessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // Waiting room and status polling\n private waitingRoomUsersSubject = new BehaviorSubject<WaitingRoomUser[]>([]);\n public waitingRoomUsers$ = this.waitingRoomUsersSubject.asObservable();\n\n private ownerHasJoinedSubject = new BehaviorSubject<boolean>(false);\n public ownerHasJoined$ = this.ownerHasJoinedSubject.asObservable();\n\n // Observable that emits true when owner was present but then left\n private ownerHasLeftSubject = new BehaviorSubject<boolean>(false);\n public ownerHasLeft$ = this.ownerHasLeftSubject.asObservable();\n\n private joinableSubject = new BehaviorSubject<boolean>(false);\n public joinable$ = this.joinableSubject.asObservable();\n\n // Observable for when backend requests geolocation activation\n private activateGeoSubject = new BehaviorSubject<boolean>(false);\n public activateGeo$ = this.activateGeoSubject.asObservable();\n\n // Observable for when geo request is active (owner waiting for user response)\n private geoRequestActiveSubject = new BehaviorSubject<boolean>(false);\n public geoRequestActive$ = this.geoRequestActiveSubject.asObservable();\n\n // Observable for when all geo has been granted\n private allGeoGrantedSubject = new BehaviorSubject<boolean>(false);\n public allGeoGranted$ = this.allGeoGrantedSubject.asObservable();\n\n // Observable for individual user geo status (for owner panel)\n private userGeoInfoSubject = new BehaviorSubject<UserGeoInfo[]>([]);\n public userGeoInfo$ = this.userGeoInfoSubject.asObservable();\n\n private statusPollingInterval: ReturnType<typeof setInterval> | null = null;\n private readonly DEFAULT_POLL_INTERVAL_MS = 30000; // Default 30s\n private wasOwnerPresent = false;\n\n // Current call context\n private currentAppointmentId: number | null = null;\n private currentVideoCallId: number | null = null;\n private currentTenant: string | null = null;\n\n // Status cache (1 second TTL)\n private readonly STATUS_CACHE_TTL_MS = 1000;\n private statusCache: {\n key: string;\n response: ProxyVideoStatusResponse | null;\n error: any | null;\n timestamp: number;\n } | null = null;\n\n constructor(\n @Inject(TAS_HTTP_CLIENT) private httpClient: TasHttpClient,\n @Inject(TAS_CONFIG) private config: TasConfig,\n private tasUtilityService: TasUtilityService\n ) {}\n\n // ... (Getters and other methods remain unchanged)\n\n /**\n * Start automatic status polling for the current session.\n * Status is polled every intervalMs (default 30s).\n */\n public startStatusPolling(\n params: ProxyVideoStatusRequest, \n intervalMs: number = this.DEFAULT_POLL_INTERVAL_MS\n ): void {\n this.stopStatusPolling(); // Clear any existing polling\n\n // Store context for polling\n if (params.sessionId) {\n this.currentSessionId = params.sessionId;\n }\n if (params.appointmentId) {\n this.currentAppointmentId = params.appointmentId;\n }\n if (params.tenant) {\n this.currentTenant = params.tenant;\n }\n\n\n\n // Initial status fetch\n this.fetchAndProcessStatus(params);\n\n // Set up periodic polling\n this.statusPollingInterval = setInterval(() => {\n this.fetchAndProcessStatus(params);\n }, intervalMs);\n }\n\n /**\n * Stop automatic status polling.\n */\n public stopStatusPolling(): void {\n if (this.statusPollingInterval) {\n clearInterval(this.statusPollingInterval);\n this.statusPollingInterval = null;\n }\n // Do NOT reset waiting room state here, as other components might observe it\n }\n\n /**\n * Reset polling state (waiting room, owner status, etc)\n * Call this when completely exiting the flow\n */\n public resetPollingState(): void {\n this.stopStatusPolling();\n this.waitingRoomUsersSubject.next([]);\n this.ownerHasJoinedSubject.next(false);\n this.ownerHasLeftSubject.next(false);\n this.joinableSubject.next(false);\n this.wasOwnerPresent = false;\n }\n\n // Getters\n public get currentSession(): OT.Session | null {\n return this.session;\n }\n\n public get currentPublisher(): OT.Publisher | null {\n return this.publisher;\n }\n\n public get currentSubscribers(): OT.Subscriber[] {\n return this.subscribers;\n }\n\n public get sessionId(): string | null {\n return this.currentSessionId;\n }\n\n public get token(): string | null {\n return this.currentToken;\n }\n\n public get proxySessionId(): string | null {\n return this.proxyVideoSessionId;\n }\n\n public get proxyToken(): string | null {\n return this.proxyVideoToken;\n }\n\n public get businessRole(): TasBusinessRole {\n return this.currentBusinessRole;\n }\n\n public get isMuted(): boolean {\n return this.isMutedSubject.getValue();\n }\n\n // View Mode Methods\n public setViewMode(mode: ViewMode): void {\n this.viewModeSubject.next(mode);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n mode,\n this.currentBusinessRole\n );\n }\n }\n\n public enterPipMode(): void {\n this.viewModeSubject.next(ViewMode.PIP);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n ViewMode.PIP,\n this.currentBusinessRole\n );\n }\n }\n\n public exitPipMode(): void {\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n ViewMode.FULLSCREEN,\n this.currentBusinessRole\n );\n }\n }\n\n public isPipMode(): boolean {\n return this.viewModeSubject.getValue() === ViewMode.PIP;\n }\n\n // Audio Control\n public toggleMute(): void {\n if (this.publisher) {\n const newMuteState = !this.isMutedSubject.getValue();\n const shouldEnableAudio = !newMuteState;\n\n // Use OpenTok's publishAudio\n this.publisher.publishAudio(shouldEnableAudio);\n\n // Also directly control the MediaStreamTrack as backup\n const audioTrack = this.publisher.getAudioSource?.();\n if (audioTrack) {\n audioTrack.enabled = shouldEnableAudio;\n }\n\n this.isMutedSubject.next(newMuteState);\n }\n }\n\n public setMute(muted: boolean): void {\n if (this.publisher) {\n this.publisher.publishAudio(!muted);\n this.isMutedSubject.next(muted);\n }\n }\n\n // Session Management\n public disconnectSession(clearStorage: boolean = true): void {\n\n\n // Call finishSession before disconnecting if we have a sessionId\n const sessionIdToFinish = this.currentSessionId;\n\n // Clear storage FIRST to prevent any race conditions where state might be saved after disconnect\n if (clearStorage) {\n this.clearSessionState();\n // Set a flag to indicate this session was intentionally disconnected\n // This prevents reconnection on page reload\n sessionStorage.setItem(this.DISCONNECTED_FLAG_KEY, 'true');\n }\n\n if (this.session) {\n this.session.disconnect();\n this.session = null;\n }\n this.publisher = null;\n this.subscribers = [];\n this.currentSessionId = null;\n this.currentToken = null;\n this.proxyVideoSessionId = null;\n this.proxyVideoToken = null;\n this.isMutedSubject.next(false); // Reset mute state\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n this.callStateSubject.next(CallState.DISCONNECTED);\n\n // Call proxy finish after disconnecting (only if not already finishing)\n if (sessionIdToFinish && !this.isFinishingSession) {\n this.isFinishingSession = true;\n this.finishProxyVideoSession({\n sessionId: sessionIdToFinish,\n businessRole: this.currentBusinessRole,\n }).subscribe({\n next: (response) => {\n\n this.isFinishingSession = false;\n },\n error: (error) => {\n\n this.isFinishingSession = false;\n },\n });\n }\n }\n\n public isCallActive(): boolean {\n return this.callStateSubject.getValue() === CallState.CONNECTED;\n }\n\n // State Persistence\n private saveSessionState(\n sessionId: string,\n token: string,\n viewMode: ViewMode,\n businessRole: TasBusinessRole = TasBusinessRole.USER\n ): void {\n const state = {\n sessionId,\n token,\n viewMode,\n businessRole,\n };\n sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));\n }\n\n private clearSessionState(): void {\n sessionStorage.removeItem(this.STORAGE_KEY);\n // Also clear the disconnected flag when clearing state\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n }\n\n public canRestoreSession(): boolean {\n return !!sessionStorage.getItem(this.STORAGE_KEY);\n }\n\n public restoreSession(containerId: string): void {\n const savedState = sessionStorage.getItem(this.STORAGE_KEY);\n if (!savedState) return;\n\n // Check if this session was intentionally disconnected\n // If so, don't restore it on page reload\n const wasDisconnected = sessionStorage.getItem(this.DISCONNECTED_FLAG_KEY);\n if (wasDisconnected === 'true') {\n\n this.clearSessionState();\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n return;\n }\n\n // Don't restore if we're already disconnected or if there's no active session\n // This prevents restoring sessions that were properly disconnected\n if (this.callStateSubject.getValue() === CallState.DISCONNECTED) {\n\n this.clearSessionState();\n return;\n }\n\n try {\n const state = JSON.parse(savedState);\n if (state.sessionId && state.token) {\n\n // Force PiP mode for restoration to ensure UI consistency\n this.viewModeSubject.next(ViewMode.PIP);\n\n if (state.businessRole) {\n this.currentBusinessRole = state.businessRole;\n }\n\n this.connectSession(\n state.sessionId,\n state.token,\n containerId, // Use the same container for both since we are in PiP\n containerId,\n this.currentBusinessRole\n )\n .then(() => {\n\n // Clear the disconnected flag if restoration succeeds\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n })\n .catch((err) => {\n\n this.clearSessionState(); // Clear bad state\n });\n }\n } catch (e) {\n\n this.clearSessionState();\n }\n }\n\n // API Methods\n /**\n * PROXY circuit token: /v2/proxy/video/start\n */\n public startProxyVideoSession(\n payload: StartSessionRequest\n ): Observable<GenerateTokenResponse> {\n return this.httpClient\n .post<GenerateTokenResponse>('v2/proxy/video/start', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as GenerateTokenResponse),\n catchError((error) => {\n console.error('TAS Service: startProxyVideoSession failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Generate cache key from request payload\n */\n private getStatusCacheKey(payload: ProxyVideoStatusRequest): string {\n return `${payload.roomType}-${payload.entityId}-${payload.tenant}-${payload.sessionId || ''}`;\n }\n\n private inflightStatusRequests = new Map<string, Observable<ProxyVideoStatusResponse>>();\n\n /**\n * PROXY circuit status: /v2/proxy/video/status\n * Uses a 1-second cache to avoid redundant API calls from multiple components\n * Implements request deduplication for simultaneous calls\n */\n public getProxyVideoStatus(\n payload: ProxyVideoStatusRequest\n ): Observable<ProxyVideoStatusResponse> {\n const cacheKey = this.getStatusCacheKey(payload);\n const now = Date.now();\n\n // 1. Check if we have a valid cached result (less than 1 second old)\n if (this.statusCache && \n this.statusCache.key === cacheKey && \n (now - this.statusCache.timestamp) < this.STATUS_CACHE_TTL_MS) {\n \n // Return cached error if present\n if (this.statusCache.error) {\n return new Observable(observer => {\n observer.error(this.statusCache!.error);\n });\n }\n \n // Return cached response\n if (this.statusCache.response) {\n return new Observable(observer => {\n observer.next(this.statusCache!.response!);\n observer.complete();\n });\n }\n }\n\n // 2. Check if there is already an inflight request for this key\n if (this.inflightStatusRequests.has(cacheKey)) {\n return this.inflightStatusRequests.get(cacheKey)!;\n }\n\n // 3. Make the API call, share it, and cache the Observable\n const request$: Observable<ProxyVideoStatusResponse> = this.httpClient\n .post<ProxyVideoStatusResponse>('v2/proxy/video/status', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => {\n const typedResponse = response as ProxyVideoStatusResponse;\n // Cache successful response\n this.statusCache = {\n key: cacheKey,\n response: typedResponse,\n error: null,\n timestamp: Date.now(),\n };\n return typedResponse;\n }),\n catchError((error) => {\n console.error('TAS Service: getProxyVideoStatus failed', error);\n // Cache error response\n this.statusCache = {\n key: cacheKey,\n response: null,\n error: error,\n timestamp: Date.now(),\n };\n throw error;\n }),\n // Clean up inflight map when the observable completes or errors\n finalize(() => {\n this.inflightStatusRequests.delete(cacheKey);\n }),\n // Share the result with all subscribers (deduplication)\n shareReplay(1)\n );\n\n this.inflightStatusRequests.set(cacheKey, request$);\n return request$;\n }\n\n /**\n * PROXY circuit user modification: /v2/proxy/video/user/modify\n */\n public modifyProxyVideoUser(payload: ProxyVideoUserModifyRequest): Observable<any> {\n return this.httpClient\n .patch<any>('v2/proxy/video/user/modify', {\n body: payload,\n headers: {},\n })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: modifyProxyVideoUser failed', error);\n throw error;\n })\n );\n }\n\n public finishProxyVideoSession(payload: ProxyVideoFinishRequest) {\n return this.httpClient\n .post<FinishSessionResponse>('v2/proxy/video/finish', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as FinishSessionResponse),\n catchError((error) => {\n console.error('TAS Service: finishProxyVideoSession failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Get user appointments within a date range.\n * @param params Date range for querying appointments\n * @returns Observable of appointment array\n */\n public getAppointments(params: GetAppointmentsRequest): Observable<TasAppointment[]> {\n // Normalize dates to YYYY-MM-DD format (handles ISO timestamps like 2026-01-15T03:00:00.000+0000)\n const normalizeDate = (date: string): string => date.split('T')[0];\n const fromDate = normalizeDate(params.fromDate);\n const toDate = normalizeDate(params.toDate);\n \n let url: string;\n\n // If dates are the same, use only initDate\n // if (fromDate === toDate) {\n // url = `v2/proxy/appointment/agendas/user/appointments?fromDate=${fromDate}&roomType=TAS`;\n // } else {\n url = `v2/proxy/appointment/agendas/user/appointments?fromDate=${fromDate}&toDate=${toDate}&roomType=TAS`;\n // }\n\n if (params.entityId !== undefined) {\n url += `&entityId=${params.entityId}`;\n }\n\n return this.httpClient\n .get<TasAppointment[]>(url, { headers: {} })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: getAppointments failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Start automatic status polling for the current session.\n * Status is polled every STATUS_POLL_INTERVAL_MS milliseconds.\n */\n\n\n /**\n * Stop automatic status polling.\n */\n\n\n /**\n * Fetch status and process the response.\n */\n private fetchAndProcessStatus(params: ProxyVideoStatusRequest): void {\n this.getProxyVideoStatus(params).subscribe({\n next: (response) => {\n this.processStatusResponse(response);\n },\n error: (err) => {\n\n },\n });\n }\n\n /**\n * Process status response to update waiting room users and owner join status.\n */\n private processStatusResponse(response: ProxyVideoStatusResponse): void {\n const content = response.content;\n\n // Update videoCallId if available\n if (content.videoCallId) {\n this.currentVideoCallId = content.videoCallId;\n }\n\n // Update sessionId if available\n if (content.sessionId) {\n this.currentSessionId = content.sessionId;\n this.proxyVideoSessionId = content.sessionId;\n }\n\n // Update joinable status\n this.joinableSubject.next(content.joinable);\n\n // Update activateGeo status\n if (content.activateGeo !== undefined) {\n\n this.activateGeoSubject.next(content.activateGeo);\n }\n\n // Update geoRequestActive status (owner waiting for user geo response)\n if (content.geoRequestActive !== undefined && content.geoRequestActive !== null) {\n\n this.geoRequestActiveSubject.next(content.geoRequestActive);\n } else if (content.geoRequestActive === null) {\n // Reset to false when null\n this.geoRequestActiveSubject.next(false);\n }\n\n // Update allGeoGranted status (all users responded with geo)\n if (content.allGeoGranted !== undefined) {\n\n this.allGeoGrantedSubject.next(content.allGeoGranted);\n }\n\n // Check if owner has joined\n const ownerJoined = this.tasUtilityService.checkIfOwnerJoined(content.users);\n this.ownerHasJoinedSubject.next(ownerJoined);\n\n // Detect if owner left: was present, now not present\n if (this.wasOwnerPresent && !ownerJoined) {\n\n this.ownerHasLeftSubject.next(true);\n }\n\n if (ownerJoined) {\n this.wasOwnerPresent = true;\n }\n\n // Extract waiting room users (status === WAITING)\n const waitingUsers: WaitingRoomUser[] = content.users\n .filter((u) => (u.status as string) === 'WAITING')\n .map((u) => ({\n userId: u.userId,\n name: `User ${u.userId}`, // TODO: Fetch actual user names from a user service\n status: RoomUserStatus.WAITING,\n }));\n\n this.waitingRoomUsersSubject.next(waitingUsers);\n\n // Extract geo info for USER role participants (for owner panel)\n const userGeoInfo: UserGeoInfo[] = content.users\n .filter((u) => u.rol === 'USER')\n .map((u) => ({\n userId: u.userId,\n geoStatus: u.geoStatus,\n latitude: u.latitude,\n longitude: u.longitude,\n }));\n\n this.userGeoInfoSubject.next(userGeoInfo);\n }\n\n /**\n * Admit a user from the waiting room by changing their status.\n */\n public admitUserFromWaitingRoom(\n userId: number,\n videoCallId: number\n ): Observable<any> {\n return this.modifyProxyVideoUser({\n userId,\n videoCallId,\n action: UserCallAction.WAITING_ROOM_LEAVE,\n });\n }\n\n // Getters for current call context\n public get appointmentId(): number | null {\n return this.currentAppointmentId;\n }\n\n public get videoCallId(): number | null {\n return this.currentVideoCallId;\n }\n\n /**\n * Connects to a TokBox video session\n */\n public connectSession(\n sessionId: string,\n token: string,\n publisherElement: string,\n subscriberElement: string,\n businessRole: TasBusinessRole = TasBusinessRole.USER\n ): Promise<void> {\n this.callStateSubject.next(CallState.CONNECTING);\n this.currentSessionId = sessionId;\n this.currentToken = token;\n this.currentBusinessRole = businessRole;\n this.isFinishingSession = false; // Reset flag for new session\n\n // Save initial state (defaulting to current view mode)\n this.saveSessionState(\n sessionId,\n token,\n this.viewModeSubject.getValue(),\n businessRole\n );\n // Clear the disconnected flag when starting a new connection\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n\n return new Promise((resolve, reject) => {\n if (!OT.checkSystemRequirements()) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error('Browser not compatible with TokBox'));\n return;\n }\n\n this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);\n\n // Handle new streams (remote participants joining)\n this.session.on('streamCreated', (event) => {\n const subscriber = this.session?.subscribe(\n event.stream,\n subscriberElement,\n {\n insertMode: 'append',\n width: '100%',\n height: '100%',\n },\n (error) => {\n if (error) {\n console.error('Error subscribing to stream:', error);\n }\n }\n );\n if (subscriber) {\n this.subscribers.push(subscriber);\n }\n });\n\n // Handle streams ending (remote participants leaving)\n this.session.on('streamDestroyed', (event) => {\n this.subscribers = this.subscribers.filter(\n (sub) => sub.stream?.streamId !== event.stream.streamId\n );\n });\n\n // Handle session disconnection\n this.session.on('sessionDisconnected', () => {\n this.callStateSubject.next(CallState.DISCONNECTED);\n\n // Call finishSession when session is disconnected (e.g., by server)\n // Only call if not already finishing (prevents duplicate calls)\n const sessionIdToFinish = this.currentSessionId;\n if (sessionIdToFinish && !this.isFinishingSession) {\n this.isFinishingSession = true;\n this.finishProxyVideoSession({\n sessionId: sessionIdToFinish,\n businessRole: this.currentBusinessRole,\n }).subscribe({\n next: (response) => {\n\n this.isFinishingSession = false;\n },\n error: (error) => {\n\n this.isFinishingSession = false;\n },\n });\n }\n });\n\n // Connect to session\n this.session.connect(token, (error) => {\n if (error) {\n console.error('Error connecting to session:', error);\n this.callStateSubject.next(CallState.ERROR);\n reject(error);\n return;\n }\n\n // Initialize publisher (local video)\n this.publisher = OT.initPublisher(\n publisherElement,\n {\n insertMode: 'append',\n width: '100%',\n height: '100%',\n },\n (err) => {\n if (err) {\n console.error('Error initializing publisher:', err);\n this.callStateSubject.next(CallState.ERROR);\n reject(err);\n return;\n }\n\n // Publish to session\n this.session?.publish(this.publisher, (pubErr) => {\n if (pubErr) {\n console.error('Error publishing stream:', pubErr);\n this.callStateSubject.next(CallState.ERROR);\n reject(pubErr);\n } else {\n this.callStateSubject.next(CallState.CONNECTED);\n resolve();\n }\n });\n }\n );\n });\n });\n }\n\n // Video Element Movement Methods\n public movePublisherTo(newContainerId: string): void {\n if (!this.publisher) return;\n\n const publisherElement = this.publisher.element;\n const newContainer = document.getElementById(newContainerId);\n\n if (publisherElement && newContainer) {\n newContainer.appendChild(publisherElement);\n }\n }\n\n public moveSubscribersTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n this.subscribers.forEach((subscriber) => {\n const subscriberElement = subscriber.element;\n if (subscriberElement) {\n newContainer.appendChild(subscriberElement);\n }\n });\n }\n\n /**\n * Moves the main video (subscriber if available, otherwise publisher) to a container.\n * Used for PiP mode to show only one video.\n */\n public moveMainVideoTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n // Prefer remote video (subscriber) as main\n if (this.subscribers.length > 0 && this.subscribers[0].element) {\n newContainer.appendChild(this.subscribers[0].element);\n return;\n }\n\n // Fall back to local video (publisher)\n if (this.publisher?.element) {\n newContainer.appendChild(this.publisher.element);\n }\n }\n\n /**\n * Moves videos back to fullscreen containers\n */\n public moveVideosToFullscreen(): void {\n this.moveSubscribersTo('subscriber-container');\n this.movePublisherTo('publisher-container');\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface GeoPosition {\n latitude: number;\n longitude: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GeolocationService {\n private cachedPosition: GeoPosition | null = null;\n\n /**\n * Request current geolocation position using Web Geolocation API.\n * Works in both browser and Capacitor environments.\n * @returns Promise with {latitude, longitude} or null if denied/unavailable\n */\n public async getCurrentPosition(): Promise<GeoPosition | null> {\n if (!navigator.geolocation) {\n console.warn('[GeolocationService] Geolocation not supported');\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const geoPosition: GeoPosition = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n };\n this.cachedPosition = geoPosition;\n resolve(geoPosition);\n },\n (error) => {\n console.warn('[GeolocationService] Geolocation error:', error.message);\n resolve(null);\n },\n {\n enableHighAccuracy: false, // Use lower accuracy for faster response\n timeout: 30000, // 30 seconds timeout\n maximumAge: 60000,\n }\n );\n });\n }\n\n /**\n * Get the cached position from the last successful request.\n */\n public getCachedPosition(): GeoPosition | null {\n return this.cachedPosition;\n }\n\n /**\n * Clear the cached position.\n */\n public clearCache(): void {\n this.cachedPosition = null;\n }\n}\n","/**\n * SVG icons used internally by TAS SDK components.\n * Icons are stored as strings to avoid asset bundling complexity.\n */\n\nexport const TAS_ICONS = {\n home: `<svg width=\"120\" height=\"100\" viewBox=\"0 0 120 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<rect x=\"10\" width=\"100\" height=\"100\" rx=\"50\" fill=\"#44D8E8\" fill-opacity=\"0.2\"/>\n<path d=\"M45 70C43.625 70 42.4479 69.5104 41.4688 68.5313C40.4896 67.5521 40 66.375 40 65V46.5625L37.5 48.5C36.9583 48.9167 36.3438 49.0833 35.6562 49C34.9688 48.9167 34.4167 48.5833 34 48C33.5833 47.4583 33.4271 46.8542 33.5312 46.1875C33.6354 45.5208 33.9583 44.9792 34.5 44.5625L56.9375 27.3125C57.3958 26.9792 57.8854 26.7292 58.4062 26.5625C58.9271 26.3958 59.4583 26.3125 60 26.3125C60.5417 26.3125 61.0729 26.3958 61.5938 26.5625C62.1146 26.7292 62.6042 26.9792 63.0625 27.3125L85.5 44.5C86.0417 44.9167 86.3646 45.4583 86.4688 46.125C86.5729 46.7917 86.4167 47.4167 86 48C85.5833 48.5833 85.0417 48.9063 84.375 48.9688C83.7083 49.0313 83.0833 48.8542 82.5 48.4375L60 31.25L45 42.75V65H50.0625C50.7708 65 51.3542 65.2396 51.8125 65.7188C52.2708 66.1979 52.5 66.7917 52.5 67.5C52.5 68.2083 52.2604 68.8021 51.7812 69.2813C51.3021 69.7604 50.7083 70 50 70H45ZM67.3125 73.9375C66.9792 73.9375 66.6667 73.875 66.375 73.75C66.0833 73.625 65.8125 73.4375 65.5625 73.1875L58.5 66.125C58 65.625 57.75 65.0417 57.75 64.375C57.75 63.7083 58 63.125 58.5 62.625C59 62.125 59.5833 61.875 60.25 61.875C60.9167 61.875 61.5 62.125 62 62.625L67.3125 67.875L79.6875 55.5C80.1875 55 80.7812 54.7604 81.4688 54.7813C82.1562 54.8021 82.75 55.0625 83.25 55.5625C83.75 56.0625 84 56.6458 84 57.3125C84 57.9792 83.75 58.5625 83.25 59.0625L69.0625 73.1875C68.8125 73.4375 68.5417 73.625 68.25 73.75C67.9583 73.875 67.6458 73.9375 67.3125 73.9375Z\" fill=\"white\"/>\n<path d=\"M110 5L106.575 3.425L105 0L103.425 3.425L100 5L103.425 6.575L105 10L106.575 6.575L110 5Z\" fill=\"#44D8E8\"/>\n<path d=\"M10 51L6.575 49.425L5 46L3.425 49.425L0 51L3.425 52.575L5 56L6.575 52.575L10 51Z\" fill=\"#44D8E8\"/>\n<path d=\"M95 43.5L93.2875 42.7125L92.5 41L91.7125 42.7125L90 43.5L91.7125 44.2875L92.5 46L93.2875 44.2875L95 43.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M42 4.5L40.2875 3.7125L39.5 2L38.7125 3.7125L37 4.5L38.7125 5.2875L39.5 7L40.2875 5.2875L42 4.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M88 83.5L86.2875 82.7125L85.5 81L84.7125 82.7125L83 83.5L84.7125 84.2875L85.5 86L86.2875 84.2875L88 83.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M120 97.5L118.287 96.7125L117.5 95L116.713 96.7125L115 97.5L116.713 98.2875L117.5 100L118.287 98.2875L120 97.5Z\" fill=\"#44D8E8\"/>\n</svg>`,\n} as const;\n\nexport type TasIconName = keyof typeof TAS_ICONS;\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'tas-avatar',\n template: `\n <div\n class=\"avatar\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n [style.fontSize.px]=\"fontSize\"\n >\n <span class=\"initials\">{{ initials }}</span>\n </div>\n `,\n styles: [\n `\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background-color: #ffffff;\n color: #0072ac;\n font-weight: 600;\n font-family: inherit;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .initials {\n text-transform: uppercase;\n user-select: none;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TasAvatarComponent {\n @Input() name: string = '';\n @Input() size: number = 80;\n\n get initials(): string {\n if (!this.name) return '';\n return this.name\n .split(' ')\n .filter((n) => n.length > 0)\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2);\n }\n\n get fontSize(): number {\n return Math.round(this.size * 0.4);\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { GeolocationService } from '../../services/geolocation.service';\nimport {\n CallState,\n ViewMode,\n TasBusinessRole,\n WaitingRoomUser,\n RoomUserStatus,\n UserCallAction,\n ProxyVideoUserModifyRequest,\n UserGeoInfo,\n GeoStatus,\n} from '../../interfaces/tas.interfaces';\nimport { TAS_ICONS } from '../../icons/tas-icons';\nimport { Subscription } from 'rxjs';\n\n/** User geolocation panel view states */\nexport enum UserGeoViewState {\n HIDDEN = 'HIDDEN',\n INITIAL = 'INITIAL',\n VERIFYING = 'VERIFYING',\n VERIFIED = 'VERIFIED',\n DENIED = 'DENIED',\n}\nimport interact from 'interactjs';\n\n@Component({\n selector: 'tas-videocall',\n templateUrl: './tas-videocall.component.html',\n styleUrls: ['./tas-videocall.component.scss'],\n})\nexport class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() sessionId!: string;\n @Input() token!: string;\n @Input() appointmentId?: number;\n @Input() videoCallId?: number;\n @Input() userId?: number; // Current user's ID for geo reporting\n @Input() participantName: string = '';\n @Input() tenant: string = '';\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n @Input() isReturningFromPip: boolean = false;\n\n @ViewChild('publisherContainer') publisherContainer!: ElementRef;\n @ViewChild('subscriberContainer') subscriberContainer!: ElementRef;\n\n public isPublisherSmall = true;\n public callState = CallState.IDLE;\n public isMuted = false;\n public waitingRoomUsers: WaitingRoomUser[] = [];\n public ownerHasJoined = false;\n public hasVideoStream = false;\n public dismissedUsers: number[] = [];\n public showLocationPanel = true; // Show by default for owners, will be updated based on user's location status\n public userHasLocation = false; // Tracks if the user has shared their location\n public geoLocationStatus: 'unknown' | 'active' | 'denied' = 'unknown';\n \n // Geo panel states for owner\n public geoRequestActive = false; // Owner sent request, waiting for user\n public allGeoGranted = false; // All users responded with geo\n public userGeoInfo: UserGeoInfo[] = []; // Individual user geo status\n\n // User geo panel state (for owners)\n public userGeoViewState: UserGeoViewState = UserGeoViewState.HIDDEN;\n public UserGeoViewState = UserGeoViewState; // Expose enum to template\n public homeIcon: SafeHtml;\n public devModeEnabled = false; // Enable dev controls for testing\n private geoPanelDismissed = false; // Track if owner manually closed the panel\n\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService,\n private sanitizer: DomSanitizer\n ) {\n this.homeIcon = this.sanitizer.bypassSecurityTrustHtml(TAS_ICONS.home);\n }\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\n \n // For owners: show the geo panel to request user location (unless dismissed)\n if (this.canAdmitUsers && !this.geoPanelDismissed) {\n this.userGeoViewState = UserGeoViewState.INITIAL;\n }\n }\n\n ngAfterViewInit(): void {\n this.initInteract();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.tasService.resetPollingState();\n\n // Only disconnect if not in PiP mode (keep session alive for floating window)\n if (!this.tasService.isPipMode()) {\n this.tasService.disconnectSession();\n }\n\n interact('.publisher-view').unset();\n }\n\n // Public Methods\n hangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n minimize(): void {\n this.tasService.moveMainVideoTo('pip-main-video');\n // Small delay to ensure video is moved before closing modal\n setTimeout(() => this.tasService.enterPipMode(), 50);\n }\n\n toggleSwap(): void {\n this.isPublisherSmall = !this.isPublisherSmall;\n this.resetVideoPositions();\n setTimeout(() => this.initInteract());\n }\n\n onDoubleClick(): void {\n this.toggleSwap();\n }\n\n /**\n * Check if current user can admit others (OWNER, BACKOFFICE, or MODERATOR)\n */\n get canAdmitUsers(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /** Users with pending geo status */\n get pendingUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.PENDING);\n }\n\n /** Users who granted geo */\n get grantedUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.GRANTED);\n }\n\n /** Users who denied geo */\n get deniedUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.DENIED);\n }\n\n /** Show location panel only if owner and there are users who haven't granted */\n get shouldShowLocationPanel(): boolean {\n if (!this.canAdmitUsers || this.userGeoInfo.length === 0) {\n return false;\n }\n // Hide if all users have granted\n const allGranted = this.userGeoInfo.every(u => u.geoStatus === GeoStatus.GRANTED);\n return !allGranted;\n }\n\n /** Check if any user has denied geo */\n get hasAnyDenied(): boolean {\n return this.deniedUsers.length > 0;\n }\n\n /** Show user geo panel for owners when not hidden */\n get shouldShowUserGeoPanel(): boolean {\n return this.canAdmitUsers && this.userGeoViewState !== UserGeoViewState.HIDDEN;\n }\n\n /** Set user geo view state (for dev controls or close button) */\n setUserGeoViewState(state: UserGeoViewState): void {\n this.userGeoViewState = state;\n // Track if owner manually dismissed the panel\n if (state === UserGeoViewState.HIDDEN) {\n this.geoPanelDismissed = true;\n }\n }\n\n /**\n * Admit a user from the waiting room\n */\n admitUser(userId: number): void {\n if (!this.videoCallId) {\n console.error('Cannot admit user: videoCallId not set');\n return;\n }\n\n this.tasService\n .modifyProxyVideoUser({\n userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.WAITING_ROOM_LEAVE,\n })\n .subscribe({\n next: () => {\n // Remove user from waiting list after successful admit\n this.waitingRoomUsers = this.waitingRoomUsers.filter(\n (u) => u.userId !== userId\n );\n },\n error: (err) => {\n console.error('Error admitting user:', err);\n },\n });\n }\n\n /**\n * Dismiss the waiting room notification for a user\n */\n dismissWaitingNotification(userId: number): void {\n this.dismissedUsers.push(userId);\n this.waitingRoomUsers = this.waitingRoomUsers.filter(\n (u) => u.userId !== userId\n );\n }\n\n /**\n * Close the location panel\n */\n closeLocationPanel(): void {\n this.showLocationPanel = false;\n }\n\n /**\n * Request the user to share their location (called by owner)\n */\n requestUserLocation(): void {\n if (!this.videoCallId) {\n console.error('Cannot request location: videoCallId not set');\n return;\n }\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.REQUEST_GEOLOCALIZATION,\n };\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => {\n console.log('Location request sent');\n // Set panel to verifying state while waiting for user response\n this.userGeoViewState = UserGeoViewState.VERIFYING;\n },\n error: (err) => console.error('Error requesting location:', err),\n });\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n // Call state subscription\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n this.callState = state;\n if (state === CallState.DISCONNECTED) {\n this.activeModal.close('hangup');\n }\n // Track if we have an active video stream\n this.hasVideoStream = state === CallState.CONNECTED;\n })\n );\n\n // View mode subscription\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (mode === ViewMode.PIP) {\n this.activeModal.close('pip');\n }\n })\n );\n\n // Mute state subscription\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n\n // Waiting room users subscription\n this.subscriptions.add(\n this.tasService.waitingRoomUsers$.subscribe((users) => {\n // Filter out dismissed users\n this.waitingRoomUsers = users.filter(\n (u) => !this.dismissedUsers.includes(u.userId)\n );\n })\n );\n\n // Owner join status subscription\n this.subscriptions.add(\n this.tasService.ownerHasJoined$.subscribe((joined) => {\n this.ownerHasJoined = joined;\n })\n );\n\n // Owner left subscription - disconnect non-owners\n this.subscriptions.add(\n this.tasService.ownerHasLeft$.subscribe((hasLeft) => {\n if (hasLeft && !this.canAdmitUsers) { // Non-owner user\n\n this.hangUp();\n this.activeModal.close('owner_left');\n }\n })\n );\n\n // ActivateGeo subscription - only for non-owners (users)\n this.subscriptions.add(\n this.tasService.activateGeo$.subscribe((activateGeo) => {\n if (activateGeo && !this.canAdmitUsers) {\n\n this.handleActivateGeo();\n }\n })\n );\n\n // GeoRequestActive subscription - for owners\n this.subscriptions.add(\n this.tasService.geoRequestActive$.subscribe((active) => {\n\n this.geoRequestActive = active;\n })\n );\n\n // AllGeoGranted subscription - for owners to update panel state\n this.subscriptions.add(\n this.tasService.allGeoGranted$.subscribe((granted) => {\n this.allGeoGranted = granted;\n \n // For owners: update panel state based on geo status\n if (this.canAdmitUsers && granted) {\n this.userGeoViewState = UserGeoViewState.VERIFIED;\n }\n })\n );\n\n // UserGeoInfo subscription - for owner geo panel\n this.subscriptions.add(\n this.tasService.userGeoInfo$.subscribe((info) => {\n this.userGeoInfo = info;\n // Note: We don't auto-switch to DENIED here - that only happens \n // after owner requests and user denies (via geoRequestActive flow)\n })\n );\n }\n\n /**\n * Handle activateGeo request from backend (for non-owner users).\n * Directly prompts browser for geolocation - no panel for users.\n */\n private async handleActivateGeo(): Promise<void> {\n // Clear any cached position to force re-prompting\n this.geolocationService.clearCache();\n \n // Request geolocation from user (browser will prompt)\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n this.geoLocationStatus = 'denied';\n this.denyGeoLocation();\n }\n }\n\n /** Start geolocation verification (called from template button) */\n public async startGeoVerification(): Promise<void> {\n this.userGeoViewState = UserGeoViewState.VERIFYING;\n\n // Clear any cached position to force re-prompting\n this.geolocationService.clearCache();\n \n // Request geolocation from user (browser will prompt)\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n this.geoLocationStatus = 'active';\n this.userGeoViewState = UserGeoViewState.VERIFIED;\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n this.geoLocationStatus = 'denied';\n this.userGeoViewState = UserGeoViewState.DENIED;\n this.denyGeoLocation();\n }\n }\n\n /**\n * Report granted geolocation to backend.\n * IMPORTANT: Only call with valid coordinates.\n */\n private reportGeoStatus(latitude: number, longitude: number): void {\n if (!this.videoCallId) {\n\n return;\n }\n\n // Validate coordinates are present\n if (latitude === undefined || latitude === null || longitude === undefined || longitude === null) {\n\n return;\n }\n\n const body: ProxyVideoUserModifyRequest = {\n userId: this.userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.ACTIVATE_GEOLOCATION,\n latitude,\n longitude,\n };\n\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n\n });\n }\n\n /**\n * Report denied geolocation to backend.\n */\n private denyGeoLocation(): void {\n if (!this.videoCallId) {\n\n return;\n }\n\n const body: ProxyVideoUserModifyRequest = {\n userId: this.userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.DENY_GEOLOCATION,\n };\n\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n\n });\n }\n\n private initializeCall(): void {\n if (this.isReturningFromPip) {\n // Returning from PiP - just move videos back\n setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);\n } else if (this.sessionId && this.token) {\n // New call - connect to session\n this.tasService\n .connectSession(\n this.sessionId,\n this.token,\n 'publisher-container',\n 'subscriber-container',\n this.businessRole\n )\n .catch((err) => {\n console.error('Error connecting to video call:', err);\n });\n \n // Start status polling with shorter interval (5s) to detect owner leaving/location requests\n if (this.appointmentId) {\n this.tasService.startStatusPolling({\n appointmentId: this.appointmentId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n roomType: undefined, // RoomType might be needed if available\n entityId: undefined, // EntityId might be needed if available\n sessionId: this.sessionId\n }, 5000);\n }\n }\n }\n\n private resetVideoPositions(): void {\n const publisherEl = this.publisherContainer?.nativeElement as HTMLElement;\n const subscriberEl = this.subscriberContainer?.nativeElement as HTMLElement;\n\n if (publisherEl) {\n publisherEl.removeAttribute('style');\n publisherEl.removeAttribute('data-x');\n publisherEl.removeAttribute('data-y');\n }\n\n if (subscriberEl) {\n subscriberEl.removeAttribute('style');\n subscriberEl.removeAttribute('data-x');\n subscriberEl.removeAttribute('data-y');\n }\n }\n\n private initInteract(): void {\n interact('.publisher-view').unset();\n\n interact('.publisher-view')\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: 'parent',\n endOnly: true,\n }),\n ],\n autoScroll: true,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute('data-x')) || 0;\n let y = parseFloat(target.getAttribute('data-y')) || 0;\n\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({ outer: 'parent' }),\n interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),\n interact.modifiers.aspectRatio({ ratio: 'preserve' }),\n ],\n inertia: true,\n });\n }\n}\n","<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} está en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificación\"\n >\n ×\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicación del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">×</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicación desactivada, solicita que la active.</p>\n <p>Esta acción nos permitirá disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicación...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicación fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicación fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permitió el acceso a su ubicación.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicación\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n","import { Component, OnInit, OnDestroy, Input, ChangeDetectorRef } from '@angular/core';\nimport { NgbActiveModal, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { GeolocationService, GeoPosition } from '../../services/geolocation.service';\nimport { Subscription } from 'rxjs';\nimport {\n TasCurrentUser,\n TasRoomType,\n TasBusinessRole,\n TasUserRole,\n UserCallAction,\n ProxyVideoUserModifyRequest,\n} from '../../interfaces/tas.interfaces';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\n\nexport enum WaitingRoomState {\n CHECKING_STATUS = 'CHECKING_STATUS',\n WAITING_FOR_JOINABLE = 'WAITING_FOR_JOINABLE',\n READY = 'READY',\n GETTING_TOKEN = 'GETTING_TOKEN',\n JOINING = 'JOINING',\n ERROR = 'ERROR',\n}\n\n@Component({\n selector: 'tas-waiting-room',\n templateUrl: './tas-waiting-room.component.html',\n styleUrls: ['./tas-waiting-room.component.scss'],\n})\nexport class TasWaitingRoomComponent implements OnInit, OnDestroy {\n // Status endpoint params\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // User info for token request\n @Input() currentUser!: TasCurrentUser;\n\n // Component state\n public state: WaitingRoomState = WaitingRoomState.CHECKING_STATUS;\n public WaitingRoomState = WaitingRoomState; // Expose enum to template\n public errorMessage: string = '';\n public isJoinable: boolean = false;\n\n // Session data from status response\n private resolvedSessionId: string = '';\n private resolvedAppointmentId: number | null = null;\n private token: string = '';\n private videoCallId: number | null = null;\n\n // Subscriptions\n private subscriptions = new Subscription();\n private videoCallModalRef: NgbModalRef | null = null;\n\n // Geolocation\n private geoPosition: GeoPosition | null = null;\n private geoWasDenied: boolean = false; // Tracks if user denied geo permission\n private geoResultSent: boolean = false; // Tracks if geo result was already sent\n\n // Permission tracking for auto-join\n private mediaPermissionsGranted: boolean = false;\n private geoPermissionsResolved: boolean = false;\n\n // Auto-retry tracking\n private retryCount: number = 0;\n private readonly MAX_RETRIES = 1;\n\n /** Whether current user is an owner */\n public get isOwner(): boolean {\n return this.currentUser?.role === TasUserRole.OWNER;\n }\n\n /** Whether we're still requesting permissions (for template) */\n public get isRequestingPermissions(): boolean {\n return !this.mediaPermissionsGranted || (!this.geoPermissionsResolved && !this.isOwner && !this.isBackoffice);\n }\n\n /** Whether we're waiting for admission after permissions granted (for template) */\n public get isWaitingForAdmission(): boolean {\n return this.mediaPermissionsGranted && \n (this.geoPermissionsResolved || this.isOwner || this.isBackoffice) && \n !this.isJoinable;\n }\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService,\n private modalService: NgbModal,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnInit');\n this.requestMediaPermissions();\n // Request geolocation permission and cache it (but don't send to backend yet)\n // The cached position will be sent when owner requests it via activateGeo\n this.requestGeolocation();\n this.checkStatus();\n }\n\n /**\n * Request camera and microphone permissions.\n * Triggers auto-join when permissions are resolved.\n */\n private async requestMediaPermissions(): Promise<void> {\n console.log('[TAS DEBUG] Requesting media permissions...');\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });\n // Stop tracks immediately - we just needed the permission\n stream.getTracks().forEach(track => track.stop());\n console.log('[TAS DEBUG] Media permissions granted');\n this.mediaPermissionsGranted = true;\n } catch (error) {\n console.warn('[TAS DEBUG] Media permissions denied or unavailable:', error);\n // Still allow joining - some users may not have camera/mic\n this.mediaPermissionsGranted = true;\n }\n this.tryAutoJoin();\n this.cdr.detectChanges();\n }\n\n /**\n * Request geolocation permission and cache result.\n * Only for regular users (not owners/backoffice).\n * Actual send to backend happens after we have videoCallId.\n * Triggers auto-join when geolocation is resolved.\n */\n private async requestGeolocation(): Promise<void> {\n // Only request geolocation for regular users, not owners/backoffice\n if (this.isOwner || this.isBackoffice) {\n console.log('[TAS DEBUG] Skipping geolocation for owner/backoffice');\n this.geoPermissionsResolved = true;\n return;\n }\n\n console.log('[TAS DEBUG] Requesting geolocation permission...');\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n console.log('[TAS DEBUG] Geolocation granted:', position);\n this.geoPosition = position;\n this.geoWasDenied = false;\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n this.geoPosition = null;\n this.geoWasDenied = true;\n }\n \n this.geoPermissionsResolved = true;\n // If we already have videoCallId, send now. Otherwise, it will be sent after status response.\n this.sendGeoResultToBackend();\n this.tryAutoJoin();\n this.cdr.detectChanges();\n }\n\n /**\n * Send geo result to backend (granted or denied).\n * Only sends if videoCallId is available and not already sent.\n */\n private sendGeoResultToBackend(): void {\n if (!this.videoCallId) {\n console.log('[TAS DEBUG] Cannot send geo result: videoCallId not available yet');\n return;\n }\n\n if (this.geoResultSent) {\n console.log('[TAS DEBUG] Geo result already sent, skipping');\n return;\n }\n\n if (this.geoPosition) {\n this.sendGeolocationToBackend();\n this.geoResultSent = true;\n } else if (this.geoWasDenied) {\n this.sendGeoDenialToBackend();\n this.geoResultSent = true;\n }\n }\n\n /**\n * Send granted geolocation to backend via modify user endpoint.\n */\n private sendGeolocationToBackend(): void {\n if (!this.geoPosition || !this.videoCallId) {\n return;\n }\n\n console.log('[TAS DEBUG] Sending geolocation to backend...');\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.ACTIVATE_GEOLOCATION,\n latitude: this.geoPosition.latitude,\n longitude: this.geoPosition.longitude,\n };\n \n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geolocation sent successfully'),\n error: (err) => console.error('[TAS DEBUG] Failed to send geolocation:', err),\n });\n }\n\n /**\n * Send geolocation denial to backend via modify user endpoint.\n */\n private sendGeoDenialToBackend(): void {\n if (!this.videoCallId) {\n return;\n }\n\n console.log('[TAS DEBUG] Sending geo denial to backend...');\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.DENY_GEOLOCATION,\n };\n \n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geo denial sent successfully'),\n error: (err) => console.error('[TAS DEBUG] Failed to send geo denial:', err),\n });\n }\n\n ngOnDestroy(): void {\n console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnDestroy');\n this.subscriptions.unsubscribe();\n this.tasService.stopStatusPolling();\n }\n\n /**\n * Check status to get session info\n */\n private checkStatus(): void {\n console.log('[TAS DEBUG] checkStatus called with:', {\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n currentUser: this.currentUser,\n });\n\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n\n const statusParams = {\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n };\n\n console.log('[TAS DEBUG] Calling getProxyVideoStatus...');\n\n this.subscriptions.add(\n this.tasService.getProxyVideoStatus(statusParams).subscribe({\n next: (response) => {\n const content = response.content;\n\n // Store session info from response\n this.resolvedSessionId = content.sessionId;\n this.resolvedAppointmentId = content.appointmentId;\n this.videoCallId = content.videoCallId;\n\n console.log('[TAS DEBUG] Status response:', content);\n\n // Now that we have videoCallId, send geo result if not already sent\n this.sendGeoResultToBackend();\n\n // Start polling for status updates\n this.tasService.startStatusPolling(statusParams);\n\n // Subscribe to joinable status\n this.subscriptions.add(\n this.tasService.joinable$.subscribe((joinable) => {\n this.handleJoinableChange(joinable);\n })\n );\n },\n error: (err) => {\n console.error('[TAS DEBUG] Status check failed:', err);\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = 'Error checking session status. Please try again.';\n },\n })\n );\n }\n\n /**\n * Handle changes to joinable status.\n * Triggers auto-join when joinable becomes true.\n */\n private handleJoinableChange(joinable: boolean): void {\n console.log('[TAS DEBUG] handleJoinableChange called', {\n joinable,\n currentState: this.state,\n resolvedSessionId: this.resolvedSessionId,\n });\n\n this.isJoinable = joinable;\n\n // Don't update state if already getting token, joining, or in error\n if (\n this.state === WaitingRoomState.GETTING_TOKEN ||\n this.state === WaitingRoomState.JOINING ||\n this.state === WaitingRoomState.ERROR\n ) {\n console.log('[TAS DEBUG] Skipping state update - already in:', this.state);\n return;\n }\n\n // Update state and attempt auto-join\n if (joinable) {\n console.log('[TAS DEBUG] Joinable is true, attempting auto-join');\n this.state = WaitingRoomState.READY;\n this.tryAutoJoin();\n } else {\n console.log('[TAS DEBUG] Waiting for joinable...');\n this.state = WaitingRoomState.WAITING_FOR_JOINABLE;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Attempt to auto-join the session when all conditions are met.\n * - For owners: just need joinable + sessionId\n * - For users: need media permissions + geo resolved + joinable + sessionId\n */\n private tryAutoJoin(): void {\n // Don't try if already joining or in error\n if (this.state === WaitingRoomState.GETTING_TOKEN || \n this.state === WaitingRoomState.JOINING) {\n console.log('[TAS DEBUG] tryAutoJoin skipped - already in state:', this.state);\n return;\n }\n\n // For owners: just need joinable\n if (this.isOwner) {\n if (this.isJoinable && this.resolvedSessionId) {\n console.log('[TAS DEBUG] Owner auto-joining...');\n this.startSessionAndJoin();\n }\n return;\n }\n\n // For users: need media + geo resolved + joinable\n if (this.mediaPermissionsGranted && \n this.geoPermissionsResolved && \n this.isJoinable && \n this.resolvedSessionId) {\n console.log('[TAS DEBUG] User auto-joining...');\n this.startSessionAndJoin();\n }\n }\n\n /**\n * Check if user has owner/backoffice role\n */\n private get isBackoffice(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /**\n * Start session and join - called when user clicks join button\n */\n private startSessionAndJoin(): void {\n if (!this.resolvedSessionId) {\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = 'Session ID not available';\n this.tasService.stopStatusPolling();\n this.cdr.detectChanges();\n return;\n }\n\n this.state = WaitingRoomState.GETTING_TOKEN;\n this.errorMessage = '';\n console.log('[TAS DEBUG] Calling /start for session:', this.resolvedSessionId);\n\n this.subscriptions.add(\n this.tasService\n .startProxyVideoSession({\n sessionId: this.resolvedSessionId,\n name: this.currentUser.name,\n lastname: this.currentUser.lastname,\n })\n .subscribe({\n next: (tokenResponse) => {\n console.log('[TAS DEBUG] Token response:', tokenResponse);\n \n // Handle case where HTTP adapter returns error in next instead of error handler\n if (!tokenResponse?.content?.token) {\n console.error('[TAS DEBUG] Invalid token response:', tokenResponse);\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = (tokenResponse as any)?.message || 'Error al iniciar la sesión. Respuesta inválida.';\n this.tasService.stopStatusPolling();\n this.cdr.detectChanges();\n return;\n }\n \n console.log('[TAS DEBUG] Token obtained successfully, joining session...');\n this.token = tokenResponse.content.token;\n this.state = WaitingRoomState.JOINING;\n this.cdr.detectChanges();\n \n // Auto-join immediately\n this.tasService.stopStatusPolling();\n this.activeModal.close('joining');\n this.openVideoCallModal();\n },\n error: (err) => {\n console.error('[TAS DEBUG] /start request failed:', err);\n \n // Auto-retry on first failure\n if (this.retryCount < this.MAX_RETRIES) {\n this.retryCount++;\n console.log('[TAS DEBUG] Auto-retrying... attempt:', this.retryCount);\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.cdr.detectChanges();\n setTimeout(() => this.startSessionAndJoin(), 2000);\n } else {\n // Show error after retry fails\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = err?.error?.message || err?.message || 'Error al iniciar la sesión. Por favor, intente nuevamente.';\n this.tasService.stopStatusPolling();\n console.log('[TAS DEBUG] State set to ERROR, errorMessage:', this.errorMessage);\n this.cdr.detectChanges();\n }\n },\n })\n );\n }\n\n\n\n /**\n * Retry after an error.\n * Resets retry count and restarts the flow.\n */\n retry(): void {\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n this.token = '';\n this.retryCount = 0; // Reset retry count for auto-retry\n this.checkStatus();\n }\n\n private openVideoCallModal(): void {\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.resolvedSessionId;\n this.videoCallModalRef.componentInstance.token = this.token;\n this.videoCallModalRef.componentInstance.appointmentId = this.resolvedAppointmentId;\n this.videoCallModalRef.componentInstance.videoCallId = this.videoCallId;\n this.videoCallModalRef.componentInstance.userId = this.currentUser?.id;\n this.videoCallModalRef.componentInstance.tenant = this.tenant;\n this.videoCallModalRef.componentInstance.businessRole = this.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = false;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n}\n","<div class=\"tas-waiting-room\">\n <div class=\"waiting-room-content\">\n <div class=\"state-container\">\n <!-- Loading states (show spinner) -->\n <ng-container *ngIf=\"state !== WaitingRoomState.ERROR\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n \n <!-- Requesting permissions -->\n <ng-container *ngIf=\"isRequestingPermissions\">\n <p class=\"state-message\">Solicitando permisos...</p>\n <p class=\"state-submessage\">Por favor, aceptá los permisos de cámara y micrófono.</p>\n </ng-container>\n \n <!-- Waiting for admission (permissions granted, not joinable yet) -->\n <ng-container *ngIf=\"isWaitingForAdmission\">\n <p class=\"state-message\">Medicina laboral va a admitirte</p>\n <p class=\"state-submessage\">Por favor, permanecé en esta pantalla.</p>\n </ng-container>\n \n <!-- Getting token / Joining -->\n <ng-container *ngIf=\"state === WaitingRoomState.GETTING_TOKEN || state === WaitingRoomState.JOINING\">\n <p class=\"state-message\">Conectando...</p>\n </ng-container>\n \n <!-- Checking status (when not requesting permissions) -->\n <ng-container *ngIf=\"state === WaitingRoomState.CHECKING_STATUS && !isRequestingPermissions\">\n <p class=\"state-message\">Verificando estado...</p>\n </ng-container>\n </ng-container>\n\n <!-- Error state (show error icon and message) -->\n <ng-container *ngIf=\"state === WaitingRoomState.ERROR\">\n <div class=\"state-icon error\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n </div>\n <p class=\"state-message error\">Ocurrió un error</p>\n <p class=\"error-details\" *ngIf=\"errorMessage\">{{ errorMessage }}</p>\n <button type=\"button\" class=\"btn action-btn retry-btn\" (click)=\"retry()\">\n <i class=\"fa fa-refresh\"></i>\n Reintentar\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { Subscription } from 'rxjs';\nimport {\n TasCurrentUser,\n \n TasRoomType,\n ViewMode,\n TasBusinessRole,\n} from '../../interfaces/tas.interfaces';\nimport { TasWaitingRoomComponent } from '../tas-waiting-room/tas-waiting-room.component';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\nimport { TasService } from '../../services/tas.service';\nimport { TasUtilityService } from '../../services/tas-utility.service';\n\n@Component({\n selector: 'tas-btn',\n templateUrl: './tas-btn.component.html',\n styleUrls: ['./tas-btn.component.scss'],\n})\nexport class TasButtonComponent implements OnInit, OnDestroy {\n // Status endpoint params\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // User info for token request\n @Input() currentUser!: TasCurrentUser;\n\n // Style customization\n @Input() variant: 'default' | 'teal' = 'default';\n @Input() buttonLabel: string = 'Iniciar TAS';\n\n // Skip status check - when true, button shows immediately without API call\n // Useful when parent component already knows the appointment is valid\n @Input() skipStatusCheck = false;\n\n public isLoading = false;\n\n // Status check state\n public isCheckingStatus = false;\n public isStatusError = false;\n public statusErrorMessage = '';\n public isJoinable = false; // Tracks joinable field from status response\n public shouldShowButton = false; // Hidden by default, shown after status check confirms visibility\n\n private subscriptions = new Subscription();\n private currentModalRef: NgbModalRef | null = null;\n private videoCallModalRef: NgbModalRef | null = null;\n private statusPollingInterval: ReturnType<typeof setInterval> | null = null;\n private readonly STATUS_POLL_INTERVAL_MS = 30000; // 30 seconds\n\n /** Whether user is backoffice (or admin/manager) */\n public get isBackoffice(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /** Whether the button should be disabled */\n public get isDisabled(): boolean {\n return this.isLoading || this.isStatusError || !this.isJoinable;\n }\n\n /** Reason why the button is disabled (for tooltip) */\n public get disabledReason(): string {\n if (this.isLoading) {\n return '';\n }\n if (this.isStatusError) {\n return this.statusErrorMessage || 'Error al verificar el estado';\n }\n if (!this.isJoinable) {\n return 'Todavía no es el horario de la llamada';\n }\n return '';\n }\n\n constructor(\n private modalService: NgbModal,\n private tasService: TasService,\n private tasUtilityService: TasUtilityService\n ) {}\n\n ngOnInit(): void {\n // Subscribe to viewMode to handle PiP return\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n // When entering PiP, clear the videoCallModalRef since modal will close\n if (mode === ViewMode.PIP) {\n this.videoCallModalRef = null;\n }\n })\n );\n\n // If skipStatusCheck is true, show button immediately without polling\n if (this.skipStatusCheck) {\n this.shouldShowButton = true;\n this.isJoinable = true;\n return;\n }\n\n // Start status checking\n this.startStatusPolling();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.stopStatusPolling();\n }\n\n /**\n * Start polling status every 30 seconds\n */\n private startStatusPolling(): void {\n // Initial status check\n this.checkStatus();\n\n // Set up periodic polling\n this.statusPollingInterval = setInterval(() => {\n this.checkStatus();\n }, this.STATUS_POLL_INTERVAL_MS);\n }\n\n /**\n * Stop status polling\n */\n private stopStatusPolling(): void {\n if (this.statusPollingInterval) {\n clearInterval(this.statusPollingInterval);\n this.statusPollingInterval = null;\n }\n }\n\n /**\n * Check status endpoint to determine if button should be enabled\n */\n private checkStatus(): void {\n // Skip if required inputs are not available\n if (!this.tenant || !this.entityId) {\n return;\n }\n\n this.isCheckingStatus = true;\n this.statusErrorMessage = '';\n\n this.subscriptions.add(\n this.tasService\n .getProxyVideoStatus({\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n })\n .subscribe({\n next: (response) => {\n // Validate response structure\n if (!response || !response.content) {\n this.handleStatusError('Invalid response');\n return;\n }\n\n this.isCheckingStatus = false;\n this.isStatusError = false;\n this.statusErrorMessage = '';\n this.shouldShowButton = true;\n // Update joinable state from response\n this.isJoinable = response.content?.joinable ?? false;\n },\n error: (err) => {\n\n this.handleStatusError(err);\n },\n })\n );\n }\n\n private handleStatusError(err: any): void {\n this.isCheckingStatus = false;\n const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');\n this.statusErrorMessage = errorMessage;\n\n // On any status error, hide the button\n this.shouldShowButton = false;\n this.isStatusError = false; // We don't show error UI, just hide the button\n\n // Stop polling on error\n this.stopStatusPolling();\n }\n\n onClick(): void {\n if (!this.tenant || !this.currentUser?.name) {\n return;\n }\n\n if (!this.entityId) {\n return;\n }\n\n this.openWaitingRoomModal();\n }\n\n private openWaitingRoomModal(): void {\n this.currentModalRef = this.modalService.open(TasWaitingRoomComponent, {\n size: 'lg',\n windowClass: 'tas-waiting-room-modal',\n backdrop: 'static',\n keyboard: false,\n centered: true,\n });\n\n // Pass all necessary inputs to the waiting room component\n this.currentModalRef.componentInstance.roomType = this.roomType;\n this.currentModalRef.componentInstance.entityId = this.entityId;\n this.currentModalRef.componentInstance.tenant = this.tenant;\n this.currentModalRef.componentInstance.businessRole = this.businessRole;\n this.currentModalRef.componentInstance.currentUser = this.currentUser;\n\n this.currentModalRef.result.then(\n () => {\n this.currentModalRef = null;\n },\n () => {\n this.currentModalRef = null;\n }\n );\n }\n\n private openVideoCallModal(isReturningFromPip: boolean = false): void {\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;\n this.videoCallModalRef.componentInstance.token = this.tasService.token;\n this.videoCallModalRef.componentInstance.businessRole = this.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n}\n","<span\n *ngIf=\"shouldShowButton\"\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { CallState, ViewMode } from '../../interfaces/tas.interfaces';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\nimport { Subscription } from 'rxjs';\nimport interact from 'interactjs';\n\n@Component({\n selector: 'tas-floating-call',\n templateUrl: './tas-floating-call.component.html',\n styleUrls: ['./tas-floating-call.component.scss'],\n})\nexport class TasFloatingCallComponent implements OnInit, OnDestroy {\n public isVisible = false;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n private videoCallModalRef: NgbModalRef | null = null;\n\n constructor(\n private tasService: TasService,\n private modalService: NgbModal\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n interact('.tas-floating-container').unset();\n }\n\n // Public Methods\n onExpand(): void {\n this.openVideoCallModal(true);\n this.tasService.exitPipMode();\n }\n\n onHangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n // Call state subscription\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n if (state === CallState.DISCONNECTED) {\n this.isVisible = false;\n }\n })\n );\n\n // View mode subscription\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n this.isVisible = mode === ViewMode.PIP && this.tasService.isCallActive();\n if (this.isVisible) {\n setTimeout(() => this.initInteract(), 100);\n // Clear modal ref if we enter PiP mode (modal closes itself)\n this.videoCallModalRef = null;\n }\n })\n );\n\n // Mute state subscription\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private openVideoCallModal(isReturningFromPip: boolean = false): void {\n if (this.videoCallModalRef) {\n return;\n }\n\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;\n this.videoCallModalRef.componentInstance.token = this.tasService.token;\n this.videoCallModalRef.componentInstance.businessRole = this.tasService.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n\n // Margin from screen edges (in pixels)\n private readonly PIP_MARGIN = 20;\n\n private initInteract(): void {\n interact('.tas-floating-container').unset();\n\n // Create restriction area with margin\n const margin = this.PIP_MARGIN;\n const restrictToBodyWithMargin = {\n restriction: () => {\n return {\n left: margin,\n top: margin,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n };\n },\n elementRect: { left: 0, right: 1, top: 0, bottom: 1 },\n };\n\n interact('.tas-floating-container')\n .draggable({\n inertia: true,\n modifiers: [interact.modifiers.restrict(restrictToBodyWithMargin)],\n autoScroll: false,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute('data-x')) || 0;\n let y = parseFloat(target.getAttribute('data-y')) || 0;\n\n // Update element size\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n // Translate when resizing from top or left edges\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({\n outer: {\n left: margin,\n top: margin,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n },\n }),\n interact.modifiers.restrictSize({\n min: { width: 200, height: 130 },\n max: { width: 500, height: 350 },\n }),\n interact.modifiers.aspectRatio({ ratio: 'preserve' }),\n ],\n inertia: true,\n });\n }\n}\n","<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <!-- Video content area - shows main video only -->\n <div class=\"floating-content\">\n <!-- Main video container (subscriber if available, otherwise publisher) -->\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <!-- Bottom controls -->\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expand to fullscreen\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TasService } from '../../services/tas.service';\nimport {\n TasAppointment,\n AppointmentStatus,\n TasRoomType,\n TasBusinessRole,\n TasCurrentUser,\n} from '../../interfaces/tas.interfaces';\n\n@Component({\n selector: 'tas-incoming-appointment',\n templateUrl: './tas-incoming-appointment.component.html',\n styleUrls: ['./tas-incoming-appointment.component.scss'],\n})\nexport class TasIncomingAppointmentComponent implements OnInit, OnDestroy {\n // Passthrough inputs for tas-btn\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n @Input() currentUser!: TasCurrentUser;\n \n // Date range inputs for fetching appointments\n @Input() fromDate!: string; // YYYY-MM-DD format\n @Input() toDate!: string; // YYYY-MM-DD format\n\n @Output() enterCall = new EventEmitter<TasAppointment>();\n\n public appointments: TasAppointment[] = [];\n public isLoading = true;\n public hasError = false;\n\n private subscriptions = new Subscription();\n\n constructor(private tasService: TasService) {}\n\n ngOnInit(): void {\n this.loadAppointments();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n private loadAppointments(): void {\n this.subscriptions.add(\n this.tasService\n .getAppointments({ \n fromDate: this.fromDate, \n toDate: this.toDate, \n entityId: this.entityId \n })\n .subscribe({\n next: (response: any) => {\n // Handle both array response and wrapped response (e.g., { content: [...] })\n const appointments = Array.isArray(response)\n ? response\n : response?.content || [];\n \n // Sort by date and startTime descending (most recent first)\n this.appointments = appointments.sort((a: TasAppointment, b: TasAppointment) => {\n const dateTimeA = `${a.date}T${a.startTime}`;\n const dateTimeB = `${b.date}T${b.startTime}`;\n return dateTimeB.localeCompare(dateTimeA);\n });\n this.isLoading = false;\n },\n error: () => {\n this.hasError = true;\n this.isLoading = false;\n },\n })\n );\n }\n\n public onEnterCall(appointment: TasAppointment): void {\n this.enterCall.emit(appointment);\n }\n\n /**\n * Check if tas-btn should be shown for an appointment (CONFIRMED or ACTIVE status)\n */\n public shouldShowTasBtn(appointment: TasAppointment): boolean {\n return appointment.status === AppointmentStatus.CONFIRMED || \n appointment.status === AppointmentStatus.ACTIVE;\n }\n\n /**\n * Format date to Spanish format: \"Lunes 8 de diciembre\"\n */\n public formatAppointmentDate(appointment: TasAppointment): string {\n const [year, month, day] = appointment.date.split('-').map(Number);\n const date = new Date(year, month - 1, day);\n\n const dayNames = [\n 'Domingo', 'Lunes', 'Martes', 'Miércoles',\n 'Jueves', 'Viernes', 'Sábado'\n ];\n const monthNames = [\n 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',\n 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'\n ];\n\n const dayName = dayNames[date.getDay()];\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n\n return `${dayName} ${dayNum} de ${monthName}`;\n }\n\n /**\n * Format time range: \"9:00 - 9:30\"\n */\n public formatTimeRange(appointment: TasAppointment): string {\n return `${appointment.startTime} - ${appointment.endTime}`;\n }\n\n /**\n * Get the other participant in the call (not the current user)\n */\n public getOtherParticipant(appointment: TasAppointment): string {\n if (!appointment.participants || appointment.participants.length === 0) {\n return appointment.title; // Fallback to title if no participants\n }\n \n const otherParticipant = appointment.participants.find(\n p => p.userId !== this.currentUser?.id\n );\n \n return otherParticipant?.name || appointment.title;\n }\n}\n","<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Próximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">✦</span>\n <span class=\"sparkle sparkle-2\">✦</span>\n <span class=\"sparkle sparkle-3\">✦</span>\n <span class=\"sparkle sparkle-4\">✦</span>\n </div>\n <h4 class=\"empty-title\">Todavía no tenés turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo verás en esta sección.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\nimport { TasButtonComponent } from './components/tas-btn/tas-btn.component';\nimport { TasVideocallComponent } from './components/tas-videocall/tas-videocall.component';\nimport { TasFloatingCallComponent } from './components/tas-floating-call/tas-floating-call.component';\nimport { TasWaitingRoomComponent } from './components/tas-waiting-room/tas-waiting-room.component';\nimport { TasAvatarComponent } from './components/tas-avatar/tas-avatar.component';\nimport { TasIncomingAppointmentComponent } from './components/tas-incoming-appointment/tas-incoming-appointment.component';\nimport { TasService } from './services/tas.service';\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from './config/tas.config';\n\n@NgModule({\n declarations: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent,\n TasAvatarComponent,\n TasIncomingAppointmentComponent,\n ],\n imports: [CommonModule, FormsModule, NgbTooltipModule],\n exports: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent,\n TasAvatarComponent,\n TasIncomingAppointmentComponent,\n ],\n})\nexport class TasUellSdkModule {\n /**\n * Use forRoot() to configure the TAS SDK module with required dependencies.\n * This should only be called once in your root AppModule.\n *\n * @example\n * ```typescript\n * import { TasUellSdkModule, TasHttpClient } from 'tas-uell-sdk';\n *\n * // Create an adapter that implements TasHttpClient\n * @Injectable({ providedIn: 'root' })\n * export class MyHttpAdapter implements TasHttpClient {\n * constructor(private http: HttpClient) {}\n * post<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {\n * return this.http.post<T>(url, options.body, { headers: options.headers });\n * }\n * }\n *\n * // In your AppModule\n * @NgModule({\n * imports: [\n * TasUellSdkModule.forRoot({\n * config: { tokBoxApiKey: 'YOUR_TOKBOX_API_KEY' },\n * httpClient: MyHttpAdapter\n * })\n * ]\n * })\n * export class AppModule { }\n * ```\n */\n static forRoot(options: {\n config: TasConfig;\n httpClient: new (...args: any[]) => TasHttpClient;\n }): ModuleWithProviders<TasUellSdkModule> {\n return {\n ngModule: TasUellSdkModule,\n providers: [\n { provide: TAS_CONFIG, useValue: options.config },\n { provide: TAS_HTTP_CLIENT, useClass: options.httpClient },\n TasService,\n ],\n };\n }\n}\n","/*\n * Public API Surface of tas-uell-sdk\n */\n\n// Configuration and tokens\nexport * from './lib/config/tas.config';\n\n// Interfaces\nexport * from './lib/interfaces/tas.interfaces';\n\n// Service\nexport * from './lib/services/tas.service';\nexport * from './lib/services/geolocation.service';\nexport * from './lib/services/tas-utility.service';\n\n// Components\nexport * from './lib/components/tas-btn/tas-btn.component';\nexport * from './lib/components/tas-waiting-room/tas-waiting-room.component';\nexport * from './lib/components/tas-videocall/tas-videocall.component';\nexport * from './lib/components/tas-floating-call/tas-floating-call.component';\nexport * from './lib/components/tas-avatar/tas-avatar.component';\nexport * from './lib/components/tas-incoming-appointment/tas-incoming-appointment.component';\n\n// Module\nexport * from './lib/tas-uell-sdk.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TasUtilityService","i2.TasService","i3.GeolocationService","i5.TasAvatarComponent","i6","i4","i3.TasUtilityService","i1.TasService","i2","i2.TasAvatarComponent","i3.TasButtonComponent"],"mappings":"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"}
1
+ {"version":3,"file":"tas-uell-sdk.mjs","sources":["../../../projects/tas-uell-sdk/src/lib/config/tas.config.ts","../../../projects/tas-uell-sdk/src/lib/interfaces/tas.interfaces.ts","../../../projects/tas-uell-sdk/src/lib/services/tas-utility.service.ts","../../../projects/tas-uell-sdk/src/lib/services/tas.service.ts","../../../projects/tas-uell-sdk/src/lib/services/geolocation.service.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-feedback-modal/tas-feedback-modal.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-feedback-modal/tas-feedback-modal.component.html","../../../projects/tas-uell-sdk/src/lib/icons/tas-icons.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-avatar/tas-avatar.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.html","../../../projects/tas-uell-sdk/src/lib/tas-uell-sdk.module.ts","../../../projects/tas-uell-sdk/src/public-api.ts","../../../projects/tas-uell-sdk/src/tas-uell-sdk.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Configuration interface for the TAS module\n */\nexport interface TasConfig {\n /** TokBox/Vonage API Key */\n tokBoxApiKey: string;\n /** Optional API base URL for room/token endpoints */\n apiBaseUrl?: string;\n}\n\n/**\n * HTTP client interface that consuming apps must implement\n */\nexport interface TasHttpClient {\n get<T>(\n url: string,\n options: { headers?: Record<string, string> }\n ): Observable<T>;\n post<T>(\n url: string,\n options: { body: any; headers?: Record<string, string> }\n ): Observable<T>;\n patch<T>(\n url: string,\n options: { body: any; headers?: Record<string, string> }\n ): Observable<T>;\n}\n\n/**\n * Injection token for TAS configuration\n */\nexport const TAS_CONFIG = new InjectionToken<TasConfig>('TAS_CONFIG');\n\n/**\n * Injection token for HTTP client adapter\n */\nexport const TAS_HTTP_CLIENT = new InjectionToken<TasHttpClient>('TAS_HTTP_CLIENT');\n","// Enums\nexport enum TasRoomType {\n TAS = 'TAS',\n JM = 'JM',\n WEBINAR = 'WEBINAR',\n WELLNESS_MANAGER = 'WELLNESS_MANAGER',\n}\n\nexport enum TasSessionType {\n SPONTANEOUS = 'SPONTANEOUS',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport enum TasUserRole {\n OWNER = 'OWNER',\n USER = 'USER',\n MODERATOR = 'MODERATOR',\n}\n\nexport enum TasBusinessRole {\n ADMIN_MANAGER = 'ADMIN_MANAGER',\n MANAGER = 'MANAGER',\n BACKOFFICE = 'BACKOFFICE',\n USER = 'USER',\n}\n\nexport enum VideoSessionStatus {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n PENDING = 'PENDING',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport enum UserStatus {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n ASSIGNED = 'ASSIGNED',\n}\n\nexport enum UserCallAction {\n WAITING_ROOM_ENTER = 'WAITING_ROOM_ENTER',\n WAITING_ROOM_LEAVE = 'WAITING_ROOM_LEAVE',\n BAN = 'BAN',\n CHANGE_STATUS = 'CHANGE_STATUS',\n REQUEST_GEOLOCALIZATION = 'REQUEST_GEOLOCALIZATION',\n ACTIVATE_GEOLOCATION = 'ACTIVATE_GEOLOCATION',\n DENY_GEOLOCATION = 'DENY_GEOLOCATION',\n}\n\nexport enum GeoStatus {\n PENDING = 'PENDING',\n GRANTED = 'GRANTED',\n DENIED = 'DENIED',\n}\n\nexport enum RoomUserStatus {\n ASSIGNED = 'ASSIGNED',\n WAITING = 'WAITING',\n JOINED = 'JOINED',\n FINISHED = 'FINISHED',\n}\n\nexport enum CallState {\n IDLE = 'IDLE',\n CONNECTING = 'CONNECTING',\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n ERROR = 'ERROR',\n}\n\nexport enum ViewMode {\n FULLSCREEN = 'FULLSCREEN',\n PIP = 'PIP',\n}\n\nexport enum FeedbackMotiveType {\n TECHNICAL = 'TECHNICAL',\n BUSINESS = 'BUSINESS',\n}\n\n// User interfaces\nexport interface TasCurrentUser {\n id: number;\n name: string;\n lastname: string;\n role: TasUserRole;\n}\n\n/** Input configuration for the TAS video call library */\nexport interface TasCallConfig {\n // Status endpoint params\n appointmentId?: number;\n sessionId?: string;\n roomType: TasRoomType;\n entityId: number;\n tenant: string;\n businessRole: TasBusinessRole;\n // Current user info (for token request)\n currentUser: TasCurrentUser;\n}\n\n// API Request/Response interfaces\nexport interface StartSessionRequest {\n sessionId: string;\n name: string;\n lastname: string;\n}\n\nexport interface GenerateTokenRequest {\n sessionId: string;\n name: string;\n lastname: string;\n roleVC: TasUserRole;\n}\n\nexport interface GenerateTokenResponse {\n content: {\n token: string;\n };\n}\n\nexport interface ProxyVideoStatusRequest {\n appointmentId?: number;\n businessRole?: TasBusinessRole;\n tenant?: string;\n sessionId?: string;\n roomType?: TasRoomType;\n entityId?: number;\n}\n\nexport interface ProxyVideoStatusUser {\n userId: number;\n rol: TasUserRole;\n status: UserStatus;\n geoStatus: GeoStatus;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport interface ProxyVideoStatusResponse {\n content: {\n videoCallId: number;\n sessionId: string;\n statusVL: VideoSessionStatus;\n joinable: boolean;\n waitingRoomAvailable: boolean;\n appointmentId: number;\n activateGeo: boolean;\n geoRequestActive: boolean | null; // Owner sent geo request, waiting for user response\n allGeoGranted: boolean; // All users have responded with geo\n users: ProxyVideoStatusUser[];\n };\n}\n\nexport interface ProxyVideoFinishRequest {\n sessionId: string;\n businessRole: TasBusinessRole;\n}\n\nexport interface FinishSessionResponse {\n content: {\n message: string;\n callStatus: string;\n };\n}\n\nexport interface ProxyVideoUserModifyRequest {\n userId?: number;\n videoCallId: number;\n action?: UserCallAction;\n newStatus?: RoomUserStatus;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface WaitingRoomUser {\n userId: number;\n name: string;\n status: RoomUserStatus;\n}\n\n/** User geolocation info for owner panel */\nexport interface UserGeoInfo {\n userId: number;\n geoStatus: GeoStatus;\n latitude: number | null;\n longitude: number | null;\n}\n\n// Appointment types\nexport enum AppointmentStatus {\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n RESCHEDULED = 'RESCHEDULED',\n ACTIVE = 'ACTIVE',\n}\n\nexport interface TasParticipant {\n userId: number;\n name: string;\n}\n\nexport interface TasAppointment {\n id: number;\n agendaId: number;\n date: string; // \"YYYY-MM-DD\"\n startTime: string; // \"HH:mm\"\n endTime: string; // \"HH:mm\"\n bookingType: string;\n status: AppointmentStatus;\n title: string;\n notes: string;\n entityId: number;\n roomType: TasRoomType;\n participants: TasParticipant[];\n}\n\nexport interface GetAppointmentsRequest {\n fromDate: string; // YYYY-MM-DD\n toDate: string; // YYYY-MM-DD\n entityId?: number; // Optional entity ID filter\n}\n\n// Feedback interfaces\nexport interface SaveFeedbackRequest {\n videoCallId: number;\n motiveId: number;\n motiveType?: FeedbackMotiveType;\n observation: string;\n rating: number; // Must be between 1 and 5\n tenant: string;\n}\n\nexport interface FeedbackMotive {\n id: number;\n description: string;\n motiveType: FeedbackMotiveType;\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TasUtilityService {\n /**\n * Determines if the button should be shown based on the error message.\n * Returns false if the error message matches any of the patterns that indicate\n * the button should be hidden (but polling should continue).\n *\n * @param errorMessage The error message from the status call\n * @returns true if button should be shown, false if it should be hidden\n */\n shouldShowButton(errorMessage: string | null | undefined): boolean {\n if (!errorMessage) {\n return true;\n }\n\n const message = errorMessage.trim();\n\n // List of error messages that should hide the button\n const hideButtonMessages = [\n 'Debe enviarse sessionId o roomType + entityId',\n 'No existe videollamada con ese sessionId',\n 'Usuario no pertenece a la llamada',\n ];\n\n // Check exact matches\n if (hideButtonMessages.some((msg) => message === msg)) {\n return false;\n }\n\n // Check pattern match for \"No existe videocall vigente para roomType=x y entityId=x\"\n // Using startsWith as primary check to handle any variations\n if (message.startsWith('No existe videocall vigente para roomType=')) {\n return false;\n }\n\n // Also check regex pattern as backup\n const vigentePattern = /^No existe videocall vigente para roomType=.+ y entityId=\\s*\\d+$/;\n if (vigentePattern.test(message)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if at least one OWNER has joined the call.\n */\n checkIfOwnerJoined(\n users: { userId: number; rol: string; status: string }[]\n ): boolean {\n return users.some((u) => u.rol === 'OWNER' && u.status === 'JOINED');\n }\n\n /**\n * Extract error message from various error structures.\n */\n extractErrorMessage(err: any, fallback = 'Error desconocido'): string {\n return err?.error?.message || err?.message || fallback;\n }\n}\n\n","import { Injectable, Inject } from '@angular/core';\nimport { TasUtilityService } from './tas-utility.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { catchError, map, finalize, shareReplay } from 'rxjs/operators';\nimport * as OT from '@opentok/client';\nimport {\n GenerateTokenResponse,\n StartSessionRequest,\n FinishSessionResponse,\n ProxyVideoStatusRequest,\n ProxyVideoStatusResponse,\n ProxyVideoFinishRequest,\n ProxyVideoUserModifyRequest,\n UserCallAction,\n RoomUserStatus,\n GeoStatus,\n TasBusinessRole,\n CallState,\n ViewMode,\n WaitingRoomUser,\n UserGeoInfo,\n TasAppointment,\n GetAppointmentsRequest,\n SaveFeedbackRequest,\n FeedbackMotive,\n} from '../interfaces/tas.interfaces';\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from '../config/tas.config';\n\n// Re-export enums for backward compatibility\nexport { CallState, ViewMode, TasBusinessRole, UserCallAction, RoomUserStatus, GeoStatus };\n\n@Injectable({\n providedIn: 'root',\n})\n \nexport class TasService {\n private session: OT.Session | null = null;\n private publisher: OT.Publisher | null = null;\n private subscribers: OT.Subscriber[] = [];\n\n private callStateSubject = new BehaviorSubject<CallState>(CallState.IDLE);\n public callState$ = this.callStateSubject.asObservable();\n\n private viewModeSubject = new BehaviorSubject<ViewMode>(ViewMode.FULLSCREEN);\n public viewMode$ = this.viewModeSubject.asObservable();\n\n private isMutedSubject = new BehaviorSubject<boolean>(false);\n public isMuted$ = this.isMutedSubject.asObservable();\n\n // Session info for PiP mode restoration\n private currentSessionId: string | null = null;\n private currentToken: string | null = null;\n private readonly STORAGE_KEY = 'tas_session_state';\n private readonly DISCONNECTED_FLAG_KEY = 'tas_session_disconnected';\n private isFinishingSession: boolean = false;\n\n // Proxy-video circuit state\n private proxyVideoSessionId: string | null = null;\n private proxyVideoToken: string | null = null;\n private currentBusinessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // Waiting room and status polling\n private waitingRoomUsersSubject = new BehaviorSubject<WaitingRoomUser[]>([]);\n public waitingRoomUsers$ = this.waitingRoomUsersSubject.asObservable();\n\n private ownerHasJoinedSubject = new BehaviorSubject<boolean>(false);\n public ownerHasJoined$ = this.ownerHasJoinedSubject.asObservable();\n\n // Observable that emits true when owner was present but then left\n private ownerHasLeftSubject = new BehaviorSubject<boolean>(false);\n public ownerHasLeft$ = this.ownerHasLeftSubject.asObservable();\n\n private joinableSubject = new BehaviorSubject<boolean>(false);\n public joinable$ = this.joinableSubject.asObservable();\n\n // Observable for when backend requests geolocation activation\n private activateGeoSubject = new BehaviorSubject<boolean>(false);\n public activateGeo$ = this.activateGeoSubject.asObservable();\n\n // Observable for when geo request is active (owner waiting for user response)\n private geoRequestActiveSubject = new BehaviorSubject<boolean>(false);\n public geoRequestActive$ = this.geoRequestActiveSubject.asObservable();\n\n // Observable for when all geo has been granted\n private allGeoGrantedSubject = new BehaviorSubject<boolean>(false);\n public allGeoGranted$ = this.allGeoGrantedSubject.asObservable();\n\n // Observable for individual user geo status (for owner panel)\n private userGeoInfoSubject = new BehaviorSubject<UserGeoInfo[]>([]);\n public userGeoInfo$ = this.userGeoInfoSubject.asObservable();\n\n private statusPollingInterval: ReturnType<typeof setInterval> | null = null;\n private readonly DEFAULT_POLL_INTERVAL_MS = 30000; // Default 30s\n private wasOwnerPresent = false;\n\n // Current call context\n private currentAppointmentId: number | null = null;\n private currentVideoCallId: number | null = null;\n private currentTenant: string | null = null;\n\n // Status cache (1 second TTL)\n private readonly STATUS_CACHE_TTL_MS = 1000;\n private statusCache: {\n key: string;\n response: ProxyVideoStatusResponse | null;\n error: any | null;\n timestamp: number;\n } | null = null;\n\n constructor(\n @Inject(TAS_HTTP_CLIENT) private httpClient: TasHttpClient,\n @Inject(TAS_CONFIG) private config: TasConfig,\n private tasUtilityService: TasUtilityService\n ) {}\n\n // ... (Getters and other methods remain unchanged)\n\n /**\n * Start automatic status polling for the current session.\n * Status is polled every intervalMs (default 30s).\n */\n public startStatusPolling(\n params: ProxyVideoStatusRequest, \n intervalMs: number = this.DEFAULT_POLL_INTERVAL_MS\n ): void {\n this.stopStatusPolling(); // Clear any existing polling\n\n // Store context for polling\n if (params.sessionId) {\n this.currentSessionId = params.sessionId;\n }\n if (params.appointmentId) {\n this.currentAppointmentId = params.appointmentId;\n }\n if (params.tenant) {\n this.currentTenant = params.tenant;\n }\n\n\n\n // Initial status fetch\n this.fetchAndProcessStatus(params);\n\n // Set up periodic polling\n this.statusPollingInterval = setInterval(() => {\n this.fetchAndProcessStatus(params);\n }, intervalMs);\n }\n\n /**\n * Stop automatic status polling.\n */\n public stopStatusPolling(): void {\n if (this.statusPollingInterval) {\n clearInterval(this.statusPollingInterval);\n this.statusPollingInterval = null;\n }\n // Do NOT reset waiting room state here, as other components might observe it\n }\n\n /**\n * Reset polling state (waiting room, owner status, etc)\n * Call this when completely exiting the flow\n */\n public resetPollingState(): void {\n this.stopStatusPolling();\n this.waitingRoomUsersSubject.next([]);\n this.ownerHasJoinedSubject.next(false);\n this.ownerHasLeftSubject.next(false);\n this.joinableSubject.next(false);\n this.wasOwnerPresent = false;\n }\n\n // Getters\n public get currentSession(): OT.Session | null {\n return this.session;\n }\n\n public get currentPublisher(): OT.Publisher | null {\n return this.publisher;\n }\n\n public get currentSubscribers(): OT.Subscriber[] {\n return this.subscribers;\n }\n\n public get sessionId(): string | null {\n return this.currentSessionId;\n }\n\n public get token(): string | null {\n return this.currentToken;\n }\n\n public get proxySessionId(): string | null {\n return this.proxyVideoSessionId;\n }\n\n public get proxyToken(): string | null {\n return this.proxyVideoToken;\n }\n\n public get businessRole(): TasBusinessRole {\n return this.currentBusinessRole;\n }\n\n public get isMuted(): boolean {\n return this.isMutedSubject.getValue();\n }\n\n // View Mode Methods\n public setViewMode(mode: ViewMode): void {\n this.viewModeSubject.next(mode);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n mode,\n this.currentBusinessRole\n );\n }\n }\n\n public enterPipMode(): void {\n this.viewModeSubject.next(ViewMode.PIP);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n ViewMode.PIP,\n this.currentBusinessRole\n );\n }\n }\n\n public exitPipMode(): void {\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n if (this.currentSessionId && this.currentToken) {\n this.saveSessionState(\n this.currentSessionId,\n this.currentToken,\n ViewMode.FULLSCREEN,\n this.currentBusinessRole\n );\n }\n }\n\n public isPipMode(): boolean {\n return this.viewModeSubject.getValue() === ViewMode.PIP;\n }\n\n // Audio Control\n public toggleMute(): void {\n if (this.publisher) {\n const newMuteState = !this.isMutedSubject.getValue();\n const shouldEnableAudio = !newMuteState;\n\n // Use OpenTok's publishAudio\n this.publisher.publishAudio(shouldEnableAudio);\n\n // Also directly control the MediaStreamTrack as backup\n const audioTrack = this.publisher.getAudioSource?.();\n if (audioTrack) {\n audioTrack.enabled = shouldEnableAudio;\n }\n\n this.isMutedSubject.next(newMuteState);\n }\n }\n\n public setMute(muted: boolean): void {\n if (this.publisher) {\n this.publisher.publishAudio(!muted);\n this.isMutedSubject.next(muted);\n }\n }\n\n // Session Management\n public disconnectSession(clearStorage: boolean = true): void {\n\n\n // Call finishSession before disconnecting if we have a sessionId\n const sessionIdToFinish = this.currentSessionId;\n\n // Clear storage FIRST to prevent any race conditions where state might be saved after disconnect\n if (clearStorage) {\n this.clearSessionState();\n // Set a flag to indicate this session was intentionally disconnected\n // This prevents reconnection on page reload\n sessionStorage.setItem(this.DISCONNECTED_FLAG_KEY, 'true');\n }\n\n if (this.session) {\n this.session.disconnect();\n this.session = null;\n }\n this.publisher = null;\n this.subscribers = [];\n this.currentSessionId = null;\n this.currentToken = null;\n this.proxyVideoSessionId = null;\n this.proxyVideoToken = null;\n this.isMutedSubject.next(false); // Reset mute state\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n this.callStateSubject.next(CallState.DISCONNECTED);\n\n // Call proxy finish after disconnecting (only if not already finishing)\n if (sessionIdToFinish && !this.isFinishingSession) {\n this.isFinishingSession = true;\n this.finishProxyVideoSession({\n sessionId: sessionIdToFinish,\n businessRole: this.currentBusinessRole,\n }).subscribe({\n next: (response) => {\n\n this.isFinishingSession = false;\n },\n error: (error) => {\n\n this.isFinishingSession = false;\n },\n });\n }\n }\n\n public isCallActive(): boolean {\n return this.callStateSubject.getValue() === CallState.CONNECTED;\n }\n\n // State Persistence\n private saveSessionState(\n sessionId: string,\n token: string,\n viewMode: ViewMode,\n businessRole: TasBusinessRole = TasBusinessRole.USER\n ): void {\n const state = {\n sessionId,\n token,\n viewMode,\n businessRole,\n };\n sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));\n }\n\n private clearSessionState(): void {\n sessionStorage.removeItem(this.STORAGE_KEY);\n // Also clear the disconnected flag when clearing state\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n }\n\n public canRestoreSession(): boolean {\n return !!sessionStorage.getItem(this.STORAGE_KEY);\n }\n\n public restoreSession(containerId: string): void {\n const savedState = sessionStorage.getItem(this.STORAGE_KEY);\n if (!savedState) return;\n\n // Check if this session was intentionally disconnected\n // If so, don't restore it on page reload\n const wasDisconnected = sessionStorage.getItem(this.DISCONNECTED_FLAG_KEY);\n if (wasDisconnected === 'true') {\n\n this.clearSessionState();\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n return;\n }\n\n // Don't restore if we're already disconnected or if there's no active session\n // This prevents restoring sessions that were properly disconnected\n if (this.callStateSubject.getValue() === CallState.DISCONNECTED) {\n\n this.clearSessionState();\n return;\n }\n\n try {\n const state = JSON.parse(savedState);\n if (state.sessionId && state.token) {\n\n // Force PiP mode for restoration to ensure UI consistency\n this.viewModeSubject.next(ViewMode.PIP);\n\n if (state.businessRole) {\n this.currentBusinessRole = state.businessRole;\n }\n\n this.connectSession(\n state.sessionId,\n state.token,\n containerId, // Use the same container for both since we are in PiP\n containerId,\n this.currentBusinessRole\n )\n .then(() => {\n\n // Clear the disconnected flag if restoration succeeds\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n })\n .catch((err) => {\n\n this.clearSessionState(); // Clear bad state\n });\n }\n } catch (e) {\n\n this.clearSessionState();\n }\n }\n\n // API Methods\n /**\n * PROXY circuit token: /v2/proxy/video/start\n */\n public startProxyVideoSession(\n payload: StartSessionRequest\n ): Observable<GenerateTokenResponse> {\n return this.httpClient\n .post<GenerateTokenResponse>('v2/proxy/video/start', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as GenerateTokenResponse),\n catchError((error) => {\n console.error('TAS Service: startProxyVideoSession failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Generate cache key from request payload\n */\n private getStatusCacheKey(payload: ProxyVideoStatusRequest): string {\n return `${payload.roomType}-${payload.entityId}-${payload.tenant}-${payload.sessionId || ''}`;\n }\n\n private inflightStatusRequests = new Map<string, Observable<ProxyVideoStatusResponse>>();\n\n /**\n * PROXY circuit status: /v2/proxy/video/status\n * Uses a 1-second cache to avoid redundant API calls from multiple components\n * Implements request deduplication for simultaneous calls\n */\n public getProxyVideoStatus(\n payload: ProxyVideoStatusRequest\n ): Observable<ProxyVideoStatusResponse> {\n const cacheKey = this.getStatusCacheKey(payload);\n const now = Date.now();\n\n // 1. Check if we have a valid cached result (less than 1 second old)\n if (this.statusCache && \n this.statusCache.key === cacheKey && \n (now - this.statusCache.timestamp) < this.STATUS_CACHE_TTL_MS) {\n \n // Return cached error if present\n if (this.statusCache.error) {\n return new Observable(observer => {\n observer.error(this.statusCache!.error);\n });\n }\n \n // Return cached response\n if (this.statusCache.response) {\n return new Observable(observer => {\n observer.next(this.statusCache!.response!);\n observer.complete();\n });\n }\n }\n\n // 2. Check if there is already an inflight request for this key\n if (this.inflightStatusRequests.has(cacheKey)) {\n return this.inflightStatusRequests.get(cacheKey)!;\n }\n\n // 3. Make the API call, share it, and cache the Observable\n const request$: Observable<ProxyVideoStatusResponse> = this.httpClient\n .post<ProxyVideoStatusResponse>('v2/proxy/video/status', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => {\n const typedResponse = response as ProxyVideoStatusResponse;\n // Cache successful response\n this.statusCache = {\n key: cacheKey,\n response: typedResponse,\n error: null,\n timestamp: Date.now(),\n };\n return typedResponse;\n }),\n catchError((error) => {\n console.error('TAS Service: getProxyVideoStatus failed', error);\n // Cache error response\n this.statusCache = {\n key: cacheKey,\n response: null,\n error: error,\n timestamp: Date.now(),\n };\n throw error;\n }),\n // Clean up inflight map when the observable completes or errors\n finalize(() => {\n this.inflightStatusRequests.delete(cacheKey);\n }),\n // Share the result with all subscribers (deduplication)\n shareReplay(1)\n );\n\n this.inflightStatusRequests.set(cacheKey, request$);\n return request$;\n }\n\n /**\n * PROXY circuit user modification: /v2/proxy/video/user/modify\n */\n public modifyProxyVideoUser(payload: ProxyVideoUserModifyRequest): Observable<any> {\n return this.httpClient\n .patch<any>('v2/proxy/video/user/modify', {\n body: payload,\n headers: {},\n })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: modifyProxyVideoUser failed', error);\n throw error;\n })\n );\n }\n\n public finishProxyVideoSession(payload: ProxyVideoFinishRequest) {\n return this.httpClient\n .post<FinishSessionResponse>('v2/proxy/video/finish', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as FinishSessionResponse),\n catchError((error) => {\n console.error('TAS Service: finishProxyVideoSession failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Get user appointments within a date range.\n * @param params Date range for querying appointments\n * @returns Observable of appointment array\n */\n public getAppointments(params: GetAppointmentsRequest): Observable<TasAppointment[]> {\n // Normalize dates to YYYY-MM-DD format (handles ISO timestamps like 2026-01-15T03:00:00.000+0000)\n const normalizeDate = (date: string): string => date.split('T')[0];\n const fromDate = normalizeDate(params.fromDate);\n const toDate = normalizeDate(params.toDate);\n \n let url: string;\n\n // If dates are the same, use only initDate\n // if (fromDate === toDate) {\n // url = `v2/proxy/appointment/agendas/user/appointments?fromDate=${fromDate}&roomType=TAS`;\n // } else {\n url = `v2/proxy/appointment/agendas/user/appointments?fromDate=${fromDate}&toDate=${toDate}&roomType=TAS`;\n // }\n\n if (params.entityId !== undefined) {\n url += `&entityId=${params.entityId}`;\n }\n\n return this.httpClient\n .get<TasAppointment[]>(url, { headers: {} })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: getAppointments failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Save video call feedback.\n * POST /v2/proxy/video/save/feedback\n * @param payload Feedback data including videoCallId, motiveId, motiveType, observation, rating (1-5), and tenant\n * @returns Observable that completes on success (HTTP 200 OK, no response body)\n */\n public saveFeedback(payload: SaveFeedbackRequest): Observable<void> {\n // Validate rating is between 1 and 5\n if (payload.rating < 1 || payload.rating > 5) {\n return new Observable(observer => {\n observer.error(new Error('Rating must be between 1 and 5'));\n });\n }\n\n return this.httpClient\n .post<void>('v2/proxy/video/save/feedback', {\n body: payload,\n headers: {},\n })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: saveFeedback failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Get available feedback motives.\n * GET /v2/proxy/video/motives\n * @returns Observable of feedback motives array\n */\n public getMotives(): Observable<FeedbackMotive[]> {\n return this.httpClient\n .get<FeedbackMotive[]>('v2/proxy/video/motives', { headers: {} })\n .pipe(\n catchError((error) => {\n console.error('TAS Service: getMotives failed', error);\n throw error;\n })\n );\n }\n\n /**\n * Start automatic status polling for the current session.\n * Status is polled every STATUS_POLL_INTERVAL_MS milliseconds.\n */\n\n\n /**\n * Stop automatic status polling.\n */\n\n\n /**\n * Fetch status and process the response.\n */\n private fetchAndProcessStatus(params: ProxyVideoStatusRequest): void {\n this.getProxyVideoStatus(params).subscribe({\n next: (response) => {\n this.processStatusResponse(response);\n },\n error: (err) => {\n\n },\n });\n }\n\n /**\n * Process status response to update waiting room users and owner join status.\n */\n private processStatusResponse(response: ProxyVideoStatusResponse): void {\n const content = response.content;\n\n // Update videoCallId if available\n if (content.videoCallId) {\n this.currentVideoCallId = content.videoCallId;\n }\n\n // Update sessionId if available\n if (content.sessionId) {\n this.currentSessionId = content.sessionId;\n this.proxyVideoSessionId = content.sessionId;\n }\n\n // Update joinable status\n this.joinableSubject.next(content.joinable);\n\n // Update activateGeo status\n if (content.activateGeo !== undefined) {\n\n this.activateGeoSubject.next(content.activateGeo);\n }\n\n // Update geoRequestActive status (owner waiting for user geo response)\n if (content.geoRequestActive !== undefined && content.geoRequestActive !== null) {\n\n this.geoRequestActiveSubject.next(content.geoRequestActive);\n } else if (content.geoRequestActive === null) {\n // Reset to false when null\n this.geoRequestActiveSubject.next(false);\n }\n\n // Update allGeoGranted status (all users responded with geo)\n if (content.allGeoGranted !== undefined) {\n\n this.allGeoGrantedSubject.next(content.allGeoGranted);\n }\n\n // Check if owner has joined\n const ownerJoined = this.tasUtilityService.checkIfOwnerJoined(content.users);\n this.ownerHasJoinedSubject.next(ownerJoined);\n\n // Detect if owner left: was present, now not present\n if (this.wasOwnerPresent && !ownerJoined) {\n\n this.ownerHasLeftSubject.next(true);\n }\n\n if (ownerJoined) {\n this.wasOwnerPresent = true;\n }\n\n // Extract waiting room users (status === WAITING)\n const waitingUsers: WaitingRoomUser[] = content.users\n .filter((u) => (u.status as string) === 'WAITING')\n .map((u) => ({\n userId: u.userId,\n name: `User ${u.userId}`, // TODO: Fetch actual user names from a user service\n status: RoomUserStatus.WAITING,\n }));\n\n this.waitingRoomUsersSubject.next(waitingUsers);\n\n // Extract geo info for USER role participants (for owner panel)\n const userGeoInfo: UserGeoInfo[] = content.users\n .filter((u) => u.rol === 'USER')\n .map((u) => ({\n userId: u.userId,\n geoStatus: u.geoStatus,\n latitude: u.latitude,\n longitude: u.longitude,\n }));\n\n this.userGeoInfoSubject.next(userGeoInfo);\n }\n\n /**\n * Admit a user from the waiting room by changing their status.\n */\n public admitUserFromWaitingRoom(\n userId: number,\n videoCallId: number\n ): Observable<any> {\n return this.modifyProxyVideoUser({\n userId,\n videoCallId,\n action: UserCallAction.WAITING_ROOM_LEAVE,\n });\n }\n\n // Getters for current call context\n public get appointmentId(): number | null {\n return this.currentAppointmentId;\n }\n\n public get videoCallId(): number | null {\n return this.currentVideoCallId;\n }\n\n public get tenant(): string | null {\n return this.currentTenant;\n }\n\n /**\n * Connects to a TokBox video session\n */\n public connectSession(\n sessionId: string,\n token: string,\n publisherElement: string,\n subscriberElement: string,\n businessRole: TasBusinessRole = TasBusinessRole.USER\n ): Promise<void> {\n this.callStateSubject.next(CallState.CONNECTING);\n this.currentSessionId = sessionId;\n this.currentToken = token;\n this.currentBusinessRole = businessRole;\n this.isFinishingSession = false; // Reset flag for new session\n\n // Save initial state (defaulting to current view mode)\n this.saveSessionState(\n sessionId,\n token,\n this.viewModeSubject.getValue(),\n businessRole\n );\n // Clear the disconnected flag when starting a new connection\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n\n return new Promise((resolve, reject) => {\n if (!OT.checkSystemRequirements()) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error('Browser not compatible with TokBox'));\n return;\n }\n\n this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);\n\n // Handle new streams (remote participants joining)\n this.session.on('streamCreated', (event) => {\n const subscriber = this.session?.subscribe(\n event.stream,\n subscriberElement,\n {\n insertMode: 'append',\n width: '100%',\n height: '100%',\n },\n (error) => {\n if (error) {\n console.error('Error subscribing to stream:', error);\n }\n }\n );\n if (subscriber) {\n this.subscribers.push(subscriber);\n }\n });\n\n // Handle streams ending (remote participants leaving)\n this.session.on('streamDestroyed', (event) => {\n this.subscribers = this.subscribers.filter(\n (sub) => sub.stream?.streamId !== event.stream.streamId\n );\n });\n\n // Handle session disconnection\n this.session.on('sessionDisconnected', () => {\n this.callStateSubject.next(CallState.DISCONNECTED);\n\n // Call finishSession when session is disconnected (e.g., by server)\n // Only call if not already finishing (prevents duplicate calls)\n const sessionIdToFinish = this.currentSessionId;\n if (sessionIdToFinish && !this.isFinishingSession) {\n this.isFinishingSession = true;\n this.finishProxyVideoSession({\n sessionId: sessionIdToFinish,\n businessRole: this.currentBusinessRole,\n }).subscribe({\n next: (response) => {\n\n this.isFinishingSession = false;\n },\n error: (error) => {\n\n this.isFinishingSession = false;\n },\n });\n }\n });\n\n // Connect to session\n this.session.connect(token, (error) => {\n if (error) {\n console.error('Error connecting to session:', error);\n this.callStateSubject.next(CallState.ERROR);\n reject(error);\n return;\n }\n\n // Initialize publisher (local video)\n this.publisher = OT.initPublisher(\n publisherElement,\n {\n insertMode: 'append',\n width: '100%',\n height: '100%',\n },\n (err) => {\n if (err) {\n console.error('Error initializing publisher:', err);\n this.callStateSubject.next(CallState.ERROR);\n reject(err);\n return;\n }\n\n // Publish to session\n this.session?.publish(this.publisher, (pubErr) => {\n if (pubErr) {\n console.error('Error publishing stream:', pubErr);\n this.callStateSubject.next(CallState.ERROR);\n reject(pubErr);\n } else {\n this.callStateSubject.next(CallState.CONNECTED);\n resolve();\n }\n });\n }\n );\n });\n });\n }\n\n // Video Element Movement Methods\n public movePublisherTo(newContainerId: string): void {\n if (!this.publisher) return;\n\n const publisherElement = this.publisher.element;\n const newContainer = document.getElementById(newContainerId);\n\n if (publisherElement && newContainer) {\n newContainer.appendChild(publisherElement);\n }\n }\n\n public moveSubscribersTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n this.subscribers.forEach((subscriber) => {\n const subscriberElement = subscriber.element;\n if (subscriberElement) {\n newContainer.appendChild(subscriberElement);\n }\n });\n }\n\n /**\n * Moves the main video (subscriber if available, otherwise publisher) to a container.\n * Used for PiP mode to show only one video.\n */\n public moveMainVideoTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n // Prefer remote video (subscriber) as main\n if (this.subscribers.length > 0 && this.subscribers[0].element) {\n newContainer.appendChild(this.subscribers[0].element);\n return;\n }\n\n // Fall back to local video (publisher)\n if (this.publisher?.element) {\n newContainer.appendChild(this.publisher.element);\n }\n }\n\n /**\n * Moves videos back to fullscreen containers\n */\n public moveVideosToFullscreen(): void {\n this.moveSubscribersTo('subscriber-container');\n this.movePublisherTo('publisher-container');\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface GeoPosition {\n latitude: number;\n longitude: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GeolocationService {\n private cachedPosition: GeoPosition | null = null;\n\n /**\n * Request current geolocation position using Web Geolocation API.\n * Works in both browser and Capacitor environments.\n * @returns Promise with {latitude, longitude} or null if denied/unavailable\n */\n public async getCurrentPosition(): Promise<GeoPosition | null> {\n if (!navigator.geolocation) {\n console.warn('[GeolocationService] Geolocation not supported');\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const geoPosition: GeoPosition = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n };\n this.cachedPosition = geoPosition;\n resolve(geoPosition);\n },\n (error) => {\n console.warn('[GeolocationService] Geolocation error:', error.message);\n resolve(null);\n },\n {\n enableHighAccuracy: false, // Use lower accuracy for faster response\n timeout: 30000, // 30 seconds timeout\n maximumAge: 60000,\n }\n );\n });\n }\n\n /**\n * Get the cached position from the last successful request.\n */\n public getCachedPosition(): GeoPosition | null {\n return this.cachedPosition;\n }\n\n /**\n * Clear the cached position.\n */\n public clearCache(): void {\n this.cachedPosition = null;\n }\n}\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { Subscription } from 'rxjs';\nimport { TasService } from '../../services/tas.service';\nimport {\n TasBusinessRole,\n FeedbackMotive,\n FeedbackMotiveType,\n SaveFeedbackRequest,\n} from '../../interfaces/tas.interfaces';\n\n@Component({\n selector: 'tas-feedback-modal',\n templateUrl: './tas-feedback-modal.component.html',\n styleUrls: ['./tas-feedback-modal.component.scss'],\n})\nexport class TasFeedbackModalComponent implements OnInit, OnDestroy {\n @Input() videoCallId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n\n motives: FeedbackMotive[] = [];\n filteredMotives: FeedbackMotive[] = [];\n selectedMotive: FeedbackMotive | null = null;\n rating: number = 0;\n hoverRating: number = 0;\n observation: string = '';\n isSubmitting = false;\n showToast = false;\n isDropdownOpen = false;\n\n private subscriptions = new Subscription();\n private toastTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService\n ) {}\n\n ngOnInit(): void {\n this.loadMotives();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n if (this.toastTimeout) {\n clearTimeout(this.toastTimeout);\n }\n }\n\n /**\n * Check if current user can see all motives (BUSINESS + TECHNICAL)\n * Only BACKOFFICE, ADMIN_MANAGER, MANAGER roles see BUSINESS motives\n */\n get canSeeBusinessMotives(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /**\n * Observation is required when \"Otro problema tecnico\" is selected\n */\n get isObservationRequired(): boolean {\n return this.selectedMotive?.description === 'Otro problema tecnico';\n }\n\n /**\n * Can submit if rating > 0 OR motive is selected\n * If observation is required, it must not be empty\n */\n get canSubmit(): boolean {\n const hasRatingOrMotive = this.rating > 0 || this.selectedMotive !== null;\n if (!hasRatingOrMotive) return false;\n if (this.isObservationRequired && !this.observation.trim()) return false;\n return true;\n }\n\n /**\n * Progress percentage for the divider line\n * 0 = nothing selected, 50 = one selected, 100 = both selected\n */\n get feedbackProgress(): number {\n const hasRating = this.rating > 0;\n const hasMotive = this.selectedMotive !== null;\n if (hasRating && hasMotive) return 100;\n if (hasRating || hasMotive) return 50;\n return 0;\n }\n\n /**\n * Set star rating\n */\n setRating(value: number): void {\n // Toggle off if clicking the same rating\n if (this.rating === value) {\n this.rating = 0;\n } else {\n this.rating = value;\n }\n }\n\n /**\n * Set hover preview rating\n */\n setHoverRating(value: number): void {\n this.hoverRating = value;\n }\n\n /**\n * Clear hover preview\n */\n clearHoverRating(): void {\n this.hoverRating = 0;\n }\n\n /**\n * Get the display rating (hover preview or actual)\n */\n getDisplayRating(): number {\n return this.hoverRating > 0 ? this.hoverRating : this.rating;\n }\n\n /**\n * Toggle dropdown open/close\n */\n toggleDropdown(): void {\n this.isDropdownOpen = !this.isDropdownOpen;\n }\n\n /**\n * Close dropdown\n */\n closeDropdown(): void {\n this.isDropdownOpen = false;\n }\n\n /**\n * Select a motive from dropdown\n */\n selectMotive(motive: FeedbackMotive): void {\n this.selectedMotive = motive;\n this.closeDropdown();\n }\n\n /**\n * Clear selected motive\n */\n clearMotive(): void {\n this.selectedMotive = null;\n }\n\n /**\n * Submit feedback\n */\n submit(): void {\n if (!this.canSubmit || this.isSubmitting) return;\n\n this.isSubmitting = true;\n\n const payload: SaveFeedbackRequest = {\n videoCallId: this.videoCallId,\n motiveId: this.selectedMotive?.id ?? 0,\n observation: this.observation.trim(),\n rating: this.rating || 1, // API requires 1-5, default to 1 if no rating\n tenant: this.tenant,\n };\n\n if (this.selectedMotive) {\n payload.motiveType = this.selectedMotive.motiveType;\n }\n\n this.subscriptions.add(\n this.tasService.saveFeedback(payload).subscribe({\n next: () => {\n this.isSubmitting = false;\n this.showToastNotification();\n },\n error: (err) => {\n console.error('Error saving feedback:', err);\n this.isSubmitting = false;\n // Still close modal on error, just don't show toast\n this.activeModal.close('submitted');\n },\n })\n );\n }\n\n /**\n * Close modal without saving\n */\n dismiss(): void {\n this.activeModal.dismiss('dismissed');\n }\n\n /**\n * Load motives from API\n */\n private loadMotives(): void {\n this.subscriptions.add(\n this.tasService.getMotives().subscribe({\n next: (motives) => {\n this.motives = motives;\n this.filterMotives();\n },\n error: (err) => {\n console.error('Error loading motives:', err);\n // Fallback mock motives for development/testing\n this.motives = [\n { id: 1, description: 'Problemas de audio', motiveType: FeedbackMotiveType.TECHNICAL },\n { id: 2, description: 'Problemas de video', motiveType: FeedbackMotiveType.TECHNICAL },\n { id: 3, description: 'Conexión inestable', motiveType: FeedbackMotiveType.TECHNICAL },\n { id: 4, description: 'Otro problema tecnico', motiveType: FeedbackMotiveType.TECHNICAL },\n { id: 5, description: 'Problema de negocio', motiveType: FeedbackMotiveType.BUSINESS },\n ];\n this.filterMotives();\n },\n })\n );\n }\n\n /**\n * Filter motives based on user role\n * USERs see only TECHNICAL motives\n * Owners (BACKOFFICE, ADMIN_MANAGER, MANAGER) see all motives\n */\n private filterMotives(): void {\n if (this.canSeeBusinessMotives) {\n this.filteredMotives = this.motives;\n } else {\n this.filteredMotives = this.motives.filter(\n (m) => !m.motiveType || m.motiveType === FeedbackMotiveType.TECHNICAL\n );\n }\n\n // If still empty after filtering, and we have motives, just show all as fallback\n if (this.filteredMotives.length === 0 && this.motives.length > 0) {\n this.filteredMotives = this.motives;\n }\n }\n\n /**\n * Show toast notification and auto-dismiss after 3s\n */\n private showToastNotification(): void {\n this.showToast = true;\n this.toastTimeout = setTimeout(() => {\n this.showToast = false;\n this.activeModal.close('submitted');\n }, 3000);\n }\n}\n","<div class=\"tas-feedback-modal\">\n <!-- Header with subtitle -->\n <div class=\"feedback-header\">\n <div class=\"header-text\">\n <span class=\"subtitle\">Cierre de la consulta</span>\n <h2>Calidad de la videollamada</h2>\n </div>\n <button\n type=\"button\"\n class=\"close-btn\"\n (click)=\"dismiss()\"\n aria-label=\"Cerrar\"\n >\n <i class=\"fa fa-times\"></i>\n </button>\n </div>\n\n <!-- Progress Divider -->\n <div class=\"progress-divider\">\n <div class=\"progress-fill\" [style.width.%]=\"feedbackProgress\"></div>\n </div>\n <div class=\"accent-line\"></div>\n\n <div class=\"feedback-content\">\n <!-- Star Rating with question -->\n <div class=\"rating-section\">\n <p class=\"rating-question\">¿Cómo fue la calidad de la llamada?</p>\n <div\n class=\"stars-container\"\n (mouseleave)=\"clearHoverRating()\"\n >\n <button\n *ngFor=\"let star of [1, 2, 3, 4, 5]\"\n type=\"button\"\n class=\"star-btn\"\n [class.filled]=\"star <= getDisplayRating()\"\n (click)=\"setRating(star)\"\n (mouseenter)=\"setHoverRating(star)\"\n [attr.aria-label]=\"'Calificar ' + star + ' estrellas'\"\n >\n <i class=\"fa\" [class.fa-star]=\"star <= getDisplayRating()\" [class.fa-star-o]=\"star > getDisplayRating()\"></i>\n </button>\n </div>\n </div>\n\n <!-- Motive Dropdown -->\n <div class=\"motive-section\">\n <label class=\"motive-label\">Motivo (opcional)</label>\n <div class=\"custom-dropdown\" [class.open]=\"isDropdownOpen\">\n <button\n type=\"button\"\n class=\"dropdown-trigger\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen\"\n aria-haspopup=\"listbox\"\n >\n <span class=\"dropdown-text\">\n {{ selectedMotive?.description || 'Seleccionar motivo' }}\n </span>\n <i class=\"fa fa-chevron-down dropdown-arrow\"></i>\n </button>\n <div\n class=\"dropdown-menu\"\n *ngIf=\"isDropdownOpen\"\n role=\"listbox\"\n >\n <button\n *ngFor=\"let motive of filteredMotives\"\n type=\"button\"\n class=\"dropdown-item\"\n [class.selected]=\"selectedMotive?.id === motive.id\"\n (click)=\"selectMotive(motive)\"\n role=\"option\"\n [attr.aria-selected]=\"selectedMotive?.id === motive.id\"\n >\n {{ motive.description }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Observation Textarea -->\n <div class=\"observation-section\">\n <label class=\"observation-label\" [class.required]=\"isObservationRequired\">\n {{ isObservationRequired ? 'Observacion (requerida)' : 'Observacion (opcional)' }}\n </label>\n <textarea\n class=\"observation-textarea\"\n [(ngModel)]=\"observation\"\n [placeholder]=\"isObservationRequired ? 'Por favor, describe el problema...' : 'Escribe tu comentario...'\"\n rows=\"3\"\n [attr.aria-required]=\"isObservationRequired\"\n ></textarea>\n </div>\n </div>\n\n <div class=\"feedback-footer\">\n <button\n type=\"button\"\n class=\"submit-btn\"\n [disabled]=\"!canSubmit || isSubmitting\"\n (click)=\"submit()\"\n >\n <span *ngIf=\"!isSubmitting\">Enviar</span>\n <span *ngIf=\"isSubmitting\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n Enviando...\n </span>\n </button>\n </div>\n\n <!-- Toast Notification -->\n <div class=\"toast-notification\" *ngIf=\"showToast\" role=\"alert\" aria-live=\"polite\">\n <i class=\"fa fa-check-circle\"></i>\n <span>Gracias por tu feedback</span>\n </div>\n</div>\n\n<!-- Backdrop to close dropdown when clicking outside -->\n<div\n class=\"dropdown-backdrop\"\n *ngIf=\"isDropdownOpen\"\n (click)=\"closeDropdown()\"\n></div>\n","/**\n * SVG icons used internally by TAS SDK components.\n * Icons are stored as strings to avoid asset bundling complexity.\n */\n\nexport const TAS_ICONS = {\n home: `<svg width=\"120\" height=\"100\" viewBox=\"0 0 120 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<rect x=\"10\" width=\"100\" height=\"100\" rx=\"50\" fill=\"#44D8E8\" fill-opacity=\"0.2\"/>\n<path d=\"M45 70C43.625 70 42.4479 69.5104 41.4688 68.5313C40.4896 67.5521 40 66.375 40 65V46.5625L37.5 48.5C36.9583 48.9167 36.3438 49.0833 35.6562 49C34.9688 48.9167 34.4167 48.5833 34 48C33.5833 47.4583 33.4271 46.8542 33.5312 46.1875C33.6354 45.5208 33.9583 44.9792 34.5 44.5625L56.9375 27.3125C57.3958 26.9792 57.8854 26.7292 58.4062 26.5625C58.9271 26.3958 59.4583 26.3125 60 26.3125C60.5417 26.3125 61.0729 26.3958 61.5938 26.5625C62.1146 26.7292 62.6042 26.9792 63.0625 27.3125L85.5 44.5C86.0417 44.9167 86.3646 45.4583 86.4688 46.125C86.5729 46.7917 86.4167 47.4167 86 48C85.5833 48.5833 85.0417 48.9063 84.375 48.9688C83.7083 49.0313 83.0833 48.8542 82.5 48.4375L60 31.25L45 42.75V65H50.0625C50.7708 65 51.3542 65.2396 51.8125 65.7188C52.2708 66.1979 52.5 66.7917 52.5 67.5C52.5 68.2083 52.2604 68.8021 51.7812 69.2813C51.3021 69.7604 50.7083 70 50 70H45ZM67.3125 73.9375C66.9792 73.9375 66.6667 73.875 66.375 73.75C66.0833 73.625 65.8125 73.4375 65.5625 73.1875L58.5 66.125C58 65.625 57.75 65.0417 57.75 64.375C57.75 63.7083 58 63.125 58.5 62.625C59 62.125 59.5833 61.875 60.25 61.875C60.9167 61.875 61.5 62.125 62 62.625L67.3125 67.875L79.6875 55.5C80.1875 55 80.7812 54.7604 81.4688 54.7813C82.1562 54.8021 82.75 55.0625 83.25 55.5625C83.75 56.0625 84 56.6458 84 57.3125C84 57.9792 83.75 58.5625 83.25 59.0625L69.0625 73.1875C68.8125 73.4375 68.5417 73.625 68.25 73.75C67.9583 73.875 67.6458 73.9375 67.3125 73.9375Z\" fill=\"white\"/>\n<path d=\"M110 5L106.575 3.425L105 0L103.425 3.425L100 5L103.425 6.575L105 10L106.575 6.575L110 5Z\" fill=\"#44D8E8\"/>\n<path d=\"M10 51L6.575 49.425L5 46L3.425 49.425L0 51L3.425 52.575L5 56L6.575 52.575L10 51Z\" fill=\"#44D8E8\"/>\n<path d=\"M95 43.5L93.2875 42.7125L92.5 41L91.7125 42.7125L90 43.5L91.7125 44.2875L92.5 46L93.2875 44.2875L95 43.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M42 4.5L40.2875 3.7125L39.5 2L38.7125 3.7125L37 4.5L38.7125 5.2875L39.5 7L40.2875 5.2875L42 4.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M88 83.5L86.2875 82.7125L85.5 81L84.7125 82.7125L83 83.5L84.7125 84.2875L85.5 86L86.2875 84.2875L88 83.5Z\" fill=\"#44D8E8\"/>\n<path d=\"M120 97.5L118.287 96.7125L117.5 95L116.713 96.7125L115 97.5L116.713 98.2875L117.5 100L118.287 98.2875L120 97.5Z\" fill=\"#44D8E8\"/>\n</svg>`,\n} as const;\n\nexport type TasIconName = keyof typeof TAS_ICONS;\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'tas-avatar',\n template: `\n <div\n class=\"avatar\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n [style.fontSize.px]=\"fontSize\"\n >\n <span class=\"initials\">{{ initials }}</span>\n </div>\n `,\n styles: [\n `\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n background-color: #ffffff;\n color: #0072ac;\n font-weight: 600;\n font-family: inherit;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .initials {\n text-transform: uppercase;\n user-select: none;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TasAvatarComponent {\n @Input() name: string = '';\n @Input() size: number = 80;\n\n get initials(): string {\n if (!this.name) return '';\n return this.name\n .split(' ')\n .filter((n) => n.length > 0)\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2);\n }\n\n get fontSize(): number {\n return Math.round(this.size * 0.4);\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { TasFeedbackModalComponent } from '../tas-feedback-modal/tas-feedback-modal.component';\nimport { TasService } from '../../services/tas.service';\nimport { GeolocationService } from '../../services/geolocation.service';\nimport {\n CallState,\n ViewMode,\n TasBusinessRole,\n WaitingRoomUser,\n RoomUserStatus,\n UserCallAction,\n ProxyVideoUserModifyRequest,\n UserGeoInfo,\n GeoStatus,\n} from '../../interfaces/tas.interfaces';\nimport { TAS_ICONS } from '../../icons/tas-icons';\nimport { Subscription } from 'rxjs';\n\n/** User geolocation panel view states */\nexport enum UserGeoViewState {\n HIDDEN = 'HIDDEN',\n INITIAL = 'INITIAL',\n VERIFYING = 'VERIFYING',\n VERIFIED = 'VERIFIED',\n DENIED = 'DENIED',\n}\nimport interact from 'interactjs';\n\n@Component({\n selector: 'tas-videocall',\n templateUrl: './tas-videocall.component.html',\n styleUrls: ['./tas-videocall.component.scss'],\n})\nexport class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() sessionId!: string;\n @Input() token!: string;\n @Input() appointmentId?: number;\n @Input() videoCallId?: number;\n @Input() userId?: number; // Current user's ID for geo reporting\n @Input() participantName: string = '';\n @Input() tenant: string = '';\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n @Input() isReturningFromPip: boolean = false;\n\n @ViewChild('publisherContainer') publisherContainer!: ElementRef;\n @ViewChild('subscriberContainer') subscriberContainer!: ElementRef;\n\n public isPublisherSmall = true;\n public callState = CallState.IDLE;\n public isMuted = false;\n public waitingRoomUsers: WaitingRoomUser[] = [];\n public ownerHasJoined = false;\n public hasVideoStream = false;\n public dismissedUsers: number[] = [];\n public showLocationPanel = true; // Show by default for owners, will be updated based on user's location status\n public userHasLocation = false; // Tracks if the user has shared their location\n public geoLocationStatus: 'unknown' | 'active' | 'denied' = 'unknown';\n \n // Geo panel states for owner\n public geoRequestActive = false; // Owner sent request, waiting for user\n public allGeoGranted = false; // All users responded with geo\n public userGeoInfo: UserGeoInfo[] = []; // Individual user geo status\n\n // User geo panel state (for owners)\n public userGeoViewState: UserGeoViewState = UserGeoViewState.HIDDEN;\n public UserGeoViewState = UserGeoViewState; // Expose enum to template\n public homeIcon: SafeHtml;\n public devModeEnabled = false; // Enable dev controls for testing\n private geoPanelDismissed = false; // Track if owner manually closed the panel\n private feedbackShown = false; // Track if feedback modal has been shown\n\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService,\n private sanitizer: DomSanitizer,\n private modalService: NgbModal\n ) {\n this.homeIcon = this.sanitizer.bypassSecurityTrustHtml(TAS_ICONS.home);\n }\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\n \n // For owners: show the geo panel to request user location (unless dismissed)\n if (this.canAdmitUsers && !this.geoPanelDismissed) {\n this.userGeoViewState = UserGeoViewState.INITIAL;\n }\n }\n\n ngAfterViewInit(): void {\n this.initInteract();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.tasService.resetPollingState();\n\n // Only disconnect if not in PiP mode (keep session alive for floating window)\n if (!this.tasService.isPipMode()) {\n this.tasService.disconnectSession();\n }\n\n interact('.publisher-view').unset();\n }\n\n // Public Methods\n hangUp(): void {\n this.tasService.disconnectSession();\n }\n\n /**\n * Open feedback modal when call ends\n */\n private openFeedbackModal(): void {\n // Prevent opening feedback modal multiple times\n if (this.feedbackShown) {\n this.activeModal.close('hangup');\n return;\n }\n\n // Get videoCallId from input or service\n const videoCallId = this.videoCallId ?? this.tasService.videoCallId;\n\n // If no videoCallId, skip feedback and close directly\n if (!videoCallId) {\n this.activeModal.close('hangup');\n return;\n }\n\n this.feedbackShown = true;\n\n const modalRef = this.modalService.open(TasFeedbackModalComponent, {\n centered: true,\n backdrop: true,\n keyboard: true,\n windowClass: 'tas-feedback-modal-wrapper',\n });\n\n modalRef.componentInstance.videoCallId = videoCallId;\n modalRef.componentInstance.tenant = this.tenant;\n modalRef.componentInstance.businessRole = this.businessRole;\n\n // Close videocall modal after feedback modal is closed/dismissed\n modalRef.result.finally(() => {\n this.activeModal.close('hangup');\n });\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n minimize(): void {\n this.tasService.moveMainVideoTo('pip-main-video');\n // Small delay to ensure video is moved before closing modal\n setTimeout(() => this.tasService.enterPipMode(), 50);\n }\n\n toggleSwap(): void {\n this.isPublisherSmall = !this.isPublisherSmall;\n this.resetVideoPositions();\n setTimeout(() => this.initInteract());\n }\n\n onDoubleClick(): void {\n this.toggleSwap();\n }\n\n /**\n * Check if current user can admit others (OWNER, BACKOFFICE, or MODERATOR)\n */\n get canAdmitUsers(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /** Users with pending geo status */\n get pendingUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.PENDING);\n }\n\n /** Users who granted geo */\n get grantedUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.GRANTED);\n }\n\n /** Users who denied geo */\n get deniedUsers(): UserGeoInfo[] {\n return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.DENIED);\n }\n\n /** Show location panel only if owner and there are users who haven't granted */\n get shouldShowLocationPanel(): boolean {\n if (!this.canAdmitUsers || this.userGeoInfo.length === 0) {\n return false;\n }\n // Hide if all users have granted\n const allGranted = this.userGeoInfo.every(u => u.geoStatus === GeoStatus.GRANTED);\n return !allGranted;\n }\n\n /** Check if any user has denied geo */\n get hasAnyDenied(): boolean {\n return this.deniedUsers.length > 0;\n }\n\n /** Show user geo panel for owners when not hidden */\n get shouldShowUserGeoPanel(): boolean {\n return this.canAdmitUsers && this.userGeoViewState !== UserGeoViewState.HIDDEN;\n }\n\n /** Set user geo view state (for dev controls or close button) */\n setUserGeoViewState(state: UserGeoViewState): void {\n this.userGeoViewState = state;\n // Track if owner manually dismissed the panel\n if (state === UserGeoViewState.HIDDEN) {\n this.geoPanelDismissed = true;\n }\n }\n\n /**\n * Admit a user from the waiting room\n */\n admitUser(userId: number): void {\n if (!this.videoCallId) {\n console.error('Cannot admit user: videoCallId not set');\n return;\n }\n\n this.tasService\n .modifyProxyVideoUser({\n userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.WAITING_ROOM_LEAVE,\n })\n .subscribe({\n next: () => {\n // Remove user from waiting list after successful admit\n this.waitingRoomUsers = this.waitingRoomUsers.filter(\n (u) => u.userId !== userId\n );\n },\n error: (err) => {\n console.error('Error admitting user:', err);\n },\n });\n }\n\n /**\n * Dismiss the waiting room notification for a user\n */\n dismissWaitingNotification(userId: number): void {\n this.dismissedUsers.push(userId);\n this.waitingRoomUsers = this.waitingRoomUsers.filter(\n (u) => u.userId !== userId\n );\n }\n\n /**\n * Close the location panel\n */\n closeLocationPanel(): void {\n this.showLocationPanel = false;\n }\n\n /**\n * Request the user to share their location (called by owner)\n */\n requestUserLocation(): void {\n if (!this.videoCallId) {\n console.error('Cannot request location: videoCallId not set');\n return;\n }\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.REQUEST_GEOLOCALIZATION,\n };\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => {\n console.log('Location request sent');\n // Set panel to verifying state while waiting for user response\n this.userGeoViewState = UserGeoViewState.VERIFYING;\n },\n error: (err) => console.error('Error requesting location:', err),\n });\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n // Call state subscription\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n this.callState = state;\n if (state === CallState.DISCONNECTED) {\n this.openFeedbackModal();\n }\n // Track if we have an active video stream\n this.hasVideoStream = state === CallState.CONNECTED;\n })\n );\n\n // View mode subscription\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (mode === ViewMode.PIP) {\n this.activeModal.close('pip');\n }\n })\n );\n\n // Mute state subscription\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n\n // Waiting room users subscription\n this.subscriptions.add(\n this.tasService.waitingRoomUsers$.subscribe((users) => {\n // Filter out dismissed users\n this.waitingRoomUsers = users.filter(\n (u) => !this.dismissedUsers.includes(u.userId)\n );\n })\n );\n\n // Owner join status subscription\n this.subscriptions.add(\n this.tasService.ownerHasJoined$.subscribe((joined) => {\n this.ownerHasJoined = joined;\n })\n );\n\n // Owner left subscription - disconnect non-owners\n this.subscriptions.add(\n this.tasService.ownerHasLeft$.subscribe((hasLeft) => {\n if (hasLeft && !this.canAdmitUsers) { // Non-owner user\n // hangUp() triggers DISCONNECTED state, which opens feedback modal\n // then closes videocall modal after feedback is done\n this.hangUp();\n }\n })\n );\n\n // ActivateGeo subscription - only for non-owners (users)\n this.subscriptions.add(\n this.tasService.activateGeo$.subscribe((activateGeo) => {\n if (activateGeo && !this.canAdmitUsers) {\n\n this.handleActivateGeo();\n }\n })\n );\n\n // GeoRequestActive subscription - for owners\n this.subscriptions.add(\n this.tasService.geoRequestActive$.subscribe((active) => {\n\n this.geoRequestActive = active;\n })\n );\n\n // AllGeoGranted subscription - for owners to update panel state\n this.subscriptions.add(\n this.tasService.allGeoGranted$.subscribe((granted) => {\n this.allGeoGranted = granted;\n \n // For owners: update panel state based on geo status\n if (this.canAdmitUsers && granted) {\n this.userGeoViewState = UserGeoViewState.VERIFIED;\n }\n })\n );\n\n // UserGeoInfo subscription - for owner geo panel\n this.subscriptions.add(\n this.tasService.userGeoInfo$.subscribe((info) => {\n this.userGeoInfo = info;\n // Note: We don't auto-switch to DENIED here - that only happens \n // after owner requests and user denies (via geoRequestActive flow)\n })\n );\n }\n\n /**\n * Handle activateGeo request from backend (for non-owner users).\n * Directly prompts browser for geolocation - no panel for users.\n */\n private async handleActivateGeo(): Promise<void> {\n // Clear any cached position to force re-prompting\n this.geolocationService.clearCache();\n \n // Request geolocation from user (browser will prompt)\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n this.geoLocationStatus = 'denied';\n this.denyGeoLocation();\n }\n }\n\n /** Start geolocation verification (called from template button) */\n public async startGeoVerification(): Promise<void> {\n this.userGeoViewState = UserGeoViewState.VERIFYING;\n\n // Clear any cached position to force re-prompting\n this.geolocationService.clearCache();\n \n // Request geolocation from user (browser will prompt)\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n this.geoLocationStatus = 'active';\n this.userGeoViewState = UserGeoViewState.VERIFIED;\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n this.geoLocationStatus = 'denied';\n this.userGeoViewState = UserGeoViewState.DENIED;\n this.denyGeoLocation();\n }\n }\n\n /**\n * Report granted geolocation to backend.\n * IMPORTANT: Only call with valid coordinates.\n */\n private reportGeoStatus(latitude: number, longitude: number): void {\n if (!this.videoCallId) {\n\n return;\n }\n\n // Validate coordinates are present\n if (latitude === undefined || latitude === null || longitude === undefined || longitude === null) {\n\n return;\n }\n\n const body: ProxyVideoUserModifyRequest = {\n userId: this.userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.ACTIVATE_GEOLOCATION,\n latitude,\n longitude,\n };\n\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n\n });\n }\n\n /**\n * Report denied geolocation to backend.\n */\n private denyGeoLocation(): void {\n if (!this.videoCallId) {\n\n return;\n }\n\n const body: ProxyVideoUserModifyRequest = {\n userId: this.userId,\n videoCallId: this.videoCallId,\n action: UserCallAction.DENY_GEOLOCATION,\n };\n\n\n this.tasService.modifyProxyVideoUser(body).subscribe({\n\n });\n }\n\n private initializeCall(): void {\n if (this.isReturningFromPip) {\n // Returning from PiP - just move videos back\n setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);\n } else if (this.sessionId && this.token) {\n // New call - connect to session\n this.tasService\n .connectSession(\n this.sessionId,\n this.token,\n 'publisher-container',\n 'subscriber-container',\n this.businessRole\n )\n .catch((err) => {\n console.error('Error connecting to video call:', err);\n });\n \n // Start status polling with shorter interval (5s) to detect owner leaving/location requests\n if (this.appointmentId) {\n this.tasService.startStatusPolling({\n appointmentId: this.appointmentId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n roomType: undefined, // RoomType might be needed if available\n entityId: undefined, // EntityId might be needed if available\n sessionId: this.sessionId\n }, 5000);\n }\n }\n }\n\n private resetVideoPositions(): void {\n const publisherEl = this.publisherContainer?.nativeElement as HTMLElement;\n const subscriberEl = this.subscriberContainer?.nativeElement as HTMLElement;\n\n if (publisherEl) {\n publisherEl.removeAttribute('style');\n publisherEl.removeAttribute('data-x');\n publisherEl.removeAttribute('data-y');\n }\n\n if (subscriberEl) {\n subscriberEl.removeAttribute('style');\n subscriberEl.removeAttribute('data-x');\n subscriberEl.removeAttribute('data-y');\n }\n }\n\n private initInteract(): void {\n interact('.publisher-view').unset();\n\n interact('.publisher-view')\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: 'parent',\n endOnly: true,\n }),\n ],\n autoScroll: true,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute('data-x')) || 0;\n let y = parseFloat(target.getAttribute('data-y')) || 0;\n\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({ outer: 'parent' }),\n interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),\n interact.modifiers.aspectRatio({ ratio: 'preserve' }),\n ],\n inertia: true,\n });\n }\n}\n","<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} está en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificación\"\n >\n ×\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicación del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">×</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicación desactivada, solicita que la active.</p>\n <p>Esta acción nos permitirá disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicación...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicación fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicación fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permitió el acceso a su ubicación.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicación\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n","import { Component, OnInit, OnDestroy, Input, ChangeDetectorRef } from '@angular/core';\nimport { NgbActiveModal, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { GeolocationService, GeoPosition } from '../../services/geolocation.service';\nimport { Subscription } from 'rxjs';\nimport {\n TasCurrentUser,\n TasRoomType,\n TasBusinessRole,\n TasUserRole,\n UserCallAction,\n ProxyVideoUserModifyRequest,\n} from '../../interfaces/tas.interfaces';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\n\nexport enum WaitingRoomState {\n CHECKING_STATUS = 'CHECKING_STATUS',\n WAITING_FOR_JOINABLE = 'WAITING_FOR_JOINABLE',\n READY = 'READY',\n GETTING_TOKEN = 'GETTING_TOKEN',\n JOINING = 'JOINING',\n ERROR = 'ERROR',\n}\n\n@Component({\n selector: 'tas-waiting-room',\n templateUrl: './tas-waiting-room.component.html',\n styleUrls: ['./tas-waiting-room.component.scss'],\n})\nexport class TasWaitingRoomComponent implements OnInit, OnDestroy {\n // Status endpoint params\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // User info for token request\n @Input() currentUser!: TasCurrentUser;\n\n // Component state\n public state: WaitingRoomState = WaitingRoomState.CHECKING_STATUS;\n public WaitingRoomState = WaitingRoomState; // Expose enum to template\n public errorMessage: string = '';\n public showErrorDetails: boolean = false;\n public isJoinable: boolean = false;\n\n // Session data from status response\n private resolvedSessionId: string = '';\n private resolvedAppointmentId: number | null = null;\n private token: string = '';\n private videoCallId: number | null = null;\n\n // Subscriptions\n private subscriptions = new Subscription();\n private videoCallModalRef: NgbModalRef | null = null;\n\n // Geolocation\n private geoPosition: GeoPosition | null = null;\n private geoWasDenied: boolean = false; // Tracks if user denied geo permission\n private geoResultSent: boolean = false; // Tracks if geo result was already sent\n\n // Permission tracking for auto-join\n private mediaPermissionsGranted: boolean = false;\n private geoPermissionsResolved: boolean = false;\n\n // Auto-retry tracking\n private retryCount: number = 0;\n private readonly MAX_RETRIES = 1;\n\n /** Whether current user is an owner */\n public get isOwner(): boolean {\n return this.currentUser?.role === TasUserRole.OWNER;\n }\n\n /** Whether we're still requesting permissions (for template) */\n public get isRequestingPermissions(): boolean {\n return !this.mediaPermissionsGranted || (!this.geoPermissionsResolved && !this.isOwner && !this.isBackoffice);\n }\n\n /** Whether we're waiting for admission after permissions granted (for template) */\n public get isWaitingForAdmission(): boolean {\n return this.mediaPermissionsGranted && \n (this.geoPermissionsResolved || this.isOwner || this.isBackoffice) && \n !this.isJoinable;\n }\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService,\n private modalService: NgbModal,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnInit');\n this.requestMediaPermissions();\n // Request geolocation permission and cache it (but don't send to backend yet)\n // The cached position will be sent when owner requests it via activateGeo\n this.requestGeolocation();\n this.checkStatus();\n }\n\n /**\n * Request camera and microphone permissions.\n * Triggers auto-join when permissions are resolved.\n */\n private async requestMediaPermissions(): Promise<void> {\n console.log('[TAS DEBUG] Requesting media permissions...');\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });\n // Stop tracks immediately - we just needed the permission\n stream.getTracks().forEach(track => track.stop());\n console.log('[TAS DEBUG] Media permissions granted');\n this.mediaPermissionsGranted = true;\n } catch (error) {\n console.warn('[TAS DEBUG] Media permissions denied or unavailable:', error);\n // Still allow joining - some users may not have camera/mic\n this.mediaPermissionsGranted = true;\n }\n this.tryAutoJoin();\n this.cdr.detectChanges();\n }\n\n /**\n * Request geolocation permission and cache result.\n * Only for regular users (not owners/backoffice).\n * Actual send to backend happens after we have videoCallId.\n * Triggers auto-join when geolocation is resolved.\n */\n private async requestGeolocation(): Promise<void> {\n // Only request geolocation for regular users, not owners/backoffice\n if (this.isOwner || this.isBackoffice) {\n console.log('[TAS DEBUG] Skipping geolocation for owner/backoffice');\n this.geoPermissionsResolved = true;\n return;\n }\n\n console.log('[TAS DEBUG] Requesting geolocation permission...');\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n console.log('[TAS DEBUG] Geolocation granted:', position);\n this.geoPosition = position;\n this.geoWasDenied = false;\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n this.geoPosition = null;\n this.geoWasDenied = true;\n }\n \n this.geoPermissionsResolved = true;\n // If we already have videoCallId, send now. Otherwise, it will be sent after status response.\n this.sendGeoResultToBackend();\n this.tryAutoJoin();\n this.cdr.detectChanges();\n }\n\n /**\n * Send geo result to backend (granted or denied).\n * Only sends if videoCallId is available and not already sent.\n */\n private sendGeoResultToBackend(): void {\n if (!this.videoCallId) {\n console.log('[TAS DEBUG] Cannot send geo result: videoCallId not available yet');\n return;\n }\n\n if (this.geoResultSent) {\n console.log('[TAS DEBUG] Geo result already sent, skipping');\n return;\n }\n\n if (this.geoPosition) {\n this.sendGeolocationToBackend();\n this.geoResultSent = true;\n } else if (this.geoWasDenied) {\n this.sendGeoDenialToBackend();\n this.geoResultSent = true;\n }\n }\n\n /**\n * Send granted geolocation to backend via modify user endpoint.\n */\n private sendGeolocationToBackend(): void {\n if (!this.geoPosition || !this.videoCallId) {\n return;\n }\n\n console.log('[TAS DEBUG] Sending geolocation to backend...');\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.ACTIVATE_GEOLOCATION,\n latitude: this.geoPosition.latitude,\n longitude: this.geoPosition.longitude,\n };\n \n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geolocation sent successfully'),\n error: (err) => console.error('[TAS DEBUG] Failed to send geolocation:', err),\n });\n }\n\n /**\n * Send geolocation denial to backend via modify user endpoint.\n */\n private sendGeoDenialToBackend(): void {\n if (!this.videoCallId) {\n return;\n }\n\n console.log('[TAS DEBUG] Sending geo denial to backend...');\n const body: ProxyVideoUserModifyRequest = {\n videoCallId: this.videoCallId,\n action: UserCallAction.DENY_GEOLOCATION,\n };\n \n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geo denial sent successfully'),\n error: (err) => console.error('[TAS DEBUG] Failed to send geo denial:', err),\n });\n }\n\n ngOnDestroy(): void {\n console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnDestroy');\n this.subscriptions.unsubscribe();\n this.tasService.stopStatusPolling();\n }\n\n /**\n * Check status to get session info\n */\n private checkStatus(): void {\n console.log('[TAS DEBUG] checkStatus called with:', {\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n currentUser: this.currentUser,\n });\n\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n\n const statusParams = {\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n };\n\n console.log('[TAS DEBUG] Calling getProxyVideoStatus...');\n\n this.subscriptions.add(\n this.tasService.getProxyVideoStatus(statusParams).subscribe({\n next: (response) => {\n const content = response.content;\n\n // Store session info from response\n this.resolvedSessionId = content.sessionId;\n this.resolvedAppointmentId = content.appointmentId;\n this.videoCallId = content.videoCallId;\n\n console.log('[TAS DEBUG] Status response:', content);\n\n // Now that we have videoCallId, send geo result if not already sent\n this.sendGeoResultToBackend();\n\n // Start polling for status updates\n this.tasService.startStatusPolling(statusParams);\n\n // Subscribe to joinable status\n this.subscriptions.add(\n this.tasService.joinable$.subscribe((joinable) => {\n this.handleJoinableChange(joinable);\n })\n );\n },\n error: (err) => {\n console.error('[TAS DEBUG] Status check failed:', err);\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = 'Error checking session status. Please try again.';\n },\n })\n );\n }\n\n /**\n * Handle changes to joinable status.\n * Triggers auto-join when joinable becomes true.\n */\n private handleJoinableChange(joinable: boolean): void {\n console.log('[TAS DEBUG] handleJoinableChange called', {\n joinable,\n currentState: this.state,\n resolvedSessionId: this.resolvedSessionId,\n });\n\n this.isJoinable = joinable;\n\n // Don't update state if already getting token, joining, or in error\n if (\n this.state === WaitingRoomState.GETTING_TOKEN ||\n this.state === WaitingRoomState.JOINING ||\n this.state === WaitingRoomState.ERROR\n ) {\n console.log('[TAS DEBUG] Skipping state update - already in:', this.state);\n return;\n }\n\n // Update state and attempt auto-join\n if (joinable) {\n console.log('[TAS DEBUG] Joinable is true, attempting auto-join');\n this.state = WaitingRoomState.READY;\n this.tryAutoJoin();\n } else {\n console.log('[TAS DEBUG] Waiting for joinable...');\n this.state = WaitingRoomState.WAITING_FOR_JOINABLE;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Attempt to auto-join the session when all conditions are met.\n * - For owners: just need joinable + sessionId\n * - For users: need media permissions + geo resolved + joinable + sessionId\n */\n private tryAutoJoin(): void {\n // Don't try if already joining or in error\n if (this.state === WaitingRoomState.GETTING_TOKEN || \n this.state === WaitingRoomState.JOINING) {\n console.log('[TAS DEBUG] tryAutoJoin skipped - already in state:', this.state);\n return;\n }\n\n // For owners: just need joinable\n if (this.isOwner) {\n if (this.isJoinable && this.resolvedSessionId) {\n console.log('[TAS DEBUG] Owner auto-joining...');\n this.startSessionAndJoin();\n }\n return;\n }\n\n // For users: need media + geo resolved + joinable\n if (this.mediaPermissionsGranted && \n this.geoPermissionsResolved && \n this.isJoinable && \n this.resolvedSessionId) {\n console.log('[TAS DEBUG] User auto-joining...');\n this.startSessionAndJoin();\n }\n }\n\n /**\n * Check if user has owner/backoffice role\n */\n private get isBackoffice(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /**\n * Start session and join - called when user clicks join button\n */\n private startSessionAndJoin(): void {\n if (!this.resolvedSessionId) {\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = 'Session ID not available';\n this.tasService.stopStatusPolling();\n this.cdr.detectChanges();\n return;\n }\n\n this.state = WaitingRoomState.GETTING_TOKEN;\n this.errorMessage = '';\n console.log('[TAS DEBUG] Calling /start for session:', this.resolvedSessionId);\n\n this.subscriptions.add(\n this.tasService\n .startProxyVideoSession({\n sessionId: this.resolvedSessionId,\n name: this.currentUser.name,\n lastname: this.currentUser.lastname,\n })\n .subscribe({\n next: (tokenResponse) => {\n console.log('[TAS DEBUG] Token response:', tokenResponse);\n \n // Handle case where HTTP adapter returns error in next instead of error handler\n if (!tokenResponse?.content?.token) {\n console.error('[TAS DEBUG] Invalid token response:', tokenResponse);\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = (tokenResponse as any)?.message || 'Error al iniciar la sesión. Respuesta inválida.';\n this.tasService.stopStatusPolling();\n this.cdr.detectChanges();\n return;\n }\n \n console.log('[TAS DEBUG] Token obtained successfully, joining session...');\n this.token = tokenResponse.content.token;\n this.state = WaitingRoomState.JOINING;\n this.cdr.detectChanges();\n \n // Auto-join immediately\n this.tasService.stopStatusPolling();\n this.activeModal.close('joining');\n this.openVideoCallModal();\n },\n error: (err) => {\n console.error('[TAS DEBUG] /start request failed:', err);\n \n // Auto-retry on first failure\n if (this.retryCount < this.MAX_RETRIES) {\n this.retryCount++;\n console.log('[TAS DEBUG] Auto-retrying... attempt:', this.retryCount);\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.cdr.detectChanges();\n setTimeout(() => this.startSessionAndJoin(), 2000);\n } else {\n // Show error after retry fails\n this.state = WaitingRoomState.ERROR;\n this.errorMessage = err?.error?.message || err?.message || 'Error al iniciar la sesión. Por favor, intente nuevamente.';\n this.tasService.stopStatusPolling();\n console.log('[TAS DEBUG] State set to ERROR, errorMessage:', this.errorMessage);\n this.cdr.detectChanges();\n }\n },\n })\n );\n }\n\n\n\n /**\n * Retry after an error.\n * Resets retry count and restarts the flow.\n */\n retry(): void {\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n this.showErrorDetails = false;\n this.token = '';\n this.retryCount = 0; // Reset retry count for auto-retry\n this.checkStatus();\n }\n\n /**\n * Toggle the error details dropdown visibility.\n */\n toggleErrorDetails(): void {\n this.showErrorDetails = !this.showErrorDetails;\n }\n\n /**\n * Close the waiting room modal.\n */\n close(): void {\n this.tasService.stopStatusPolling();\n this.activeModal.dismiss('close');\n }\n\n private openVideoCallModal(): void {\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.resolvedSessionId;\n this.videoCallModalRef.componentInstance.token = this.token;\n this.videoCallModalRef.componentInstance.appointmentId = this.resolvedAppointmentId;\n this.videoCallModalRef.componentInstance.videoCallId = this.videoCallId;\n this.videoCallModalRef.componentInstance.userId = this.currentUser?.id;\n this.videoCallModalRef.componentInstance.tenant = this.tenant;\n this.videoCallModalRef.componentInstance.businessRole = this.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = false;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n}\n","<div class=\"tas-waiting-room\">\n <div class=\"waiting-room-content\">\n <div class=\"state-container\">\n <!-- Loading states (show spinner) -->\n <ng-container *ngIf=\"state !== WaitingRoomState.ERROR\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n \n <!-- Requesting permissions -->\n <ng-container *ngIf=\"isRequestingPermissions\">\n <p class=\"state-message\">Solicitando permisos...</p>\n <p class=\"state-submessage\">Por favor, aceptá los permisos de cámara y micrófono.</p>\n </ng-container>\n \n <!-- Waiting for admission (permissions granted, not joinable yet) -->\n <ng-container *ngIf=\"isWaitingForAdmission\">\n <p class=\"state-message\">Medicina laboral va a admitirte</p>\n <p class=\"state-submessage\">Por favor, permanecé en esta pantalla.</p>\n </ng-container>\n \n <!-- Getting token / Joining -->\n <ng-container *ngIf=\"state === WaitingRoomState.GETTING_TOKEN || state === WaitingRoomState.JOINING\">\n <p class=\"state-message\">Conectando...</p>\n </ng-container>\n \n <!-- Checking status (when not requesting permissions) -->\n <ng-container *ngIf=\"state === WaitingRoomState.CHECKING_STATUS && !isRequestingPermissions\">\n <p class=\"state-message\">Verificando estado...</p>\n </ng-container>\n </ng-container>\n\n <!-- Error state (show error icon and message) -->\n <ng-container *ngIf=\"state === WaitingRoomState.ERROR\">\n <div class=\"state-icon error\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n </div>\n <p class=\"state-message error\">Ocurrió un error</p>\n \n <!-- Collapsible error details -->\n <div class=\"error-dropdown\" *ngIf=\"errorMessage\">\n <button \n type=\"button\" \n class=\"error-toggle-btn\"\n (click)=\"toggleErrorDetails()\"\n [attr.aria-expanded]=\"showErrorDetails\"\n aria-controls=\"error-details-content\"\n >\n <span>Ver detalles del error</span>\n <i class=\"fa\" [class.fa-chevron-down]=\"!showErrorDetails\" [class.fa-chevron-up]=\"showErrorDetails\"></i>\n </button>\n <div \n id=\"error-details-content\"\n class=\"error-details-content\"\n [class.expanded]=\"showErrorDetails\"\n >\n <p class=\"error-details-text\">{{ errorMessage }}</p>\n </div>\n </div>\n \n <div class=\"error-actions\">\n <button type=\"button\" class=\"btn action-btn retry-btn\" (click)=\"retry()\">\n <i class=\"fa fa-refresh\"></i>\n Reintentar\n </button>\n <button type=\"button\" class=\"btn action-btn close-btn\" (click)=\"close()\">\n Cerrar\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { Subscription } from 'rxjs';\nimport {\n TasCurrentUser,\n \n TasRoomType,\n ViewMode,\n TasBusinessRole,\n} from '../../interfaces/tas.interfaces';\nimport { TasWaitingRoomComponent } from '../tas-waiting-room/tas-waiting-room.component';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\nimport { TasService } from '../../services/tas.service';\nimport { TasUtilityService } from '../../services/tas-utility.service';\n\n@Component({\n selector: 'tas-btn',\n templateUrl: './tas-btn.component.html',\n styleUrls: ['./tas-btn.component.scss'],\n})\nexport class TasButtonComponent implements OnInit, OnDestroy {\n // Status endpoint params\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n\n // User info for token request\n @Input() currentUser!: TasCurrentUser;\n\n // Style customization\n @Input() variant: 'default' | 'teal' = 'default';\n @Input() buttonLabel: string = 'Iniciar TAS';\n\n public isLoading = false;\n\n // Status check state\n public isCheckingStatus = false;\n public isStatusError = false;\n public statusErrorMessage = '';\n public isJoinable = false; // Tracks joinable field from status response\n public shouldShowButton = false; // Hidden by default, shown after status check confirms visibility\n\n private subscriptions = new Subscription();\n private currentModalRef: NgbModalRef | null = null;\n private videoCallModalRef: NgbModalRef | null = null;\n private statusPollingInterval: ReturnType<typeof setInterval> | null = null;\n private readonly STATUS_POLL_INTERVAL_MS = 30000; // 30 seconds\n\n /** Whether user is backoffice (or admin/manager) */\n public get isBackoffice(): boolean {\n return (\n this.businessRole === TasBusinessRole.BACKOFFICE ||\n this.businessRole === TasBusinessRole.ADMIN_MANAGER ||\n this.businessRole === TasBusinessRole.MANAGER\n );\n }\n\n /** Whether the button should be disabled */\n public get isDisabled(): boolean {\n return this.isLoading || this.isStatusError || !this.isJoinable;\n }\n\n /** Reason why the button is disabled (for tooltip) */\n public get disabledReason(): string {\n if (this.isLoading) {\n return '';\n }\n if (this.isStatusError) {\n return this.statusErrorMessage || 'Error al verificar el estado';\n }\n if (!this.isJoinable) {\n return 'Todavía no es el horario de la llamada';\n }\n return '';\n }\n\n constructor(\n private modalService: NgbModal,\n private tasService: TasService,\n private tasUtilityService: TasUtilityService\n ) {}\n\n ngOnInit(): void {\n // Subscribe to viewMode to handle PiP return\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n // When entering PiP, clear the videoCallModalRef since modal will close\n if (mode === ViewMode.PIP) {\n this.videoCallModalRef = null;\n }\n })\n );\n\n // Start status checking\n this.startStatusPolling();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.stopStatusPolling();\n }\n\n /**\n * Start polling status every 30 seconds\n */\n private startStatusPolling(): void {\n // Initial status check\n this.checkStatus();\n\n // Set up periodic polling\n this.statusPollingInterval = setInterval(() => {\n this.checkStatus();\n }, this.STATUS_POLL_INTERVAL_MS);\n }\n\n /**\n * Stop status polling\n */\n private stopStatusPolling(): void {\n if (this.statusPollingInterval) {\n clearInterval(this.statusPollingInterval);\n this.statusPollingInterval = null;\n }\n }\n\n /**\n * Check status endpoint to determine if button should be enabled\n */\n private checkStatus(): void {\n // Skip if required inputs are not available\n if (!this.tenant || !this.entityId) {\n return;\n }\n\n this.isCheckingStatus = true;\n this.statusErrorMessage = '';\n\n this.subscriptions.add(\n this.tasService\n .getProxyVideoStatus({\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n })\n .subscribe({\n next: (response) => {\n // Validate response structure\n if (!response || !response.content) {\n this.handleStatusError('Invalid response');\n return;\n }\n\n this.isCheckingStatus = false;\n this.isStatusError = false;\n this.statusErrorMessage = '';\n this.shouldShowButton = true;\n // Update joinable state from response\n this.isJoinable = response.content?.joinable ?? false;\n },\n error: (err) => {\n\n this.handleStatusError(err);\n },\n })\n );\n }\n\n private handleStatusError(err: any): void {\n this.isCheckingStatus = false;\n const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');\n this.statusErrorMessage = errorMessage;\n\n // On any status error, hide the button\n this.shouldShowButton = false;\n this.isStatusError = false; // We don't show error UI, just hide the button\n\n // Stop polling on error\n this.stopStatusPolling();\n }\n\n onClick(): void {\n if (!this.tenant || !this.currentUser?.name) {\n return;\n }\n\n if (!this.entityId) {\n return;\n }\n\n this.openWaitingRoomModal();\n }\n\n private openWaitingRoomModal(): void {\n this.currentModalRef = this.modalService.open(TasWaitingRoomComponent, {\n size: 'lg',\n windowClass: 'tas-waiting-room-modal',\n backdrop: 'static',\n keyboard: false,\n centered: true,\n });\n\n // Pass all necessary inputs to the waiting room component\n this.currentModalRef.componentInstance.roomType = this.roomType;\n this.currentModalRef.componentInstance.entityId = this.entityId;\n this.currentModalRef.componentInstance.tenant = this.tenant;\n this.currentModalRef.componentInstance.businessRole = this.businessRole;\n this.currentModalRef.componentInstance.currentUser = this.currentUser;\n\n this.currentModalRef.result.then(\n () => {\n this.currentModalRef = null;\n },\n () => {\n this.currentModalRef = null;\n }\n );\n }\n\n private openVideoCallModal(isReturningFromPip: boolean = false): void {\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;\n this.videoCallModalRef.componentInstance.token = this.tasService.token;\n this.videoCallModalRef.componentInstance.businessRole = this.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n}\n","<span\n *ngIf=\"shouldShowButton\"\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { CallState, ViewMode } from '../../interfaces/tas.interfaces';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\nimport { TasFeedbackModalComponent } from '../tas-feedback-modal/tas-feedback-modal.component';\nimport { Subscription } from 'rxjs';\nimport interact from 'interactjs';\n\n@Component({\n selector: 'tas-floating-call',\n templateUrl: './tas-floating-call.component.html',\n styleUrls: ['./tas-floating-call.component.scss'],\n})\nexport class TasFloatingCallComponent implements OnInit, OnDestroy {\n public isVisible = false;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n private videoCallModalRef: NgbModalRef | null = null;\n private feedbackShown = false; // Track if feedback modal has been shown\n\n constructor(\n private tasService: TasService,\n private modalService: NgbModal\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n interact('.tas-floating-container').unset();\n }\n\n // Public Methods\n onExpand(): void {\n this.openVideoCallModal(true);\n this.tasService.exitPipMode();\n }\n\n onHangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n /**\n * Open feedback modal when call ends from PiP mode\n */\n private openFeedbackModal(): void {\n // Prevent opening feedback modal multiple times\n if (this.feedbackShown) {\n this.isVisible = false;\n return;\n }\n\n // Get videoCallId from service\n const videoCallId = this.tasService.videoCallId;\n\n // If no videoCallId, skip feedback and hide directly\n if (!videoCallId) {\n this.isVisible = false;\n return;\n }\n\n this.feedbackShown = true;\n\n const modalRef = this.modalService.open(TasFeedbackModalComponent, {\n centered: true,\n backdrop: true,\n keyboard: true,\n windowClass: 'tas-feedback-modal-wrapper',\n });\n\n modalRef.componentInstance.videoCallId = videoCallId;\n modalRef.componentInstance.tenant = this.tasService.tenant ?? '';\n modalRef.componentInstance.businessRole = this.tasService.businessRole;\n\n // Hide floating call after feedback modal is closed/dismissed\n modalRef.result.finally(() => {\n this.isVisible = false;\n this.feedbackShown = false; // Reset for potential future calls\n });\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n // Call state subscription\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n // Only handle disconnect feedback if we're in PiP mode (isVisible)\n if (state === CallState.DISCONNECTED && this.isVisible) {\n this.openFeedbackModal();\n }\n })\n );\n\n // View mode subscription\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n this.isVisible = mode === ViewMode.PIP && this.tasService.isCallActive();\n if (this.isVisible) {\n setTimeout(() => this.initInteract(), 100);\n // Clear modal ref if we enter PiP mode (modal closes itself)\n this.videoCallModalRef = null;\n }\n })\n );\n\n // Mute state subscription\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private openVideoCallModal(isReturningFromPip: boolean = false): void {\n if (this.videoCallModalRef) {\n return;\n }\n\n this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n size: 'xl',\n windowClass: 'tas-video-modal',\n backdrop: 'static',\n keyboard: false,\n });\n\n this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;\n this.videoCallModalRef.componentInstance.token = this.tasService.token;\n this.videoCallModalRef.componentInstance.businessRole = this.tasService.businessRole;\n this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n this.videoCallModalRef.result.then(\n () => {\n this.videoCallModalRef = null;\n },\n () => {\n this.videoCallModalRef = null;\n }\n );\n }\n\n // Margin from screen edges (in pixels)\n private readonly PIP_MARGIN = 20;\n\n private initInteract(): void {\n interact('.tas-floating-container').unset();\n\n // Create restriction area with margin\n const margin = this.PIP_MARGIN;\n const restrictToBodyWithMargin = {\n restriction: () => {\n return {\n left: margin,\n top: margin,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n };\n },\n elementRect: { left: 0, right: 1, top: 0, bottom: 1 },\n };\n\n interact('.tas-floating-container')\n .draggable({\n inertia: true,\n modifiers: [interact.modifiers.restrict(restrictToBodyWithMargin)],\n autoScroll: false,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute('data-x')) || 0;\n let y = parseFloat(target.getAttribute('data-y')) || 0;\n\n // Update element size\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n // Translate when resizing from top or left edges\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute('data-x', String(x));\n target.setAttribute('data-y', String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({\n outer: {\n left: margin,\n top: margin,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n },\n }),\n interact.modifiers.restrictSize({\n min: { width: 200, height: 130 },\n max: { width: 500, height: 350 },\n }),\n interact.modifiers.aspectRatio({ ratio: 'preserve' }),\n ],\n inertia: true,\n });\n }\n}\n","<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <!-- Video content area - shows main video only -->\n <div class=\"floating-content\">\n <!-- Main video container (subscriber if available, otherwise publisher) -->\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <!-- Bottom controls -->\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expand to fullscreen\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TasService } from '../../services/tas.service';\nimport {\n TasAppointment,\n AppointmentStatus,\n TasRoomType,\n TasBusinessRole,\n TasCurrentUser,\n} from '../../interfaces/tas.interfaces';\n\n@Component({\n selector: 'tas-incoming-appointment',\n templateUrl: './tas-incoming-appointment.component.html',\n styleUrls: ['./tas-incoming-appointment.component.scss'],\n})\nexport class TasIncomingAppointmentComponent implements OnInit, OnDestroy {\n // Passthrough inputs for tas-btn\n @Input() roomType: TasRoomType = TasRoomType.TAS;\n @Input() entityId!: number;\n @Input() tenant!: string;\n @Input() businessRole: TasBusinessRole = TasBusinessRole.USER;\n @Input() currentUser!: TasCurrentUser;\n \n // Date range inputs for fetching appointments\n @Input() fromDate!: string; // YYYY-MM-DD format\n @Input() toDate!: string; // YYYY-MM-DD format\n\n @Output() enterCall = new EventEmitter<TasAppointment>();\n\n public appointments: TasAppointment[] = [];\n public isLoading = true;\n public hasError = false;\n\n // The appointmentId from status API - only this appointment shows tas-btn\n public activeAppointmentId: number | null = null;\n\n private subscriptions = new Subscription();\n\n constructor(private tasService: TasService) {}\n\n ngOnInit(): void {\n this.loadAppointments();\n this.checkStatus();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n private loadAppointments(): void {\n this.subscriptions.add(\n this.tasService\n .getAppointments({ \n fromDate: this.fromDate, \n toDate: this.toDate, \n entityId: this.entityId \n })\n .subscribe({\n next: (response: any) => {\n // Handle both array response and wrapped response (e.g., { content: [...] })\n const appointments = Array.isArray(response)\n ? response\n : response?.content || [];\n \n // Deduplicate by id and sort by date and startTime ascending (earliest first)\n const uniqueAppointments = appointments.filter(\n (appt: TasAppointment, index: number, self: TasAppointment[]) =>\n index === self.findIndex((a: TasAppointment) => a.id === appt.id)\n );\n this.appointments = uniqueAppointments.sort((a: TasAppointment, b: TasAppointment) => {\n const dateTimeA = `${a.date}T${a.startTime}`;\n const dateTimeB = `${b.date}T${b.startTime}`;\n return dateTimeB.localeCompare(dateTimeA);\n });\n this.isLoading = false;\n },\n error: () => {\n this.hasError = true;\n this.isLoading = false;\n },\n })\n );\n }\n\n /**\n * Check status endpoint to get the active appointmentId\n */\n private checkStatus(): void {\n if (!this.tenant || !this.entityId) {\n return;\n }\n\n this.subscriptions.add(\n this.tasService\n .getProxyVideoStatus({\n roomType: this.roomType,\n entityId: this.entityId,\n tenant: this.tenant,\n businessRole: this.businessRole,\n })\n .subscribe({\n next: (response) => {\n // Store the appointmentId from status - tas-btn only shows for this one\n this.activeAppointmentId = response?.content?.appointmentId ?? null;\n },\n error: () => {\n this.activeAppointmentId = null;\n },\n })\n );\n }\n\n public onEnterCall(appointment: TasAppointment): void {\n this.enterCall.emit(appointment);\n }\n\n /**\n * Check if tas-btn should be shown for an appointment.\n * Only shows when appointment.id matches the activeAppointmentId from status API.\n * tas-btn handles its own polling for joinable state.\n */\n public shouldShowTasBtn(appointment: TasAppointment): boolean {\n const hasValidStatus = appointment.status === AppointmentStatus.CONFIRMED ||\n appointment.status === AppointmentStatus.ACTIVE;\n \n // Only show for the appointment that matches status API response\n return hasValidStatus && appointment.id === this.activeAppointmentId;\n }\n\n /**\n * TrackBy function for ngFor\n */\n public trackByAppointmentId(index: number, appointment: TasAppointment): number {\n return appointment.id;\n }\n\n /**\n * Format date to Spanish format: \"Lunes 8 de diciembre\"\n */\n public formatAppointmentDate(appointment: TasAppointment): string {\n const [year, month, day] = appointment.date.split('-').map(Number);\n const date = new Date(year, month - 1, day);\n\n const dayNames = [\n 'Domingo', 'Lunes', 'Martes', 'Miércoles',\n 'Jueves', 'Viernes', 'Sábado'\n ];\n const monthNames = [\n 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',\n 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'\n ];\n\n const dayName = dayNames[date.getDay()];\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n\n return `${dayName} ${dayNum} de ${monthName}`;\n }\n\n /**\n * Format time range: \"9:00 - 9:30\"\n */\n public formatTimeRange(appointment: TasAppointment): string {\n return `${appointment.startTime} - ${appointment.endTime}`;\n }\n\n /**\n * Get the other participant in the call (not the current user)\n */\n public getOtherParticipant(appointment: TasAppointment): string {\n if (!appointment.participants || appointment.participants.length === 0) {\n return appointment.title;\n }\n \n const otherParticipant = appointment.participants.find(\n p => p.userId !== this.currentUser?.id\n );\n \n return otherParticipant?.name || appointment.title;\n }\n}\n\n","<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Próximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">✦</span>\n <span class=\"sparkle sparkle-2\">✦</span>\n <span class=\"sparkle sparkle-3\">✦</span>\n <span class=\"sparkle sparkle-4\">✦</span>\n </div>\n <h4 class=\"empty-title\">Todavía no tenés turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo verás en esta sección.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\nimport { TasButtonComponent } from './components/tas-btn/tas-btn.component';\nimport { TasVideocallComponent } from './components/tas-videocall/tas-videocall.component';\nimport { TasFloatingCallComponent } from './components/tas-floating-call/tas-floating-call.component';\nimport { TasWaitingRoomComponent } from './components/tas-waiting-room/tas-waiting-room.component';\nimport { TasAvatarComponent } from './components/tas-avatar/tas-avatar.component';\nimport { TasIncomingAppointmentComponent } from './components/tas-incoming-appointment/tas-incoming-appointment.component';\nimport { TasFeedbackModalComponent } from './components/tas-feedback-modal/tas-feedback-modal.component';\nimport { TasService } from './services/tas.service';\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from './config/tas.config';\n\n@NgModule({\n declarations: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent,\n TasAvatarComponent,\n TasIncomingAppointmentComponent,\n TasFeedbackModalComponent,\n ],\n imports: [CommonModule, FormsModule, NgbTooltipModule],\n exports: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent,\n TasAvatarComponent,\n TasIncomingAppointmentComponent,\n TasFeedbackModalComponent,\n ],\n})\nexport class TasUellSdkModule {\n /**\n * Use forRoot() to configure the TAS SDK module with required dependencies.\n * This should only be called once in your root AppModule.\n *\n * @example\n * ```typescript\n * import { TasUellSdkModule, TasHttpClient } from 'tas-uell-sdk';\n *\n * // Create an adapter that implements TasHttpClient\n * @Injectable({ providedIn: 'root' })\n * export class MyHttpAdapter implements TasHttpClient {\n * constructor(private http: HttpClient) {}\n * post<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {\n * return this.http.post<T>(url, options.body, { headers: options.headers });\n * }\n * }\n *\n * // In your AppModule\n * @NgModule({\n * imports: [\n * TasUellSdkModule.forRoot({\n * config: { tokBoxApiKey: 'YOUR_TOKBOX_API_KEY' },\n * httpClient: MyHttpAdapter\n * })\n * ]\n * })\n * export class AppModule { }\n * ```\n */\n static forRoot(options: {\n config: TasConfig;\n httpClient: new (...args: any[]) => TasHttpClient;\n }): ModuleWithProviders<TasUellSdkModule> {\n return {\n ngModule: TasUellSdkModule,\n providers: [\n { provide: TAS_CONFIG, useValue: options.config },\n { provide: TAS_HTTP_CLIENT, useClass: options.httpClient },\n TasService,\n ],\n };\n }\n}\n","/*\n * Public API Surface of tas-uell-sdk\n */\n\n// Configuration and tokens\nexport * from './lib/config/tas.config';\n\n// Interfaces\nexport * from './lib/interfaces/tas.interfaces';\n\n// Service\nexport * from './lib/services/tas.service';\nexport * from './lib/services/geolocation.service';\nexport * from './lib/services/tas-utility.service';\n\n// Components\nexport * from './lib/components/tas-btn/tas-btn.component';\nexport * from './lib/components/tas-waiting-room/tas-waiting-room.component';\nexport * from './lib/components/tas-videocall/tas-videocall.component';\nexport * from './lib/components/tas-floating-call/tas-floating-call.component';\nexport * from './lib/components/tas-avatar/tas-avatar.component';\nexport * from './lib/components/tas-incoming-appointment/tas-incoming-appointment.component';\nexport * from './lib/components/tas-feedback-modal/tas-feedback-modal.component';\n\n// Module\nexport * from './lib/tas-uell-sdk.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TasUtilityService","i2.TasService","i3","i4","i3.GeolocationService","i5.TasAvatarComponent","i6","i3.TasUtilityService","i1.TasService","i2","i2.TasAvatarComponent","i3.TasButtonComponent"],"mappings":"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"}