import { useMemo, useState } from 'react'; import { IoAdd } from 'react-icons/io5'; import { EntryId, isOntimeEvent, isPlayableEvent, OntimeEvent, OntimeView } from 'ontime-types'; import Button from '../../common/components/buttons/Button'; import Empty from '../../common/components/state/Empty'; import EmptyPage from '../../common/components/state/EmptyPage'; import ViewLogo from '../../common/components/view-logo/ViewLogo'; import ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor'; import { useClock } from '../../common/hooks/useSocket'; import { useWindowTitle } from '../../common/hooks/useWindowTitle'; import { ExtendedEntry } from '../../common/utils/rundownMetadata'; import { formatTime, getDefaultFormat } from '../../common/utils/time'; import SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime'; import { useTranslation } from '../../translation/TranslationProvider'; import Loader from '../common/loader/Loader'; import { getCountdownOptions, useCountdownOptions } from './countdown.options'; import { getOrderedSubscriptions } from './countdown.utils'; import CountdownSelect from './CountdownSelect'; import CountdownSubscriptions from './CountdownSubscriptions'; import SingleEventCountdown from './SingleEventCountdown'; import { CountdownData, useCountdownData } from './useCountdownData'; import './Countdown.scss'; export default function CountdownLoader() { const { data, status } = useCountdownData(); useWindowTitle('Countdown'); if (status === 'pending') { return ; } if (status === 'error') { return ; } return ; } function Countdown({ customFields, rundownData, projectData, isMirrored, settings }: CountdownData) { const { getLocalizedString } = useTranslation(); const { subscriptions } = useCountdownOptions(); const [editMode, setEditMode] = useState(false); // gather rundown data const playableEvents = rundownData.filter((entry) => isOntimeEvent(entry) && isPlayableEvent(entry)); // gather presentation data const hasEvents = playableEvents.length > 0; // gather option data const defaultFormat = getDefaultFormat(settings?.timeFormat); const countdownOptions = useMemo( () => getCountdownOptions(defaultFormat, customFields, subscriptions), [defaultFormat, customFields, subscriptions], ); return (
{projectData?.logo && }
{projectData.title}
{!hasEvents && } {hasEvents && editMode && ( setEditMode(false)} /> )} {hasEvents && !editMode && ( setEditMode(true)} /> )}
); } interface CountdownContentsProps { playableEvents: ExtendedEntry[]; subscriptions: EntryId[]; goToEditMode: () => void; } function CountdownContents({ playableEvents, subscriptions, goToEditMode }: CountdownContentsProps) { const { getLocalizedString } = useTranslation(); if (subscriptions.length === 0) { return (
); } const subscribedEvents = getOrderedSubscriptions(subscriptions, playableEvents); if (subscribedEvents.length === 0) { return (
); } if (subscribedEvents.length === 1) { const event = subscribedEvents.at(0); if (!event) return null; return ; } return ; } function CountdownClock() { const { getLocalizedString } = useTranslation(); const { clock } = useClock(); // gather timer data const formattedClock = formatTime(clock); return (
{getLocalizedString('common.time_now')}
); }