some cleanup

This commit is contained in:
Ginger Wong 2020-10-22 17:16:28 -07:00
parent a062856726
commit 00fd087fde
9 changed files with 76 additions and 38 deletions

View File

@ -9,8 +9,10 @@ import {
LineChartOutlined, LineChartOutlined,
CloseCircleOutlined, CloseCircleOutlined,
PlayCircleFilled, PlayCircleFilled,
StopFilled,
MinusSquareFilled,
} from '@ant-design/icons'; } from '@ant-design/icons';
import classNames from 'classNames'; import classNames from 'classnames';
import OwncastLogo from './logo'; import OwncastLogo from './logo';
@ -30,7 +32,9 @@ export default function MainLayout(props) {
const { Header, Footer, Content, Sider } = Layout; const { Header, Footer, Content, Sider } = Layout;
const { SubMenu } = Menu; const { SubMenu } = Menu;
const statusMessage = broadcastActive ? const statusIcon = broadcastActive ?
<PlayCircleFilled /> : <MinusSquareFilled />;
const statusMessage = broadcastActive ?
'Online' : 'Offline'; 'Online' : 'Offline';
const appClass = classNames({ const appClass = classNames({
@ -59,7 +63,7 @@ export default function MainLayout(props) {
<span className={adminStyles.owncastTitle}>Owncast Admin</span> <span className={adminStyles.owncastTitle}>Owncast Admin</span>
</h1> </h1>
<Menu.Item key="home" icon={<HomeOutlined />}> <Menu.Item key="home" icon={<HomeOutlined />}>
<Link href="/index2">Home</Link> <Link href="/">Home</Link>
</Menu.Item> </Menu.Item>
<SubMenu key="current-stream-menu" icon={<LineChartOutlined />} title="Stream Details"> <SubMenu key="current-stream-menu" icon={<LineChartOutlined />} title="Stream Details">
@ -96,12 +100,12 @@ export default function MainLayout(props) {
<Layout> <Layout>
<Header className={adminStyles.header}> <Header className={adminStyles.header}>
<div className={adminStyles.statusIndicatorContainer}> <div className={adminStyles.statusIndicatorContainer}>
<span className={adminStyles.statusIcon}>
<PlayCircleFilled />
</span>
<span className={adminStyles.statusLabel}> <span className={adminStyles.statusLabel}>
{statusMessage} {statusMessage}
</span> </span>
<span className={adminStyles.statusIcon}>
{statusIcon}
</span>
</div> </div>
</Header> </Header>
<Content className={adminStyles.contentMain}> <Content className={adminStyles.contentMain}>

View File

@ -1,5 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect, useContext } from 'react';
import { Table } from 'antd'; import { Table } from 'antd';
import { BroadcastStatusContext } from './utils/broadcast-status-context';
import { CONNECTED_CLIENTS, fetchData, FETCH_INTERVAL } from './utils/apis'; import { CONNECTED_CLIENTS, fetchData, FETCH_INTERVAL } from './utils/apis';
@ -12,13 +13,16 @@ geo data looks like this
} }
*/ */
export default function HardwareInfo() { export default function ConnectedClients() {
const context = useContext(BroadcastStatusContext);
const { broadcastActive } = context || {};
const [clients, setClients] = useState([]); const [clients, setClients] = useState([]);
const getInfo = async () => { const getInfo = async () => {
try { try {
const result = await fetchData(CONNECTED_CLIENTS); const result = await fetchData(CONNECTED_CLIENTS);
console.log("result",result)
setClients(result); setClients(result);
} catch (error) { } catch (error) {
console.log("==== error", error) console.log("==== error", error)
} }
@ -28,14 +32,22 @@ export default function HardwareInfo() {
let getStatusIntervalId = null; let getStatusIntervalId = null;
getInfo(); getInfo();
getStatusIntervalId = setInterval(getInfo, FETCH_INTERVAL); if (broadcastActive) {
getStatusIntervalId = setInterval(getInfo, FETCH_INTERVAL);
// returned function will be called on component unmount // returned function will be called on component unmount
return () => { return () => {
clearInterval(getStatusIntervalId); clearInterval(getStatusIntervalId);
}
} }
return () => [];
}, []); }, []);
if (!clients.length) {
return "no clients";
}
// todo - check to see if broadcast active has changed. if so, start polling.
const columns = [ const columns = [
{ {
title: 'User name', title: 'User name',

View File

@ -1,7 +1,11 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect, useContext } from 'react';
import { HARDWARE_STATS, fetchData, FETCH_INTERVAL } from './utils/apis'; import { HARDWARE_STATS, fetchData, FETCH_INTERVAL } from './utils/apis';
import { BroadcastStatusContext } from './utils/broadcast-status-context';
export default function HardwareInfo() { export default function HardwareInfo() {
const context = useContext(BroadcastStatusContext);
const { broadcastActive } = context || {};
const [hardwareStatus, setHardwareStatus] = useState({}); const [hardwareStatus, setHardwareStatus] = useState({});
const getHardwareStatus = async () => { const getHardwareStatus = async () => {

View File

@ -1,11 +1,19 @@
import React from 'react';
import { Card, Alert, Statistic, Row, Col } from "antd"; import { Card, Alert, Statistic, Row, Col } from "antd";
import { LikeOutlined } from "@ant-design/icons"; import { LikeOutlined } from "@ant-design/icons";
const { Meta } = Card; const { Meta } = Card;
export default function Home() { export default function AdminHome() {
return ( return (
<div> <div>
<div>
&lt; pick something<br />
Home view. pretty pictures. Rainbows. Kittens.
</div>
<br /><br />
<Alert <Alert
message="These are some ant design component example I stole from their web site." message="These are some ant design component example I stole from their web site."
type="success" type="success"

View File

@ -1,10 +0,0 @@
import React from 'react';
export default function AdminHome() {
return (
<div>
&lt; pick something<br />
Home view. pretty pictures. Rainbows. Kittens.
</div>
);
}

View File

@ -1,7 +1,12 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect, useContext } from 'react';
import { SERVER_CONFIG, fetchData, FETCH_INTERVAL } from './utils/apis'; import { SERVER_CONFIG, fetchData, FETCH_INTERVAL } from './utils/apis';
import { BroadcastStatusContext } from './utils/broadcast-status-context';
export default function ServerConfig() { export default function ServerConfig() {
const context = useContext(BroadcastStatusContext);
const { broadcastActive } = context || {};
const [clients, setClients] = useState({}); const [clients, setClients] = useState({});
const getInfo = async () => { const getInfo = async () => {

View File

@ -17,7 +17,7 @@ const BroadcastStatusProvider = ({ children }) => {
const getBroadcastStatus = async () => { const getBroadcastStatus = async () => {
try { try {
const result = await fetchData(BROADCASTER); const result = await fetchData(BROADCASTER);
const broadcastActive = !!result.broadcaster; const broadcastActive = !!result.broadcaster || result.success;
setBroadcasterStatus({ ...result, broadcastActive }); setBroadcasterStatus({ ...result, broadcastActive });
} catch (error) { } catch (error) {

View File

@ -1,12 +1,16 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect, useContext } from 'react';
import {timeFormat} from 'd3-time-format'; import {timeFormat} from 'd3-time-format';
import { LineChart, XAxis, YAxis, Line, Tooltip } from 'recharts'; import { LineChart, XAxis, YAxis, Line, Tooltip } from 'recharts';
import { BroadcastStatusContext } from './utils/broadcast-status-context';
import { VIEWERS_OVER_TIME, fetchData } from './utils/apis'; import { VIEWERS_OVER_TIME, fetchData } from './utils/apis';
const FETCH_INTERVAL = 5 * 60 * 1000; // 5 mins const FETCH_INTERVAL = 5 * 60 * 1000; // 5 mins
export default function ViewersOverTime() { export default function ViewersOverTime() {
const context = useContext(BroadcastStatusContext);
const { broadcastActive } = context || {};
const [viewerInfo, setViewerInfo] = useState([]); const [viewerInfo, setViewerInfo] = useState([]);
const getInfo = async () => { const getInfo = async () => {
@ -22,14 +26,24 @@ export default function ViewersOverTime() {
let getStatusIntervalId = null; let getStatusIntervalId = null;
getInfo(); getInfo();
getStatusIntervalId = setInterval(getInfo, FETCH_INTERVAL); if (broadcastActive) {
getStatusIntervalId = setInterval(getInfo, FETCH_INTERVAL);
// returned function will be called on component unmount // returned function will be called on component unmount
return () => { return () => {
clearInterval(getStatusIntervalId); clearInterval(getStatusIntervalId);
}
} }
return () => [];
}, []); }, []);
// todo - check to see if broadcast active has changed. if so, start polling.
if (!viewerInfo.length) {
return "no info";
}
const timeFormatter = (tick) => {return timeFormat('%H:%M:%S')(new Date(tick));}; const timeFormatter = (tick) => {return timeFormat('%H:%M:%S')(new Date(tick));};
const CustomizedTooltip = (props) => { const CustomizedTooltip = (props) => {

View File

@ -36,6 +36,7 @@
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-end; justify-content: flex-end;
padding-right: 1rem;
} }
.statusIndicatorContainer { .statusIndicatorContainer {
@ -49,15 +50,15 @@
font-size: 1.5rem; font-size: 1.5rem;
} }
.statusIcon svg { .statusIcon svg {
fill: #ccc; fill: #999;
} }
.statusLabel { .statusLabel {
color: #fff; color: #fff;
text-transform: uppercase; text-transform: uppercase;
font-size: .75rem; font-size: .75rem;
display: inline-block; display: inline-block;
margin-left: .5rem; margin-right: .5rem;
color: #ccc; color: #999;
} }
.online .statusIcon svg { .online .statusIcon svg {
fill: #52c41a; fill: #52c41a;