{/* Base layer */}
0}
broadcastError={broadcastError}
isLoadingBroadcast={isLoadingBroadcast}
hasBroadcast={hasBroadcast}
streamUrlError={streamUrlError}
streamError={streamError}
videoEnded={videoEnded}
streamUrl={streamUrl}
broadcast={broadcast}
activeSubtitleTrack={subtitles.activeSubtitleTrack}
isMuted={volume.isMuted}
showStats={showStats}
videoRef={videoRef}
onSubtitleTracksChange={subtitles.setSubtitleTracks}
onStreamError={handleStreamError}
onEnded={handleVideoEnded}
onNeedsInteraction={() => setNeedsInteraction(true)}
onRetry={handleRetry}
/>
{/* Logo watermark */}
{channel?.logo && (
)}
{/* Password modals */}
{passwords.showChannelPasswordModal && (
passwords.setShowChannelPasswordModal(false)}
/>
)}
{passwords.showBlockPasswordModal && (
passwords.submitBlockPassword(
broadcast?.slot.id ?? "",
channel?.id,
pw,
)
}
onCancel={() => passwords.setShowBlockPasswordModal(false)}
/>
)}
{/* Autoplay blocked prompt */}
{needsInteraction && }
{/* Overlays */}
{channel && (
<>
subtitles.setShowSubtitlePicker((s) => !s)
}
onChangeSubtitleTrack={(id) => {
subtitles.setActiveSubtitleTrack(id);
subtitles.setShowSubtitlePicker(false);
}}
volume={volume.volume}
isMuted={volume.isMuted}
VolumeIcon={volume.VolumeIcon}
showVolumeSlider={volume.showSlider}
onToggleVolumeSlider={() => volume.setShowSlider((s) => !s)}
onToggleMute={volume.toggleMute}
onVolumeChange={(v) => {
volume.setVolume(v);
volume.setIsMuted(v === 0);
}}
isFullscreen={isFullscreen}
onToggleFullscreen={toggleFullscreen}
castAvailable={castAvailable}
isCasting={isCasting}
castDeviceName={castDeviceName}
streamUrl={streamUrl}
onRequestCast={requestCast}
onStopCasting={stopCasting}
quality={quality.quality}
qualityOptions={QUALITY_OPTIONS}
showQualityPicker={quality.showQualityPicker}
onToggleQualityPicker={() =>
quality.setShowQualityPicker((s) => !s)
}
onChangeQuality={quality.changeQuality}
showStats={showStats}
onToggleStats={() => setShowStats((v) => !v)}
showSchedule={showSchedule}
onToggleSchedule={toggleSchedule}
/>
{showBanner && nextSlot && (
)}
{hasBroadcast ? (
) : (
{channelIdx + 1}
{channel.name}
)}
{isCasting && castDeviceName && (
Casting to {castDeviceName}
)}
{showOverlays && showSchedule && (
)}
>
)}
);
}