tas-uell-sdk 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +2 -2
- package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +41 -28
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +3 -3
- package/esm2020/lib/interfaces/tas.interfaces.mjs +2 -1
- package/esm2020/lib/services/tas.service.mjs +12 -2
- package/fesm2015/tas-uell-sdk.mjs +55 -31
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +55 -31
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +15 -6
- package/lib/interfaces/tas.interfaces.d.ts +7 -1
- package/package.json +2 -2
|
@@ -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/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}\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}\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; // 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// Appointment types\nexport enum AppointmentStatus {\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n RESCHEDULED = 'RESCHEDULED',\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}\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 } 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 TasCurrentUser,\n TasBusinessRole,\n TasUserRole,\n CallState,\n ViewMode,\n WaitingRoomUser,\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 };\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 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 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 console.log(`[TAS DEBUG] Starting status polling with interval ${intervalMs}ms`);\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 console.log(\n '[TAS DEBUG] TasService.disconnectSession called. clearStorage:',\n clearStorage\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 console.log('[TAS DEBUG] Session finished successfully:', response);\n this.isFinishingSession = false;\n },\n error: (error) => {\n console.error('[TAS DEBUG] Error finishing session:', error);\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 console.log('[TAS DEBUG] Session was intentionally disconnected, skipping restore');\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 console.log('[TAS DEBUG] Call state is DISCONNECTED, skipping restore');\n this.clearSessionState();\n return;\n }\n\n try {\n const state = JSON.parse(savedState);\n if (state.sessionId && state.token) {\n console.log('[TAS DEBUG] Restoring session from storage');\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 console.log('[TAS DEBUG] Session restored successfully');\n // Clear the disconnected flag if restoration succeeds\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n })\n .catch((err) => {\n console.error('[TAS DEBUG] Failed to restore session:', err);\n this.clearSessionState(); // Clear bad state\n });\n }\n } catch (e) {\n console.error('[TAS DEBUG] Error parsing saved session state', e);\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 * PROXY circuit status: /v2/proxy/video/status\n */\n public getProxyVideoStatus(\n payload: ProxyVideoStatusRequest\n ): Observable<ProxyVideoStatusResponse> {\n return this.httpClient\n .post<ProxyVideoStatusResponse>('v2/proxy/video/status', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as ProxyVideoStatusResponse),\n catchError((error) => {\n console.error('TAS Service: getProxyVideoStatus failed', error);\n throw error;\n })\n );\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 let url = `v2/proxy/appointment/agendas/user/appointments?fromDate=${params.fromDate}&toDate=${params.toDate}&roomType=TAS`;\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 console.error('[TAS DEBUG] Status polling error:', err);\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 console.log('[TAS DEBUG] activateGeo received:', content.activateGeo);\n this.activateGeoSubject.next(content.activateGeo);\n }\n\n // Update geoRequestActive status (owner waiting for user geo response)\n if (content.geoRequestActive !== undefined) {\n console.log('[TAS DEBUG] geoRequestActive received:', content.geoRequestActive);\n this.geoRequestActiveSubject.next(content.geoRequestActive);\n }\n\n // Update allGeoGranted status (all users responded with geo)\n if (content.allGeoGranted !== undefined) {\n console.log('[TAS DEBUG] allGeoGranted received:', content.allGeoGranted);\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 console.log('[TAS DEBUG] Owner has left the session');\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\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 console.log('[TAS DEBUG] Session finished on disconnect event:', response);\n this.isFinishingSession = false;\n },\n error: (error) => {\n console.error('[TAS DEBUG] Error finishing session on disconnect:', error);\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, 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 { 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} from '../../interfaces/tas.interfaces';\nimport { Subscription } from 'rxjs';\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\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\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 /**\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\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 // TODO: Send location request action to backend when endpoint is ready\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('Location request sent'),\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 console.log('[TAS DEBUG] Owner left, disconnecting user');\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 console.log('[TAS DEBUG] activateGeo=true, checking geo status for user...');\n this.handleActivateGeo();\n }\n })\n );\n\n // GeoRequestActive subscription - for owners\n this.subscriptions.add(\n this.tasService.geoRequestActive$.subscribe((active) => {\n console.log('[TAS DEBUG] geoRequestActive changed:', active);\n this.geoRequestActive = active;\n })\n );\n\n // AllGeoGranted subscription - for owners\n this.subscriptions.add(\n this.tasService.allGeoGranted$.subscribe((granted) => {\n console.log('[TAS DEBUG] allGeoGranted changed:', granted);\n this.allGeoGranted = granted;\n })\n );\n }\n\n /**\n * Handle activateGeo request from backend (for non-owner users).\n * If geo is already active, report it. If not, prompt user.\n */\n private async handleActivateGeo(): Promise<void> {\n console.log('[TAS DEBUG] handleActivateGeo - current status:', this.geoLocationStatus);\n\n // Check if we already have a cached position\n const cachedPosition = this.geolocationService.getCachedPosition();\n if (cachedPosition) {\n console.log('[TAS DEBUG] Geolocation already active, reporting to backend:', cachedPosition);\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(cachedPosition.latitude, cachedPosition.longitude);\n return;\n }\n\n // Try to get position\n console.log('[TAS DEBUG] Requesting geolocation from user...');\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n console.log('[TAS DEBUG] Geolocation obtained:', position);\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n this.geoLocationStatus = 'denied';\n // Report that geo is not available (with no coordinates)\n this.reportGeoStatus();\n }\n }\n\n /**\n * Report geolocation status to backend.\n */\n private reportGeoStatus(latitude?: number, longitude?: number): void {\n if (!this.videoCallId) {\n console.error('[TAS DEBUG] Cannot report geo status: videoCallId not set');\n return;\n }\n\n // TODO: If the permission for geo location is not granted, we should not report it to the backend\n if (!this.geoLocationStatus) {\n console.error('[TAS DEBUG] Cannot report geo status: geoLocationStatus not set');\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 console.log('[TAS DEBUG] Reporting geo status to backend:', body);\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geo status reported successfully'),\n error: (err) => console.error('[TAS DEBUG] Error reporting geo status:', err),\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-video-camera\"></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 <button\n class=\"btn control-btn more-btn\"\n title=\"Más opciones\"\n aria-label=\"Más opciones\"\n >\n <i class=\"fa fa-ellipsis-v\"></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 <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicación del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">×</button>\n </div>\n <div class=\"location-description\">\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 <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicación\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicación...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicación\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicación fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\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\n /** Whether current user is an owner */\n public get isOwner(): boolean {\n return this.currentUser?.role === TasUserRole.OWNER;\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 this.requestGeolocation();\n this.checkStatus();\n }\n\n /**\n * Request camera and microphone permissions.\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 } catch (error) {\n console.warn('[TAS DEBUG] Media permissions denied or unavailable:', error);\n }\n }\n\n /**\n * Request geolocation immediately on init.\n * Only for regular users (not owners/backoffice).\n * If user allows, store position and send to backend.\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 return;\n }\n\n console.log('[TAS DEBUG] Requesting geolocation...');\n const position = await this.geolocationService.getCurrentPosition();\n if (position) {\n console.log('[TAS DEBUG] Geolocation obtained:', position);\n this.geoPosition = position;\n // Send to backend when videoCallId is available\n this.sendGeolocationToBackend();\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n }\n }\n\n /**\n * Send geolocation to backend via modify user endpoint.\n * NOTE: Endpoint call is prepared but may not be active yet.\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 userId: this.currentUser?.id,\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 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 // Try to send geolocation now that we have videoCallId\n this.sendGeolocationToBackend();\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 */\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 // Both users and owners: show join button based on joinable\n if (joinable) {\n console.log('[TAS DEBUG] Joinable is true, showing join button');\n this.state = WaitingRoomState.READY;\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 * Called when user clicks the join button.\n * Calls /start to get token then auto-joins.\n */\n public joinSession(): void {\n this.startSessionAndJoin();\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 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 * Closes the waiting room\n */\n cancel(): void {\n this.tasService.stopStatusPolling();\n this.activeModal.dismiss('cancel');\n }\n\n /**\n * Retry after an error\n */\n retry(): void {\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n this.token = '';\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 <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesión...</p>\n </div>\n\n <!-- WAITING_FOR_JOINABLE State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.WAITING_FOR_JOINABLE\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Esperando que la sesión esté disponible...</p>\n <p class=\"state-submessage\">Por favor, permanecé en esta pantalla.</p>\n </div>\n\n <!-- READY State (Join button enabled) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n <div class=\"state-icon ready\">\n <i class=\"fa fa-check-circle\"></i>\n </div>\n <p class=\"state-message success\">¡La sala está lista!</p>\n <button type=\"button\" class=\"btn action-btn join-btn\" (click)=\"joinSession()\">\n <i class=\"fa fa-sign-in\"></i>\n Unirse a la llamada\n </button>\n </div>\n\n <!-- JOINING State (Auto-joining) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.JOINING\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Ingresando a la llamada...</p>\n </div>\n\n <!-- GETTING_TOKEN State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Conectando...</p>\n </div>\n\n <!-- ERROR State -->\n <div class=\"state-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\">\n {{ errorMessage }}\n </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 </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 = true; // Controls button 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 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 this.isCheckingStatus = false;\n const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');\n this.statusErrorMessage = errorMessage;\n\n // Use utility service to determine if button should be shown\n this.shouldShowButton = this.tasUtilityService.shouldShowButton(errorMessage);\n\n // Stop polling on error\n this.stopStatusPolling();\n\n // If button should be hidden, don't treat as error\n if (!this.shouldShowButton) {\n this.isStatusError = false;\n } else {\n this.isStatusError = true;\n }\n },\n })\n );\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 @Output() enterCall = new EventEmitter<TasAppointment>();\n\n public appointment: TasAppointment | null = null;\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 const today = new Date();\n const in7Days = new Date(today);\n in7Days.setDate(today.getDate() + 7);\n\n this.subscriptions.add(\n this.tasService\n .getAppointments({ fromDate: this.formatDate(today), toDate: this.formatDate(in7Days), entityId: this.entityId })\n .subscribe({\n next: (response: any) => {\n // Handle both array response and wrapped response (e.g., { content: [...] })\n const appointments: TasAppointment[] = Array.isArray(response)\n ? response\n : response?.content || [];\n\n // Filter for confirmed appointments and get the first one\n const confirmed = appointments.filter(\n (a) => a.status === AppointmentStatus.CONFIRMED\n );\n this.appointment = confirmed.length > 0 ? confirmed[0] : null;\n this.isLoading = false;\n },\n error: () => {\n this.hasError = true;\n this.isLoading = false;\n },\n })\n );\n }\n\n public onEnterCall(): void {\n if (this.appointment) {\n this.enterCall.emit(this.appointment);\n }\n }\n\n /**\n * Format date to Spanish format: \"Lunes 8 de diciembre\"\n */\n public get formattedDate(): string {\n if (!this.appointment) return '';\n\n const [year, month, day] = this.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 get formattedTimeRange(): string {\n if (!this.appointment) return '';\n return `${this.appointment.startTime} - ${this.appointment.endTime}`;\n }\n\n private formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\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 && !appointment\">\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 <!-- Appointment state -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointment\">\n \n <div class=\"appointment-card\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"appointment.title\" [size]=\"48\"></tas-avatar>\n \n <span class=\"doctor-name\">{{ appointment.title }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formattedDate }}</span>\n <span class=\"time\">{{ formattedTimeRange }}</span>\n </div>\n <tas-btn\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appointment.roomType\"\n [entityId]=\"appointment.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\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","i4.TasAvatarComponent","i5","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-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}\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}\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; // 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// 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 } 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 TasBusinessRole,\n CallState,\n ViewMode,\n WaitingRoomUser,\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 };\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 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 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 console.log(`[TAS DEBUG] Starting status polling with interval ${intervalMs}ms`);\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 console.log(\n '[TAS DEBUG] TasService.disconnectSession called. clearStorage:',\n clearStorage\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 console.log('[TAS DEBUG] Session finished successfully:', response);\n this.isFinishingSession = false;\n },\n error: (error) => {\n console.error('[TAS DEBUG] Error finishing session:', error);\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 console.log('[TAS DEBUG] Session was intentionally disconnected, skipping restore');\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 console.log('[TAS DEBUG] Call state is DISCONNECTED, skipping restore');\n this.clearSessionState();\n return;\n }\n\n try {\n const state = JSON.parse(savedState);\n if (state.sessionId && state.token) {\n console.log('[TAS DEBUG] Restoring session from storage');\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 console.log('[TAS DEBUG] Session restored successfully');\n // Clear the disconnected flag if restoration succeeds\n sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);\n })\n .catch((err) => {\n console.error('[TAS DEBUG] Failed to restore session:', err);\n this.clearSessionState(); // Clear bad state\n });\n }\n } catch (e) {\n console.error('[TAS DEBUG] Error parsing saved session state', e);\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 * PROXY circuit status: /v2/proxy/video/status\n */\n public getProxyVideoStatus(\n payload: ProxyVideoStatusRequest\n ): Observable<ProxyVideoStatusResponse> {\n return this.httpClient\n .post<ProxyVideoStatusResponse>('v2/proxy/video/status', {\n body: payload,\n headers: {},\n })\n .pipe(\n map((response: any) => response as ProxyVideoStatusResponse),\n catchError((error) => {\n console.error('TAS Service: getProxyVideoStatus failed', error);\n throw error;\n })\n );\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 console.error('[TAS DEBUG] Status polling error:', err);\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 console.log('[TAS DEBUG] activateGeo received:', content.activateGeo);\n this.activateGeoSubject.next(content.activateGeo);\n }\n\n // Update geoRequestActive status (owner waiting for user geo response)\n if (content.geoRequestActive !== undefined) {\n console.log('[TAS DEBUG] geoRequestActive received:', content.geoRequestActive);\n this.geoRequestActiveSubject.next(content.geoRequestActive);\n }\n\n // Update allGeoGranted status (all users responded with geo)\n if (content.allGeoGranted !== undefined) {\n console.log('[TAS DEBUG] allGeoGranted received:', content.allGeoGranted);\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 console.log('[TAS DEBUG] Owner has left the session');\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\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 console.log('[TAS DEBUG] Session finished on disconnect event:', response);\n this.isFinishingSession = false;\n },\n error: (error) => {\n console.error('[TAS DEBUG] Error finishing session on disconnect:', error);\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, 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 { 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} from '../../interfaces/tas.interfaces';\nimport { Subscription } from 'rxjs';\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\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService,\n private geolocationService: GeolocationService\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\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 /**\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\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 // TODO: Send location request action to backend when endpoint is ready\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('Location request sent'),\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 console.log('[TAS DEBUG] Owner left, disconnecting user');\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 console.log('[TAS DEBUG] activateGeo=true, checking geo status for user...');\n this.handleActivateGeo();\n }\n })\n );\n\n // GeoRequestActive subscription - for owners\n this.subscriptions.add(\n this.tasService.geoRequestActive$.subscribe((active) => {\n console.log('[TAS DEBUG] geoRequestActive changed:', active);\n this.geoRequestActive = active;\n })\n );\n\n // AllGeoGranted subscription - for owners\n this.subscriptions.add(\n this.tasService.allGeoGranted$.subscribe((granted) => {\n console.log('[TAS DEBUG] allGeoGranted changed:', granted);\n this.allGeoGranted = granted;\n })\n );\n }\n\n /**\n * Handle activateGeo request from backend (for non-owner users).\n * If geo is already active, report it. If not, prompt user.\n */\n private async handleActivateGeo(): Promise<void> {\n console.log('[TAS DEBUG] handleActivateGeo - current status:', this.geoLocationStatus);\n\n // Check if we already have a cached position\n const cachedPosition = this.geolocationService.getCachedPosition();\n if (cachedPosition) {\n console.log('[TAS DEBUG] Geolocation already active, reporting to backend:', cachedPosition);\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(cachedPosition.latitude, cachedPosition.longitude);\n return;\n }\n\n // Try to get position\n console.log('[TAS DEBUG] Requesting geolocation from user...');\n const position = await this.geolocationService.getCurrentPosition();\n \n if (position) {\n console.log('[TAS DEBUG] Geolocation obtained:', position);\n this.geoLocationStatus = 'active';\n this.reportGeoStatus(position.latitude, position.longitude);\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n this.geoLocationStatus = 'denied';\n // Report that geo is not available (with no coordinates)\n this.reportGeoStatus();\n }\n }\n\n /**\n * Report geolocation status to backend.\n */\n private reportGeoStatus(latitude?: number, longitude?: number): void {\n if (!this.videoCallId) {\n console.error('[TAS DEBUG] Cannot report geo status: videoCallId not set');\n return;\n }\n\n // TODO: If the permission for geo location is not granted, we should not report it to the backend\n if (!this.geoLocationStatus) {\n console.error('[TAS DEBUG] Cannot report geo status: geoLocationStatus not set');\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 console.log('[TAS DEBUG] Reporting geo status to backend:', body);\n this.tasService.modifyProxyVideoUser(body).subscribe({\n next: () => console.log('[TAS DEBUG] Geo status reported successfully'),\n error: (err) => console.error('[TAS DEBUG] Error reporting geo status:', err),\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 <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicación del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">×</button>\n </div>\n <div class=\"location-description\">\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 <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicación\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicación...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicación\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicación fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\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\n /** Whether current user is an owner */\n public get isOwner(): boolean {\n return this.currentUser?.role === TasUserRole.OWNER;\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 this.requestGeolocation();\n this.checkStatus();\n }\n\n /**\n * Request camera and microphone permissions.\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 } catch (error) {\n console.warn('[TAS DEBUG] Media permissions denied or unavailable:', error);\n }\n }\n\n /**\n * Request geolocation immediately on init.\n * Only for regular users (not owners/backoffice).\n * If user allows, store position and send to backend.\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 return;\n }\n\n console.log('[TAS DEBUG] Requesting geolocation...');\n const position = await this.geolocationService.getCurrentPosition();\n if (position) {\n console.log('[TAS DEBUG] Geolocation obtained:', position);\n this.geoPosition = position;\n // Send to backend when videoCallId is available\n this.sendGeolocationToBackend();\n } else {\n console.log('[TAS DEBUG] Geolocation denied or unavailable');\n }\n }\n\n /**\n * Send geolocation to backend via modify user endpoint.\n * NOTE: Endpoint call is prepared but may not be active yet.\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 userId: this.currentUser?.id,\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 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 // Try to send geolocation now that we have videoCallId\n this.sendGeolocationToBackend();\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 */\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 // Both users and owners: show join button based on joinable\n if (joinable) {\n console.log('[TAS DEBUG] Joinable is true, showing join button');\n this.state = WaitingRoomState.READY;\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 * Called when user clicks the join button.\n * Calls /start to get token then auto-joins.\n */\n public joinSession(): void {\n this.startSessionAndJoin();\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 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 * Closes the waiting room\n */\n cancel(): void {\n this.tasService.stopStatusPolling();\n this.activeModal.dismiss('cancel');\n }\n\n /**\n * Retry after an error\n */\n retry(): void {\n this.state = WaitingRoomState.CHECKING_STATUS;\n this.errorMessage = '';\n this.token = '';\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 <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesión...</p>\n </div>\n\n <!-- WAITING_FOR_JOINABLE State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.WAITING_FOR_JOINABLE\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Esperando que la sesión esté disponible...</p>\n <p class=\"state-submessage\">Por favor, permanecé en esta pantalla.</p>\n </div>\n\n <!-- READY State (Join button enabled) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n <div class=\"state-icon ready\">\n <i class=\"fa fa-check-circle\"></i>\n </div>\n <p class=\"state-message success\">¡La sala está lista!</p>\n <button type=\"button\" class=\"btn action-btn join-btn\" (click)=\"joinSession()\">\n <i class=\"fa fa-sign-in\"></i>\n Unirse a la llamada\n </button>\n </div>\n\n <!-- JOINING State (Auto-joining) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.JOINING\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Ingresando a la llamada...</p>\n </div>\n\n <!-- GETTING_TOKEN State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Conectando...</p>\n </div>\n\n <!-- ERROR State -->\n <div class=\"state-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\">\n {{ errorMessage }}\n </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 </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 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 this.isCheckingStatus = false;\n const errorMessage = this.tasUtilityService.extractErrorMessage(err, 'Error checking status');\n this.statusErrorMessage = errorMessage;\n\n // Use utility service to determine if button should be shown\n this.shouldShowButton = this.tasUtilityService.shouldShowButton(errorMessage);\n\n // Stop polling on error\n this.stopStatusPolling();\n\n // If button should be hidden, don't treat as error\n if (!this.shouldShowButton) {\n this.isStatusError = false;\n } else {\n this.isStatusError = true;\n }\n },\n })\n );\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","i4.TasAvatarComponent","i5","i3.TasUtilityService","i1.TasService","i2","i2.TasAvatarComponent","i3.TasButtonComponent"],"mappings":"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"}
|