import {Registry} from "tc-shared/events"; import * as React from "react"; import { DeviceListResult, ModalVideoSourceEvents, ScreenCaptureDeviceList, SettingFrameRate, VideoPreviewStatus, VideoSourceState } from "tc-shared/ui/modal/video-source/Definitions"; import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Select} from "tc-shared/ui/react-elements/InputField"; import {Button} from "tc-shared/ui/react-elements/Button"; import {useContext, useEffect, useRef, useState} from "react"; import {VideoBroadcastType} from "tc-shared/connection/VideoConnection"; import {Slider} from "tc-shared/ui/react-elements/Slider"; import {Checkbox} from "tc-shared/ui/react-elements/Checkbox"; import {Tab, TabEntry} from "tc-shared/ui/react-elements/Tab"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {ScreenCaptureDevice} from "tc-shared/video/VideoSource"; const cssStyle = require("./Renderer.scss"); const ModalEvents = React.createContext>(undefined); const AdvancedSettings = React.createContext(false); const kNoDeviceId = "__no__device"; const VideoSourceSelector = () => { const events = useContext(ModalEvents); const [ deviceList, setDeviceList ] = useState(() => { events.fire("query_device_list"); return "loading"; }); events.reactUse("notify_device_list", event => setDeviceList(event.status)); if(deviceList === "loading") { return (
); } else if(deviceList.status === "error") { let message; switch (deviceList.reason) { case "no-permissions": message = tr("Missing device query permissions"); break; case "request-permissions": message = tr("Please grant video device permissions"); break; case "custom": message = tr("An error happened"); break; } return (
); } else { return (
); } }; const VideoSourceRequester = () => { const events = useContext(ModalEvents); const [ source, setSource ] = useState(() => { events.fire("query_source"); return { type: "none" }; }); events.reactUse("notify_source", event => setSource(event.state), undefined, []); let info; switch (source.type) { case "selected": let name = source.name === "Screen" ? source.deviceId : source.name; info = (
{name || source.deviceId}
); break; case "errored": info = (
{source.error}
); break; case "none": info = (
No source has been selected
); break; } return (
{info}
); }; const VideoPreviewMessage = (props: { message: any, kind: "info" | "error" }) => { return (
{props.message}
); } const VideoRequestPermissions = (props: { systemDenied: boolean }) => { const events = useContext(ModalEvents); let body; let button; if(props.systemDenied) { body = (
Camara access has been denied by your browser.
Please allow camara access in order to broadcast video.
); button = Retry to query; } else { body = (
In order to be able to broadcast video,
you have to allow camara access.
); button = Request permissions; } return (
{body}
); } const VideoPreview = () => { const events = useContext(ModalEvents); const refVideo = useRef(); const [ status, setStatus ] = useState(() => { events.fire("query_video_preview"); return "loading"; }); events.reactUse("notify_video_preview", event => { setStatus(event.status); }); let body; if(status === "loading") { /* Nothing to show */ } else { switch (status.status) { case "none": body = ; break; case "error": if(status.reason === "no-permissions" || status.reason === "request-permissions") { body = ; } else { body = ; } break; case "preview": body = (