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)}
- />
-
-
-
-
- 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
-
-
-
-
-
-
-
-
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