import React from "react"; import { ExclamationTriangleIcon } from "@heroicons/react/24/solid"; import { ArrowPathIcon, ArrowRightIcon } from "@heroicons/react/16/solid"; import { motion, AnimatePresence } from "framer-motion"; import { LuPlay } from "react-icons/lu"; import { BsMouseFill } from "react-icons/bs"; import { m } from "@localizations/messages.js"; import { Button, LinkButton } from "@components/Button"; import LoadingSpinner from "@components/LoadingSpinner"; import Card, { GridCard } from "@components/Card"; interface OverlayContentProps { readonly children: React.ReactNode; } function OverlayContent({ children }: OverlayContentProps) { return ( {children} ); } interface LoadingOverlayProps { readonly show: boolean; } export function LoadingVideoOverlay({ show }: LoadingOverlayProps) { return ( {show && ( {m.video_overlay_loading_stream()} )} ); } interface LoadingConnectionOverlayProps { readonly show: boolean; readonly text: string; } export function LoadingConnectionOverlay({ show, text }: LoadingConnectionOverlayProps) { return ( {show && ( {text} )} ); } interface ConnectionErrorOverlayProps { readonly show: boolean; readonly setupPeerConnection: () => Promise; } export function ConnectionFailedOverlay({ show, setupPeerConnection, }: ConnectionErrorOverlayProps) { return ( {show && ( {m.video_overlay_connection_issue_title()} {m.video_overlay_conn_verify_power()} {m.video_overlay_conn_check_cables()} {m.video_overlay_conn_ensure_network()} {m.video_overlay_conn_restart()} setupPeerConnection()} LeadingIcon={ArrowPathIcon} text={m.video_overlay_try_again()} size="SM" theme="light" /> )} ); } interface PeerConnectionDisconnectedOverlay { readonly show: boolean; } export function PeerConnectionDisconnectedOverlay({ show, }: PeerConnectionDisconnectedOverlay) { return ( {show && ( {m.video_overlay_connection_issue_title()} {m.video_overlay_conn_verify_power()} {m.video_overlay_conn_check_cables()} {m.video_overlay_conn_ensure_network()} {m.video_overlay_conn_restart()} {m.video_overlay_retrying_connection()} )} ); } interface HDMIErrorOverlayProps { readonly show: boolean; readonly hdmiState: string; } export function HDMIErrorOverlay({ show, hdmiState }: HDMIErrorOverlayProps) { const isNoSignal = hdmiState === "no_signal"; const isOtherError = hdmiState === "no_lock" || hdmiState === "out_of_range"; return ( <> {show && isNoSignal && ( {m.video_overlay_no_hdmi_signal()} {m.video_overlay_no_hdmi_ensure_cable()} {m.video_overlay_no_hdmi_ensure_power()} {m.video_overlay_no_hdmi_adapter_compat()} )} {show && isOtherError && ( {m.video_overlay_hdmi_error_title()} {m.video_overlay_hdmi_loose_faulty()} {m.video_overlay_hdmi_incompatible_resolution()} {m.video_overlay_hdmi_source_issue()} )} > ); } interface NoAutoplayPermissionsOverlayProps { readonly show: boolean; readonly onPlayClick: () => void; } export function NoAutoplayPermissionsOverlay({ show, onPlayClick, }: NoAutoplayPermissionsOverlayProps) { return ( {show && ( {m.video_overlay_autoplay_permissions_required()} {m.video_overlay_enable_autoplay_settings()} )} ); } interface PointerLockBarProps { readonly show: boolean; } export function PointerLockBar({ show }: PointerLockBarProps) { return ( {show ? ( {m.video_overlay_pointerlock_click_to_enable()} ) : null} ); }
{m.video_overlay_loading_stream()}
{text}
{m.video_overlay_retrying_connection()}