Refactor: split runtime state (#1725)

* refactor: runtime types

* refactor: runtimeState functions to use the split type

* refactor: RuntimeService to use the new split data

* refactor: use the split data in the UI

* update comments

* refactor: rename runtime to offset

* fix utils test
This commit is contained in:
Alex Christoffer Rasmussen
2025-08-14 19:29:25 +02:00
committed by Carlos Valente
parent ed93cf313a
commit 048a9c96ea
26 changed files with 400 additions and 518 deletions
@@ -1,13 +0,0 @@
import type { MaybeNumber } from '../../utils/utils.type.js';
import type { EntryId } from '../core/OntimeEntry.js';
export type GroupState = {
id: EntryId;
startedAt: MaybeNumber;
expectedEnd: MaybeNumber;
};
export type UpcomingEntry = {
id: EntryId;
expectedStart: MaybeNumber;
};
@@ -0,0 +1,15 @@
import type { MaybeNumber } from '../../utils/utils.type.js';
export enum OffsetMode {
Absolute = 'absolute',
Relative = 'relative',
}
export type Offset = {
absolute: number; // a positive value means that we are in over time aka behind schedule
relative: number;
mode: OffsetMode;
expectedGroupEnd: MaybeNumber;
expectedRundownEnd: MaybeNumber;
expectedFlagStart: MaybeNumber;
};
@@ -0,0 +1,9 @@
import type { MaybeNumber } from '../../utils/utils.type.js';
export type RundownState = {
selectedEventIndex: MaybeNumber;
numEvents: number;
plannedStart: MaybeNumber;
actualStart: MaybeNumber;
plannedEnd: MaybeNumber;
};
@@ -1,18 +0,0 @@
import type { MaybeNumber } from '../../utils/utils.type.js';
export enum OffsetMode {
Absolute = 'absolute',
Relative = 'relative',
}
export type Runtime = {
selectedEventIndex: MaybeNumber;
numEvents: number;
offsetAbs: number; // a positive value means that we are in over time aka behind schedule
offsetRel: number;
plannedStart: MaybeNumber;
actualStart: MaybeNumber;
plannedEnd: MaybeNumber;
expectedEnd: MaybeNumber;
offsetMode: OffsetMode;
};
@@ -1,6 +1,6 @@
import { SimpleDirection, SimplePlayback } from './AuxTimer.type.js';
import { OffsetMode } from './Offset.type.js';
import { Playback } from './Playback.type.js';
import { OffsetMode } from './Runtime.type.js';
import type { RuntimeStore } from './RuntimeStore.type.js';
import { TimerPhase } from './TimerState.type.js';
@@ -27,22 +27,25 @@ export const runtimeStorePlaceholder: Readonly<RuntimeStore> = {
},
secondary: '',
},
runtime: {
rundown: {
selectedEventIndex: null, // changes if rundown changes or we load a new event
numEvents: 0, // change initiated by user
offsetAbs: 0, // changes at runtime
offsetRel: 0, // changes at runtime
plannedStart: 0, // only changes if event changes
plannedEnd: 0, // only changes if event changes, overflows over dayInMs
actualStart: null, // set once we start the timer
expectedEnd: null, // changes with runtime, based on offset, overflows over dayInMs
offsetMode: OffsetMode.Absolute,
},
offset: {
absolute: 0, // changes at runtime
relative: 0, // changes at runtime
mode: OffsetMode.Absolute,
expectedFlagStart: null,
expectedGroupEnd: null,
expectedRundownEnd: null,
},
groupNow: null,
groupNext: null,
nextFlag: null,
eventNow: null,
eventNext: null,
eventFlag: null,
auxtimer1: {
current: 0,
direction: SimpleDirection.CountUp,
@@ -1,9 +1,8 @@
import type { MaybeString } from '../../utils/utils.type.js';
import type { OntimeEvent } from '../core/OntimeEntry.js';
import type { OntimeEvent, OntimeGroup } from '../core/OntimeEntry.js';
import type { SimpleTimerState } from './AuxTimer.type.js';
import type { GroupState, UpcomingEntry } from './CurrentGroupState.type.js';
import type { MessageState } from './MessageControl.type.js';
import type { Runtime } from './Runtime.type.js';
import type { Offset } from './Offset.type.js';
import type { RundownState } from './RundownState.type.js';
import type { TimerState } from './TimerState.type.js';
export type RuntimeStore = {
@@ -15,13 +14,16 @@ export type RuntimeStore = {
message: MessageState;
// rundown data
runtime: Runtime;
rundown: RundownState;
// runtime
offset: Offset;
// relevant entries
eventNow: OntimeEvent | null;
eventNext: OntimeEvent | null;
groupNow: GroupState | null;
groupNext: MaybeString;
nextFlag: UpcomingEntry | null;
eventFlag: OntimeEvent | null;
groupNow: OntimeGroup | null;
// extra timers
auxtimer1: SimpleTimerState;
+3 -3
View File
@@ -96,12 +96,12 @@ export { Playback } from './definitions/runtime/Playback.type.js';
export { TimerLifeCycle, timerLifecycleValues } from './definitions/core/TimerLifecycle.type.js';
export type { TimerMessage, MessageState, SecondarySource } from './definitions/runtime/MessageControl.type.js';
export type { Runtime } from './definitions/runtime/Runtime.type.js';
export { OffsetMode } from './definitions/runtime/Runtime.type.js';
export type { RundownState } from './definitions/runtime/RundownState.type.js';
export type { Offset } from './definitions/runtime/Offset.type.js';
export { OffsetMode } from './definitions/runtime/Offset.type.js';
export type { RuntimeStore } from './definitions/runtime/RuntimeStore.type.js';
export { runtimeStorePlaceholder } from './definitions/runtime/RuntimeStore.js';
export { type TimerState, TimerPhase } from './definitions/runtime/TimerState.type.js';
export type { GroupState, UpcomingEntry } from './definitions/runtime/CurrentGroupState.type.js';
// ---> Extra Timer
export { type SimpleTimerState, SimplePlayback, SimpleDirection } from './definitions/runtime/AuxTimer.type.js';
@@ -15,7 +15,7 @@ describe('getExpectedStart()', () => {
currentDay: 0,
totalGap: 0,
offset: 0,
offsetMode: OffsetMode.Absolute,
mode: OffsetMode.Absolute,
actualStart: null,
plannedStart: null,
};
@@ -34,7 +34,7 @@ describe('getExpectedStart()', () => {
currentDay: 0,
totalGap: 0,
offset: 20,
offsetMode: OffsetMode.Absolute,
mode: OffsetMode.Absolute,
actualStart: null,
plannedStart: null,
};
@@ -53,7 +53,7 @@ describe('getExpectedStart()', () => {
currentDay: 0,
totalGap: 0,
offset: -10,
offsetMode: OffsetMode.Absolute,
mode: OffsetMode.Absolute,
actualStart: null,
plannedStart: null,
};
@@ -72,7 +72,7 @@ describe('getExpectedStart()', () => {
currentDay: 0,
totalGap: 20,
offset: 20,
offsetMode: OffsetMode.Absolute,
mode: OffsetMode.Absolute,
actualStart: null,
plannedStart: null,
};
@@ -91,7 +91,7 @@ describe('getExpectedStart()', () => {
currentDay: 0,
totalGap: 10,
offset: 20,
offsetMode: OffsetMode.Absolute,
mode: OffsetMode.Absolute,
actualStart: 0,
plannedStart: 0,
};
@@ -109,7 +109,7 @@ describe('getExpectedStart()', () => {
actualStart: 100,
plannedStart: 0,
offset: 0,
offsetMode: OffsetMode.Relative,
mode: OffsetMode.Relative,
};
const timeStartEvent2 = 10;
@@ -189,7 +189,7 @@ describe('getExpectedStart()', () => {
actualStart: 100,
plannedStart: 0,
offset: 0,
offsetMode: OffsetMode.Relative,
mode: OffsetMode.Relative,
};
expect(getExpectedStart(testEvent, { ...testState, isLinkedToLoaded: true })).toBe(120);
@@ -213,7 +213,7 @@ describe('getExpectedStart()', () => {
actualStart: 100,
plannedStart: 0,
offset: 0,
offsetMode: OffsetMode.Relative,
mode: OffsetMode.Relative,
};
expect(getExpectedStart(testEvent, { ...testState, isLinkedToLoaded: true })).toBe(120);
@@ -236,7 +236,7 @@ describe('getExpectedStart()', () => {
actualStart: 100,
plannedStart: 0,
offset: 0,
offsetMode: OffsetMode.Relative,
mode: OffsetMode.Relative,
};
// this event will start the current day
@@ -270,7 +270,7 @@ describe('getExpectedStart()', () => {
actualStart: 100,
plannedStart: 0,
offset: 0,
offsetMode: OffsetMode.Relative,
mode: OffsetMode.Relative,
isLinkedToLoaded: false,
};
@@ -19,13 +19,13 @@ export function getExpectedStart(
totalGap: number;
isLinkedToLoaded: boolean;
offset: number;
offsetMode: OffsetMode;
mode: OffsetMode;
actualStart: MaybeNumber;
plannedStart: MaybeNumber;
},
): number {
const { timeStart, dayOffset, delay } = event;
const { currentDay, totalGap, isLinkedToLoaded, offset, offsetMode, actualStart, plannedStart } = state;
const { currentDay, totalGap, isLinkedToLoaded, offset, mode, actualStart, plannedStart } = state;
//How many days from the currently running event to this one
const relativeDayOffset = dayOffset - currentDay;
@@ -37,7 +37,7 @@ export function getExpectedStart(
let relativeStartOffset = 0;
if (offsetMode === OffsetMode.Relative) {
if (mode === OffsetMode.Relative) {
relativeStartOffset = (actualStart ?? 0) - (plannedStart ?? 0);
}