diff --git a/packages/app/src/pages/live_control/index.jsx b/packages/app/src/pages/live_control/index.jsx deleted file mode 100644 index 56439e8d..00000000 --- a/packages/app/src/pages/live_control/index.jsx +++ /dev/null @@ -1,395 +0,0 @@ -import React from "react" -import * as antd from "antd" - -import { Icons } from "components/Icons" - -import Livestream from "../../models/livestream" - -import "./index.less" - -const StreamingKeyView = (props) => { - const [streamingKeyVisibility, setStreamingKeyVisibility] = React.useState(false) - - const toogleVisibility = (to) => { - setStreamingKeyVisibility(to ?? !streamingKeyVisibility) - } - - return
- {streamingKeyVisibility ? - <> - toogleVisibility()} /> - - {props.streamingKey ?? "No streaming key available"} - - : -
toogleVisibility()} - > - - Click to show key -
- } -
-} - -const LivestreamsCategoriesSelector = (props) => { - const [categories, setCategories] = React.useState([]) - const [loading, setLoading] = React.useState(true) - - const loadData = async () => { - setLoading(true) - - const categories = await Livestream.getCategories().catch((err) => { - console.error(err) - - app.message.error("Failed to load categories") - - return null - }) - - console.log(`Loaded categories >`, categories) - - setLoading(false) - - if (categories) { - setCategories(categories) - } - } - - React.useEffect(() => { - loadData() - }, []) - - if (loading) { - return - } - - return props.updateStreamInfo("category", value)} - > - { - categories.map((category) => { - return {category?.label ?? "No category"} - }) - } - -} - -const StreamInfoEditor = (props) => { - const [streamInfo, setStreamInfo] = React.useState(props.defaultStreamInfo ?? {}) - - const updateStreamInfo = (key, value) => { - setStreamInfo({ - ...streamInfo, - [key]: value, - }) - } - - const saveStreamInfo = async () => { - if (typeof props.onSave === "function") { - return await props.onSave(streamInfo) - } - - // peform default save - const result = await Livestream.updateLivestreamInfo(streamInfo).catch((err) => { - console.error(err) - - app.message.error("Failed to update stream info") - - return false - }) - - if (result) { - app.message.success("Stream info updated") - } - - if (typeof props.onSaveComplete === "function") { - await props.onSaveComplete(result) - } - - return result - } - - return
-
- - Title - -
- updateStreamInfo("title", e.target.value)} - /> -
-
-
- - Description - -
- updateStreamInfo("description", e.target.value)} - /> -
-
-
- - Category - -
- -
-
- - Save - -
-} - -export default (props) => { - const [streamInfo, setStreamInfo] = React.useState({}) - const [addresses, setAddresses] = React.useState({}) - - const [isConnected, setIsConnected] = React.useState(false) - const [streamingKey, setStreamingKey] = React.useState(null) - - const onClickEditInfo = () => { - app.ModalController.open(() => { - if (result) { - app.ModalController.close() - - fetchStreamInfo() - } - }} - />) - } - - const regenerateStreamingKey = async () => { - antd.Modal.confirm({ - title: "Regenerate streaming key", - content: "Are you sure you want to regenerate the streaming key? After this, all other generated keys will be deleted.", - onOk: async () => { - const result = await Livestream.regenerateStreamingKey().catch((err) => { - app.message.error(`Failed to regenerate streaming key`) - console.error(err) - - return null - }) - - if (result) { - setStreamingKey(result.key) - } - } - }) - } - - const fetchStreamingKey = async () => { - const streamingKey = await Livestream.getStreamingKey().catch((err) => { - console.error(err) - return false - }) - - if (streamingKey) { - setStreamingKey(streamingKey.key) - } - } - - const fetchAddresses = async () => { - const addresses = await Livestream.getAddresses().catch((error) => { - app.message.error(`Failed to fetch addresses`) - console.error(error) - - return null - }) - - if (addresses) { - setAddresses(addresses) - } - } - - const fetchStreamInfo = async () => { - const result = await Livestream.getStreamInfo().catch((err) => { - console.error(err) - return false - }) - - console.log("Stream info", result) - - if (result) { - setStreamInfo(result) - } - } - - React.useEffect(() => { - fetchAddresses() - fetchStreamInfo() - fetchStreamingKey() - }, []) - - return
-
-
- -
- -
-
- : } - > - {isConnected ? "Connected" : "Disconnected"} - -
-
- - Title - -

- {streamInfo?.title ?? "No title"} -

-
- -
- - Description - - -

- {streamInfo?.description ?? "No description"} -

-
- -
- - Category - -

- {streamInfo?.category?.label ?? "No category"} -

-
-
- -
- } - onClick={onClickEditInfo} - > - Edit info - -
-
- -
-
-

Emission

- -
- Ingestion URL - - - {addresses.ingestURL ?? "No ingest URL available"} - -
- -
-
-
- Streaming key -
-
- regenerateStreamingKey()}> - - Regenerate - -
-
- -
- -
-
-
- -
-

Additional options

- -
- Enable DVR - -
- -
-
- -
- Private mode - -
- -
-
-
- -
-

URL Information

- -
- Live URL - - - {addresses.liveURL ?? "No Live URL available"} - -
- -
- HLS URL - - - {addresses.hlsURL ?? "No HLS URL available"} - -
- -
- FLV URL - - - {addresses.flvURL ?? "No FLV URL available"} - -
-
- -
-

Statistics

- -
- -

- Cannot connect with statistics -

-
-
-
-
-
-} \ No newline at end of file diff --git a/packages/app/src/pages/live_control/index.less b/packages/app/src/pages/live_control/index.less deleted file mode 100644 index 3f693d07..00000000 --- a/packages/app/src/pages/live_control/index.less +++ /dev/null @@ -1,143 +0,0 @@ -.streamingControlPanel { - display: flex; - flex-direction: column; - - transition: all 0.3s ease-in-out; - - .header { - display: flex; - flex-direction: row; - - height: fit-content; - - padding: 15px; - - border: 1px solid var(--border-color); - border-radius: 12px; - - margin-bottom: 20px; - - transition: all 0.3s ease-in-out; - - .preview { - height: 100%; - width: 300px; - - img { - width: 100%; - height: 100%; - - border-radius: 12px; - } - - margin-right: 40px; - } - - .details { - display: inline-flex; - flex-direction: column; - - padding: 20px 0; - width: 100%; - - .status { - margin-bottom: 20px; - } - } - } - - .config { - display: flex; - - padding: 0 40px; - - transition: all 0.3s ease-in-out; - - code { - padding: 5px 8px; - font-size: 1rem; - - background-color: var(--background-color-accent); - color: var(--text-color); - - border-radius: 8px; - - font-family: "DM Mono", monospace; - - user-select: all; - } - - .panel { - display: flex; - flex-direction: column; - - margin-right: 50px; - - .content { - display: flex; - flex-direction: column; - - margin: 10px 20px 20px 0; - - width: 100%; - - .title { - display: inline-flex; - flex-direction: row; - - justify-content: space-between; - align-items: center; - - width: 100%; - margin-bottom: 8px; - } - } - } - } - -} - -.streamingKeyString { - display: inline-flex; - flex-direction: row; - - align-items: center; - justify-content: center; - - color: var(--text-color); - - svg { - font-size: 1.5rem; - - cursor: pointer; - } - - div { - display: inline-flex; - flex-direction: row; - - align-items: center; - justify-content: center; - } -} - -.streamInfoEditor { - display: flex; - flex-direction: column; - - .field { - display: flex; - flex-direction: column; - - margin-bottom: 20px; - - .value { - margin-top: 5px; - margin-left: 20px; - - .ant-select { - min-width: 200px; - } - } - } -} \ No newline at end of file