mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-16 04:43:35 +00:00
107 lines
3.2 KiB
TypeScript
107 lines
3.2 KiB
TypeScript
import { OntimeEvent, Playback } from 'ontime-types';
|
|
|
|
import { ViewExtendedTimer } from '../../../common/models/TimeManager.type';
|
|
import { formatTime } from '../../../common/utils/time';
|
|
import { isStringBoolean } from '../common/viewUtils';
|
|
|
|
export enum TimerMessage {
|
|
toStart = 'to_start',
|
|
waiting = 'waiting',
|
|
running = 'running',
|
|
ended = 'ended',
|
|
unhandled = '',
|
|
}
|
|
|
|
/**
|
|
* Parses string as a title
|
|
*/
|
|
export const sanitiseTitle = (title: string | null) => (title ? title : '{no title}');
|
|
|
|
/**
|
|
* Returns a parsed timer and relevant status message
|
|
*/
|
|
export const fetchTimerData = (
|
|
time: ViewExtendedTimer,
|
|
follow: OntimeEvent | null,
|
|
selectedId: string | null,
|
|
offset: number,
|
|
): { message: TimerMessage; timer: number } => {
|
|
if (follow === null) {
|
|
return { message: TimerMessage.unhandled, timer: 0 };
|
|
}
|
|
|
|
if (selectedId === follow.id) {
|
|
// if it is selected, it may not be running
|
|
return {
|
|
message: time.playback === Playback.Pause ? TimerMessage.waiting : TimerMessage.running,
|
|
timer: time.current ?? 0,
|
|
};
|
|
}
|
|
|
|
const showProjected = getShouldShowProjected();
|
|
const addedTime = showProjected ? offset : 0;
|
|
if (time.clock < follow.timeStart) {
|
|
// if it hasnt started, we count to start
|
|
return { message: TimerMessage.toStart, timer: follow.timeStart - time.clock - addedTime };
|
|
}
|
|
|
|
if (follow.timeStart <= time.clock && time.clock <= follow.timeEnd) {
|
|
// if it has started, we show running timer
|
|
return { message: TimerMessage.waiting, timer: time.current ?? 0 };
|
|
}
|
|
|
|
// running timer timer is not the one we are following
|
|
|
|
// ends day after
|
|
if (follow.timeStart > follow.timeEnd) {
|
|
if (follow.timeStart > time.clock) {
|
|
// if it hasnt started, we count to start
|
|
return { message: TimerMessage.toStart, timer: follow.timeStart - time.clock - addedTime };
|
|
}
|
|
if (follow.timeStart <= time.clock) {
|
|
// if it has started, we show running timer
|
|
return { message: TimerMessage.waiting, timer: time.current ?? 0 };
|
|
}
|
|
// if it has ended, we show how long ago
|
|
return { message: TimerMessage.ended, timer: follow.timeEnd };
|
|
}
|
|
|
|
// if it has ended, we show how long ago
|
|
return { message: TimerMessage.ended, timer: follow.timeEnd };
|
|
};
|
|
|
|
/**
|
|
* Gets values for the timer items
|
|
*/
|
|
export function getTimerItems(start: number | undefined, end: number | undefined, delay: number, offset: number) {
|
|
if (start == null || end == null) {
|
|
return {
|
|
scheduledStart: '',
|
|
scheduledEnd: '',
|
|
projectedStart: '',
|
|
projectedEnd: '',
|
|
};
|
|
}
|
|
|
|
const showProjected = getShouldShowProjected();
|
|
const scheduledStart = formatTime(start + delay);
|
|
const scheduledEnd = formatTime(end + delay);
|
|
const projectedStart = showProjected ? formatTime(start + delay - offset) : '';
|
|
const projectedEnd = showProjected ? formatTime(end + delay - offset) : '';
|
|
|
|
return {
|
|
scheduledStart,
|
|
scheduledEnd,
|
|
projectedStart,
|
|
projectedEnd,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Gets from the URL whether the showProjected option is active
|
|
*/
|
|
function getShouldShowProjected() {
|
|
const params = new URL(document.location.href).searchParams;
|
|
return isStringBoolean(params.get('showProjected'));
|
|
}
|