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')}
);
}