import React, { useContext, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import Link from 'next/link'; import { differenceInSeconds } from "date-fns"; import { useRouter } from 'next/router'; import { Layout, Menu } from 'antd'; import { SettingOutlined, HomeOutlined, LineChartOutlined, CloseCircleOutlined, PlayCircleFilled, MinusSquareFilled, } from '@ant-design/icons'; import classNames from 'classnames'; import { upgradeVersionAvailable } from "../../utils/apis"; import { parseSecondsToDurationString } from '../../utils/format' import OwncastLogo from './logo'; import { BroadcastStatusContext } from '../../utils/broadcast-status-context'; import adminStyles from '../../styles/styles.module.css'; export default function MainLayout(props) { const { children } = props; const context = useContext(BroadcastStatusContext); const { broadcastActive, broadcaster } = context || {}; const router = useRouter(); const { route } = router || {}; const { Header, Footer, Content, Sider } = Layout; const { SubMenu } = Menu; const streamDurationString = broadcastActive ? parseSecondsToDurationString(differenceInSeconds(new Date(), new Date(broadcaster.time))) : "" const statusIcon = broadcastActive ? : ; const statusMessage = broadcastActive ? `Online ${ streamDurationString}` : "Offline"; const [upgradeVersion, setUpgradeVersion] = useState(null); const checkForUpgrade = async () => { try { const result = await upgradeVersionAvailable(); setUpgradeVersion(result); } catch (error) { console.log("==== error", error); } }; useEffect(() => { checkForUpgrade(); }, []); const appClass = classNames({ 'owncast-layout': true, [adminStyles.online]: broadcastActive, }) const upgradeMenuItemStyle = upgradeVersion ? 'block' : 'none'; const upgradeVersionString = upgradeVersion || ''; return (

Owncast Admin

}> Home } title="Current stream" > Viewers {broadcastActive ? ( }> Disconnect Stream... ) : null} } > Server Configuration Video Configuration Storage } title="Utilities" > Hardware Logs Upgrade to v{upgradeVersionString}
{statusMessage} {statusIcon}
{children}
); } MainLayout.propTypes = { children: PropTypes.element.isRequired, };