diff --git a/apps/client/src/features/control/playback/add-time/AddTime.tsx b/apps/client/src/features/control/playback/add-time/AddTime.tsx
index 2ad249066..19b7b717d 100644
--- a/apps/client/src/features/control/playback/add-time/AddTime.tsx
+++ b/apps/client/src/features/control/playback/add-time/AddTime.tsx
@@ -2,7 +2,7 @@ import { IoAdd, IoRemove } from 'react-icons/io5';
import { Tooltip } from '@chakra-ui/react';
import { useLocalStorage } from '@mantine/hooks';
import { Playback } from 'ontime-types';
-import { MILLIS_PER_HOUR, MILLIS_PER_SECOND, parseUserTime } from 'ontime-utils';
+import { MILLIS_PER_HOUR, parseUserTime } from 'ontime-utils';
import TimeInput from '../../../../common/components/input/time-input/TimeInput';
import { setPlayback } from '../../../../common/hooks/useSocket';
@@ -17,29 +17,29 @@ interface AddTimeProps {
export default function AddTime(props: AddTimeProps) {
const { playback } = props;
- const [time, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes
+ const [timeInMs, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes
const handleTimeChange = (_field: string, value: string) => {
- const newTime = parseUserTime(value);
+ const newTimeInMs = parseUserTime(value);
// cap add time to 1 hour
- setTime(Math.min(newTime, MILLIS_PER_HOUR));
+ setTime(Math.min(newTimeInMs, MILLIS_PER_HOUR));
};
const handleAddTime = (direction: 'add' | 'remove') => {
- // API expects input in seconds
+ // API expects input in milliseconds
if (direction === 'add') {
- setPlayback.addTime(time / MILLIS_PER_SECOND);
+ setPlayback.addTime(timeInMs);
} else {
- setPlayback.addTime((-1 * time) / MILLIS_PER_SECOND);
+ setPlayback.addTime(-1 * timeInMs);
}
};
const canAddTime = playback === Playback.Play || playback === Playback.Pause;
- const doDisableButtons = !canAddTime || time === 0;
+ const doDisableButtons = !canAddTime || timeInMs === 0;
return (
-
+
handleAddTime('remove')} disabled={doDisableButtons} className={style.tallButtons}>
diff --git a/apps/client/src/features/control/playback/aux-timer/AuxTimer.tsx b/apps/client/src/features/control/playback/aux-timer/AuxTimer.tsx
index cac01f16b..0012df419 100644
--- a/apps/client/src/features/control/playback/aux-timer/AuxTimer.tsx
+++ b/apps/client/src/features/control/playback/aux-timer/AuxTimer.tsx
@@ -59,15 +59,20 @@ export function AuxTimer() {
}
function AuxTimerInput() {
- const time = useAuxTimerTime();
+ const newTimeInMs = useAuxTimerTime();
const { setDuration } = setAuxTimer;
const handleTimeUpdate = (_field: string, value: string) => {
- const newTime = parseUserTime(value);
- setDuration(newTime / 1000); // frontend api is seconds based
+ const newTimeInMs = parseUserTime(value);
+ setDuration(newTimeInMs);
};
return (
- submitHandler={handleTimeUpdate} name='auxTimer' time={time} placeholder='Aux Timer 1' />
+
+ submitHandler={handleTimeUpdate}
+ name='auxTimer'
+ time={newTimeInMs}
+ placeholder='Aux Timer 1'
+ />
);
}
diff --git a/apps/server/src/api-integration/integration.controller.ts b/apps/server/src/api-integration/integration.controller.ts
index 585784872..1f48995ab 100644
--- a/apps/server/src/api-integration/integration.controller.ts
+++ b/apps/server/src/api-integration/integration.controller.ts
@@ -1,5 +1,5 @@
import { MessageState, OffsetMode, OntimeEvent, SimpleDirection, SimplePlayback } from 'ontime-types';
-import { MILLIS_PER_HOUR, MILLIS_PER_SECOND } from 'ontime-utils';
+import { MILLIS_PER_HOUR } from 'ontime-utils';
import { DeepPartial } from 'ts-essentials';
@@ -187,27 +187,24 @@ const actionHandlers: Record = {
throw new Error('No matching method provided');
},
addtime: (payload) => {
- let time = 0;
- if (payload && typeof payload === 'object') {
- if ('add' in payload) {
- time = numberOrError(payload.add);
- } else if ('remove' in payload) {
- time = numberOrError(payload.remove) * -1;
+ const time = (() => {
+ if (payload && typeof payload === 'object') {
+ if ('add' in payload) return numberOrError(payload.add);
+ if ('remove' in payload) return numberOrError(payload.remove) * -1;
}
- } else {
- time = numberOrError(payload);
- }
+ return numberOrError(payload);
+ })();
+
assert.isNumber(time);
if (time === 0) {
return { payload: 'success' };
}
- const timeToAdd = time * MILLIS_PER_SECOND; // frontend is seconds based
- if (Math.abs(timeToAdd) > MILLIS_PER_HOUR) {
+ if (Math.abs(time) > MILLIS_PER_HOUR) {
throw new Error(`Payload too large: ${time}`);
}
- runtimeService.addTime(timeToAdd);
+ runtimeService.addTime(time);
return { payload: 'success' };
},
/* Extra timers */
@@ -233,13 +230,11 @@ const actionHandlers: Record = {
} else if (command && typeof command === 'object') {
const reply = { payload: {} };
if ('duration' in command) {
- // convert duration in seconds to ms
- const timeInMs = numberOrError(command.duration) * 1000;
+ const timeInMs = numberOrError(command.duration);
reply.payload = auxTimerService.setTime(timeInMs);
}
if ('addtime' in command) {
- // convert addTime in seconds to ms
- const timeInMs = numberOrError(command.addtime) * 1000;
+ const timeInMs = numberOrError(command.addtime);
reply.payload = auxTimerService.addTime(timeInMs);
}
if ('direction' in command) {