import { useSearchParams } from 'react-router-dom'; import type { MaybeString, OntimeEvent, OntimeRundown, Settings, ViewSettings } from 'ontime-types'; import { Playback } from 'ontime-types'; import { millisToString, removeSeconds, secondsInMillis } from 'ontime-utils'; import { overrideStylesURL } from '../../../common/api/constants'; import { FitText } from '../../../common/components/fit-text/FitText'; import ViewParamsEditor from '../../../common/components/view-params-editor/ViewParamsEditor'; import { useRuntimeStylesheet } from '../../../common/hooks/useRuntimeStylesheet'; import { useWindowTitle } from '../../../common/hooks/useWindowTitle'; import { ViewExtendedTimer } from '../../../common/models/TimeManager.type'; import { formatTime, getDefaultFormat } from '../../../common/utils/time'; import { isStringBoolean } from '../common/viewUtils'; import { getStudioClockOptions } from './studioClock.options'; import StudioClockSchedule from './StudioClockSchedule'; import './StudioClock.scss'; interface StudioClockProps { isMirrored: boolean; eventNext: OntimeEvent | null; time: ViewExtendedTimer; backstageEvents: OntimeRundown; selectedId: MaybeString; nextId: MaybeString; onAir: boolean; viewSettings: ViewSettings; settings: Settings | undefined; } export default function StudioClock(props: StudioClockProps) { const { isMirrored, eventNext, time, backstageEvents, selectedId, nextId, onAir, viewSettings, settings } = props; const { shouldRender } = useRuntimeStylesheet(viewSettings?.overrideStyles && overrideStylesURL); const [searchParams] = useSearchParams(); useWindowTitle('Studio Clock'); // defer rendering until we load stylesheets if (!shouldRender) { return null; } const activeIndicators = [...Array(12).keys()]; const secondsIndicators = [...Array(60).keys()]; let clock = formatTime(time.clock); let hasAmPm = ''; if (clock.includes('AM')) { clock = clock.replace('PM', ''); hasAmPm = 'AM'; } else if (clock.includes('PM')) { clock = clock.replace('PM', ''); hasAmPm = 'PM'; } const secondsNow = secondsInMillis(time.clock); const isNegative = (time.current ?? 0) < 0; const isPaused = time.playback === Playback.Pause; const defaultFormat = getDefaultFormat(settings?.timeFormat); const studioClockOptions = getStudioClockOptions(defaultFormat); const hideRight = isStringBoolean(searchParams.get('hideRight')); let timer = millisToString(time.current, { fallback: '---' }); const hideSeconds = isStringBoolean(searchParams.get('hideTimerSeconds')); if (time.current != null && hideSeconds) { timer = removeSeconds(timer); } return (
{hasAmPm &&
{hasAmPm}
}
{clock}
{eventNext?.title}
{timer}
{activeIndicators.map((i) => (
))} {secondsIndicators.map((i) => (
))}
{!hideRight && ( )}
); }