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