owncast/web/pages/embed/video/index.tsx

95 lines
2.8 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { useRecoilValue } from 'recoil';
import { useRouter } from 'next/router';
2023-02-01 10:25:40 +03:00
import { Skeleton } from 'antd';
import {
clientConfigStateAtom,
ClientConfigStore,
isOnlineSelector,
serverStatusState,
2023-02-01 10:25:40 +03:00
appStateAtom,
} from '../../../components/stores/ClientConfigStore';
reafctor: normalize component formatting (#2082) * refactor: move/rename BanUserButton file * refactor: move/rename Chart file * refactor: update generic component filenames to PascalCase * refactor: update config component filenames to PascalCase * refactor: update AdminLayout component filename to PascalCase * refactor: update/move VideoJS component * chore(eslint): disable bad react/require-default-props rule * refactor: normalize ActionButton component * refactor: normalize ActionButtonRow component * refactor: normalize FollowButton component * refactor: normalize NotifyButton component * refactor: normalize ChatActionMessage component * refactor: normalize ChatContainer component * refactor: normalize ChatJoinMessage component * refactor: normalize ChatModerationActionMenu component * refactor: normalize ChatModerationDetailsModal component * refactor: normalize ChatModeratorNotification component * refactor: normalize ChatSocialMessage component * refactor: normalize ChatSystemMessage component * refactor: normalize ChatTextField component * refactor: normalize ChatUserBadge component * refactor: normalize ChatUserMessage component * refactor: normalize ContentHeader component * refactor: normalize OwncastLogo component * refactor: normalize UserDropdown component * chore(eslint): modify react/function-component-definition rule * refactor: normalize CodecSelector component * refactor: update a bunch of functional components using eslint * refactor: update a bunch of functional components using eslint, pt2 * refactor: update a bunch of functional components using eslint, pt3 * refactor: replace all component->component default imports with named imports * refactor: replace all component-stories->component default imports with named imports * refactor: remove default exports from most components * chore(eslint): add eslint config files for the components and pages dirs * fix: use-before-define error in ChatContainer * Fix ChatContainer import * Only process .tsx files in Next builds Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2022-09-07 10:00:28 +03:00
import { OfflineBanner } from '../../../components/ui/OfflineBanner/OfflineBanner';
import { Statusbar } from '../../../components/ui/Statusbar/Statusbar';
import { OwncastPlayer } from '../../../components/video/OwncastPlayer/OwncastPlayer';
import { ClientConfig } from '../../../interfaces/client-config.model';
import { ServerStatus } from '../../../interfaces/server-status.model';
2023-02-01 10:25:40 +03:00
import { AppStateOptions } from '../../../components/stores/application-state';
import { Theme } from '../../../components/theme/Theme';
2022-05-17 08:55:22 +03:00
export default function VideoEmbed() {
const status = useRecoilValue<ServerStatus>(serverStatusState);
const clientConfig = useRecoilValue<ClientConfig>(clientConfigStateAtom);
2023-02-01 10:25:40 +03:00
const appState = useRecoilValue<AppStateOptions>(appStateAtom);
const { name } = clientConfig;
const { offlineMessage } = clientConfig;
const { viewerCount, lastConnectTime, lastDisconnectTime, streamTitle } = status;
const online = useRecoilValue<boolean>(isOnlineSelector);
const router = useRouter();
/**
* router.query isn't initialized until hydration
* (see https://github.com/vercel/next.js/discussions/11484)
* but router.asPath is initialized earlier, so we parse the
* query parameters ourselves
*/
const path = router.asPath.split('?')[1] ?? '';
const query = path.split('&').reduce((currQuery, part) => {
const [key, value] = part.split('=');
return { ...currQuery, [key]: value };
}, {} as Record<string, string>);
const initiallyMuted = query.initiallyMuted === 'true';
2023-02-01 10:25:40 +03:00
const loadingState = <Skeleton active style={{ padding: '10px' }} paragraph={{ rows: 10 }} />;
const offlineState = (
<OfflineBanner
streamName={name}
customText={offlineMessage}
lastLive={lastDisconnectTime}
notificationsEnabled={false}
/>
2023-02-01 10:25:40 +03:00
);
const onlineState = (
<>
<OwncastPlayer
source="/hls/stream.m3u8"
online={online}
initiallyMuted={initiallyMuted}
title={streamTitle || name}
fill
2023-02-01 10:25:40 +03:00
/>
<Statusbar
online={online}
lastConnectTime={lastConnectTime}
lastDisconnectTime={lastDisconnectTime}
viewerCount={viewerCount}
/>
</>
);
const getView = () => {
if (appState.appLoading) {
return loadingState;
}
if (online) {
return onlineState;
}
return offlineState;
};
2022-05-17 08:55:22 +03:00
return (
<>
<ClientConfigStore />
2023-02-01 10:25:40 +03:00
<Theme />
<div className="video-embed">{getView()}</div>
</>
2022-05-17 08:55:22 +03:00
);
}