@dialtribe/react-sdk 0.1.0-alpha.5 → 0.1.0-alpha.6

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/HelloWorld.tsx","../src/context/DialTribeProvider.tsx","../src/client/DialTribeClient.ts","../src/components/AudioWaveform.tsx","../src/components/LoadingSpinner.tsx","../src/utils/cdn.ts","../src/utils/format.ts","../src/utils/http-status.ts","../src/utils/debug.ts","../src/components/BroadcastPlayer.tsx","../src/components/BroadcastPlayerModal.tsx","../src/components/BroadcastPlayerErrorBoundary.tsx"],"names":["jsxs","jsx","createContext","useState","useCallback","useEffect","useContext","useRef","animationId","handleTimeUpdate","Fragment","ReactPlayer","Component"],"mappings":"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","file":"index.js","sourcesContent":["export interface HelloWorldProps {\n name?: string;\n}\n\n/**\n * A simple Hello World component for testing the SDK package setup.\n * This component will be replaced with actual DialTribe media components.\n */\nexport function HelloWorld({ name = 'World' }: HelloWorldProps) {\n return (\n <div style={{\n padding: '20px',\n border: '2px solid #4F46E5',\n borderRadius: '8px',\n backgroundColor: '#EEF2FF',\n color: '#4F46E5',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center',\n }}>\n <h1 style={{ margin: '0 0 10px 0' }}>\n Hello, {name}!\n </h1>\n <p style={{ margin: 0, fontSize: '14px' }}>\n @dialtribe/react-sdk is working correctly\n </p>\n </div>\n );\n}\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\n\n/**\n * DialTribe SDK Context\n * Manages session token and auto-refresh across all SDK components\n */\n\nexport interface DialTribeContextValue {\n /** Current session token */\n sessionToken: string | null;\n /** Update the session token (called automatically on refresh) */\n setSessionToken: (token: string, expiresAt?: string) => void;\n /** Whether the session token is expired/invalid */\n isExpired: boolean;\n /** Mark token as expired */\n markExpired: () => void;\n}\n\nconst DialTribeContext = createContext<DialTribeContextValue | null>(null);\n\nexport interface DialTribeProviderProps {\n /** Session token from your backend (required) */\n sessionToken: string;\n /** Called when the API returns a refreshed token via X-Session-Token header */\n onTokenRefresh?: (newToken: string, expiresAt: string) => void;\n /** Called when the session token expires or becomes invalid */\n onTokenExpired?: () => void;\n /** Your React app */\n children: React.ReactNode;\n}\n\n/**\n * DialTribe Provider\n *\n * Wraps your app to provide session token authentication to all SDK components.\n *\n * @example\n * ```tsx\n * <DialTribeProvider\n * sessionToken=\"sess_xxx...\"\n * onTokenRefresh={(newToken) => {\n * // Save to state/localStorage\n * setToken(newToken);\n * }}\n * onTokenExpired={() => {\n * // Redirect to login or refresh\n * router.push('/login');\n * }}\n * >\n * <App />\n * </DialTribeProvider>\n * ```\n */\nexport function DialTribeProvider({\n sessionToken: initialToken,\n onTokenRefresh,\n onTokenExpired,\n children,\n}: DialTribeProviderProps) {\n const [sessionToken, setSessionTokenState] = useState<string>(initialToken);\n const [isExpired, setIsExpired] = useState(false);\n\n // Update token and notify parent\n const setSessionToken = useCallback(\n (newToken: string, expiresAt?: string) => {\n setSessionTokenState(newToken);\n setIsExpired(false);\n // Notify parent component of token refresh\n if (expiresAt) {\n onTokenRefresh?.(newToken, expiresAt);\n }\n },\n [onTokenRefresh]\n );\n\n // Mark token as expired\n const markExpired = useCallback(() => {\n setIsExpired(true);\n onTokenExpired?.();\n }, [onTokenExpired]);\n\n // Sync with prop changes (in case parent updates the token)\n useEffect(() => {\n if (initialToken !== sessionToken) {\n setSessionTokenState(initialToken);\n setIsExpired(false);\n }\n }, [initialToken, sessionToken]);\n\n const value: DialTribeContextValue = {\n sessionToken,\n setSessionToken,\n isExpired,\n markExpired,\n };\n\n return (\n <DialTribeContext.Provider value={value}>\n {children}\n </DialTribeContext.Provider>\n );\n}\n\n/**\n * Hook to access DialTribe context\n *\n * @throws Error if used outside DialTribeProvider\n *\n * @example\n * ```tsx\n * const { sessionToken, setSessionToken } = useDialTribe();\n * ```\n */\nexport function useDialTribe(): DialTribeContextValue {\n const context = useContext(DialTribeContext);\n\n if (!context) {\n throw new Error(\n 'useDialTribe must be used within a DialTribeProvider. ' +\n 'Wrap your app with <DialTribeProvider sessionToken=\"sess_xxx\">...</DialTribeProvider>'\n );\n }\n\n return context;\n}\n","/**\n * DialTribe API Client\n *\n * Handles all API communication with fixed DialTribe endpoints.\n * Automatically manages session token refresh via X-Session-Token headers.\n */\n\n/** DialTribe API base URL (production only) */\nexport const DIALTRIBE_API_BASE = 'https://dialtribe.com/api/public/v1';\n\n/** API endpoints (fixed, not configurable) */\nexport const ENDPOINTS = {\n broadcasts: `${DIALTRIBE_API_BASE}/broadcasts`,\n broadcast: (id: number) => `${DIALTRIBE_API_BASE}/broadcasts/${id}`,\n contentPlay: `${DIALTRIBE_API_BASE}/content/play`,\n presignedUrl: `${DIALTRIBE_API_BASE}/media/presigned-url`,\n sessionStart: `${DIALTRIBE_API_BASE}/session/start`,\n sessionPing: `${DIALTRIBE_API_BASE}/session/ping`,\n} as const;\n\nexport interface ApiClientConfig {\n /** Session token for authentication */\n sessionToken: string;\n /** Called when API returns a refreshed token */\n onTokenRefresh?: (newToken: string, expiresAt: string) => void;\n /** Called when token expires or becomes invalid */\n onTokenExpired?: () => void;\n}\n\n/**\n * DialTribe API Client\n *\n * Low-level client for making authenticated requests to DialTribe API.\n * Handles session token auto-refresh automatically.\n */\nexport class DialTribeClient {\n private config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n }\n\n /**\n * Make an authenticated request to DialTribe API\n *\n * Automatically:\n * - Adds Authorization header with session token\n * - Checks for X-Session-Token header in response (token refresh)\n * - Calls onTokenRefresh if new token is provided\n * - Calls onTokenExpired on 401 errors\n */\n async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n const headers = new Headers(options.headers);\n\n // Add session token to Authorization header\n headers.set('Authorization', `Bearer ${this.config.sessionToken}`);\n headers.set('Content-Type', 'application/json');\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Check for refreshed session token in response headers\n const newToken = response.headers.get('X-Session-Token');\n const expiresAt = response.headers.get('X-Session-Expires');\n\n if (newToken && expiresAt) {\n // API returned a refreshed token\n this.config.onTokenRefresh?.(newToken, expiresAt);\n }\n\n // Handle expired/invalid token\n if (response.status === 401) {\n this.config.onTokenExpired?.();\n throw new Error('Session token expired or invalid');\n }\n\n return response;\n }\n\n /**\n * Update the session token\n * Called automatically when token is refreshed, or manually by user\n */\n setSessionToken(token: string) {\n this.config.sessionToken = token;\n }\n\n /**\n * Get list of broadcasts for the authenticated app\n */\n async getBroadcasts(params?: {\n page?: number;\n limit?: number;\n broadcastStatus?: 1 | 2;\n search?: string;\n includeDeleted?: boolean;\n }) {\n const searchParams = new URLSearchParams();\n\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.limit) searchParams.set('limit', params.limit.toString());\n if (params?.broadcastStatus) searchParams.set('broadcastStatus', params.broadcastStatus.toString());\n if (params?.search) searchParams.set('search', params.search);\n if (params?.includeDeleted) searchParams.set('includeDeleted', 'true');\n\n const url = `${ENDPOINTS.broadcasts}${searchParams.toString() ? `?${searchParams}` : ''}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch broadcasts: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get a single broadcast by ID\n */\n async getBroadcast(id: number) {\n const response = await this.fetch(ENDPOINTS.broadcast(id));\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Broadcast not found');\n }\n throw new Error(`Failed to fetch broadcast: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get presigned URL for media playback\n *\n * @param broadcastId - Broadcast ID\n * @param hash - Broadcast hash (optional if using session token)\n * @param action - 'download' to force download, otherwise streams\n */\n async getPlaybackUrl(params: {\n broadcastId: number;\n hash?: string;\n action?: 'download';\n }): Promise<string> {\n const searchParams = new URLSearchParams({\n broadcastId: params.broadcastId.toString(),\n });\n\n if (params.hash) searchParams.set('hash', params.hash);\n if (params.action) searchParams.set('action', params.action);\n\n const url = `${ENDPOINTS.contentPlay}?${searchParams}`;\n const response = await this.fetch(url, {\n redirect: 'manual', // Don't follow redirect, we want the URL\n });\n\n // The endpoint returns a 307 redirect to the signed URL\n const location = response.headers.get('Location');\n if (!location) {\n throw new Error('No playback URL returned from API');\n }\n\n return location;\n }\n\n /**\n * Refresh a presigned URL before it expires\n *\n * @param broadcastId - Broadcast ID\n * @param hash - Broadcast hash\n * @param fileType - Type of media file\n */\n async refreshPresignedUrl(params: {\n broadcastId: number;\n hash: string;\n fileType: 'mp4' | 'mp3' | 'hls';\n }) {\n const searchParams = new URLSearchParams({\n broadcastId: params.broadcastId.toString(),\n hash: params.hash,\n fileType: params.fileType,\n });\n\n const url = `${ENDPOINTS.presignedUrl}?${searchParams}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to refresh URL: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n url: string;\n expiresAt: string;\n expiresIn: number;\n }>;\n }\n\n /**\n * Start a new audience tracking session\n *\n * @returns audienceId and optional resumePosition\n */\n async startSession(params: {\n contentId: number;\n broadcastId: number;\n appId: string;\n foreignId?: string | null;\n foreignTier?: string;\n sessionId: string;\n fileType: string;\n platform: string;\n userAgent: string | null;\n origin: string | null;\n country?: string | null;\n region?: string | null;\n }) {\n const response = await this.fetch(ENDPOINTS.sessionStart, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to start session: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n audienceId: string;\n resumePosition?: number;\n }>;\n }\n\n /**\n * Send a session ping event\n *\n * Event types:\n * - 0: PAUSE/STOP\n * - 1: PLAY/START\n * - 2: HEARTBEAT\n * - 3: UNMOUNT\n */\n async sendSessionPing(params: {\n audienceId: string;\n sessionId: string;\n eventType: 0 | 1 | 2 | 3;\n currentTime: number;\n duration: number;\n }) {\n const response = await this.fetch(ENDPOINTS.sessionPing, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send session ping: ${response.status} ${response.statusText}`);\n }\n\n // Session ping may return no body\n if (response.status === 204) {\n return;\n }\n\n return response.json();\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\n\ninterface AudioWaveformProps {\n /** Audio/video element for playback visualization */\n audioElement?: HTMLMediaElement | null;\n /** Media stream for live streaming visualization */\n mediaStream?: MediaStream | null;\n /** Whether the audio is currently playing (for playback mode) */\n isPlaying?: boolean;\n /** Whether this is currently a live stream (for HLS streams) */\n isLive?: boolean;\n}\n\n/**\n * Shared audio waveform visualization component\n * Can be used for both live streaming (MediaStream) and playback (HTMLVideoElement)\n */\nexport function AudioWaveform({\n audioElement,\n mediaStream,\n isPlaying = false,\n isLive = false,\n}: AudioWaveformProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const [setupError, setSetupError] = useState(false);\n const isPlayingRef = useRef(isPlaying);\n const isLiveRef = useRef(isLive);\n\n // Sync playing state ref\n useEffect(() => {\n isPlayingRef.current = isPlaying;\n }, [isPlaying]);\n\n // Sync live state ref\n useEffect(() => {\n isLiveRef.current = isLive;\n }, [isLive]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Validate audio element before using it\n // Accept both native HTMLMediaElement and custom elements with video/audio API (like HLS-VIDEO)\n if (audioElement) {\n const hasMediaAPI =\n \"play\" in audioElement &&\n \"pause\" in audioElement &&\n \"currentTime\" in audioElement;\n const isMediaElement = audioElement instanceof HTMLMediaElement;\n\n if (!hasMediaAPI && !isMediaElement) {\n console.warn(\n \"[AudioWaveform] Invalid audio element - missing media API\"\n );\n return;\n }\n\n console.log(\"[AudioWaveform] Audio element validation:\", {\n tagName: audioElement.tagName,\n isHTMLMediaElement: isMediaElement,\n hasMediaAPI: hasMediaAPI,\n willAttemptVisualization: true,\n });\n }\n\n // Check if we can use the audio element for visualization\n const canUseAudioElement =\n audioElement && audioElement instanceof HTMLMediaElement;\n\n // Check if this is specifically an HLS live stream (custom element)\n const isHLSLiveStream = audioElement && !canUseAudioElement;\n\n // If we don't have a valid source, or have a custom element, show static waveform\n if (\n (!audioElement && !mediaStream) ||\n (audioElement && !canUseAudioElement)\n ) {\n // Enhanced dynamic waveform for HLS live streams\n if (isHLSLiveStream) {\n let time = 0;\n let frozenTime = 0; // Store time when stream ends\n let wasFrozen = false; // Track if we've frozen\n let frameCount = 0;\n // Create unique phase offsets for each bar to desynchronize them\n const barPhases = Array.from(\n { length: 128 },\n () => Math.random() * Math.PI * 2\n );\n const barSpeeds = Array.from(\n { length: 128 },\n () => 0.8 + Math.random() * 0.4\n ); // Speed variance 0.8-1.2x\n const glowPhases = Array.from(\n { length: 128 },\n () => Math.random() * Math.PI * 2\n ); // Unique glow phase per bar\n const glowSpeeds = Array.from(\n { length: 128 },\n () => 0.7 + Math.random() * 0.6\n ); // Glow speed variance 0.7-1.3x\n\n const drawEnhancedWaveform = () => {\n frameCount++;\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n // Check current live state from ref (always up-to-date)\n const currentlyLive = isLiveRef.current;\n\n // Only increment time if stream is live\n if (currentlyLive) {\n time += 0.02;\n wasFrozen = false; // Reset frozen state if we go live again\n } else if (!wasFrozen) {\n // Stream just ended, freeze at current time\n frozenTime = time;\n wasFrozen = true;\n }\n\n // Use frozen time when paused\n const currentTime = wasFrozen ? frozenTime : time;\n\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const maxHeight = canvas.height * 0.9; // Allow bars to reach 90% of container height\n\n for (let i = 0; i < barCount; i++) {\n // Layer multiple sine waves with different frequencies for organic movement\n const primaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 2.5 -\n currentTime * barSpeeds[i] +\n barPhases[i]\n ) *\n (maxHeight * 0.35);\n const secondaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 4 -\n currentTime * barSpeeds[i] * 1.3 +\n barPhases[i] * 0.7\n ) *\n (maxHeight * 0.15);\n const tertiaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 7 -\n currentTime * barSpeeds[i] * 0.8 +\n barPhases[i] * 1.5\n ) *\n (maxHeight * 0.1);\n\n // Combine waves for complex, organic height variation\n const baseHeight = maxHeight * 0.15;\n const combinedWave = primaryWave + secondaryWave + tertiaryWave;\n const barHeight = Math.max(\n 10,\n Math.min(maxHeight, baseHeight + combinedWave)\n ); // Min 10px, max 90% container\n\n // Multi-layered opacity variation for depth\n const opacityWave1 = Math.sin(\n (i / barCount) * Math.PI * 2 * 1.5 - currentTime * 1.2\n );\n const opacityWave2 = Math.sin(\n (i / barCount) * Math.PI * 2 * 3.5 - currentTime * 0.7\n );\n const opacity =\n 0.3 + opacityWave1 * 0.25 + opacityWave2 * 0.15; // Range: 0.3-0.7\n\n // Variable glow intensity - each bar has unique glow animation\n const glowWave = Math.sin(\n currentTime * glowSpeeds[i] + glowPhases[i]\n );\n const glowIntensity = 8 + glowWave * 12; // Range: 0-20 (varies per bar)\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n ctx.shadowBlur = glowIntensity;\n ctx.shadowColor = \"#3b82f6\";\n ctx.fillStyle = gradient;\n ctx.globalAlpha = Math.max(0.15, Math.min(0.9, opacity)); // Clamp between 0.15-0.9\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n const animationId = setInterval(drawEnhancedWaveform, 1000 / 60);\n return () => clearInterval(animationId);\n }\n\n // Simple static waveform for other cases (loading state, etc.)\n let waveOffset = 0;\n const drawPlaceholder = () => {\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n waveOffset += 0.0083;\n\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const baseHeight = 15;\n const waveAmplitude = 10;\n\n for (let i = 0; i < barCount; i++) {\n const wave =\n Math.sin((i / barCount) * Math.PI * 2 * 3 - waveOffset) *\n waveAmplitude;\n const barHeight = baseHeight + wave;\n const opacityWave = Math.sin(\n (i / barCount) * Math.PI * 2 * 2 - waveOffset * 1.5\n );\n const opacity = 0.5 + opacityWave * 0.3;\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n ctx.shadowBlur = 15;\n ctx.shadowColor = \"#3b82f6\";\n ctx.fillStyle = gradient;\n ctx.globalAlpha = opacity;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n const animationId = setInterval(drawPlaceholder, 1000 / 60);\n return () => clearInterval(animationId);\n }\n\n let audioContext: AudioContext | null = null;\n let analyser: AnalyserNode | null = null;\n let source:\n | MediaElementAudioSourceNode\n | MediaStreamAudioSourceNode\n | null = null;\n\n // Set up audio analyser\n try {\n audioContext = new AudioContext();\n analyser = audioContext.createAnalyser();\n analyser.fftSize = 2048;\n\n // Create source from either audio element or media stream\n if (audioElement) {\n // Playback mode: use HTMLVideoElement\n // Note: Custom elements like HLS-VIDEO are NOT supported by Web Audio API\n console.log(\"[AudioWaveform] Creating audio source from element:\", {\n tagName: audioElement.tagName,\n src: audioElement.src?.substring(0, 80),\n readyState: audioElement.readyState,\n paused: audioElement.paused,\n currentTime: audioElement.currentTime,\n hasSourceNode: !!(audioElement as any).audioSourceNode,\n isNativeElement: audioElement instanceof HTMLMediaElement,\n });\n\n // Web Audio API only works with native HTMLMediaElement (VIDEO, AUDIO tags)\n // Custom elements like HLS-VIDEO are not supported\n if (!(audioElement instanceof HTMLMediaElement)) {\n console.warn(\n \"[AudioWaveform] Cannot visualize custom element (HLS-VIDEO), falling back to static waveform\"\n );\n setSetupError(true);\n return; // Let the placeholder waveform handle it\n }\n\n // Check if source was already created (can only call createMediaElementSource once per element)\n if ((audioElement as any).audioSourceNode) {\n console.log(\n \"[AudioWaveform] Audio source already exists, reusing it\"\n );\n source = (audioElement as any).audioSourceNode;\n source?.connect(analyser);\n analyser.connect(audioContext.destination);\n } else {\n try {\n source = audioContext.createMediaElementSource(audioElement);\n source.connect(analyser);\n analyser.connect(audioContext.destination);\n // Store reference so we don't try to create it again\n (audioElement as any).audioSourceNode = source;\n console.log(\n \"[AudioWaveform] Audio source created and connected successfully\"\n );\n } catch (error) {\n console.error(\n \"[AudioWaveform] Failed to create media element source:\",\n error\n );\n setSetupError(true);\n return; // Let the placeholder waveform handle it\n }\n }\n\n // Track if audio is actually playing\n audioElement.addEventListener(\"play\", () => {\n console.log(\"[AudioWaveform] Play event - setting isPlaying to true\");\n isPlayingRef.current = true;\n });\n audioElement.addEventListener(\"pause\", () => {\n console.log(\n \"[AudioWaveform] Pause event - setting isPlaying to false\"\n );\n isPlayingRef.current = false;\n });\n audioElement.addEventListener(\"ended\", () => {\n console.log(\n \"[AudioWaveform] Ended event - setting isPlaying to false\"\n );\n isPlayingRef.current = false;\n });\n\n // Log initial state\n console.log(\"[AudioWaveform] Initial audio state:\", {\n paused: audioElement.paused,\n currentTime: audioElement.currentTime,\n readyState: audioElement.readyState,\n });\n\n // Set initial playing state based on audio element\n if (!audioElement.paused) {\n isPlayingRef.current = true;\n }\n } else if (mediaStream) {\n // Live streaming mode: use MediaStream\n source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyser);\n // Note: Don't connect to destination for live streams - we don't want to echo the audio\n isPlayingRef.current = true; // Always \"playing\" for live streams\n } else {\n // No audio source provided\n return;\n }\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n let waveOffset = 0;\n\n const drawStaticWaveform = () => {\n // Clear canvas\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create gradient\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n // Animate wave (super subtle speed)\n waveOffset += 0.0083;\n\n // Draw animated wave\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const baseHeight = 15; // Half the previous height\n const waveAmplitude = 10; // How much the bars grow/shrink (more subtle)\n\n for (let i = 0; i < barCount; i++) {\n // Create smooth wave using sine function (subtract to flow right)\n const wave =\n Math.sin((i / barCount) * Math.PI * 2 * 3 - waveOffset) *\n waveAmplitude;\n const barHeight = baseHeight + wave;\n\n // Create opacity wave (dims and brightens as it flows)\n const opacityWave = Math.sin(\n (i / barCount) * Math.PI * 2 * 2 - waveOffset * 1.5\n );\n const opacity = 0.5 + opacityWave * 0.3; // Increased from 0.3 + 0.2 for better visibility\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n // Add subtle glow\n ctx.shadowBlur = 15; // Increased glow\n ctx.shadowColor = \"#3b82f6\";\n\n ctx.fillStyle = gradient;\n ctx.globalAlpha = opacity;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n let frameCount = 0;\n const draw = () => {\n if (!analyser) return;\n animationFrameRef.current = requestAnimationFrame(draw);\n\n analyser.getByteFrequencyData(dataArray);\n\n // Check if there's actual audio activity\n const hasActivity = dataArray.some((value) => value > 0);\n const maxValue = Math.max(...dataArray);\n\n // Debug logging - log first 5 frames and then every 60 frames (once per second at 60fps)\n frameCount++;\n if (frameCount < 5 || frameCount % 60 === 0) {\n console.log(\"[AudioWaveform] Frame\", frameCount, \"Audio activity:\", {\n hasActivity,\n maxValue,\n isPlaying: isPlayingRef.current,\n sampleValues: [\n dataArray[0],\n dataArray[10],\n dataArray[50],\n dataArray[100],\n ],\n avgValue:\n dataArray.reduce((a, b) => a + b, 0) / dataArray.length,\n });\n }\n\n if (!hasActivity || !isPlayingRef.current) {\n // Show static waveform when paused/stopped\n if (frameCount < 5) {\n console.log(\n \"[AudioWaveform] No activity or not playing, showing static waveform\"\n );\n }\n drawStaticWaveform();\n return;\n }\n\n // Clear canvas with dark background for trail effect\n ctx.fillStyle = \"rgba(0, 0, 0, 0.1)\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create gradient from cyan/blue to purple/pink\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\"); // cyan\n gradient.addColorStop(0.3, \"#3b82f6\"); // blue\n gradient.addColorStop(0.6, \"#8b5cf6\"); // purple\n gradient.addColorStop(1, \"#ec4899\"); // pink\n\n // Draw frequency bars\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n\n for (let i = 0; i < barCount; i++) {\n const barHeight = (dataArray[i] / 255) * canvas.height * 0.8;\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n // Add glow effect\n ctx.shadowBlur = 20;\n ctx.shadowColor = \"#3b82f6\";\n\n // Draw bar\n ctx.fillStyle = gradient;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n\n // Reset shadow for next frame\n ctx.shadowBlur = 0;\n };\n\n draw();\n } catch (error) {\n console.error(\"Error setting up audio visualization:\", error);\n setSetupError(true);\n\n // Draw a static flat line if visualization fails\n if (ctx) {\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(0, canvas.height / 2);\n ctx.lineTo(canvas.width, canvas.height / 2);\n ctx.stroke();\n }\n }\n\n return () => {\n // Cleanup animation frame\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n // Close audio context\n if (audioContext) {\n audioContext.close();\n }\n };\n }, [audioElement, mediaStream, isLive]);\n\n return (\n <div className=\"w-full h-full\">\n <canvas\n ref={canvasRef}\n width={1600}\n height={400}\n className=\"w-full h-full\"\n style={{ display: \"block\" }}\n />\n {setupError && (\n <p className=\"text-gray-400 text-xs text-center mt-2 absolute bottom-4\">\n Audio visualization unavailable\n </p>\n )}\n </div>\n );\n}\n","\n/**\n * Shared Loading Spinner Component\n */\n\ninterface LoadingSpinnerProps {\n /**\n * Optional text to display below the spinner\n */\n text?: string;\n /**\n * Size variant of the spinner\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Color scheme\n * @default \"default\"\n */\n variant?: \"default\" | \"primary\" | \"white\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-4\",\n lg: \"h-12 w-12 border-4\",\n};\n\nconst variantClasses = {\n default:\n \"border-gray-200 dark:border-gray-800 border-t-black dark:border-t-white\",\n primary:\n \"border-gray-300 dark:border-gray-700 border-t-blue-600 dark:border-t-blue-400\",\n white: \"border-gray-600 border-t-white\",\n};\n\n/**\n * Loading spinner component with optional text\n *\n * @example\n * <LoadingSpinner />\n * <LoadingSpinner text=\"Loading broadcasts...\" size=\"lg\" />\n * <LoadingSpinner variant=\"white\" />\n */\nexport function LoadingSpinner({\n text,\n size = \"md\",\n variant = \"default\",\n}: LoadingSpinnerProps) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3\">\n <div\n className={`${sizeClasses[size]} ${variantClasses[variant]} rounded-full animate-spin`}\n role=\"status\"\n aria-label=\"Loading\"\n />\n {text && <p className=\"text-sm text-gray-500 dark:text-gray-400\">{text}</p>}\n </div>\n );\n}\n","/**\n * CDN domain for broadcast content\n * Can be overridden via environment variable CONTENT_CDN_DOMAIN\n */\nexport const CDN_DOMAIN =\n typeof process !== \"undefined\" && process.env?.CONTENT_CDN_DOMAIN\n ? process.env.CONTENT_CDN_DOMAIN\n : \"cdn.dialtribe.com\";\n\n/**\n * Shard a hash by inserting slashes between characters\n * Example: \"abc123\" → \"a/b/c/1/2/3\"\n */\nfunction shardHash(hash: string): string {\n return hash.toLowerCase().split(\"\").join(\"/\");\n}\n\n/**\n * Build S3 key prefix for broadcast files\n *\n * @param appHash - App S3 hash\n * @param broadcastHash - Broadcast hash\n * @returns S3 key prefix with trailing slash\n */\nexport function buildBroadcastS3KeyPrefix(\n appHash: string,\n broadcastHash: string\n): string {\n return `a/${shardHash(appHash)}/b/${shardHash(broadcastHash)}/`;\n}\n\n/**\n * Build CDN URL for a broadcast file (HLS)\n *\n * @param appHash - App S3 hash\n * @param broadcastHash - Broadcast hash\n * @param filename - File name (e.g., \"index.m3u8\", \"seg-0-000001.ts\")\n * @returns CDN URL\n */\nexport function buildBroadcastCdnUrl(\n appHash: string,\n broadcastHash: string,\n filename: string\n): string {\n const keyPrefix = buildBroadcastS3KeyPrefix(appHash, broadcastHash);\n return `https://${CDN_DOMAIN}/${keyPrefix}${filename}`;\n}\n","/**\n * Format seconds to time string (HH:MM:SS or MM:SS)\n *\n * @param seconds - Number of seconds\n * @param includeHours - Whether to always include hours (default: auto-detect)\n * @returns Formatted time string\n *\n * Examples:\n * - formatTime(45) → \"0:45\"\n * - formatTime(125) → \"2:05\"\n * - formatTime(3665) → \"1:01:05\"\n */\nexport function formatTime(seconds: number, includeHours?: boolean): string {\n if (isNaN(seconds) || !isFinite(seconds) || seconds < 0) {\n return \"0:00\";\n }\n\n const hrs = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n const secStr = secs.toString().padStart(2, \"0\");\n const minStr = mins.toString().padStart(2, \"0\");\n\n if (hrs > 0 || includeHours) {\n return `${hrs}:${minStr}:${secStr}`;\n }\n\n return `${mins}:${secStr}`;\n}\n","export const HTTP_STATUS = {\n // 2xx Success\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n\n // 3xx Redirection\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n // 4xx Client Errors\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n CONFLICT: 409,\n GONE: 410,\n PAYLOAD_TOO_LARGE: 413,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n // 5xx Server Errors\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n} as const;\n\n// Type-safe status code type\nexport type HttpStatusCode = typeof HTTP_STATUS[keyof typeof HTTP_STATUS];\n","/**\n * Debug logging utility\n * Only logs in development mode to avoid exposing internals in production\n */\n\nconst DEBUG = process.env.NODE_ENV === 'development';\n\nexport const debug = {\n log: (...args: unknown[]) => {\n if (DEBUG) console.log(...args);\n },\n\n warn: (...args: unknown[]) => {\n if (DEBUG) console.warn(...args);\n },\n\n error: (...args: unknown[]) => {\n if (DEBUG) console.error(...args);\n },\n};\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport ReactPlayer from \"react-player\";\n\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport { buildBroadcastCdnUrl } from \"../utils/cdn\";\nimport { formatTime } from \"../utils/format\";\nimport { HTTP_STATUS } from \"../utils/http-status\";\nimport { debug } from \"../utils/debug\";\nimport { useDialTribe } from \"../context/DialTribeProvider\";\nimport { DialTribeClient, ENDPOINTS } from \"../client/DialTribeClient\";\nimport type { Broadcast, TranscriptData } from \"../types/broadcast\";\n\n// Constants for URL refresh behavior\nconst URL_EXPIRATION_MS = 6 * 60 * 60 * 1000; // 6 hours\nconst REFRESH_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes before expiration\nconst REFRESH_CHECK_INTERVAL_MS = 60000; // Check every 1 minute\nconst PLAYBACK_RESUME_DELAY_MS = 500; // Wait for player to load new URL\nconst TRAILING_WORDS = 3; // Number of trailing words to highlight in transcript\n\n/**\n * Build a playback URL for the content/play endpoint\n */\nfunction buildPlaybackUrl(broadcastId: number, hash: string, action?: 'download'): string {\n const searchParams = new URLSearchParams({\n broadcastId: broadcastId.toString(),\n hash,\n });\n if (action) {\n searchParams.set('action', action);\n }\n return `${ENDPOINTS.contentPlay}?${searchParams}`;\n}\n\n/**\n * Get a user-friendly error message based on the error type\n */\nfunction getErrorMessage(error: unknown): string {\n if (!error) return 'Unable to play media. Please try again.';\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorCode = (error as any)?.code;\n const errorStatus = (error as any)?.status || (error as any)?.statusCode;\n\n // Network errors\n if (errorMsg.toLowerCase().includes('network') || errorMsg.includes('NetworkError')) {\n return 'No internet connection detected. Please check your network and try again.';\n }\n\n // Session/Auth errors\n if (errorStatus === 401 || errorMsg.includes('401') || errorMsg.includes('Unauthorized')) {\n return 'Session expired. Please refresh the page and log in again.';\n }\n\n if (errorStatus === 403 || errorMsg.includes('403') || errorMsg.includes('Forbidden')) {\n return 'Access denied. You may not have permission to view this content.';\n }\n\n // Not found errors\n if (errorStatus === 404 || errorMsg.includes('404') || errorMsg.includes('not found')) {\n return 'Media file not found. It may have been deleted or is still processing.';\n }\n\n // Media errors\n if (errorMsg.includes('no supported sources') || errorMsg.includes('NotSupportedError')) {\n return 'This media format is not supported by your browser. Try using Chrome, Firefox, or Safari.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_SRC_NOT_SUPPORTED') || errorCode === 4) {\n return 'Media file is not available or the format is unsupported.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_NETWORK') || errorCode === 2) {\n return 'Network error while loading media. Please check your connection.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_DECODE') || errorCode === 3) {\n return 'Media file is corrupted or cannot be decoded. Please contact support.';\n }\n\n if (errorMsg.includes('AbortError')) {\n return 'Media loading was interrupted. Please try again.';\n }\n\n // Generic fallback\n return 'Unable to play media. Please try refreshing the page or contact support if the problem persists.';\n}\n\nexport interface BroadcastPlayerProps {\n /** Broadcast data from DialTribe API */\n broadcast: Broadcast;\n\n /** Optional: App ID for tracking */\n appId?: string;\n\n /** Optional: Content ID for tracking */\n contentId?: number;\n\n /** Foreign user ID from partner system (any tier) */\n foreignId?: string;\n\n /** Tier name from partner system (e.g., 'guest', 'member', 'subscriber_gold') */\n foreignTier?: string;\n\n /**\n * Optional render prop for clip creator\n * If provided, the \"Create Clip\" button will be shown and this will be called when clicked\n */\n renderClipCreator?: (props: {\n isOpen: boolean;\n onClose: () => void;\n sourceVideoUrl?: string;\n sourceAudioUrl?: string;\n sourceDuration: number;\n onPauseParent: () => void;\n }) => React.ReactNode;\n\n /** Optional: Called when player encounters error */\n onError?: (error: Error) => void;\n\n /** Optional: Custom CSS classes */\n className?: string;\n\n /** Optional: Enable keyboard shortcuts (Space, arrows, M, F, etc.). Default: false */\n enableKeyboardShortcuts?: boolean;\n}\n\n/**\n * BroadcastPlayer - Core media player component (no modal wrapper)\n *\n * Plays video/audio broadcasts with transcript, waveform visualization, and clip creation.\n * Uses DialTribeClient for authenticated API calls.\n *\n * @example\n * ```tsx\n * <BroadcastPlayer\n * broadcast={broadcast}\n * appId=\"app_123\"\n * contentId={456}\n * />\n * ```\n */\nexport function BroadcastPlayer({\n broadcast,\n appId,\n contentId,\n foreignId,\n foreignTier = \"guest\",\n renderClipCreator,\n onError,\n className = \"\",\n enableKeyboardShortcuts = false,\n}: BroadcastPlayerProps) {\n // Get session token from context\n const { sessionToken, setSessionToken, markExpired } = useDialTribe();\n\n // Create API client with token refresh handlers (stable reference)\n const clientRef = useRef<DialTribeClient | null>(null);\n\n // Initialize or update client when token changes\n if (!clientRef.current && sessionToken) {\n clientRef.current = new DialTribeClient({\n sessionToken,\n onTokenRefresh: (newToken, expiresAt) => {\n debug.log(`[DialTribeClient] Token refreshed, expires at ${expiresAt}`);\n setSessionToken(newToken, expiresAt);\n },\n onTokenExpired: () => {\n debug.error('[DialTribeClient] Token expired');\n markExpired();\n },\n });\n } else if (clientRef.current && sessionToken) {\n // Update token in existing client\n clientRef.current.setSessionToken(sessionToken);\n }\n\n const client = clientRef.current;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const playerRef = useRef<any>(null); // ReactPlayer doesn't export proper types\n const transcriptContainerRef = useRef<HTMLDivElement>(null);\n const activeWordRef = useRef<HTMLSpanElement>(null);\n const [audioElement, setAudioElement] = useState<HTMLMediaElement | null>(null);\n const [playing, setPlaying] = useState(false);\n const [played, setPlayed] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [muted, setMuted] = useState(false);\n const [seeking, setSeeking] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState(\"\");\n const [hasEnded, setHasEnded] = useState(false);\n const [hasStreamEnded, setHasStreamEnded] = useState(false);\n const [showTranscript, setShowTranscript] = useState(false);\n const [transcriptData, setTranscriptData] = useState<TranscriptData | null>(null);\n const [currentTime, setCurrentTime] = useState(0);\n const [isLoadingTranscript, setIsLoadingTranscript] = useState(false);\n const [isLoadingVideo, setIsLoadingVideo] = useState(true);\n const [autoScrollEnabled, setAutoScrollEnabled] = useState(true);\n const isScrollingProgrammatically = useRef(false);\n const lastActiveWordIndex = useRef<number>(-1);\n const [showClipCreator, setShowClipCreator] = useState(false);\n\n // Track initial playback type\n const initialPlaybackTypeRef = useRef<string | null>(null);\n const [currentPlaybackInfo, setCurrentPlaybackInfo] = useState<{ url: string; type: string } | null>(null);\n const [urlExpiresAt, setUrlExpiresAt] = useState<Date | null>(null);\n const isRefreshingUrl = useRef(false);\n\n // Audience tracking state\n const [audienceId, setAudienceId] = useState<string | null>(null);\n const [sessionId] = useState<string>(() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n });\n const heartbeatIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const hasInitializedSession = useRef(false);\n\n /**\n * Refresh presigned URL when it expires\n */\n const refreshPresignedUrl = useCallback(\n async (fileType: 'mp4' | 'mp3' | 'hls'): Promise<boolean> => {\n if (!broadcast.hash || isRefreshingUrl.current || !client) {\n debug.log('[URL Refresh] Skipping refresh - no hash, already refreshing, or no client');\n return false;\n }\n\n // HLS doesn't need refresh (direct CloudFront URLs)\n if (fileType === 'hls') {\n debug.log('[URL Refresh] HLS does not need URL refresh');\n return false;\n }\n\n isRefreshingUrl.current = true;\n debug.log(`[URL Refresh] Refreshing ${fileType} URL for broadcast ${broadcast.id}`);\n\n try {\n const data = await client.refreshPresignedUrl({\n broadcastId: broadcast.id,\n hash: broadcast.hash,\n fileType,\n });\n\n debug.log(`[URL Refresh] Successfully refreshed URL, expires at ${data.expiresAt}`);\n\n // Update playback info with new URL\n setCurrentPlaybackInfo({ url: data.url, type: fileType });\n setUrlExpiresAt(new Date(data.expiresAt));\n\n // Clear error state\n if (errorMessage.includes('URL') || errorMessage.includes('session') || errorMessage.includes('refresh')) {\n setHasError(false);\n setErrorMessage('');\n }\n\n return true;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n debug.log('[URL Refresh] Request aborted');\n return false;\n }\n\n debug.error('[URL Refresh] Failed to refresh presigned URL:', error);\n setHasError(true);\n setErrorMessage('Unable to refresh media URL. The session may have expired.');\n if (onError && error instanceof Error) {\n onError(error);\n }\n return false;\n } finally {\n isRefreshingUrl.current = false;\n }\n },\n [broadcast.hash, broadcast.id, errorMessage, client, onError]\n );\n\n /**\n * Detect screen size category\n */\n const getScreenSize = () => {\n if (typeof window === 'undefined') return 'unknown';\n const width = window.innerWidth;\n if (width < 768) return 'mobile';\n if (width < 1024) return 'tablet';\n return 'desktop';\n };\n\n /**\n * Initialize audience tracking session\n */\n const initializeTrackingSession = useCallback(async () => {\n // Only track recorded content (not live HLS)\n if (!contentId || !appId || !client) return;\n if (currentPlaybackInfo?.type === 'hls' && broadcast.broadcastStatus === 1) return;\n\n // Prevent duplicate initialization\n if (hasInitializedSession.current) return;\n hasInitializedSession.current = true;\n\n try {\n const screenSize = getScreenSize();\n const platformInfo = `${navigator.platform || 'Unknown'} (${screenSize})`;\n\n const data = await client.startSession({\n contentId,\n broadcastId: broadcast.id,\n appId,\n foreignId: foreignId || null,\n foreignTier: foreignTier || 'guest',\n sessionId,\n fileType: currentPlaybackInfo?.type || 'mp3',\n platform: platformInfo,\n userAgent: navigator.userAgent || null,\n origin: window.location.origin || null,\n country: null,\n region: null,\n });\n\n setAudienceId(data.audienceId);\n\n if (data.resumePosition && data.resumePosition > 0 && audioElement) {\n audioElement.currentTime = data.resumePosition;\n debug.log(`[Audience Tracking] Resumed playback at ${data.resumePosition}s`);\n }\n\n debug.log('[Audience Tracking] Session initialized:', data.audienceId);\n } catch (error) {\n debug.error('[Audience Tracking] Error initializing session:', error);\n if (onError && error instanceof Error) {\n onError(error);\n }\n }\n }, [contentId, appId, broadcast.id, broadcast.broadcastStatus, foreignId, foreignTier, sessionId, currentPlaybackInfo?.type, audioElement, client, onError]);\n\n /**\n * Send audience tracking ping event\n */\n const sendTrackingPing = useCallback(\n async (eventType: 0 | 1 | 2 | 3) => {\n if (!audienceId || !sessionId || !client) return;\n\n try {\n await client.sendSessionPing({\n audienceId,\n sessionId,\n eventType,\n currentTime: Math.floor(audioElement?.currentTime || 0),\n duration: Math.floor(duration || 0),\n });\n } catch (error) {\n debug.error('[Audience Tracking] Error sending ping:', error);\n }\n },\n [audienceId, sessionId, audioElement, duration, client]\n );\n\n /**\n * Determine which URL and type to use for playback\n */\n const getPlaybackInfo = () => {\n // Live HLS streams - use direct CloudFront URL\n if (broadcast.broadcastStatus === 1) {\n if (broadcast.hlsPlaylistUrl) {\n return { url: broadcast.hlsPlaylistUrl, type: 'hls' };\n }\n if (broadcast.hash && broadcast.app?.s3Hash) {\n const hlsUrl = buildBroadcastCdnUrl(broadcast.app.s3Hash, broadcast.hash, 'index.m3u8');\n return { url: hlsUrl, type: 'hls' };\n }\n }\n\n // MP4 recordings - use secure playback endpoint\n // ReactPlayer will follow the 307 redirect to the presigned S3 URL\n if (broadcast.recordingMp4Url && broadcast.isVideo && broadcast.hash) {\n return { url: buildPlaybackUrl(broadcast.id, broadcast.hash), type: 'mp4' };\n }\n\n // MP3 recordings - use secure playback endpoint\n // ReactPlayer will follow the 307 redirect to the presigned S3 URL\n if (broadcast.recordingMp3Url && broadcast.hash) {\n return { url: buildPlaybackUrl(broadcast.id, broadcast.hash), type: 'mp3' };\n }\n\n // Offline HLS - use direct CloudFront URL\n if (broadcast.hlsPlaylistUrl) {\n return { url: broadcast.hlsPlaylistUrl, type: 'hls' };\n }\n\n return null;\n };\n\n // Initialize playback info on first render\n useEffect(() => {\n if (!currentPlaybackInfo) {\n const info = getPlaybackInfo();\n setCurrentPlaybackInfo(info);\n initialPlaybackTypeRef.current = info?.type || null;\n\n // Set expiration time for presigned URLs\n if (info && (info.type === 'mp4' || info.type === 'mp3')) {\n const expiresAt = new Date(Date.now() + URL_EXPIRATION_MS);\n setUrlExpiresAt(expiresAt);\n debug.log(`[URL Refresh] Initial ${info.type} URL expires at ${expiresAt.toISOString()}`);\n }\n\n // Auto-play when component mounts\n if (info) {\n setPlaying(true);\n setIsLoadingVideo(true);\n }\n }\n }, [currentPlaybackInfo]);\n\n // Reset loading state when playback URL changes\n useEffect(() => {\n if (currentPlaybackInfo?.url) {\n setIsLoadingVideo(true);\n }\n }, [currentPlaybackInfo?.url]);\n\n // Proactively refresh presigned URLs before they expire\n useEffect(() => {\n if (!urlExpiresAt || !currentPlaybackInfo?.type) return;\n\n const checkExpiration = () => {\n const now = new Date();\n const timeUntilExpiration = urlExpiresAt.getTime() - now.getTime();\n\n if (timeUntilExpiration <= REFRESH_THRESHOLD_MS && timeUntilExpiration > 0) {\n debug.log('[URL Refresh] Proactively refreshing URL before expiration');\n\n const fileType = currentPlaybackInfo.type;\n if (fileType === 'mp4' || fileType === 'mp3' || fileType === 'hls') {\n refreshPresignedUrl(fileType);\n }\n }\n };\n\n const interval = setInterval(checkExpiration, REFRESH_CHECK_INTERVAL_MS);\n checkExpiration();\n\n return () => {\n clearInterval(interval);\n };\n }, [urlExpiresAt, currentPlaybackInfo?.type, refreshPresignedUrl]);\n\n // When live HLS stream ends and MP3 is available, switch to MP3\n useEffect(() => {\n if (\n initialPlaybackTypeRef.current === 'hls' &&\n currentPlaybackInfo?.type === 'hls' &&\n broadcast.broadcastStatus !== 1 &&\n broadcast.recordingMp3Url &&\n broadcast.hash &&\n parseInt(broadcast.mp3Size || \"0\") > 0\n ) {\n const secureUrl = buildPlaybackUrl(broadcast.id, broadcast.hash);\n setCurrentPlaybackInfo({ url: secureUrl, type: 'mp3' });\n setAudioElement(null);\n setPlaying(true);\n }\n }, [broadcast.broadcastStatus, broadcast.recordingMp3Url, broadcast.mp3Size, broadcast.hash, broadcast.id, currentPlaybackInfo]);\n\n const playbackUrl = currentPlaybackInfo?.url || null;\n const playbackType = currentPlaybackInfo?.type || null;\n const isAudioOnly = playbackType === 'mp3' || (!broadcast.isVideo && playbackType !== 'mp4');\n const isLiveStream = broadcast.broadcastStatus === 1 && playbackType === 'hls' && !hasStreamEnded;\n const wasLiveStream = initialPlaybackTypeRef.current === 'hls';\n\n /**\n * Format time as HH:MM:SS for transcript timestamps\n */\n const formatTimestamp = (seconds: number) => {\n if (!seconds || isNaN(seconds) || !isFinite(seconds)) return \"00:00:00\";\n const hrs = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n return `${hrs.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handlePlay = () => {\n setPlaying(true);\n setIsLoadingVideo(false);\n };\n\n const handlePause = () => {\n setPlaying(false);\n };\n\n const handleEnded = () => {\n setPlaying(false);\n if (playbackType === 'hls') {\n setHasStreamEnded(true);\n }\n if (!wasLiveStream) {\n setHasEnded(true);\n }\n };\n\n // Initialize duration from broadcast data\n useEffect(() => {\n if (broadcast.durationSeconds && broadcast.durationSeconds > 0) {\n setDuration(broadcast.durationSeconds);\n }\n }, [broadcast.durationSeconds]);\n\n // Auto-play live streams\n useEffect(() => {\n if (isLiveStream && !playing) {\n setPlaying(true);\n }\n }, [isLiveStream, playing]);\n\n // Initialize audience tracking session\n useEffect(() => {\n if (currentPlaybackInfo && audioElement && !hasInitializedSession.current) {\n initializeTrackingSession();\n }\n }, [currentPlaybackInfo, audioElement, initializeTrackingSession]);\n\n // Set up heartbeat interval when playing\n useEffect(() => {\n if (playing && audienceId) {\n sendTrackingPing(1); // PLAY_START\n\n heartbeatIntervalRef.current = setInterval(() => {\n sendTrackingPing(2); // HEARTBEAT\n }, 15000);\n\n return () => {\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current);\n heartbeatIntervalRef.current = null;\n }\n };\n } else if (!playing && audienceId) {\n sendTrackingPing(0); // PAUSE_STOP\n\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current);\n heartbeatIntervalRef.current = null;\n }\n }\n }, [playing, audienceId, sendTrackingPing]);\n\n // Send unmount event\n useEffect(() => {\n return () => {\n if (audienceId && sessionId && sessionToken) {\n const payload = {\n audienceId,\n sessionId,\n eventType: 3, // UNMOUNT\n currentTime: Math.floor(audioElement?.currentTime || 0),\n duration: Math.floor(duration || 0),\n };\n\n const headers = {\n 'Authorization': `Bearer ${sessionToken}`,\n 'Content-Type': 'application/json',\n };\n // Note: sendBeacon doesn't support custom headers, so we use fetch with keepalive\n fetch(ENDPOINTS.sessionPing, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n keepalive: true,\n }).catch(() => {\n // Silently fail - component is unmounting\n });\n }\n };\n }, [audienceId, sessionId, sessionToken, audioElement, duration]);\n\n // Fetch transcript\n useEffect(() => {\n if (broadcast.transcriptUrl && broadcast.transcriptStatus === 2 && !transcriptData) {\n setIsLoadingTranscript(true);\n fetch(broadcast.transcriptUrl)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`Failed to fetch transcript: ${res.status} ${res.statusText}`);\n }\n return res.json();\n })\n .then((data) => {\n // Assign words to segments if needed\n if (data.segments && data.words && !data.segments[0]?.words) {\n data.segments = data.segments.map((segment: any, index: number) => {\n const segmentWords = data.words!.filter((word: any) => {\n if (index === data.segments!.length - 1) {\n return word.start >= segment.start;\n }\n return word.start >= segment.start && word.start < segment.end;\n });\n return {\n ...segment,\n words: segmentWords,\n };\n });\n }\n\n setTranscriptData(data);\n setIsLoadingTranscript(false);\n })\n .catch((error) => {\n debug.error('[Transcript] Failed to load transcript:', error);\n setIsLoadingTranscript(false);\n });\n }\n }, [broadcast.transcriptUrl, broadcast.transcriptStatus, transcriptData]);\n\n // Update current time\n useEffect(() => {\n if (!audioElement) return;\n\n const handleTimeUpdate = () => {\n setCurrentTime(audioElement.currentTime);\n };\n\n audioElement.addEventListener('timeupdate', handleTimeUpdate);\n return () => audioElement.removeEventListener('timeupdate', handleTimeUpdate);\n }, [audioElement]);\n\n // Auto-scroll to active word\n useEffect(() => {\n if (showTranscript && autoScrollEnabled && activeWordRef.current && transcriptContainerRef.current) {\n const container = transcriptContainerRef.current;\n const activeWord = activeWordRef.current;\n const containerRect = container.getBoundingClientRect();\n const wordRect = activeWord.getBoundingClientRect();\n\n if (wordRect.top < containerRect.top || wordRect.bottom > containerRect.bottom) {\n isScrollingProgrammatically.current = true;\n activeWord.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n setTimeout(() => {\n isScrollingProgrammatically.current = false;\n }, 500);\n }\n }\n }, [currentTime, showTranscript, autoScrollEnabled]);\n\n // Detect manual scrolling\n useEffect(() => {\n if (!showTranscript || !transcriptContainerRef.current) return;\n\n const container = transcriptContainerRef.current;\n\n const handleScroll = () => {\n if (!isScrollingProgrammatically.current && autoScrollEnabled) {\n setAutoScrollEnabled(false);\n }\n };\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [showTranscript, autoScrollEnabled]);\n\n const handlePlayPause = () => {\n if (hasEnded) {\n if (audioElement) {\n audioElement.currentTime = 0;\n }\n setHasEnded(false);\n }\n setPlaying(!playing);\n };\n\n const handleRestart = () => {\n if (audioElement) {\n audioElement.currentTime = 0;\n }\n setHasEnded(false);\n setPlaying(true);\n };\n\n const handleVideoClick = () => {\n if (!isLiveStream) {\n handlePlayPause();\n }\n };\n\n const handleSeekChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value);\n setPlayed(newValue);\n };\n\n const handleSeekMouseDown = () => {\n setSeeking(true);\n };\n\n const handleSeekMouseUp = (e: React.MouseEvent<HTMLInputElement>) => {\n const seekValue = parseFloat((e.target as HTMLInputElement).value);\n setSeeking(false);\n\n if (audioElement && duration > 0) {\n const seekTime = seekValue * duration;\n audioElement.currentTime = seekTime;\n setHasEnded(false);\n }\n };\n\n const handleSeekTouchStart = () => {\n setSeeking(true);\n };\n\n const handleSeekTouchEnd = (e: React.TouchEvent<HTMLInputElement>) => {\n const seekValue = parseFloat((e.target as HTMLInputElement).value);\n setSeeking(false);\n\n if (audioElement && duration > 0) {\n const seekTime = seekValue * duration;\n audioElement.currentTime = seekTime;\n setHasEnded(false);\n }\n };\n\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (!seeking) {\n const video = e.currentTarget;\n const playedFraction = video.duration > 0 ? video.currentTime / video.duration : 0;\n setPlayed(playedFraction);\n }\n };\n\n const handleLoadedMetadata = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n setAudioElement(video);\n\n if (video.duration && !isNaN(video.duration) && video.duration > 0) {\n setDuration(video.duration);\n } else if (broadcast.durationSeconds && broadcast.durationSeconds > 0) {\n setDuration(broadcast.durationSeconds);\n }\n };\n\n const handlePlayerReady = (player?: any) => {\n try {\n const internalPlayer = player?.getInternalPlayer?.();\n\n if (internalPlayer && internalPlayer instanceof HTMLMediaElement) {\n setAudioElement(internalPlayer);\n }\n } catch (error) {\n debug.error('[BroadcastPlayer] Error getting internal player:', error);\n }\n };\n\n // Audio element detection\n useEffect(() => {\n const findAudioElement = () => {\n const videoElements = document.querySelectorAll('video, audio');\n\n if (videoElements.length > 0) {\n const element = videoElements[0] as HTMLVideoElement;\n setAudioElement(element);\n return true;\n }\n return false;\n };\n\n if (!findAudioElement()) {\n const retryIntervals = [100, 300, 500, 1000, 1500, 2000, 3000, 4000, 5000];\n const timeouts = retryIntervals.map((delay) =>\n setTimeout(() => {\n findAudioElement();\n }, delay)\n );\n\n return () => timeouts.forEach(clearTimeout);\n }\n }, [playbackUrl]);\n\n useEffect(() => {\n if (playing && !audioElement) {\n const videoElements = document.querySelectorAll('video, audio');\n if (videoElements.length > 0) {\n const element = videoElements[0] as HTMLVideoElement;\n setAudioElement(element);\n }\n }\n }, [playing, audioElement]);\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n };\n\n const toggleMute = () => {\n setMuted(!muted);\n };\n\n const toggleFullscreen = async () => {\n try {\n if (document.fullscreenElement) {\n await document.exitFullscreen();\n return;\n }\n\n let videoElement = null;\n\n if (playerRef.current && typeof playerRef.current.getInternalPlayer === 'function') {\n videoElement = playerRef.current.getInternalPlayer();\n }\n\n if (!videoElement || typeof videoElement.requestFullscreen !== 'function') {\n const videoElements = document.querySelectorAll('video');\n if (videoElements.length > 0) {\n videoElement = videoElements[0];\n }\n }\n\n if (!videoElement || typeof videoElement.requestFullscreen !== 'function') {\n const modalElement = document.querySelector('.aspect-video');\n if (modalElement && typeof (modalElement as HTMLElement).requestFullscreen === 'function') {\n await (modalElement as HTMLElement).requestFullscreen();\n return;\n }\n }\n\n if (videoElement && typeof videoElement.requestFullscreen === 'function') {\n await videoElement.requestFullscreen();\n }\n } catch (error) {\n debug.error('Error toggling fullscreen:', error);\n }\n };\n\n const handleError = async (error: any) => {\n debug.error('Media playback error:', error);\n\n const isPotentialExpiration =\n error?.code === HTTP_STATUS.FORBIDDEN ||\n error?.status === HTTP_STATUS.FORBIDDEN ||\n error?.statusCode === HTTP_STATUS.FORBIDDEN ||\n error?.code === HTTP_STATUS.NOT_FOUND ||\n error?.status === HTTP_STATUS.NOT_FOUND ||\n error?.statusCode === HTTP_STATUS.NOT_FOUND ||\n error?.message?.includes('403') ||\n error?.message?.includes('404') ||\n error?.message?.includes('Forbidden') ||\n error?.message?.toLowerCase().includes('network') ||\n error?.type === 'network' ||\n error?.message?.includes('MEDIA_ERR_SRC_NOT_SUPPORTED');\n\n if (isPotentialExpiration && currentPlaybackInfo?.type && !isRefreshingUrl.current) {\n debug.log('[Player Error] Detected potential URL expiration, attempting refresh...');\n\n const currentPosition = audioElement?.currentTime || 0;\n const wasPlaying = playing;\n\n const fileType = currentPlaybackInfo.type;\n if (fileType !== 'mp4' && fileType !== 'mp3' && fileType !== 'hls') {\n debug.error('[Player Error] Invalid file type, cannot refresh:', fileType);\n } else {\n const refreshed = await refreshPresignedUrl(fileType);\n\n if (refreshed) {\n debug.log('[Player Error] URL refreshed successfully, resuming playback');\n setTimeout(() => {\n if (audioElement && currentPosition > 0) {\n audioElement.currentTime = currentPosition;\n }\n if (wasPlaying) {\n setPlaying(true);\n }\n }, PLAYBACK_RESUME_DELAY_MS);\n return;\n }\n }\n }\n\n setHasError(true);\n setPlaying(false);\n setIsLoadingVideo(false);\n\n // Use the improved error message helper\n setErrorMessage(getErrorMessage(error));\n\n if (onError && error instanceof Error) {\n onError(error);\n }\n };\n\n const handleRetry = useCallback(() => {\n setHasError(false);\n setErrorMessage('');\n setIsLoadingVideo(true);\n\n // Force reinitialize playback\n const info = getPlaybackInfo();\n if (info) {\n setCurrentPlaybackInfo(null); // Force re-render\n setTimeout(() => {\n setCurrentPlaybackInfo(info);\n setPlaying(true);\n }, 100);\n }\n }, [broadcast]);\n\n const handleWordClick = (startTime: number) => {\n if (audioElement) {\n audioElement.currentTime = startTime;\n setPlayed(startTime / duration);\n setHasEnded(false);\n if (!playing) {\n setPlaying(true);\n }\n }\n };\n\n /**\n * Keyboard shortcuts effect\n *\n * Listens for keyboard events when enableKeyboardShortcuts is true.\n * Prevents interference with form inputs, contenteditable elements, and modifier key combinations.\n *\n * Supported shortcuts:\n * - Space/K: Play/Pause\n * - Arrow Left/Right: Seek backward/forward 5 seconds\n * - Arrow Up/Down: Volume up/down 10%\n * - M: Mute toggle\n * - F: Fullscreen (video only)\n * - 0/Home: Jump to start\n * - End: Jump to end\n */\n useEffect(() => {\n // Skip if keyboard shortcuts are disabled\n if (!enableKeyboardShortcuts) return;\n\n /**\n * Seek by a relative number of seconds\n * @param seconds - Number of seconds to seek (negative for backward, positive for forward)\n */\n const seekBy = (seconds: number) => {\n if (!audioElement || duration <= 0) return;\n const newTime = Math.max(0, Math.min(duration, audioElement.currentTime + seconds));\n audioElement.currentTime = newTime;\n setPlayed(newTime / duration);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n\n // Don't interfere with typing in inputs, textareas, or contenteditable elements\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target.contentEditable === 'true' ||\n target.getAttribute('role') === 'textbox'\n ) {\n return;\n }\n\n // Don't handle if a modifier key is pressed\n if (e.ctrlKey || e.metaKey || e.altKey) {\n return;\n }\n\n switch (e.key) {\n case ' ':\n case 'k':\n case 'K':\n e.preventDefault();\n handlePlayPause();\n break;\n\n case 'ArrowLeft':\n e.preventDefault();\n seekBy(-5);\n break;\n\n case 'ArrowRight':\n e.preventDefault();\n seekBy(5);\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n setVolume(prev => Math.min(1, prev + 0.1));\n if (muted) setMuted(false);\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n setVolume(prev => Math.max(0, prev - 0.1));\n break;\n\n case 'm':\n case 'M':\n e.preventDefault();\n toggleMute();\n break;\n\n case 'f':\n case 'F':\n if (!isAudioOnly) {\n e.preventDefault();\n toggleFullscreen();\n }\n break;\n\n case '0':\n case 'Home':\n e.preventDefault();\n if (audioElement && duration > 0) {\n audioElement.currentTime = 0;\n setPlayed(0);\n setHasEnded(false);\n }\n break;\n\n case 'End':\n e.preventDefault();\n if (audioElement && duration > 0) {\n audioElement.currentTime = duration - 1;\n setPlayed((duration - 1) / duration);\n }\n break;\n\n default:\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enableKeyboardShortcuts, audioElement, duration, playing, muted, isAudioOnly, handlePlayPause, toggleMute, toggleFullscreen]);\n\n // Show error if no playback URL after initialization\n if (currentPlaybackInfo !== null && !playbackUrl) {\n return (\n <div className=\"bg-white dark:bg-zinc-900 rounded-lg p-6 max-w-md w-full mx-4 border border-gray-200 dark:border-zinc-800\">\n <h3 className=\"text-lg font-bold text-black dark:text-white mb-4\">Broadcast Unavailable</h3>\n <p className=\"text-gray-600 dark:text-gray-400\">\n No playback URL available for this broadcast. The recording may still be processing.\n </p>\n </div>\n );\n }\n\n // Show loading state\n if (!playbackUrl) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <LoadingSpinner variant=\"white\" text=\"Loading...\" />\n </div>\n );\n }\n\n const hasTranscript =\n broadcast.transcriptStatus === 2 &&\n transcriptData &&\n ((transcriptData.segments && transcriptData.segments.some((s) => s.words && s.words.length > 0)) ||\n (transcriptData.words && transcriptData.words.length > 0));\n\n return (\n <div className={`bg-black rounded-lg shadow-2xl w-full h-full flex flex-col ${className}`}>\n {/* Header */}\n <div className=\"bg-zinc-900/50 backdrop-blur-sm border-b border-zinc-800 px-4 md:px-6 py-3 md:py-4 flex justify-between items-center rounded-t-lg shrink-0\">\n <div>\n <h3 className=\"text-lg font-semibold text-white\">{broadcast.streamKeyRecord?.foreignName || \"Broadcast\"}</h3>\n <p className=\"text-sm text-gray-400\">\n {broadcast.isVideo ? \"Video\" : \"Audio\"} •{\" \"}\n {broadcast.broadcastStatus === 1 ? (\n <span className=\"text-red-500 font-semibold\">🔴 LIVE</span>\n ) : playbackType === 'hls' ? (\n <span className=\"text-gray-500 font-semibold\">OFFLINE</span>\n ) : (\n formatTime(duration)\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n {renderClipCreator && playbackType !== \"hls\" && appId && contentId && duration > 0 && (\n <button\n onClick={() => setShowClipCreator(true)}\n className=\"px-3 md:px-4 py-1.5 md:py-2 bg-blue-600 hover:bg-blue-700 text-white text-xs md:text-sm font-medium rounded-lg transition-colors flex items-center gap-1 md:gap-2\"\n title=\"Create a clip from this broadcast\"\n aria-label=\"Create clip from broadcast\"\n >\n <svg className=\"w-3 h-3 md:w-4 md:h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span className=\"hidden sm:inline\">Create Clip</span>\n <span className=\"sm:hidden\">Clip</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Main Content Area - Player + Transcript */}\n <div className=\"flex flex-1 overflow-hidden\">\n {/* Player Container */}\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Player Area */}\n <div className={`relative ${isAudioOnly ? \"bg-linear-to-br from-zinc-900 via-zinc-800 to-zinc-900 flex items-stretch\" : \"bg-black\"}`}>\n {isAudioOnly ? (\n <div className=\"relative cursor-pointer w-full flex flex-col\" onClick={handleVideoClick}>\n {!hasError ? (\n <>\n <div className=\"w-full h-full relative\">\n <AudioWaveform audioElement={audioElement} isPlaying={isLiveStream ? true : playing} isLive={isLiveStream} />\n {isLoadingVideo && !hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center z-20\">\n <LoadingSpinner variant=\"white\" />\n </div>\n )}\n {hasEnded && !wasLiveStream && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center z-20 pointer-events-auto\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRestart();\n }}\n className=\"bg-white hover:bg-blue-500 text-black hover:text-white font-semibold py-4 px-8 rounded-full transition-all transform hover:scale-105 flex items-center gap-3\"\n aria-label=\"Restart playback from beginning\"\n >\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z\" clipRule=\"evenodd\" />\n </svg>\n Restart\n </button>\n </div>\n )}\n </div>\n </>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <div className=\"text-center max-w-md px-4\">\n <div className=\"text-6xl mb-4\">⚠️</div>\n <h3 className=\"text-xl font-semibold text-white mb-3\">Playback Error</h3>\n <p className=\"text-gray-300 text-sm mb-6\">{errorMessage}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors inline-flex items-center gap-2\"\n aria-label=\"Retry playback\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n Retry\n </button>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"aspect-video relative\">\n <div onClick={handleVideoClick} className=\"cursor-pointer\">\n <ReactPlayer\n key={playbackUrl || 'no-url'}\n ref={playerRef}\n src={playbackUrl || undefined}\n playing={playing}\n volume={volume}\n muted={muted}\n width=\"100%\"\n height=\"100%\"\n crossOrigin=\"anonymous\"\n onReady={handlePlayerReady}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n style={{ backgroundColor: '#000' }}\n />\n </div>\n {isLoadingVideo && !hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center\">\n <LoadingSpinner variant=\"white\" />\n </div>\n )}\n {hasEnded && !hasError && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRestart();\n }}\n className=\"bg-white hover:bg-blue-500 text-black hover:text-white font-semibold py-4 px-8 rounded-full transition-all transform hover:scale-105 flex items-center gap-3\"\n >\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z\" clipRule=\"evenodd\" />\n </svg>\n Restart\n </button>\n </div>\n )}\n {hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center p-8\">\n <div className=\"text-center max-w-md\">\n <div className=\"text-6xl mb-4\">⚠️</div>\n <h3 className=\"text-xl font-semibold text-white mb-3\">Playback Error</h3>\n <p className=\"text-gray-300 text-sm mb-6\">{errorMessage}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors inline-flex items-center gap-2\"\n aria-label=\"Retry playback\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n Retry\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hidden audio player for audio-only */}\n {isAudioOnly && (\n <div className=\"hidden\">\n <ReactPlayer\n key={playbackUrl || 'no-url'}\n ref={playerRef}\n src={playbackUrl || undefined}\n playing={playing}\n volume={volume}\n muted={muted}\n width=\"0\"\n height=\"0\"\n crossOrigin=\"anonymous\"\n onReady={handlePlayerReady}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n />\n </div>\n )}\n </div>\n\n {/* Custom Controls */}\n {!hasError && !isLiveStream && (\n wasLiveStream ? (\n parseInt(broadcast.mp3Size || \"0\") > 0 || parseInt(broadcast.mp4Size || \"0\") > 0 ? (\n <div className=\"bg-zinc-900/50 backdrop-blur-sm px-4 md:px-6 py-3 md:py-4 rounded-b-lg\">\n {/* Progress Bar */}\n <div className=\"mb-4\">\n <input\n type=\"range\"\n min={0}\n max={0.999999}\n step=\"any\"\n value={played || 0}\n onMouseDown={handleSeekMouseDown}\n onMouseUp={handleSeekMouseUp}\n onTouchStart={handleSeekTouchStart}\n onTouchEnd={handleSeekTouchEnd}\n onChange={handleSeekChange}\n className=\"w-full h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n aria-label=\"Seek position\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={played * duration}\n aria-valuetext={`${formatTime(played * duration)} of ${formatTime(duration)}`}\n role=\"slider\"\n />\n <div className=\"flex justify-between text-xs text-gray-400 mt-1\">\n <span>{formatTime((played || 0) * duration)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Control Buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n {/* Play/Pause */}\n <button\n onClick={handlePlayPause}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title={playing ? \"Pause\" : \"Play\"}\n aria-label={playing ? \"Pause\" : \"Play\"}\n aria-pressed={playing}\n >\n {playing ? (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title={muted ? \"Unmute\" : \"Mute\"}\n aria-label={muted ? \"Unmute\" : \"Mute\"}\n aria-pressed={muted}\n >\n {muted || volume === 0 ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM14.657 2.929a1 1 0 011.414 0A9.972 9.972 0 0119 10a9.972 9.972 0 01-2.929 7.071 1 1 0 01-1.414-1.414A7.971 7.971 0 0017 10c0-2.21-.894-4.208-2.343-5.657a1 1 0 010-1.414zm-2.829 2.828a1 1 0 011.415 0A5.983 5.983 0 0115 10a5.984 5.984 0 01-1.757 4.243 1 1 0 01-1.415-1.415A3.984 3.984 0 0013 10a3.983 3.983 0 00-1.172-2.828 1 1 0 010-1.415z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={muted ? 0 : volume || 1}\n onChange={handleVolumeChange}\n className=\"w-20 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n aria-label=\"Volume\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={muted ? 0 : Math.round(volume * 100)}\n aria-valuetext={muted ? \"Muted\" : `${Math.round(volume * 100)}%`}\n role=\"slider\"\n />\n </div>\n </div>\n\n {/* Fullscreen, Download, and Transcript buttons */}\n <div className=\"flex items-center gap-3\">\n {/* Download */}\n {!isLiveStream && broadcast.hash && (broadcast.recordingMp4Url || broadcast.recordingMp3Url) && (\n <button\n onClick={() => {\n const downloadUrl = buildPlaybackUrl(broadcast.id, broadcast.hash!, 'download');\n window.open(downloadUrl, '_blank');\n }}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title=\"Download Recording\"\n aria-label=\"Download recording\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n </button>\n )}\n\n {/* Fullscreen */}\n {!isAudioOnly && (\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title=\"Fullscreen\"\n aria-label=\"Toggle fullscreen\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 11-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n )}\n\n {/* Transcript toggle */}\n {hasTranscript && (\n <button\n onClick={() => setShowTranscript(!showTranscript)}\n className={`transition-colors ${showTranscript ? 'text-blue-400' : 'text-white hover:text-blue-400'}`}\n title={showTranscript ? \"Hide Transcript\" : \"Show Transcript\"}\n aria-label={showTranscript ? \"Hide transcript\" : \"Show transcript\"}\n aria-pressed={showTranscript}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ) : null\n ) : (\n <div className=\"bg-zinc-900/50 backdrop-blur-sm px-4 md:px-6 py-3 md:py-4 rounded-b-lg\">\n {/* Progress Bar */}\n <div className=\"mb-4\">\n <input\n type=\"range\"\n min={0}\n max={0.999999}\n step=\"any\"\n value={played || 0}\n onMouseDown={handleSeekMouseDown}\n onMouseUp={handleSeekMouseUp}\n onTouchStart={handleSeekTouchStart}\n onTouchEnd={handleSeekTouchEnd}\n onChange={handleSeekChange}\n className=\"w-full h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-gray-400 mt-1\">\n <span>{formatTime((played || 0) * duration)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Control Buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n {/* Play/Pause */}\n <button onClick={handlePlayPause} className=\"text-white hover:text-blue-400 transition-colors\" title={playing ? \"Pause\" : \"Play\"}>\n {playing ? (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button onClick={toggleMute} className=\"text-white hover:text-blue-400 transition-colors\" title={muted ? \"Unmute\" : \"Mute\"}>\n {muted || volume === 0 ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM14.657 2.929a1 1 0 011.414 0A9.972 9.972 0 0119 10a9.972 9.972 0 01-2.929 7.071 1 1 0 01-1.414-1.414A7.971 7.971 0 0017 10c0-2.21-.894-4.208-2.343-5.657a1 1 0 010-1.414zm-2.829 2.828a1 1 0 011.415 0A5.983 5.983 0 0115 10a5.984 5.984 0 01-1.757 4.243 1 1 0 01-1.415-1.415A3.984 3.984 0 0013 10a3.983 3.983 0 00-1.172-2.828 1 1 0 010-1.415z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={muted ? 0 : volume || 1}\n onChange={handleVolumeChange}\n className=\"w-20 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n />\n </div>\n </div>\n\n {/* Fullscreen and Transcript buttons */}\n <div className=\"flex items-center gap-3\">\n {/* Fullscreen */}\n {!isAudioOnly && (\n <button onClick={toggleFullscreen} className=\"text-white hover:text-blue-400 transition-colors\" title=\"Fullscreen\">\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 11-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n )}\n\n {/* Transcript toggle */}\n {hasTranscript && (\n <button\n onClick={() => setShowTranscript(!showTranscript)}\n className={`transition-colors ${showTranscript ? 'text-blue-400' : 'text-white hover:text-blue-400'}`}\n title={showTranscript ? \"Hide Transcript\" : \"Show Transcript\"}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n )\n )}\n </div>\n\n {/* Transcript Side Panel */}\n {showTranscript && hasTranscript && (\n <div className=\"w-full md:w-96 bg-zinc-900 border-l border-zinc-800 flex flex-col overflow-hidden\">\n {/* Transcript Header */}\n <div className=\"px-4 py-3 border-b border-zinc-800 bg-zinc-900/50 shrink-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n <span className=\"font-medium text-white\">Transcript</span>\n {broadcast.transcriptLanguage && (\n <span className=\"text-xs text-gray-400 px-2 py-0.5 bg-zinc-800 rounded\">{broadcast.transcriptLanguage.toUpperCase()}</span>\n )}\n </div>\n {broadcast.transcriptUrl && (\n <a\n href={broadcast.transcriptUrl}\n download={`${broadcast.hash || broadcast.id}-transcript.json`}\n className=\"text-gray-400 hover:text-white transition-colors\"\n title=\"Download Transcript\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* Resume Auto-Scroll Button */}\n {!autoScrollEnabled && (\n <div className=\"px-4 py-2 bg-zinc-800/50 border-b border-zinc-700 shrink-0\">\n <button\n onClick={() => setAutoScrollEnabled(true)}\n className=\"w-full px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded transition-colors flex items-center justify-center gap-2 text-sm font-medium\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 14l-7 7m0 0l-7-7m7 7V3\" />\n </svg>\n Resume Auto-Scroll\n </button>\n </div>\n )}\n\n {/* Transcript Content - Scrollable */}\n <div ref={transcriptContainerRef} className=\"flex-1 overflow-y-auto px-4 py-4 text-gray-300 leading-relaxed\">\n {isLoadingTranscript ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"h-6 w-6 border-2 border-gray-600 border-t-blue-500 rounded-full animate-spin\" />\n </div>\n ) : transcriptData?.segments && transcriptData.segments.length > 0 ? (\n <div className=\"space-y-4\">\n {(() => {\n const filteredSegments = transcriptData.segments.filter((s) => s.words && s.words.length > 0);\n let globalWordIndex = 0;\n const wordMap = new Map();\n\n filteredSegments.forEach((segment) => {\n segment.words.forEach((_word, wordIndex) => {\n wordMap.set(`${segment.id}-${wordIndex}`, globalWordIndex++);\n });\n });\n\n let currentWordIndex = -1;\n\n filteredSegments.forEach((segment) => {\n segment.words.forEach((word, wordIndex) => {\n const globalIdx = wordMap.get(`${segment.id}-${wordIndex}`) || -1;\n if (currentTime >= word.start && globalIdx > currentWordIndex) {\n currentWordIndex = globalIdx;\n }\n });\n });\n\n const previousWordIndex = lastActiveWordIndex.current;\n let minHighlightIndex = -1;\n let maxHighlightIndex = -1;\n\n if (currentWordIndex >= 0) {\n minHighlightIndex = Math.max(0, currentWordIndex - TRAILING_WORDS);\n maxHighlightIndex = currentWordIndex;\n\n if (currentWordIndex <= TRAILING_WORDS) {\n minHighlightIndex = 0;\n }\n\n lastActiveWordIndex.current = currentWordIndex;\n } else if (currentWordIndex === -1) {\n minHighlightIndex = 0;\n maxHighlightIndex = 0;\n } else if (previousWordIndex >= 0) {\n minHighlightIndex = Math.max(0, previousWordIndex - TRAILING_WORDS);\n maxHighlightIndex = previousWordIndex;\n }\n\n return filteredSegments.map((segment, _segmentIndex) => {\n const isSegmentActive = currentTime >= segment.start && currentTime < segment.end;\n return (\n <div key={segment.id} ref={isSegmentActive ? transcriptContainerRef : null} className=\"flex gap-3 items-start leading-relaxed\">\n <button\n onClick={() => handleWordClick(segment.start)}\n className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors shrink-0 pt-0.5 font-mono\"\n title={`Jump to ${formatTimestamp(segment.start)}`}\n >\n {formatTimestamp(segment.start)}\n </button>\n\n <div className=\"flex-1\">\n {segment.words.map((word, wordIndex) => {\n const thisGlobalIndex = wordMap.get(`${segment.id}-${wordIndex}`) ?? -1;\n const isTimestampActive = currentTime >= word.start && currentTime < word.end;\n const isInGapFill = minHighlightIndex >= 0 && thisGlobalIndex >= minHighlightIndex && thisGlobalIndex <= maxHighlightIndex;\n const isWordActive = isInGapFill;\n\n return (\n <span\n key={`${segment.id}-${wordIndex}`}\n ref={isTimestampActive ? activeWordRef : null}\n onClick={() => handleWordClick(word.start)}\n className={`cursor-pointer ${\n isWordActive ? 'text-blue-400 font-medium active-word' : isSegmentActive ? 'text-gray-200 segment-word' : 'text-gray-400 hover:text-gray-200 inactive-word'\n }`}\n title={`${formatTime(word.start)} - ${formatTime(word.end)}`}\n >\n {word.word}{' '}\n </span>\n );\n })}\n </div>\n </div>\n );\n });\n })()}\n </div>\n ) : transcriptData?.words && transcriptData.words.length > 0 ? (\n <div className=\"space-y-1\">\n {transcriptData.words.map((word, index) => {\n const isActive = currentTime >= word.start && currentTime < word.end;\n return (\n <span\n key={index}\n ref={isActive ? activeWordRef : null}\n onClick={() => handleWordClick(word.start)}\n className={`inline-block cursor-pointer transition-all ${\n isActive ? 'text-blue-400 underline decoration-blue-400 decoration-2 font-medium' : 'text-gray-400 hover:text-gray-200'\n }`}\n title={`${formatTime(word.start)} - ${formatTime(word.end)}`}\n >\n {word.word}{' '}\n </span>\n );\n })}\n </div>\n ) : (\n <div className=\"text-center text-gray-500 py-8\">\n <p className=\"mb-2\">Transcript data not available</p>\n {transcriptData && (\n <p className=\"text-xs text-gray-600\">\n Debug: segments={transcriptData.segments ? transcriptData.segments.length : 0}, words={transcriptData.words ? transcriptData.words.length : 0}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Clip Creator */}\n {renderClipCreator &&\n renderClipCreator({\n isOpen: showClipCreator,\n onClose: () => setShowClipCreator(false),\n sourceVideoUrl: playbackType === \"mp4\" ? playbackUrl || undefined : undefined,\n sourceAudioUrl: playbackType === \"mp3\" ? playbackUrl || undefined : undefined,\n sourceDuration: duration,\n onPauseParent: () => setPlaying(false),\n })}\n\n <style>{`\n .slider::-webkit-slider-thumb {\n appearance: none;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: white;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n }\n .slider::-webkit-slider-thumb:hover {\n background: #60a5fa;\n }\n .slider::-moz-range-thumb {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: white;\n cursor: pointer;\n border: none;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n }\n .slider::-moz-range-thumb:hover {\n background: #60a5fa;\n }\n\n .active-word {\n transition: color 0s, text-shadow 0s;\n text-shadow: 0 0 8px rgba(96, 165, 250, 0.6), 0 0 12px rgba(96, 165, 250, 0.4);\n }\n .segment-word,\n .inactive-word {\n transition: color 0.4s ease-out, text-shadow 0.4s ease-out;\n text-shadow: none;\n }\n .segment-word:hover,\n .inactive-word:hover {\n transition: color 0.15s ease-in;\n }\n `}</style>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { BroadcastPlayer } from \"./BroadcastPlayer\";\nimport { debug } from \"../utils/debug\";\nimport type { Broadcast } from \"../types/broadcast\";\n\nexport interface BroadcastPlayerModalProps {\n /** Broadcast data from DialTribe API */\n broadcast: Broadcast;\n\n /** Whether modal is open */\n isOpen: boolean;\n\n /** Called when modal should close */\n onClose: () => void;\n\n /** Optional: App ID for tracking */\n appId?: string;\n\n /** Optional: Content ID for tracking */\n contentId?: number;\n\n /** Foreign user ID from partner system (any tier) */\n foreignId?: string;\n\n /** Tier name from partner system (e.g., 'guest', 'member', 'subscriber_gold') */\n foreignTier?: string;\n\n /**\n * Optional render prop for clip creator\n * If provided, the \"Create Clip\" button will be shown and this will be called when clicked\n */\n renderClipCreator?: (props: {\n isOpen: boolean;\n onClose: () => void;\n sourceVideoUrl?: string;\n sourceAudioUrl?: string;\n sourceDuration: number;\n onPauseParent: () => void;\n }) => React.ReactNode;\n\n /** Optional: Custom CSS classes for the player */\n className?: string;\n\n /** Optional: Enable keyboard shortcuts (Space, arrows, M, F, etc.). Default: false */\n enableKeyboardShortcuts?: boolean;\n}\n\n/**\n * BroadcastPlayerModal - Modal wrapper for BroadcastPlayer\n *\n * Provides a modal overlay with ESC key handling and backdrop click to close.\n * Uses the new BroadcastPlayer component for all player functionality.\n *\n * @example\n * ```tsx\n * <BroadcastPlayerModal\n * broadcast={broadcast}\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * appId=\"app_123\"\n * contentId={456}\n * />\n * ```\n */\nexport function BroadcastPlayerModal({\n broadcast,\n isOpen,\n onClose,\n appId,\n contentId,\n foreignId,\n foreignTier,\n renderClipCreator,\n className,\n enableKeyboardShortcuts = false,\n}: BroadcastPlayerModalProps) {\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Don't render if not open\n if (!isOpen) return null;\n\n // Focus management\n useEffect(() => {\n if (isOpen) {\n // Save current focus\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n // Focus close button after render\n setTimeout(() => {\n closeButtonRef.current?.focus();\n }, 100);\n }\n\n return () => {\n // Restore focus when modal closes\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen]);\n\n // ESC key handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onClose]);\n\n // Backdrop click handler\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-black/70 backdrop-blur-xl flex items-center justify-center z-50 p-4\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Broadcast player\"\n >\n <div className=\"relative w-full h-full max-w-7xl max-h-[90vh]\">\n {/* Close Button */}\n <button\n ref={closeButtonRef}\n onClick={onClose}\n className=\"absolute top-4 right-4 z-10 text-gray-400 hover:text-white text-2xl leading-none transition-colors w-8 h-8 flex items-center justify-center bg-black/50 rounded-full\"\n title=\"Close (ESC)\"\n aria-label=\"Close player\"\n >\n ×\n </button>\n\n {/* Core Player */}\n <BroadcastPlayer\n broadcast={broadcast}\n appId={appId}\n contentId={contentId}\n foreignId={foreignId}\n foreignTier={foreignTier}\n renderClipCreator={renderClipCreator}\n className={className}\n enableKeyboardShortcuts={enableKeyboardShortcuts}\n onError={(error) => {\n debug.error('[BroadcastPlayerModal] Player error:', error);\n }}\n />\n </div>\n </div>\n );\n}\n","import { Component, ErrorInfo, ReactNode } from \"react\";\n\ninterface Props {\n children: ReactNode;\n /** Callback when modal needs to be closed */\n onClose?: () => void;\n /** Broadcast ID for logging purposes */\n broadcastId?: number;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n/**\n * Error Boundary for Broadcast Player Modal\n *\n * Catches and handles React errors that occur during:\n * - Rendering\n * - Lifecycle methods\n * - Constructors of the whole tree below them\n *\n * Does NOT catch errors in:\n * - Event handlers (use try-catch)\n * - Asynchronous code (use try-catch)\n * - Server-side rendering\n * - Errors thrown in the error boundary itself\n *\n * Benefits:\n * - Prevents white screen of death\n * - Provides user-friendly error UI\n * - Logs errors for debugging\n * - Allows graceful recovery\n */\nexport class BroadcastPlayerErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<State> {\n // Update state so the next render will show the fallback UI\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // Log error details for debugging\n console.error(\"[Player Error Boundary] Caught error:\", {\n error: error.message,\n stack: error.stack,\n componentStack: errorInfo.componentStack,\n broadcastId: this.props.broadcastId,\n timestamp: new Date().toISOString(),\n });\n\n // Update state with error info\n this.setState({\n error,\n errorInfo,\n });\n\n // TODO: Send error to logging service (e.g., Sentry, LogRocket)\n // Example:\n // logErrorToService({\n // error,\n // errorInfo,\n // broadcastId: this.props.broadcastId,\n // });\n }\n\n handleReset = () => {\n // Reset error state and try again\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n handleClose = () => {\n // Close modal and reset error state\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n this.props.onClose?.();\n };\n\n render() {\n if (this.state.hasError) {\n // Render fallback UI\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl w-full mx-4 p-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n Player Error\n </h2>\n <button\n onClick={this.handleClose}\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n aria-label=\"Close\"\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* Error icon */}\n <div className=\"flex justify-center mb-4\">\n <div className=\"rounded-full bg-red-100 dark:bg-red-900/30 p-3\">\n <svg\n className=\"w-12 h-12 text-red-600 dark:text-red-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n </div>\n\n {/* Error message */}\n <div className=\"text-center mb-6\">\n <p className=\"text-lg text-gray-900 dark:text-white mb-2\">\n Something went wrong with the media player\n </p>\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n {this.state.error?.message || \"An unexpected error occurred\"}\n </p>\n </div>\n\n {/* Error details (collapsible, for debugging) */}\n {process.env.NODE_ENV === \"development\" && this.state.errorInfo && (\n <details className=\"mb-6 p-4 bg-gray-100 dark:bg-gray-900 rounded text-xs\">\n <summary className=\"cursor-pointer font-semibold text-gray-700 dark:text-gray-300 mb-2\">\n Error Details (Development Only)\n </summary>\n <pre className=\"overflow-auto text-gray-600 dark:text-gray-400 whitespace-pre-wrap\">\n {this.state.error?.stack}\n {\"\\n\\nComponent Stack:\"}\n {this.state.errorInfo.componentStack}\n </pre>\n </details>\n )}\n\n {/* Action buttons */}\n <div className=\"flex gap-3 justify-center\">\n <button\n onClick={this.handleReset}\n className=\"px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors\"\n >\n Try Again\n </button>\n <button\n onClick={this.handleClose}\n className=\"px-6 py-2 bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-900 dark:text-white rounded-lg font-medium transition-colors\"\n >\n Close Player\n </button>\n </div>\n\n {/* Help text */}\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\n If this problem persists, try refreshing the page or contact\n support.\n </p>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/components/HelloWorld.tsx","../src/context/DialTribeProvider.tsx","../src/client/DialTribeClient.ts","../src/components/AudioWaveform.tsx","../src/components/LoadingSpinner.tsx","../src/utils/cdn.ts","../src/utils/format.ts","../src/utils/http-status.ts","../src/utils/debug.ts","../src/components/BroadcastPlayer.tsx","../src/components/BroadcastPlayerModal.tsx","../src/components/BroadcastPlayerErrorBoundary.tsx"],"names":["jsxs","jsx","createContext","useState","useCallback","useEffect","useContext","useRef","animationId","handleTimeUpdate","Fragment","ReactPlayer","Component"],"mappings":"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","file":"index.js","sourcesContent":["export interface HelloWorldProps {\n name?: string;\n}\n\n/**\n * A simple Hello World component for testing the SDK package setup.\n * This component will be replaced with actual DialTribe media components.\n */\nexport function HelloWorld({ name = 'World' }: HelloWorldProps) {\n return (\n <div style={{\n padding: '20px',\n border: '2px solid #4F46E5',\n borderRadius: '8px',\n backgroundColor: '#EEF2FF',\n color: '#4F46E5',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center',\n }}>\n <h1 style={{ margin: '0 0 10px 0' }}>\n Hello, {name}!\n </h1>\n <p style={{ margin: 0, fontSize: '14px' }}>\n @dialtribe/react-sdk is working correctly\n </p>\n </div>\n );\n}\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\n\n/**\n * DialTribe SDK Context\n * Manages session token and auto-refresh across all SDK components\n */\n\nexport interface DialTribeContextValue {\n /** Current session token */\n sessionToken: string | null;\n /** Update the session token (called automatically on refresh) */\n setSessionToken: (token: string, expiresAt?: string) => void;\n /** Whether the session token is expired/invalid */\n isExpired: boolean;\n /** Mark token as expired */\n markExpired: () => void;\n /** Optional API base URL override */\n apiBaseUrl?: string;\n}\n\nconst DialTribeContext = createContext<DialTribeContextValue | null>(null);\n\nexport interface DialTribeProviderProps {\n /** Session token from your backend (required) */\n sessionToken: string;\n /** Called when the API returns a refreshed token via X-Session-Token header */\n onTokenRefresh?: (newToken: string, expiresAt: string) => void;\n /** Called when the session token expires or becomes invalid */\n onTokenExpired?: () => void;\n /**\n * Optional: Override API base URL (for local development)\n * If not provided, uses NEXT_PUBLIC_DIALTRIBE_API_URL environment variable or production default\n * @example \"http://localhost:3001/api/public/v1\"\n */\n apiBaseUrl?: string;\n /** Your React app */\n children: React.ReactNode;\n}\n\n/**\n * DialTribe Provider\n *\n * Wraps your app to provide session token authentication to all SDK components.\n *\n * @example\n * ```tsx\n * // Production (default)\n * <DialTribeProvider\n * sessionToken=\"sess_xxx...\"\n * onTokenRefresh={(newToken) => setToken(newToken)}\n * onTokenExpired={() => router.push('/login')}\n * >\n * <App />\n * </DialTribeProvider>\n *\n * // Local development (explicit)\n * <DialTribeProvider\n * sessionToken=\"sess_xxx...\"\n * apiBaseUrl=\"http://localhost:3001/api/public/v1\"\n * onTokenRefresh={(newToken) => setToken(newToken)}\n * >\n * <App />\n * </DialTribeProvider>\n *\n * // Local development (via env var - recommended)\n * // Set NEXT_PUBLIC_DIALTRIBE_API_URL=http://localhost:3001/api/public/v1 in .env\n * <DialTribeProvider sessionToken=\"sess_xxx...\">\n * <App />\n * </DialTribeProvider>\n * ```\n */\nexport function DialTribeProvider({\n sessionToken: initialToken,\n onTokenRefresh,\n onTokenExpired,\n apiBaseUrl,\n children,\n}: DialTribeProviderProps) {\n const [sessionToken, setSessionTokenState] = useState<string>(initialToken);\n const [isExpired, setIsExpired] = useState(false);\n\n // Update token and notify parent\n const setSessionToken = useCallback(\n (newToken: string, expiresAt?: string) => {\n setSessionTokenState(newToken);\n setIsExpired(false);\n // Notify parent component of token refresh\n if (expiresAt) {\n onTokenRefresh?.(newToken, expiresAt);\n }\n },\n [onTokenRefresh]\n );\n\n // Mark token as expired\n const markExpired = useCallback(() => {\n setIsExpired(true);\n onTokenExpired?.();\n }, [onTokenExpired]);\n\n // Sync with prop changes (in case parent updates the token)\n useEffect(() => {\n if (initialToken !== sessionToken) {\n setSessionTokenState(initialToken);\n setIsExpired(false);\n }\n }, [initialToken, sessionToken]);\n\n const value: DialTribeContextValue = {\n sessionToken,\n setSessionToken,\n isExpired,\n markExpired,\n apiBaseUrl,\n };\n\n return (\n <DialTribeContext.Provider value={value}>\n {children}\n </DialTribeContext.Provider>\n );\n}\n\n/**\n * Hook to access DialTribe context\n *\n * @throws Error if used outside DialTribeProvider\n *\n * @example\n * ```tsx\n * const { sessionToken, setSessionToken } = useDialTribe();\n * ```\n */\nexport function useDialTribe(): DialTribeContextValue {\n const context = useContext(DialTribeContext);\n\n if (!context) {\n throw new Error(\n 'useDialTribe must be used within a DialTribeProvider. ' +\n 'Wrap your app with <DialTribeProvider sessionToken=\"sess_xxx\">...</DialTribeProvider>'\n );\n }\n\n return context;\n}\n","/**\n * DialTribe API Client\n *\n * Handles all API communication with DialTribe endpoints.\n * Automatically manages session token refresh via X-Session-Token headers.\n *\n * Supports configurable API base URL for development:\n * 1. Via environment variable: NEXT_PUBLIC_DIALTRIBE_API_URL\n * 2. Via apiBaseUrl prop on DialTribeProvider (takes precedence)\n *\n * Defaults to production URL if neither is specified.\n */\n\n/**\n * Get the default API base URL\n * Checks environment variable, falls back to production\n */\nfunction getDefaultApiBaseUrl(): string {\n // Check for environment variable (Next.js, Create React App, Vite all support this pattern)\n if (typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_DIALTRIBE_API_URL) {\n return process.env.NEXT_PUBLIC_DIALTRIBE_API_URL;\n }\n\n // Production default\n return 'https://dialtribe.com/api/public/v1';\n}\n\n/** Default API base URL (production or from environment) */\nexport const DIALTRIBE_API_BASE = getDefaultApiBaseUrl();\n\n/**\n * Generate API endpoints for a given base URL\n * This allows runtime configuration while maintaining type safety\n */\nexport function getEndpoints(baseUrl: string = DIALTRIBE_API_BASE) {\n return {\n broadcasts: `${baseUrl}/broadcasts`,\n broadcast: (id: number) => `${baseUrl}/broadcasts/${id}`,\n contentPlay: `${baseUrl}/content/play`,\n presignedUrl: `${baseUrl}/media/presigned-url`,\n sessionStart: `${baseUrl}/session/start`,\n sessionPing: `${baseUrl}/session/ping`,\n } as const;\n}\n\n/** Default API endpoints (uses default base URL) */\nexport const ENDPOINTS = getEndpoints();\n\nexport interface ApiClientConfig {\n /** Session token for authentication */\n sessionToken: string;\n /** Called when API returns a refreshed token */\n onTokenRefresh?: (newToken: string, expiresAt: string) => void;\n /** Called when token expires or becomes invalid */\n onTokenExpired?: () => void;\n /**\n * Optional: Override API base URL (e.g., for local development)\n * If not provided, uses environment variable or production default\n * @example \"http://localhost:3001/api/public/v1\"\n */\n apiBaseUrl?: string;\n}\n\n/**\n * DialTribe API Client\n *\n * Low-level client for making authenticated requests to DialTribe API.\n * Handles session token auto-refresh automatically.\n */\nexport class DialTribeClient {\n private config: ApiClientConfig;\n private endpoints: ReturnType<typeof getEndpoints>;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n // Generate endpoints with custom base URL if provided\n this.endpoints = config.apiBaseUrl ? getEndpoints(config.apiBaseUrl) : ENDPOINTS;\n }\n\n /**\n * Make an authenticated request to DialTribe API\n *\n * Automatically:\n * - Adds Authorization header with session token\n * - Checks for X-Session-Token header in response (token refresh)\n * - Calls onTokenRefresh if new token is provided\n * - Calls onTokenExpired on 401 errors\n */\n async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n const headers = new Headers(options.headers);\n\n // Add session token to Authorization header\n headers.set('Authorization', `Bearer ${this.config.sessionToken}`);\n headers.set('Content-Type', 'application/json');\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Check for refreshed session token in response headers\n const newToken = response.headers.get('X-Session-Token');\n const expiresAt = response.headers.get('X-Session-Expires');\n\n if (newToken && expiresAt) {\n // API returned a refreshed token\n this.config.onTokenRefresh?.(newToken, expiresAt);\n }\n\n // Handle expired/invalid token\n if (response.status === 401) {\n this.config.onTokenExpired?.();\n throw new Error('Session token expired or invalid');\n }\n\n return response;\n }\n\n /**\n * Update the session token\n * Called automatically when token is refreshed, or manually by user\n */\n setSessionToken(token: string) {\n this.config.sessionToken = token;\n }\n\n /**\n * Get list of broadcasts for the authenticated app\n */\n async getBroadcasts(params?: {\n page?: number;\n limit?: number;\n broadcastStatus?: 1 | 2;\n search?: string;\n includeDeleted?: boolean;\n }) {\n const searchParams = new URLSearchParams();\n\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.limit) searchParams.set('limit', params.limit.toString());\n if (params?.broadcastStatus) searchParams.set('broadcastStatus', params.broadcastStatus.toString());\n if (params?.search) searchParams.set('search', params.search);\n if (params?.includeDeleted) searchParams.set('includeDeleted', 'true');\n\n const url = `${this.endpoints.broadcasts}${searchParams.toString() ? `?${searchParams}` : ''}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch broadcasts: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get a single broadcast by ID\n */\n async getBroadcast(id: number) {\n const response = await this.fetch(this.endpoints.broadcast(id));\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Broadcast not found');\n }\n throw new Error(`Failed to fetch broadcast: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get presigned URL for media playback\n *\n * @param broadcastId - Broadcast ID\n * @param hash - Broadcast hash (optional if using session token)\n * @param action - 'download' to force download, otherwise streams\n */\n async getPlaybackUrl(params: {\n broadcastId: number;\n hash?: string;\n action?: 'download';\n }): Promise<string> {\n const searchParams = new URLSearchParams({\n broadcastId: params.broadcastId.toString(),\n });\n\n if (params.hash) searchParams.set('hash', params.hash);\n if (params.action) searchParams.set('action', params.action);\n\n const url = `${this.endpoints.contentPlay}?${searchParams}`;\n const response = await this.fetch(url, {\n redirect: 'manual', // Don't follow redirect, we want the URL\n });\n\n // The endpoint returns a 307 redirect to the signed URL\n const location = response.headers.get('Location');\n if (!location) {\n throw new Error('No playback URL returned from API');\n }\n\n return location;\n }\n\n /**\n * Refresh a presigned URL before it expires\n *\n * @param broadcastId - Broadcast ID\n * @param hash - Broadcast hash\n * @param fileType - Type of media file\n */\n async refreshPresignedUrl(params: {\n broadcastId: number;\n hash: string;\n fileType: 'mp4' | 'mp3' | 'hls';\n }) {\n const searchParams = new URLSearchParams({\n broadcastId: params.broadcastId.toString(),\n hash: params.hash,\n fileType: params.fileType,\n });\n\n const url = `${this.endpoints.presignedUrl}?${searchParams}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to refresh URL: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n url: string;\n expiresAt: string;\n expiresIn: number;\n }>;\n }\n\n /**\n * Start a new audience tracking session\n *\n * @returns audienceId and optional resumePosition\n */\n async startSession(params: {\n contentId: number;\n broadcastId: number;\n appId: string;\n foreignId?: string | null;\n foreignTier?: string;\n sessionId: string;\n fileType: string;\n platform: string;\n userAgent: string | null;\n origin: string | null;\n country?: string | null;\n region?: string | null;\n }) {\n const response = await this.fetch(this.endpoints.sessionStart, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to start session: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n audienceId: string;\n resumePosition?: number;\n }>;\n }\n\n /**\n * Send a session ping event\n *\n * Event types:\n * - 0: PAUSE/STOP\n * - 1: PLAY/START\n * - 2: HEARTBEAT\n * - 3: UNMOUNT\n */\n async sendSessionPing(params: {\n audienceId: string;\n sessionId: string;\n eventType: 0 | 1 | 2 | 3;\n currentTime: number;\n duration: number;\n }) {\n const response = await this.fetch(this.endpoints.sessionPing, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send session ping: ${response.status} ${response.statusText}`);\n }\n\n // Session ping may return no body\n if (response.status === 204) {\n return;\n }\n\n return response.json();\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\n\ninterface AudioWaveformProps {\n /** Audio/video element for playback visualization */\n audioElement?: HTMLMediaElement | null;\n /** Media stream for live streaming visualization */\n mediaStream?: MediaStream | null;\n /** Whether the audio is currently playing (for playback mode) */\n isPlaying?: boolean;\n /** Whether this is currently a live stream (for HLS streams) */\n isLive?: boolean;\n}\n\n/**\n * Shared audio waveform visualization component\n * Can be used for both live streaming (MediaStream) and playback (HTMLVideoElement)\n */\nexport function AudioWaveform({\n audioElement,\n mediaStream,\n isPlaying = false,\n isLive = false,\n}: AudioWaveformProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const [setupError, setSetupError] = useState(false);\n const isPlayingRef = useRef(isPlaying);\n const isLiveRef = useRef(isLive);\n\n // Sync playing state ref\n useEffect(() => {\n isPlayingRef.current = isPlaying;\n }, [isPlaying]);\n\n // Sync live state ref\n useEffect(() => {\n isLiveRef.current = isLive;\n }, [isLive]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Validate audio element before using it\n // Accept both native HTMLMediaElement and custom elements with video/audio API (like HLS-VIDEO)\n if (audioElement) {\n const hasMediaAPI =\n \"play\" in audioElement &&\n \"pause\" in audioElement &&\n \"currentTime\" in audioElement;\n const isMediaElement = audioElement instanceof HTMLMediaElement;\n\n if (!hasMediaAPI && !isMediaElement) {\n console.warn(\n \"[AudioWaveform] Invalid audio element - missing media API\"\n );\n return;\n }\n\n console.log(\"[AudioWaveform] Audio element validation:\", {\n tagName: audioElement.tagName,\n isHTMLMediaElement: isMediaElement,\n hasMediaAPI: hasMediaAPI,\n willAttemptVisualization: true,\n });\n }\n\n // Check if we can use the audio element for visualization\n const canUseAudioElement =\n audioElement && audioElement instanceof HTMLMediaElement;\n\n // Check if this is specifically an HLS live stream (custom element)\n const isHLSLiveStream = audioElement && !canUseAudioElement;\n\n // If we don't have a valid source, or have a custom element, show static waveform\n if (\n (!audioElement && !mediaStream) ||\n (audioElement && !canUseAudioElement)\n ) {\n // Enhanced dynamic waveform for HLS live streams\n if (isHLSLiveStream) {\n let time = 0;\n let frozenTime = 0; // Store time when stream ends\n let wasFrozen = false; // Track if we've frozen\n let frameCount = 0;\n // Create unique phase offsets for each bar to desynchronize them\n const barPhases = Array.from(\n { length: 128 },\n () => Math.random() * Math.PI * 2\n );\n const barSpeeds = Array.from(\n { length: 128 },\n () => 0.8 + Math.random() * 0.4\n ); // Speed variance 0.8-1.2x\n const glowPhases = Array.from(\n { length: 128 },\n () => Math.random() * Math.PI * 2\n ); // Unique glow phase per bar\n const glowSpeeds = Array.from(\n { length: 128 },\n () => 0.7 + Math.random() * 0.6\n ); // Glow speed variance 0.7-1.3x\n\n const drawEnhancedWaveform = () => {\n frameCount++;\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n // Check current live state from ref (always up-to-date)\n const currentlyLive = isLiveRef.current;\n\n // Only increment time if stream is live\n if (currentlyLive) {\n time += 0.02;\n wasFrozen = false; // Reset frozen state if we go live again\n } else if (!wasFrozen) {\n // Stream just ended, freeze at current time\n frozenTime = time;\n wasFrozen = true;\n }\n\n // Use frozen time when paused\n const currentTime = wasFrozen ? frozenTime : time;\n\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const maxHeight = canvas.height * 0.9; // Allow bars to reach 90% of container height\n\n for (let i = 0; i < barCount; i++) {\n // Layer multiple sine waves with different frequencies for organic movement\n const primaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 2.5 -\n currentTime * barSpeeds[i] +\n barPhases[i]\n ) *\n (maxHeight * 0.35);\n const secondaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 4 -\n currentTime * barSpeeds[i] * 1.3 +\n barPhases[i] * 0.7\n ) *\n (maxHeight * 0.15);\n const tertiaryWave =\n Math.sin(\n (i / barCount) * Math.PI * 2 * 7 -\n currentTime * barSpeeds[i] * 0.8 +\n barPhases[i] * 1.5\n ) *\n (maxHeight * 0.1);\n\n // Combine waves for complex, organic height variation\n const baseHeight = maxHeight * 0.15;\n const combinedWave = primaryWave + secondaryWave + tertiaryWave;\n const barHeight = Math.max(\n 10,\n Math.min(maxHeight, baseHeight + combinedWave)\n ); // Min 10px, max 90% container\n\n // Multi-layered opacity variation for depth\n const opacityWave1 = Math.sin(\n (i / barCount) * Math.PI * 2 * 1.5 - currentTime * 1.2\n );\n const opacityWave2 = Math.sin(\n (i / barCount) * Math.PI * 2 * 3.5 - currentTime * 0.7\n );\n const opacity =\n 0.3 + opacityWave1 * 0.25 + opacityWave2 * 0.15; // Range: 0.3-0.7\n\n // Variable glow intensity - each bar has unique glow animation\n const glowWave = Math.sin(\n currentTime * glowSpeeds[i] + glowPhases[i]\n );\n const glowIntensity = 8 + glowWave * 12; // Range: 0-20 (varies per bar)\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n ctx.shadowBlur = glowIntensity;\n ctx.shadowColor = \"#3b82f6\";\n ctx.fillStyle = gradient;\n ctx.globalAlpha = Math.max(0.15, Math.min(0.9, opacity)); // Clamp between 0.15-0.9\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n const animationId = setInterval(drawEnhancedWaveform, 1000 / 60);\n return () => clearInterval(animationId);\n }\n\n // Simple static waveform for other cases (loading state, etc.)\n let waveOffset = 0;\n const drawPlaceholder = () => {\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n waveOffset += 0.0083;\n\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const baseHeight = 15;\n const waveAmplitude = 10;\n\n for (let i = 0; i < barCount; i++) {\n const wave =\n Math.sin((i / barCount) * Math.PI * 2 * 3 - waveOffset) *\n waveAmplitude;\n const barHeight = baseHeight + wave;\n const opacityWave = Math.sin(\n (i / barCount) * Math.PI * 2 * 2 - waveOffset * 1.5\n );\n const opacity = 0.5 + opacityWave * 0.3;\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n ctx.shadowBlur = 15;\n ctx.shadowColor = \"#3b82f6\";\n ctx.fillStyle = gradient;\n ctx.globalAlpha = opacity;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n const animationId = setInterval(drawPlaceholder, 1000 / 60);\n return () => clearInterval(animationId);\n }\n\n let audioContext: AudioContext | null = null;\n let analyser: AnalyserNode | null = null;\n let source:\n | MediaElementAudioSourceNode\n | MediaStreamAudioSourceNode\n | null = null;\n\n // Set up audio analyser\n try {\n audioContext = new AudioContext();\n analyser = audioContext.createAnalyser();\n analyser.fftSize = 2048;\n\n // Create source from either audio element or media stream\n if (audioElement) {\n // Playback mode: use HTMLVideoElement\n // Note: Custom elements like HLS-VIDEO are NOT supported by Web Audio API\n console.log(\"[AudioWaveform] Creating audio source from element:\", {\n tagName: audioElement.tagName,\n src: audioElement.src?.substring(0, 80),\n readyState: audioElement.readyState,\n paused: audioElement.paused,\n currentTime: audioElement.currentTime,\n hasSourceNode: !!(audioElement as any).audioSourceNode,\n isNativeElement: audioElement instanceof HTMLMediaElement,\n });\n\n // Web Audio API only works with native HTMLMediaElement (VIDEO, AUDIO tags)\n // Custom elements like HLS-VIDEO are not supported\n if (!(audioElement instanceof HTMLMediaElement)) {\n console.warn(\n \"[AudioWaveform] Cannot visualize custom element (HLS-VIDEO), falling back to static waveform\"\n );\n setSetupError(true);\n return; // Let the placeholder waveform handle it\n }\n\n // Check if source was already created (can only call createMediaElementSource once per element)\n if ((audioElement as any).audioSourceNode) {\n console.log(\n \"[AudioWaveform] Audio source already exists, reusing it\"\n );\n source = (audioElement as any).audioSourceNode;\n source?.connect(analyser);\n analyser.connect(audioContext.destination);\n } else {\n try {\n source = audioContext.createMediaElementSource(audioElement);\n source.connect(analyser);\n analyser.connect(audioContext.destination);\n // Store reference so we don't try to create it again\n (audioElement as any).audioSourceNode = source;\n console.log(\n \"[AudioWaveform] Audio source created and connected successfully\"\n );\n } catch (error) {\n console.error(\n \"[AudioWaveform] Failed to create media element source:\",\n error\n );\n setSetupError(true);\n return; // Let the placeholder waveform handle it\n }\n }\n\n // Track if audio is actually playing\n audioElement.addEventListener(\"play\", () => {\n console.log(\"[AudioWaveform] Play event - setting isPlaying to true\");\n isPlayingRef.current = true;\n });\n audioElement.addEventListener(\"pause\", () => {\n console.log(\n \"[AudioWaveform] Pause event - setting isPlaying to false\"\n );\n isPlayingRef.current = false;\n });\n audioElement.addEventListener(\"ended\", () => {\n console.log(\n \"[AudioWaveform] Ended event - setting isPlaying to false\"\n );\n isPlayingRef.current = false;\n });\n\n // Log initial state\n console.log(\"[AudioWaveform] Initial audio state:\", {\n paused: audioElement.paused,\n currentTime: audioElement.currentTime,\n readyState: audioElement.readyState,\n });\n\n // Set initial playing state based on audio element\n if (!audioElement.paused) {\n isPlayingRef.current = true;\n }\n } else if (mediaStream) {\n // Live streaming mode: use MediaStream\n source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyser);\n // Note: Don't connect to destination for live streams - we don't want to echo the audio\n isPlayingRef.current = true; // Always \"playing\" for live streams\n } else {\n // No audio source provided\n return;\n }\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n let waveOffset = 0;\n\n const drawStaticWaveform = () => {\n // Clear canvas\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create gradient\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\");\n gradient.addColorStop(0.3, \"#3b82f6\");\n gradient.addColorStop(0.6, \"#8b5cf6\");\n gradient.addColorStop(1, \"#ec4899\");\n\n // Animate wave (super subtle speed)\n waveOffset += 0.0083;\n\n // Draw animated wave\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n const baseHeight = 15; // Half the previous height\n const waveAmplitude = 10; // How much the bars grow/shrink (more subtle)\n\n for (let i = 0; i < barCount; i++) {\n // Create smooth wave using sine function (subtract to flow right)\n const wave =\n Math.sin((i / barCount) * Math.PI * 2 * 3 - waveOffset) *\n waveAmplitude;\n const barHeight = baseHeight + wave;\n\n // Create opacity wave (dims and brightens as it flows)\n const opacityWave = Math.sin(\n (i / barCount) * Math.PI * 2 * 2 - waveOffset * 1.5\n );\n const opacity = 0.5 + opacityWave * 0.3; // Increased from 0.3 + 0.2 for better visibility\n\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n // Add subtle glow\n ctx.shadowBlur = 15; // Increased glow\n ctx.shadowColor = \"#3b82f6\";\n\n ctx.fillStyle = gradient;\n ctx.globalAlpha = opacity;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n ctx.globalAlpha = 1.0;\n ctx.shadowBlur = 0;\n };\n\n let frameCount = 0;\n const draw = () => {\n if (!analyser) return;\n animationFrameRef.current = requestAnimationFrame(draw);\n\n analyser.getByteFrequencyData(dataArray);\n\n // Check if there's actual audio activity\n const hasActivity = dataArray.some((value) => value > 0);\n const maxValue = Math.max(...dataArray);\n\n // Debug logging - log first 5 frames and then every 60 frames (once per second at 60fps)\n frameCount++;\n if (frameCount < 5 || frameCount % 60 === 0) {\n console.log(\"[AudioWaveform] Frame\", frameCount, \"Audio activity:\", {\n hasActivity,\n maxValue,\n isPlaying: isPlayingRef.current,\n sampleValues: [\n dataArray[0],\n dataArray[10],\n dataArray[50],\n dataArray[100],\n ],\n avgValue:\n dataArray.reduce((a, b) => a + b, 0) / dataArray.length,\n });\n }\n\n if (!hasActivity || !isPlayingRef.current) {\n // Show static waveform when paused/stopped\n if (frameCount < 5) {\n console.log(\n \"[AudioWaveform] No activity or not playing, showing static waveform\"\n );\n }\n drawStaticWaveform();\n return;\n }\n\n // Clear canvas with dark background for trail effect\n ctx.fillStyle = \"rgba(0, 0, 0, 0.1)\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create gradient from cyan/blue to purple/pink\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n gradient.addColorStop(0, \"#06b6d4\"); // cyan\n gradient.addColorStop(0.3, \"#3b82f6\"); // blue\n gradient.addColorStop(0.6, \"#8b5cf6\"); // purple\n gradient.addColorStop(1, \"#ec4899\"); // pink\n\n // Draw frequency bars\n const barCount = 128;\n const barWidth = canvas.width / barCount;\n const gap = 2;\n\n for (let i = 0; i < barCount; i++) {\n const barHeight = (dataArray[i] / 255) * canvas.height * 0.8;\n const x = i * barWidth;\n const y = canvas.height / 2 - barHeight / 2;\n\n // Add glow effect\n ctx.shadowBlur = 20;\n ctx.shadowColor = \"#3b82f6\";\n\n // Draw bar\n ctx.fillStyle = gradient;\n ctx.fillRect(x + gap / 2, y, barWidth - gap, barHeight);\n }\n\n // Reset shadow for next frame\n ctx.shadowBlur = 0;\n };\n\n draw();\n } catch (error) {\n console.error(\"Error setting up audio visualization:\", error);\n setSetupError(true);\n\n // Draw a static flat line if visualization fails\n if (ctx) {\n ctx.fillStyle = \"#000\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(0, canvas.height / 2);\n ctx.lineTo(canvas.width, canvas.height / 2);\n ctx.stroke();\n }\n }\n\n return () => {\n // Cleanup animation frame\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n // Close audio context\n if (audioContext) {\n audioContext.close();\n }\n };\n }, [audioElement, mediaStream, isLive]);\n\n return (\n <div className=\"w-full h-full\">\n <canvas\n ref={canvasRef}\n width={1600}\n height={400}\n className=\"w-full h-full\"\n style={{ display: \"block\" }}\n />\n {setupError && (\n <p className=\"text-gray-400 text-xs text-center mt-2 absolute bottom-4\">\n Audio visualization unavailable\n </p>\n )}\n </div>\n );\n}\n","\n/**\n * Shared Loading Spinner Component\n */\n\ninterface LoadingSpinnerProps {\n /**\n * Optional text to display below the spinner\n */\n text?: string;\n /**\n * Size variant of the spinner\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Color scheme\n * @default \"default\"\n */\n variant?: \"default\" | \"primary\" | \"white\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-4\",\n lg: \"h-12 w-12 border-4\",\n};\n\nconst variantClasses = {\n default:\n \"border-gray-200 dark:border-gray-800 border-t-black dark:border-t-white\",\n primary:\n \"border-gray-300 dark:border-gray-700 border-t-blue-600 dark:border-t-blue-400\",\n white: \"border-gray-600 border-t-white\",\n};\n\n/**\n * Loading spinner component with optional text\n *\n * @example\n * <LoadingSpinner />\n * <LoadingSpinner text=\"Loading broadcasts...\" size=\"lg\" />\n * <LoadingSpinner variant=\"white\" />\n */\nexport function LoadingSpinner({\n text,\n size = \"md\",\n variant = \"default\",\n}: LoadingSpinnerProps) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3\">\n <div\n className={`${sizeClasses[size]} ${variantClasses[variant]} rounded-full animate-spin`}\n role=\"status\"\n aria-label=\"Loading\"\n />\n {text && <p className=\"text-sm text-gray-500 dark:text-gray-400\">{text}</p>}\n </div>\n );\n}\n","/**\n * CDN domain for broadcast content\n * Can be overridden via environment variable CONTENT_CDN_DOMAIN\n */\nexport const CDN_DOMAIN =\n typeof process !== \"undefined\" && process.env?.CONTENT_CDN_DOMAIN\n ? process.env.CONTENT_CDN_DOMAIN\n : \"cdn.dialtribe.com\";\n\n/**\n * Shard a hash by inserting slashes between characters\n * Example: \"abc123\" → \"a/b/c/1/2/3\"\n */\nfunction shardHash(hash: string): string {\n return hash.toLowerCase().split(\"\").join(\"/\");\n}\n\n/**\n * Build S3 key prefix for broadcast files\n *\n * @param appHash - App S3 hash\n * @param broadcastHash - Broadcast hash\n * @returns S3 key prefix with trailing slash\n */\nexport function buildBroadcastS3KeyPrefix(\n appHash: string,\n broadcastHash: string\n): string {\n return `a/${shardHash(appHash)}/b/${shardHash(broadcastHash)}/`;\n}\n\n/**\n * Build CDN URL for a broadcast file (HLS)\n *\n * @param appHash - App S3 hash\n * @param broadcastHash - Broadcast hash\n * @param filename - File name (e.g., \"index.m3u8\", \"seg-0-000001.ts\")\n * @returns CDN URL\n */\nexport function buildBroadcastCdnUrl(\n appHash: string,\n broadcastHash: string,\n filename: string\n): string {\n const keyPrefix = buildBroadcastS3KeyPrefix(appHash, broadcastHash);\n return `https://${CDN_DOMAIN}/${keyPrefix}${filename}`;\n}\n","/**\n * Format seconds to time string (HH:MM:SS or MM:SS)\n *\n * @param seconds - Number of seconds\n * @param includeHours - Whether to always include hours (default: auto-detect)\n * @returns Formatted time string\n *\n * Examples:\n * - formatTime(45) → \"0:45\"\n * - formatTime(125) → \"2:05\"\n * - formatTime(3665) → \"1:01:05\"\n */\nexport function formatTime(seconds: number, includeHours?: boolean): string {\n if (isNaN(seconds) || !isFinite(seconds) || seconds < 0) {\n return \"0:00\";\n }\n\n const hrs = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n const secStr = secs.toString().padStart(2, \"0\");\n const minStr = mins.toString().padStart(2, \"0\");\n\n if (hrs > 0 || includeHours) {\n return `${hrs}:${minStr}:${secStr}`;\n }\n\n return `${mins}:${secStr}`;\n}\n","export const HTTP_STATUS = {\n // 2xx Success\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n\n // 3xx Redirection\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n // 4xx Client Errors\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n CONFLICT: 409,\n GONE: 410,\n PAYLOAD_TOO_LARGE: 413,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n // 5xx Server Errors\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n} as const;\n\n// Type-safe status code type\nexport type HttpStatusCode = typeof HTTP_STATUS[keyof typeof HTTP_STATUS];\n","/**\n * Debug logging utility\n * Only logs in development mode to avoid exposing internals in production\n */\n\nconst DEBUG = process.env.NODE_ENV === 'development';\n\nexport const debug = {\n log: (...args: unknown[]) => {\n if (DEBUG) console.log(...args);\n },\n\n warn: (...args: unknown[]) => {\n if (DEBUG) console.warn(...args);\n },\n\n error: (...args: unknown[]) => {\n if (DEBUG) console.error(...args);\n },\n};\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport ReactPlayer from \"react-player\";\n\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport { buildBroadcastCdnUrl } from \"../utils/cdn\";\nimport { formatTime } from \"../utils/format\";\nimport { HTTP_STATUS } from \"../utils/http-status\";\nimport { debug } from \"../utils/debug\";\nimport { useDialTribe } from \"../context/DialTribeProvider\";\nimport { DialTribeClient, ENDPOINTS } from \"../client/DialTribeClient\";\nimport type { Broadcast, TranscriptData } from \"../types/broadcast\";\n\n// Constants for URL refresh behavior\nconst URL_EXPIRATION_MS = 6 * 60 * 60 * 1000; // 6 hours\nconst REFRESH_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes before expiration\nconst REFRESH_CHECK_INTERVAL_MS = 60000; // Check every 1 minute\nconst PLAYBACK_RESUME_DELAY_MS = 500; // Wait for player to load new URL\nconst TRAILING_WORDS = 3; // Number of trailing words to highlight in transcript\n\n/**\n * Build a playback URL for the content/play endpoint\n */\nfunction buildPlaybackUrl(broadcastId: number, hash: string, action?: 'download'): string {\n const searchParams = new URLSearchParams({\n broadcastId: broadcastId.toString(),\n hash,\n });\n if (action) {\n searchParams.set('action', action);\n }\n return `${ENDPOINTS.contentPlay}?${searchParams}`;\n}\n\n/**\n * Get a user-friendly error message based on the error type\n */\nfunction getErrorMessage(error: unknown): string {\n if (!error) return 'Unable to play media. Please try again.';\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorCode = (error as any)?.code;\n const errorStatus = (error as any)?.status || (error as any)?.statusCode;\n\n // Network errors\n if (errorMsg.toLowerCase().includes('network') || errorMsg.includes('NetworkError')) {\n return 'No internet connection detected. Please check your network and try again.';\n }\n\n // Session/Auth errors\n if (errorStatus === 401 || errorMsg.includes('401') || errorMsg.includes('Unauthorized')) {\n return 'Session expired. Please refresh the page and log in again.';\n }\n\n if (errorStatus === 403 || errorMsg.includes('403') || errorMsg.includes('Forbidden')) {\n return 'Access denied. You may not have permission to view this content.';\n }\n\n // Not found errors\n if (errorStatus === 404 || errorMsg.includes('404') || errorMsg.includes('not found')) {\n return 'Media file not found. It may have been deleted or is still processing.';\n }\n\n // Media errors\n if (errorMsg.includes('no supported sources') || errorMsg.includes('NotSupportedError')) {\n return 'This media format is not supported by your browser. Try using Chrome, Firefox, or Safari.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_SRC_NOT_SUPPORTED') || errorCode === 4) {\n return 'Media file is not available or the format is unsupported.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_NETWORK') || errorCode === 2) {\n return 'Network error while loading media. Please check your connection.';\n }\n\n if (errorMsg.includes('MEDIA_ERR_DECODE') || errorCode === 3) {\n return 'Media file is corrupted or cannot be decoded. Please contact support.';\n }\n\n if (errorMsg.includes('AbortError')) {\n return 'Media loading was interrupted. Please try again.';\n }\n\n // Generic fallback\n return 'Unable to play media. Please try refreshing the page or contact support if the problem persists.';\n}\n\nexport interface BroadcastPlayerProps {\n /** Broadcast data from DialTribe API */\n broadcast: Broadcast;\n\n /** Optional: App ID for tracking */\n appId?: string;\n\n /** Optional: Content ID for tracking */\n contentId?: number;\n\n /** Foreign user ID from partner system (any tier) */\n foreignId?: string;\n\n /** Tier name from partner system (e.g., 'guest', 'member', 'subscriber_gold') */\n foreignTier?: string;\n\n /**\n * Optional render prop for clip creator\n * If provided, the \"Create Clip\" button will be shown and this will be called when clicked\n */\n renderClipCreator?: (props: {\n isOpen: boolean;\n onClose: () => void;\n sourceVideoUrl?: string;\n sourceAudioUrl?: string;\n sourceDuration: number;\n onPauseParent: () => void;\n }) => React.ReactNode;\n\n /** Optional: Called when player encounters error */\n onError?: (error: Error) => void;\n\n /** Optional: Custom CSS classes */\n className?: string;\n\n /** Optional: Enable keyboard shortcuts (Space, arrows, M, F, etc.). Default: false */\n enableKeyboardShortcuts?: boolean;\n}\n\n/**\n * BroadcastPlayer - Core media player component (no modal wrapper)\n *\n * Plays video/audio broadcasts with transcript, waveform visualization, and clip creation.\n * Uses DialTribeClient for authenticated API calls.\n *\n * @example\n * ```tsx\n * <BroadcastPlayer\n * broadcast={broadcast}\n * appId=\"app_123\"\n * contentId={456}\n * />\n * ```\n */\nexport function BroadcastPlayer({\n broadcast,\n appId,\n contentId,\n foreignId,\n foreignTier = \"guest\",\n renderClipCreator,\n onError,\n className = \"\",\n enableKeyboardShortcuts = false,\n}: BroadcastPlayerProps) {\n // Get session token and API base URL from context\n const { sessionToken, setSessionToken, markExpired, apiBaseUrl } = useDialTribe();\n\n // Create API client with token refresh handlers (stable reference)\n const clientRef = useRef<DialTribeClient | null>(null);\n\n // Initialize or update client when token changes\n if (!clientRef.current && sessionToken) {\n clientRef.current = new DialTribeClient({\n sessionToken,\n apiBaseUrl,\n onTokenRefresh: (newToken, expiresAt) => {\n debug.log(`[DialTribeClient] Token refreshed, expires at ${expiresAt}`);\n setSessionToken(newToken, expiresAt);\n },\n onTokenExpired: () => {\n debug.error('[DialTribeClient] Token expired');\n markExpired();\n },\n });\n } else if (clientRef.current && sessionToken) {\n // Update token in existing client\n clientRef.current.setSessionToken(sessionToken);\n }\n\n const client = clientRef.current;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const playerRef = useRef<any>(null); // ReactPlayer doesn't export proper types\n const transcriptContainerRef = useRef<HTMLDivElement>(null);\n const activeWordRef = useRef<HTMLSpanElement>(null);\n const [audioElement, setAudioElement] = useState<HTMLMediaElement | null>(null);\n const [playing, setPlaying] = useState(false);\n const [played, setPlayed] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [muted, setMuted] = useState(false);\n const [seeking, setSeeking] = useState(false);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState(\"\");\n const [hasEnded, setHasEnded] = useState(false);\n const [hasStreamEnded, setHasStreamEnded] = useState(false);\n const [showTranscript, setShowTranscript] = useState(false);\n const [transcriptData, setTranscriptData] = useState<TranscriptData | null>(null);\n const [currentTime, setCurrentTime] = useState(0);\n const [isLoadingTranscript, setIsLoadingTranscript] = useState(false);\n const [isLoadingVideo, setIsLoadingVideo] = useState(true);\n const [autoScrollEnabled, setAutoScrollEnabled] = useState(true);\n const isScrollingProgrammatically = useRef(false);\n const lastActiveWordIndex = useRef<number>(-1);\n const [showClipCreator, setShowClipCreator] = useState(false);\n\n // Track initial playback type\n const initialPlaybackTypeRef = useRef<string | null>(null);\n const [currentPlaybackInfo, setCurrentPlaybackInfo] = useState<{ url: string; type: string } | null>(null);\n const [urlExpiresAt, setUrlExpiresAt] = useState<Date | null>(null);\n const isRefreshingUrl = useRef(false);\n\n // Audience tracking state\n const [audienceId, setAudienceId] = useState<string | null>(null);\n const [sessionId] = useState<string>(() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n });\n const heartbeatIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const hasInitializedSession = useRef(false);\n\n /**\n * Refresh presigned URL when it expires\n */\n const refreshPresignedUrl = useCallback(\n async (fileType: 'mp4' | 'mp3' | 'hls'): Promise<boolean> => {\n if (!broadcast.hash || isRefreshingUrl.current || !client) {\n debug.log('[URL Refresh] Skipping refresh - no hash, already refreshing, or no client');\n return false;\n }\n\n // HLS doesn't need refresh (direct CloudFront URLs)\n if (fileType === 'hls') {\n debug.log('[URL Refresh] HLS does not need URL refresh');\n return false;\n }\n\n isRefreshingUrl.current = true;\n debug.log(`[URL Refresh] Refreshing ${fileType} URL for broadcast ${broadcast.id}`);\n\n try {\n const data = await client.refreshPresignedUrl({\n broadcastId: broadcast.id,\n hash: broadcast.hash,\n fileType,\n });\n\n debug.log(`[URL Refresh] Successfully refreshed URL, expires at ${data.expiresAt}`);\n\n // Update playback info with new URL\n setCurrentPlaybackInfo({ url: data.url, type: fileType });\n setUrlExpiresAt(new Date(data.expiresAt));\n\n // Clear error state\n if (errorMessage.includes('URL') || errorMessage.includes('session') || errorMessage.includes('refresh')) {\n setHasError(false);\n setErrorMessage('');\n }\n\n return true;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n debug.log('[URL Refresh] Request aborted');\n return false;\n }\n\n debug.error('[URL Refresh] Failed to refresh presigned URL:', error);\n setHasError(true);\n setErrorMessage('Unable to refresh media URL. The session may have expired.');\n if (onError && error instanceof Error) {\n onError(error);\n }\n return false;\n } finally {\n isRefreshingUrl.current = false;\n }\n },\n [broadcast.hash, broadcast.id, errorMessage, client, onError]\n );\n\n /**\n * Detect screen size category\n */\n const getScreenSize = () => {\n if (typeof window === 'undefined') return 'unknown';\n const width = window.innerWidth;\n if (width < 768) return 'mobile';\n if (width < 1024) return 'tablet';\n return 'desktop';\n };\n\n /**\n * Initialize audience tracking session\n */\n const initializeTrackingSession = useCallback(async () => {\n // Only track recorded content (not live HLS)\n if (!contentId || !appId || !client) return;\n if (currentPlaybackInfo?.type === 'hls' && broadcast.broadcastStatus === 1) return;\n\n // Prevent duplicate initialization\n if (hasInitializedSession.current) return;\n hasInitializedSession.current = true;\n\n try {\n const screenSize = getScreenSize();\n const platformInfo = `${navigator.platform || 'Unknown'} (${screenSize})`;\n\n const data = await client.startSession({\n contentId,\n broadcastId: broadcast.id,\n appId,\n foreignId: foreignId || null,\n foreignTier: foreignTier || 'guest',\n sessionId,\n fileType: currentPlaybackInfo?.type || 'mp3',\n platform: platformInfo,\n userAgent: navigator.userAgent || null,\n origin: window.location.origin || null,\n country: null,\n region: null,\n });\n\n setAudienceId(data.audienceId);\n\n if (data.resumePosition && data.resumePosition > 0 && audioElement) {\n audioElement.currentTime = data.resumePosition;\n debug.log(`[Audience Tracking] Resumed playback at ${data.resumePosition}s`);\n }\n\n debug.log('[Audience Tracking] Session initialized:', data.audienceId);\n } catch (error) {\n debug.error('[Audience Tracking] Error initializing session:', error);\n if (onError && error instanceof Error) {\n onError(error);\n }\n }\n }, [contentId, appId, broadcast.id, broadcast.broadcastStatus, foreignId, foreignTier, sessionId, currentPlaybackInfo?.type, audioElement, client, onError]);\n\n /**\n * Send audience tracking ping event\n */\n const sendTrackingPing = useCallback(\n async (eventType: 0 | 1 | 2 | 3) => {\n if (!audienceId || !sessionId || !client) return;\n\n try {\n await client.sendSessionPing({\n audienceId,\n sessionId,\n eventType,\n currentTime: Math.floor(audioElement?.currentTime || 0),\n duration: Math.floor(duration || 0),\n });\n } catch (error) {\n debug.error('[Audience Tracking] Error sending ping:', error);\n }\n },\n [audienceId, sessionId, audioElement, duration, client]\n );\n\n /**\n * Determine which URL and type to use for playback\n */\n const getPlaybackInfo = () => {\n // Live HLS streams - use direct CloudFront URL\n if (broadcast.broadcastStatus === 1) {\n if (broadcast.hlsPlaylistUrl) {\n return { url: broadcast.hlsPlaylistUrl, type: 'hls' };\n }\n if (broadcast.hash && broadcast.app?.s3Hash) {\n const hlsUrl = buildBroadcastCdnUrl(broadcast.app.s3Hash, broadcast.hash, 'index.m3u8');\n return { url: hlsUrl, type: 'hls' };\n }\n }\n\n // MP4 recordings - use secure playback endpoint\n // ReactPlayer will follow the 307 redirect to the presigned S3 URL\n if (broadcast.recordingMp4Url && broadcast.isVideo && broadcast.hash) {\n return { url: buildPlaybackUrl(broadcast.id, broadcast.hash), type: 'mp4' };\n }\n\n // MP3 recordings - use secure playback endpoint\n // ReactPlayer will follow the 307 redirect to the presigned S3 URL\n if (broadcast.recordingMp3Url && broadcast.hash) {\n return { url: buildPlaybackUrl(broadcast.id, broadcast.hash), type: 'mp3' };\n }\n\n // Offline HLS - use direct CloudFront URL\n if (broadcast.hlsPlaylistUrl) {\n return { url: broadcast.hlsPlaylistUrl, type: 'hls' };\n }\n\n return null;\n };\n\n // Initialize playback info on first render\n useEffect(() => {\n if (!currentPlaybackInfo) {\n const info = getPlaybackInfo();\n setCurrentPlaybackInfo(info);\n initialPlaybackTypeRef.current = info?.type || null;\n\n // Set expiration time for presigned URLs\n if (info && (info.type === 'mp4' || info.type === 'mp3')) {\n const expiresAt = new Date(Date.now() + URL_EXPIRATION_MS);\n setUrlExpiresAt(expiresAt);\n debug.log(`[URL Refresh] Initial ${info.type} URL expires at ${expiresAt.toISOString()}`);\n }\n\n // Auto-play when component mounts\n if (info) {\n setPlaying(true);\n setIsLoadingVideo(true);\n }\n }\n }, [currentPlaybackInfo]);\n\n // Reset loading state when playback URL changes\n useEffect(() => {\n if (currentPlaybackInfo?.url) {\n setIsLoadingVideo(true);\n }\n }, [currentPlaybackInfo?.url]);\n\n // Proactively refresh presigned URLs before they expire\n useEffect(() => {\n if (!urlExpiresAt || !currentPlaybackInfo?.type) return;\n\n const checkExpiration = () => {\n const now = new Date();\n const timeUntilExpiration = urlExpiresAt.getTime() - now.getTime();\n\n if (timeUntilExpiration <= REFRESH_THRESHOLD_MS && timeUntilExpiration > 0) {\n debug.log('[URL Refresh] Proactively refreshing URL before expiration');\n\n const fileType = currentPlaybackInfo.type;\n if (fileType === 'mp4' || fileType === 'mp3' || fileType === 'hls') {\n refreshPresignedUrl(fileType);\n }\n }\n };\n\n const interval = setInterval(checkExpiration, REFRESH_CHECK_INTERVAL_MS);\n checkExpiration();\n\n return () => {\n clearInterval(interval);\n };\n }, [urlExpiresAt, currentPlaybackInfo?.type, refreshPresignedUrl]);\n\n // When live HLS stream ends and MP3 is available, switch to MP3\n useEffect(() => {\n if (\n initialPlaybackTypeRef.current === 'hls' &&\n currentPlaybackInfo?.type === 'hls' &&\n broadcast.broadcastStatus !== 1 &&\n broadcast.recordingMp3Url &&\n broadcast.hash &&\n parseInt(broadcast.mp3Size || \"0\") > 0\n ) {\n const secureUrl = buildPlaybackUrl(broadcast.id, broadcast.hash);\n setCurrentPlaybackInfo({ url: secureUrl, type: 'mp3' });\n setAudioElement(null);\n setPlaying(true);\n }\n }, [broadcast.broadcastStatus, broadcast.recordingMp3Url, broadcast.mp3Size, broadcast.hash, broadcast.id, currentPlaybackInfo]);\n\n const playbackUrl = currentPlaybackInfo?.url || null;\n const playbackType = currentPlaybackInfo?.type || null;\n const isAudioOnly = playbackType === 'mp3' || (!broadcast.isVideo && playbackType !== 'mp4');\n const isLiveStream = broadcast.broadcastStatus === 1 && playbackType === 'hls' && !hasStreamEnded;\n const wasLiveStream = initialPlaybackTypeRef.current === 'hls';\n\n /**\n * Format time as HH:MM:SS for transcript timestamps\n */\n const formatTimestamp = (seconds: number) => {\n if (!seconds || isNaN(seconds) || !isFinite(seconds)) return \"00:00:00\";\n const hrs = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n return `${hrs.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handlePlay = () => {\n setPlaying(true);\n setIsLoadingVideo(false);\n };\n\n const handlePause = () => {\n setPlaying(false);\n };\n\n const handleEnded = () => {\n setPlaying(false);\n if (playbackType === 'hls') {\n setHasStreamEnded(true);\n }\n if (!wasLiveStream) {\n setHasEnded(true);\n }\n };\n\n // Initialize duration from broadcast data\n useEffect(() => {\n if (broadcast.durationSeconds && broadcast.durationSeconds > 0) {\n setDuration(broadcast.durationSeconds);\n }\n }, [broadcast.durationSeconds]);\n\n // Auto-play live streams\n useEffect(() => {\n if (isLiveStream && !playing) {\n setPlaying(true);\n }\n }, [isLiveStream, playing]);\n\n // Initialize audience tracking session\n useEffect(() => {\n if (currentPlaybackInfo && audioElement && !hasInitializedSession.current) {\n initializeTrackingSession();\n }\n }, [currentPlaybackInfo, audioElement, initializeTrackingSession]);\n\n // Set up heartbeat interval when playing\n useEffect(() => {\n if (playing && audienceId) {\n sendTrackingPing(1); // PLAY_START\n\n heartbeatIntervalRef.current = setInterval(() => {\n sendTrackingPing(2); // HEARTBEAT\n }, 15000);\n\n return () => {\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current);\n heartbeatIntervalRef.current = null;\n }\n };\n } else if (!playing && audienceId) {\n sendTrackingPing(0); // PAUSE_STOP\n\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current);\n heartbeatIntervalRef.current = null;\n }\n }\n }, [playing, audienceId, sendTrackingPing]);\n\n // Send unmount event\n useEffect(() => {\n return () => {\n if (audienceId && sessionId && sessionToken) {\n const payload = {\n audienceId,\n sessionId,\n eventType: 3, // UNMOUNT\n currentTime: Math.floor(audioElement?.currentTime || 0),\n duration: Math.floor(duration || 0),\n };\n\n const headers = {\n 'Authorization': `Bearer ${sessionToken}`,\n 'Content-Type': 'application/json',\n };\n // Note: sendBeacon doesn't support custom headers, so we use fetch with keepalive\n fetch(ENDPOINTS.sessionPing, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n keepalive: true,\n }).catch(() => {\n // Silently fail - component is unmounting\n });\n }\n };\n }, [audienceId, sessionId, sessionToken, audioElement, duration]);\n\n // Fetch transcript\n useEffect(() => {\n if (broadcast.transcriptUrl && broadcast.transcriptStatus === 2 && !transcriptData) {\n setIsLoadingTranscript(true);\n fetch(broadcast.transcriptUrl)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`Failed to fetch transcript: ${res.status} ${res.statusText}`);\n }\n return res.json();\n })\n .then((data) => {\n // Assign words to segments if needed\n if (data.segments && data.words && !data.segments[0]?.words) {\n data.segments = data.segments.map((segment: any, index: number) => {\n const segmentWords = data.words!.filter((word: any) => {\n if (index === data.segments!.length - 1) {\n return word.start >= segment.start;\n }\n return word.start >= segment.start && word.start < segment.end;\n });\n return {\n ...segment,\n words: segmentWords,\n };\n });\n }\n\n setTranscriptData(data);\n setIsLoadingTranscript(false);\n })\n .catch((error) => {\n debug.error('[Transcript] Failed to load transcript:', error);\n setIsLoadingTranscript(false);\n });\n }\n }, [broadcast.transcriptUrl, broadcast.transcriptStatus, transcriptData]);\n\n // Update current time\n useEffect(() => {\n if (!audioElement) return;\n\n const handleTimeUpdate = () => {\n setCurrentTime(audioElement.currentTime);\n };\n\n audioElement.addEventListener('timeupdate', handleTimeUpdate);\n return () => audioElement.removeEventListener('timeupdate', handleTimeUpdate);\n }, [audioElement]);\n\n // Auto-scroll to active word\n useEffect(() => {\n if (showTranscript && autoScrollEnabled && activeWordRef.current && transcriptContainerRef.current) {\n const container = transcriptContainerRef.current;\n const activeWord = activeWordRef.current;\n const containerRect = container.getBoundingClientRect();\n const wordRect = activeWord.getBoundingClientRect();\n\n if (wordRect.top < containerRect.top || wordRect.bottom > containerRect.bottom) {\n isScrollingProgrammatically.current = true;\n activeWord.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n setTimeout(() => {\n isScrollingProgrammatically.current = false;\n }, 500);\n }\n }\n }, [currentTime, showTranscript, autoScrollEnabled]);\n\n // Detect manual scrolling\n useEffect(() => {\n if (!showTranscript || !transcriptContainerRef.current) return;\n\n const container = transcriptContainerRef.current;\n\n const handleScroll = () => {\n if (!isScrollingProgrammatically.current && autoScrollEnabled) {\n setAutoScrollEnabled(false);\n }\n };\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [showTranscript, autoScrollEnabled]);\n\n const handlePlayPause = () => {\n if (hasEnded) {\n if (audioElement) {\n audioElement.currentTime = 0;\n }\n setHasEnded(false);\n }\n setPlaying(!playing);\n };\n\n const handleRestart = () => {\n if (audioElement) {\n audioElement.currentTime = 0;\n }\n setHasEnded(false);\n setPlaying(true);\n };\n\n const handleVideoClick = () => {\n if (!isLiveStream) {\n handlePlayPause();\n }\n };\n\n const handleSeekChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value);\n setPlayed(newValue);\n };\n\n const handleSeekMouseDown = () => {\n setSeeking(true);\n };\n\n const handleSeekMouseUp = (e: React.MouseEvent<HTMLInputElement>) => {\n const seekValue = parseFloat((e.target as HTMLInputElement).value);\n setSeeking(false);\n\n if (audioElement && duration > 0) {\n const seekTime = seekValue * duration;\n audioElement.currentTime = seekTime;\n setHasEnded(false);\n }\n };\n\n const handleSeekTouchStart = () => {\n setSeeking(true);\n };\n\n const handleSeekTouchEnd = (e: React.TouchEvent<HTMLInputElement>) => {\n const seekValue = parseFloat((e.target as HTMLInputElement).value);\n setSeeking(false);\n\n if (audioElement && duration > 0) {\n const seekTime = seekValue * duration;\n audioElement.currentTime = seekTime;\n setHasEnded(false);\n }\n };\n\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (!seeking) {\n const video = e.currentTarget;\n const playedFraction = video.duration > 0 ? video.currentTime / video.duration : 0;\n setPlayed(playedFraction);\n }\n };\n\n const handleLoadedMetadata = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n setAudioElement(video);\n\n if (video.duration && !isNaN(video.duration) && video.duration > 0) {\n setDuration(video.duration);\n } else if (broadcast.durationSeconds && broadcast.durationSeconds > 0) {\n setDuration(broadcast.durationSeconds);\n }\n };\n\n const handlePlayerReady = (player?: any) => {\n try {\n const internalPlayer = player?.getInternalPlayer?.();\n\n if (internalPlayer && internalPlayer instanceof HTMLMediaElement) {\n setAudioElement(internalPlayer);\n }\n } catch (error) {\n debug.error('[BroadcastPlayer] Error getting internal player:', error);\n }\n };\n\n // Audio element detection\n useEffect(() => {\n const findAudioElement = () => {\n const videoElements = document.querySelectorAll('video, audio');\n\n if (videoElements.length > 0) {\n const element = videoElements[0] as HTMLVideoElement;\n setAudioElement(element);\n return true;\n }\n return false;\n };\n\n if (!findAudioElement()) {\n const retryIntervals = [100, 300, 500, 1000, 1500, 2000, 3000, 4000, 5000];\n const timeouts = retryIntervals.map((delay) =>\n setTimeout(() => {\n findAudioElement();\n }, delay)\n );\n\n return () => timeouts.forEach(clearTimeout);\n }\n }, [playbackUrl]);\n\n useEffect(() => {\n if (playing && !audioElement) {\n const videoElements = document.querySelectorAll('video, audio');\n if (videoElements.length > 0) {\n const element = videoElements[0] as HTMLVideoElement;\n setAudioElement(element);\n }\n }\n }, [playing, audioElement]);\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n };\n\n const toggleMute = () => {\n setMuted(!muted);\n };\n\n const toggleFullscreen = async () => {\n try {\n if (document.fullscreenElement) {\n await document.exitFullscreen();\n return;\n }\n\n let videoElement = null;\n\n if (playerRef.current && typeof playerRef.current.getInternalPlayer === 'function') {\n videoElement = playerRef.current.getInternalPlayer();\n }\n\n if (!videoElement || typeof videoElement.requestFullscreen !== 'function') {\n const videoElements = document.querySelectorAll('video');\n if (videoElements.length > 0) {\n videoElement = videoElements[0];\n }\n }\n\n if (!videoElement || typeof videoElement.requestFullscreen !== 'function') {\n const modalElement = document.querySelector('.aspect-video');\n if (modalElement && typeof (modalElement as HTMLElement).requestFullscreen === 'function') {\n await (modalElement as HTMLElement).requestFullscreen();\n return;\n }\n }\n\n if (videoElement && typeof videoElement.requestFullscreen === 'function') {\n await videoElement.requestFullscreen();\n }\n } catch (error) {\n debug.error('Error toggling fullscreen:', error);\n }\n };\n\n const handleError = async (error: any) => {\n debug.error('Media playback error:', error);\n\n const isPotentialExpiration =\n error?.code === HTTP_STATUS.FORBIDDEN ||\n error?.status === HTTP_STATUS.FORBIDDEN ||\n error?.statusCode === HTTP_STATUS.FORBIDDEN ||\n error?.code === HTTP_STATUS.NOT_FOUND ||\n error?.status === HTTP_STATUS.NOT_FOUND ||\n error?.statusCode === HTTP_STATUS.NOT_FOUND ||\n error?.message?.includes('403') ||\n error?.message?.includes('404') ||\n error?.message?.includes('Forbidden') ||\n error?.message?.toLowerCase().includes('network') ||\n error?.type === 'network' ||\n error?.message?.includes('MEDIA_ERR_SRC_NOT_SUPPORTED');\n\n if (isPotentialExpiration && currentPlaybackInfo?.type && !isRefreshingUrl.current) {\n debug.log('[Player Error] Detected potential URL expiration, attempting refresh...');\n\n const currentPosition = audioElement?.currentTime || 0;\n const wasPlaying = playing;\n\n const fileType = currentPlaybackInfo.type;\n if (fileType !== 'mp4' && fileType !== 'mp3' && fileType !== 'hls') {\n debug.error('[Player Error] Invalid file type, cannot refresh:', fileType);\n } else {\n const refreshed = await refreshPresignedUrl(fileType);\n\n if (refreshed) {\n debug.log('[Player Error] URL refreshed successfully, resuming playback');\n setTimeout(() => {\n if (audioElement && currentPosition > 0) {\n audioElement.currentTime = currentPosition;\n }\n if (wasPlaying) {\n setPlaying(true);\n }\n }, PLAYBACK_RESUME_DELAY_MS);\n return;\n }\n }\n }\n\n setHasError(true);\n setPlaying(false);\n setIsLoadingVideo(false);\n\n // Use the improved error message helper\n setErrorMessage(getErrorMessage(error));\n\n if (onError && error instanceof Error) {\n onError(error);\n }\n };\n\n const handleRetry = useCallback(() => {\n setHasError(false);\n setErrorMessage('');\n setIsLoadingVideo(true);\n\n // Force reinitialize playback\n const info = getPlaybackInfo();\n if (info) {\n setCurrentPlaybackInfo(null); // Force re-render\n setTimeout(() => {\n setCurrentPlaybackInfo(info);\n setPlaying(true);\n }, 100);\n }\n }, [broadcast]);\n\n const handleWordClick = (startTime: number) => {\n if (audioElement) {\n audioElement.currentTime = startTime;\n setPlayed(startTime / duration);\n setHasEnded(false);\n if (!playing) {\n setPlaying(true);\n }\n }\n };\n\n /**\n * Keyboard shortcuts effect\n *\n * Listens for keyboard events when enableKeyboardShortcuts is true.\n * Prevents interference with form inputs, contenteditable elements, and modifier key combinations.\n *\n * Supported shortcuts:\n * - Space/K: Play/Pause\n * - Arrow Left/Right: Seek backward/forward 5 seconds\n * - Arrow Up/Down: Volume up/down 10%\n * - M: Mute toggle\n * - F: Fullscreen (video only)\n * - 0/Home: Jump to start\n * - End: Jump to end\n */\n useEffect(() => {\n // Skip if keyboard shortcuts are disabled\n if (!enableKeyboardShortcuts) return;\n\n /**\n * Seek by a relative number of seconds\n * @param seconds - Number of seconds to seek (negative for backward, positive for forward)\n */\n const seekBy = (seconds: number) => {\n if (!audioElement || duration <= 0) return;\n const newTime = Math.max(0, Math.min(duration, audioElement.currentTime + seconds));\n audioElement.currentTime = newTime;\n setPlayed(newTime / duration);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n\n // Don't interfere with typing in inputs, textareas, or contenteditable elements\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target.contentEditable === 'true' ||\n target.getAttribute('role') === 'textbox'\n ) {\n return;\n }\n\n // Don't handle if a modifier key is pressed\n if (e.ctrlKey || e.metaKey || e.altKey) {\n return;\n }\n\n switch (e.key) {\n case ' ':\n case 'k':\n case 'K':\n e.preventDefault();\n handlePlayPause();\n break;\n\n case 'ArrowLeft':\n e.preventDefault();\n seekBy(-5);\n break;\n\n case 'ArrowRight':\n e.preventDefault();\n seekBy(5);\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n setVolume(prev => Math.min(1, prev + 0.1));\n if (muted) setMuted(false);\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n setVolume(prev => Math.max(0, prev - 0.1));\n break;\n\n case 'm':\n case 'M':\n e.preventDefault();\n toggleMute();\n break;\n\n case 'f':\n case 'F':\n if (!isAudioOnly) {\n e.preventDefault();\n toggleFullscreen();\n }\n break;\n\n case '0':\n case 'Home':\n e.preventDefault();\n if (audioElement && duration > 0) {\n audioElement.currentTime = 0;\n setPlayed(0);\n setHasEnded(false);\n }\n break;\n\n case 'End':\n e.preventDefault();\n if (audioElement && duration > 0) {\n audioElement.currentTime = duration - 1;\n setPlayed((duration - 1) / duration);\n }\n break;\n\n default:\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enableKeyboardShortcuts, audioElement, duration, playing, muted, isAudioOnly, handlePlayPause, toggleMute, toggleFullscreen]);\n\n // Show error if no playback URL after initialization\n if (currentPlaybackInfo !== null && !playbackUrl) {\n return (\n <div className=\"bg-white dark:bg-zinc-900 rounded-lg p-6 max-w-md w-full mx-4 border border-gray-200 dark:border-zinc-800\">\n <h3 className=\"text-lg font-bold text-black dark:text-white mb-4\">Broadcast Unavailable</h3>\n <p className=\"text-gray-600 dark:text-gray-400\">\n No playback URL available for this broadcast. The recording may still be processing.\n </p>\n </div>\n );\n }\n\n // Show loading state\n if (!playbackUrl) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <LoadingSpinner variant=\"white\" text=\"Loading...\" />\n </div>\n );\n }\n\n const hasTranscript =\n broadcast.transcriptStatus === 2 &&\n transcriptData &&\n ((transcriptData.segments && transcriptData.segments.some((s) => s.words && s.words.length > 0)) ||\n (transcriptData.words && transcriptData.words.length > 0));\n\n return (\n <div className={`bg-black rounded-lg shadow-2xl w-full h-full flex flex-col ${className}`}>\n {/* Header */}\n <div className=\"bg-zinc-900/50 backdrop-blur-sm border-b border-zinc-800 px-4 md:px-6 py-3 md:py-4 flex justify-between items-center rounded-t-lg shrink-0\">\n <div>\n <h3 className=\"text-lg font-semibold text-white\">{broadcast.streamKeyRecord?.foreignName || \"Broadcast\"}</h3>\n <p className=\"text-sm text-gray-400\">\n {broadcast.isVideo ? \"Video\" : \"Audio\"} •{\" \"}\n {broadcast.broadcastStatus === 1 ? (\n <span className=\"text-red-500 font-semibold\">🔴 LIVE</span>\n ) : playbackType === 'hls' ? (\n <span className=\"text-gray-500 font-semibold\">OFFLINE</span>\n ) : (\n formatTime(duration)\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n {renderClipCreator && playbackType !== \"hls\" && appId && contentId && duration > 0 && (\n <button\n onClick={() => setShowClipCreator(true)}\n className=\"px-3 md:px-4 py-1.5 md:py-2 bg-blue-600 hover:bg-blue-700 text-white text-xs md:text-sm font-medium rounded-lg transition-colors flex items-center gap-1 md:gap-2\"\n title=\"Create a clip from this broadcast\"\n aria-label=\"Create clip from broadcast\"\n >\n <svg className=\"w-3 h-3 md:w-4 md:h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span className=\"hidden sm:inline\">Create Clip</span>\n <span className=\"sm:hidden\">Clip</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Main Content Area - Player + Transcript */}\n <div className=\"flex flex-1 overflow-hidden\">\n {/* Player Container */}\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Player Area */}\n <div className={`relative ${isAudioOnly ? \"bg-linear-to-br from-zinc-900 via-zinc-800 to-zinc-900 flex items-stretch\" : \"bg-black\"}`}>\n {isAudioOnly ? (\n <div className=\"relative cursor-pointer w-full flex flex-col\" onClick={handleVideoClick}>\n {!hasError ? (\n <>\n <div className=\"w-full h-full relative\">\n <AudioWaveform audioElement={audioElement} isPlaying={isLiveStream ? true : playing} isLive={isLiveStream} />\n {isLoadingVideo && !hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center z-20\">\n <LoadingSpinner variant=\"white\" />\n </div>\n )}\n {hasEnded && !wasLiveStream && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center z-20 pointer-events-auto\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRestart();\n }}\n className=\"bg-white hover:bg-blue-500 text-black hover:text-white font-semibold py-4 px-8 rounded-full transition-all transform hover:scale-105 flex items-center gap-3\"\n aria-label=\"Restart playback from beginning\"\n >\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z\" clipRule=\"evenodd\" />\n </svg>\n Restart\n </button>\n </div>\n )}\n </div>\n </>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <div className=\"text-center max-w-md px-4\">\n <div className=\"text-6xl mb-4\">⚠️</div>\n <h3 className=\"text-xl font-semibold text-white mb-3\">Playback Error</h3>\n <p className=\"text-gray-300 text-sm mb-6\">{errorMessage}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors inline-flex items-center gap-2\"\n aria-label=\"Retry playback\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n Retry\n </button>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"aspect-video relative\">\n <div onClick={handleVideoClick} className=\"cursor-pointer\">\n <ReactPlayer\n key={playbackUrl || 'no-url'}\n ref={playerRef}\n src={playbackUrl || undefined}\n playing={playing}\n volume={volume}\n muted={muted}\n width=\"100%\"\n height=\"100%\"\n crossOrigin=\"anonymous\"\n onReady={handlePlayerReady}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n style={{ backgroundColor: '#000' }}\n />\n </div>\n {isLoadingVideo && !hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center\">\n <LoadingSpinner variant=\"white\" />\n </div>\n )}\n {hasEnded && !hasError && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRestart();\n }}\n className=\"bg-white hover:bg-blue-500 text-black hover:text-white font-semibold py-4 px-8 rounded-full transition-all transform hover:scale-105 flex items-center gap-3\"\n >\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z\" clipRule=\"evenodd\" />\n </svg>\n Restart\n </button>\n </div>\n )}\n {hasError && (\n <div className=\"absolute inset-0 bg-black/90 flex items-center justify-center p-8\">\n <div className=\"text-center max-w-md\">\n <div className=\"text-6xl mb-4\">⚠️</div>\n <h3 className=\"text-xl font-semibold text-white mb-3\">Playback Error</h3>\n <p className=\"text-gray-300 text-sm mb-6\">{errorMessage}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors inline-flex items-center gap-2\"\n aria-label=\"Retry playback\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n Retry\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hidden audio player for audio-only */}\n {isAudioOnly && (\n <div className=\"hidden\">\n <ReactPlayer\n key={playbackUrl || 'no-url'}\n ref={playerRef}\n src={playbackUrl || undefined}\n playing={playing}\n volume={volume}\n muted={muted}\n width=\"0\"\n height=\"0\"\n crossOrigin=\"anonymous\"\n onReady={handlePlayerReady}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n />\n </div>\n )}\n </div>\n\n {/* Custom Controls */}\n {!hasError && !isLiveStream && (\n wasLiveStream ? (\n parseInt(broadcast.mp3Size || \"0\") > 0 || parseInt(broadcast.mp4Size || \"0\") > 0 ? (\n <div className=\"bg-zinc-900/50 backdrop-blur-sm px-4 md:px-6 py-3 md:py-4 rounded-b-lg\">\n {/* Progress Bar */}\n <div className=\"mb-4\">\n <input\n type=\"range\"\n min={0}\n max={0.999999}\n step=\"any\"\n value={played || 0}\n onMouseDown={handleSeekMouseDown}\n onMouseUp={handleSeekMouseUp}\n onTouchStart={handleSeekTouchStart}\n onTouchEnd={handleSeekTouchEnd}\n onChange={handleSeekChange}\n className=\"w-full h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n aria-label=\"Seek position\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={played * duration}\n aria-valuetext={`${formatTime(played * duration)} of ${formatTime(duration)}`}\n role=\"slider\"\n />\n <div className=\"flex justify-between text-xs text-gray-400 mt-1\">\n <span>{formatTime((played || 0) * duration)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Control Buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n {/* Play/Pause */}\n <button\n onClick={handlePlayPause}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title={playing ? \"Pause\" : \"Play\"}\n aria-label={playing ? \"Pause\" : \"Play\"}\n aria-pressed={playing}\n >\n {playing ? (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title={muted ? \"Unmute\" : \"Mute\"}\n aria-label={muted ? \"Unmute\" : \"Mute\"}\n aria-pressed={muted}\n >\n {muted || volume === 0 ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM14.657 2.929a1 1 0 011.414 0A9.972 9.972 0 0119 10a9.972 9.972 0 01-2.929 7.071 1 1 0 01-1.414-1.414A7.971 7.971 0 0017 10c0-2.21-.894-4.208-2.343-5.657a1 1 0 010-1.414zm-2.829 2.828a1 1 0 011.415 0A5.983 5.983 0 0115 10a5.984 5.984 0 01-1.757 4.243 1 1 0 01-1.415-1.415A3.984 3.984 0 0013 10a3.983 3.983 0 00-1.172-2.828 1 1 0 010-1.415z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={muted ? 0 : volume || 1}\n onChange={handleVolumeChange}\n className=\"w-20 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n aria-label=\"Volume\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={muted ? 0 : Math.round(volume * 100)}\n aria-valuetext={muted ? \"Muted\" : `${Math.round(volume * 100)}%`}\n role=\"slider\"\n />\n </div>\n </div>\n\n {/* Fullscreen, Download, and Transcript buttons */}\n <div className=\"flex items-center gap-3\">\n {/* Download */}\n {!isLiveStream && broadcast.hash && (broadcast.recordingMp4Url || broadcast.recordingMp3Url) && (\n <button\n onClick={() => {\n const downloadUrl = buildPlaybackUrl(broadcast.id, broadcast.hash!, 'download');\n window.open(downloadUrl, '_blank');\n }}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title=\"Download Recording\"\n aria-label=\"Download recording\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n </button>\n )}\n\n {/* Fullscreen */}\n {!isAudioOnly && (\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-blue-400 transition-colors\"\n title=\"Fullscreen\"\n aria-label=\"Toggle fullscreen\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 11-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n )}\n\n {/* Transcript toggle */}\n {hasTranscript && (\n <button\n onClick={() => setShowTranscript(!showTranscript)}\n className={`transition-colors ${showTranscript ? 'text-blue-400' : 'text-white hover:text-blue-400'}`}\n title={showTranscript ? \"Hide Transcript\" : \"Show Transcript\"}\n aria-label={showTranscript ? \"Hide transcript\" : \"Show transcript\"}\n aria-pressed={showTranscript}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ) : null\n ) : (\n <div className=\"bg-zinc-900/50 backdrop-blur-sm px-4 md:px-6 py-3 md:py-4 rounded-b-lg\">\n {/* Progress Bar */}\n <div className=\"mb-4\">\n <input\n type=\"range\"\n min={0}\n max={0.999999}\n step=\"any\"\n value={played || 0}\n onMouseDown={handleSeekMouseDown}\n onMouseUp={handleSeekMouseUp}\n onTouchStart={handleSeekTouchStart}\n onTouchEnd={handleSeekTouchEnd}\n onChange={handleSeekChange}\n className=\"w-full h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-gray-400 mt-1\">\n <span>{formatTime((played || 0) * duration)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Control Buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n {/* Play/Pause */}\n <button onClick={handlePlayPause} className=\"text-white hover:text-blue-400 transition-colors\" title={playing ? \"Pause\" : \"Play\"}>\n {playing ? (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button onClick={toggleMute} className=\"text-white hover:text-blue-400 transition-colors\" title={muted ? \"Unmute\" : \"Mute\"}>\n {muted || volume === 0 ? (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM12.293 7.293a1 1 0 011.414 0L15 8.586l1.293-1.293a1 1 0 111.414 1.414L16.414 10l1.293 1.293a1 1 0 01-1.414 1.414L15 11.414l-1.293 1.293a1 1 0 01-1.414-1.414L13.586 10l-1.293-1.293a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.707.707L4.586 13H2a1 1 0 01-1-1V8a1 1 0 011-1h2.586l3.707-3.707a1 1 0 011.09-.217zM14.657 2.929a1 1 0 011.414 0A9.972 9.972 0 0119 10a9.972 9.972 0 01-2.929 7.071 1 1 0 01-1.414-1.414A7.971 7.971 0 0017 10c0-2.21-.894-4.208-2.343-5.657a1 1 0 010-1.414zm-2.829 2.828a1 1 0 011.415 0A5.983 5.983 0 0115 10a5.984 5.984 0 01-1.757 4.243 1 1 0 01-1.415-1.415A3.984 3.984 0 0013 10a3.983 3.983 0 00-1.172-2.828 1 1 0 010-1.415z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={muted ? 0 : volume || 1}\n onChange={handleVolumeChange}\n className=\"w-20 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer slider\"\n />\n </div>\n </div>\n\n {/* Fullscreen and Transcript buttons */}\n <div className=\"flex items-center gap-3\">\n {/* Fullscreen */}\n {!isAudioOnly && (\n <button onClick={toggleFullscreen} className=\"text-white hover:text-blue-400 transition-colors\" title=\"Fullscreen\">\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 11-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n )}\n\n {/* Transcript toggle */}\n {hasTranscript && (\n <button\n onClick={() => setShowTranscript(!showTranscript)}\n className={`transition-colors ${showTranscript ? 'text-blue-400' : 'text-white hover:text-blue-400'}`}\n title={showTranscript ? \"Hide Transcript\" : \"Show Transcript\"}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n )\n )}\n </div>\n\n {/* Transcript Side Panel */}\n {showTranscript && hasTranscript && (\n <div className=\"w-full md:w-96 bg-zinc-900 border-l border-zinc-800 flex flex-col overflow-hidden\">\n {/* Transcript Header */}\n <div className=\"px-4 py-3 border-b border-zinc-800 bg-zinc-900/50 shrink-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n <span className=\"font-medium text-white\">Transcript</span>\n {broadcast.transcriptLanguage && (\n <span className=\"text-xs text-gray-400 px-2 py-0.5 bg-zinc-800 rounded\">{broadcast.transcriptLanguage.toUpperCase()}</span>\n )}\n </div>\n {broadcast.transcriptUrl && (\n <a\n href={broadcast.transcriptUrl}\n download={`${broadcast.hash || broadcast.id}-transcript.json`}\n className=\"text-gray-400 hover:text-white transition-colors\"\n title=\"Download Transcript\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* Resume Auto-Scroll Button */}\n {!autoScrollEnabled && (\n <div className=\"px-4 py-2 bg-zinc-800/50 border-b border-zinc-700 shrink-0\">\n <button\n onClick={() => setAutoScrollEnabled(true)}\n className=\"w-full px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded transition-colors flex items-center justify-center gap-2 text-sm font-medium\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 14l-7 7m0 0l-7-7m7 7V3\" />\n </svg>\n Resume Auto-Scroll\n </button>\n </div>\n )}\n\n {/* Transcript Content - Scrollable */}\n <div ref={transcriptContainerRef} className=\"flex-1 overflow-y-auto px-4 py-4 text-gray-300 leading-relaxed\">\n {isLoadingTranscript ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"h-6 w-6 border-2 border-gray-600 border-t-blue-500 rounded-full animate-spin\" />\n </div>\n ) : transcriptData?.segments && transcriptData.segments.length > 0 ? (\n <div className=\"space-y-4\">\n {(() => {\n const filteredSegments = transcriptData.segments.filter((s) => s.words && s.words.length > 0);\n let globalWordIndex = 0;\n const wordMap = new Map();\n\n filteredSegments.forEach((segment) => {\n segment.words.forEach((_word, wordIndex) => {\n wordMap.set(`${segment.id}-${wordIndex}`, globalWordIndex++);\n });\n });\n\n let currentWordIndex = -1;\n\n filteredSegments.forEach((segment) => {\n segment.words.forEach((word, wordIndex) => {\n const globalIdx = wordMap.get(`${segment.id}-${wordIndex}`) || -1;\n if (currentTime >= word.start && globalIdx > currentWordIndex) {\n currentWordIndex = globalIdx;\n }\n });\n });\n\n const previousWordIndex = lastActiveWordIndex.current;\n let minHighlightIndex = -1;\n let maxHighlightIndex = -1;\n\n if (currentWordIndex >= 0) {\n minHighlightIndex = Math.max(0, currentWordIndex - TRAILING_WORDS);\n maxHighlightIndex = currentWordIndex;\n\n if (currentWordIndex <= TRAILING_WORDS) {\n minHighlightIndex = 0;\n }\n\n lastActiveWordIndex.current = currentWordIndex;\n } else if (currentWordIndex === -1) {\n minHighlightIndex = 0;\n maxHighlightIndex = 0;\n } else if (previousWordIndex >= 0) {\n minHighlightIndex = Math.max(0, previousWordIndex - TRAILING_WORDS);\n maxHighlightIndex = previousWordIndex;\n }\n\n return filteredSegments.map((segment, _segmentIndex) => {\n const isSegmentActive = currentTime >= segment.start && currentTime < segment.end;\n return (\n <div key={segment.id} ref={isSegmentActive ? transcriptContainerRef : null} className=\"flex gap-3 items-start leading-relaxed\">\n <button\n onClick={() => handleWordClick(segment.start)}\n className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors shrink-0 pt-0.5 font-mono\"\n title={`Jump to ${formatTimestamp(segment.start)}`}\n >\n {formatTimestamp(segment.start)}\n </button>\n\n <div className=\"flex-1\">\n {segment.words.map((word, wordIndex) => {\n const thisGlobalIndex = wordMap.get(`${segment.id}-${wordIndex}`) ?? -1;\n const isTimestampActive = currentTime >= word.start && currentTime < word.end;\n const isInGapFill = minHighlightIndex >= 0 && thisGlobalIndex >= minHighlightIndex && thisGlobalIndex <= maxHighlightIndex;\n const isWordActive = isInGapFill;\n\n return (\n <span\n key={`${segment.id}-${wordIndex}`}\n ref={isTimestampActive ? activeWordRef : null}\n onClick={() => handleWordClick(word.start)}\n className={`cursor-pointer ${\n isWordActive ? 'text-blue-400 font-medium active-word' : isSegmentActive ? 'text-gray-200 segment-word' : 'text-gray-400 hover:text-gray-200 inactive-word'\n }`}\n title={`${formatTime(word.start)} - ${formatTime(word.end)}`}\n >\n {word.word}{' '}\n </span>\n );\n })}\n </div>\n </div>\n );\n });\n })()}\n </div>\n ) : transcriptData?.words && transcriptData.words.length > 0 ? (\n <div className=\"space-y-1\">\n {transcriptData.words.map((word, index) => {\n const isActive = currentTime >= word.start && currentTime < word.end;\n return (\n <span\n key={index}\n ref={isActive ? activeWordRef : null}\n onClick={() => handleWordClick(word.start)}\n className={`inline-block cursor-pointer transition-all ${\n isActive ? 'text-blue-400 underline decoration-blue-400 decoration-2 font-medium' : 'text-gray-400 hover:text-gray-200'\n }`}\n title={`${formatTime(word.start)} - ${formatTime(word.end)}`}\n >\n {word.word}{' '}\n </span>\n );\n })}\n </div>\n ) : (\n <div className=\"text-center text-gray-500 py-8\">\n <p className=\"mb-2\">Transcript data not available</p>\n {transcriptData && (\n <p className=\"text-xs text-gray-600\">\n Debug: segments={transcriptData.segments ? transcriptData.segments.length : 0}, words={transcriptData.words ? transcriptData.words.length : 0}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Clip Creator */}\n {renderClipCreator &&\n renderClipCreator({\n isOpen: showClipCreator,\n onClose: () => setShowClipCreator(false),\n sourceVideoUrl: playbackType === \"mp4\" ? playbackUrl || undefined : undefined,\n sourceAudioUrl: playbackType === \"mp3\" ? playbackUrl || undefined : undefined,\n sourceDuration: duration,\n onPauseParent: () => setPlaying(false),\n })}\n\n <style>{`\n .slider::-webkit-slider-thumb {\n appearance: none;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: white;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n }\n .slider::-webkit-slider-thumb:hover {\n background: #60a5fa;\n }\n .slider::-moz-range-thumb {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: white;\n cursor: pointer;\n border: none;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n }\n .slider::-moz-range-thumb:hover {\n background: #60a5fa;\n }\n\n .active-word {\n transition: color 0s, text-shadow 0s;\n text-shadow: 0 0 8px rgba(96, 165, 250, 0.6), 0 0 12px rgba(96, 165, 250, 0.4);\n }\n .segment-word,\n .inactive-word {\n transition: color 0.4s ease-out, text-shadow 0.4s ease-out;\n text-shadow: none;\n }\n .segment-word:hover,\n .inactive-word:hover {\n transition: color 0.15s ease-in;\n }\n `}</style>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { BroadcastPlayer } from \"./BroadcastPlayer\";\nimport { debug } from \"../utils/debug\";\nimport type { Broadcast } from \"../types/broadcast\";\n\nexport interface BroadcastPlayerModalProps {\n /** Broadcast data from DialTribe API */\n broadcast: Broadcast;\n\n /** Whether modal is open */\n isOpen: boolean;\n\n /** Called when modal should close */\n onClose: () => void;\n\n /** Optional: App ID for tracking */\n appId?: string;\n\n /** Optional: Content ID for tracking */\n contentId?: number;\n\n /** Foreign user ID from partner system (any tier) */\n foreignId?: string;\n\n /** Tier name from partner system (e.g., 'guest', 'member', 'subscriber_gold') */\n foreignTier?: string;\n\n /**\n * Optional render prop for clip creator\n * If provided, the \"Create Clip\" button will be shown and this will be called when clicked\n */\n renderClipCreator?: (props: {\n isOpen: boolean;\n onClose: () => void;\n sourceVideoUrl?: string;\n sourceAudioUrl?: string;\n sourceDuration: number;\n onPauseParent: () => void;\n }) => React.ReactNode;\n\n /** Optional: Custom CSS classes for the player */\n className?: string;\n\n /** Optional: Enable keyboard shortcuts (Space, arrows, M, F, etc.). Default: false */\n enableKeyboardShortcuts?: boolean;\n}\n\n/**\n * BroadcastPlayerModal - Modal wrapper for BroadcastPlayer\n *\n * Provides a modal overlay with ESC key handling and backdrop click to close.\n * Uses the new BroadcastPlayer component for all player functionality.\n *\n * @example\n * ```tsx\n * <BroadcastPlayerModal\n * broadcast={broadcast}\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * appId=\"app_123\"\n * contentId={456}\n * />\n * ```\n */\nexport function BroadcastPlayerModal({\n broadcast,\n isOpen,\n onClose,\n appId,\n contentId,\n foreignId,\n foreignTier,\n renderClipCreator,\n className,\n enableKeyboardShortcuts = false,\n}: BroadcastPlayerModalProps) {\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Don't render if not open\n if (!isOpen) return null;\n\n // Focus management\n useEffect(() => {\n if (isOpen) {\n // Save current focus\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n // Focus close button after render\n setTimeout(() => {\n closeButtonRef.current?.focus();\n }, 100);\n }\n\n return () => {\n // Restore focus when modal closes\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen]);\n\n // ESC key handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onClose]);\n\n // Backdrop click handler\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-black/70 backdrop-blur-xl flex items-center justify-center z-50 p-4\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Broadcast player\"\n >\n <div className=\"relative w-full h-full max-w-7xl max-h-[90vh]\">\n {/* Close Button */}\n <button\n ref={closeButtonRef}\n onClick={onClose}\n className=\"absolute top-4 right-4 z-10 text-gray-400 hover:text-white text-2xl leading-none transition-colors w-8 h-8 flex items-center justify-center bg-black/50 rounded-full\"\n title=\"Close (ESC)\"\n aria-label=\"Close player\"\n >\n ×\n </button>\n\n {/* Core Player */}\n <BroadcastPlayer\n broadcast={broadcast}\n appId={appId}\n contentId={contentId}\n foreignId={foreignId}\n foreignTier={foreignTier}\n renderClipCreator={renderClipCreator}\n className={className}\n enableKeyboardShortcuts={enableKeyboardShortcuts}\n onError={(error) => {\n debug.error('[BroadcastPlayerModal] Player error:', error);\n }}\n />\n </div>\n </div>\n );\n}\n","import { Component, ErrorInfo, ReactNode } from \"react\";\n\ninterface Props {\n children: ReactNode;\n /** Callback when modal needs to be closed */\n onClose?: () => void;\n /** Broadcast ID for logging purposes */\n broadcastId?: number;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n/**\n * Error Boundary for Broadcast Player Modal\n *\n * Catches and handles React errors that occur during:\n * - Rendering\n * - Lifecycle methods\n * - Constructors of the whole tree below them\n *\n * Does NOT catch errors in:\n * - Event handlers (use try-catch)\n * - Asynchronous code (use try-catch)\n * - Server-side rendering\n * - Errors thrown in the error boundary itself\n *\n * Benefits:\n * - Prevents white screen of death\n * - Provides user-friendly error UI\n * - Logs errors for debugging\n * - Allows graceful recovery\n */\nexport class BroadcastPlayerErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<State> {\n // Update state so the next render will show the fallback UI\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // Log error details for debugging\n console.error(\"[Player Error Boundary] Caught error:\", {\n error: error.message,\n stack: error.stack,\n componentStack: errorInfo.componentStack,\n broadcastId: this.props.broadcastId,\n timestamp: new Date().toISOString(),\n });\n\n // Update state with error info\n this.setState({\n error,\n errorInfo,\n });\n\n // TODO: Send error to logging service (e.g., Sentry, LogRocket)\n // Example:\n // logErrorToService({\n // error,\n // errorInfo,\n // broadcastId: this.props.broadcastId,\n // });\n }\n\n handleReset = () => {\n // Reset error state and try again\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n handleClose = () => {\n // Close modal and reset error state\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n this.props.onClose?.();\n };\n\n render() {\n if (this.state.hasError) {\n // Render fallback UI\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl w-full mx-4 p-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n Player Error\n </h2>\n <button\n onClick={this.handleClose}\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n aria-label=\"Close\"\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* Error icon */}\n <div className=\"flex justify-center mb-4\">\n <div className=\"rounded-full bg-red-100 dark:bg-red-900/30 p-3\">\n <svg\n className=\"w-12 h-12 text-red-600 dark:text-red-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n </div>\n\n {/* Error message */}\n <div className=\"text-center mb-6\">\n <p className=\"text-lg text-gray-900 dark:text-white mb-2\">\n Something went wrong with the media player\n </p>\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n {this.state.error?.message || \"An unexpected error occurred\"}\n </p>\n </div>\n\n {/* Error details (collapsible, for debugging) */}\n {process.env.NODE_ENV === \"development\" && this.state.errorInfo && (\n <details className=\"mb-6 p-4 bg-gray-100 dark:bg-gray-900 rounded text-xs\">\n <summary className=\"cursor-pointer font-semibold text-gray-700 dark:text-gray-300 mb-2\">\n Error Details (Development Only)\n </summary>\n <pre className=\"overflow-auto text-gray-600 dark:text-gray-400 whitespace-pre-wrap\">\n {this.state.error?.stack}\n {\"\\n\\nComponent Stack:\"}\n {this.state.errorInfo.componentStack}\n </pre>\n </details>\n )}\n\n {/* Action buttons */}\n <div className=\"flex gap-3 justify-center\">\n <button\n onClick={this.handleReset}\n className=\"px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors\"\n >\n Try Again\n </button>\n <button\n onClick={this.handleClose}\n className=\"px-6 py-2 bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-900 dark:text-white rounded-lg font-medium transition-colors\"\n >\n Close Player\n </button>\n </div>\n\n {/* Help text */}\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\n If this problem persists, try refreshing the page or contact\n support.\n </p>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"]}