diff --git a/apps/client/src/common/hooks/useEventAction.ts b/apps/client/src/common/hooks/useEventAction.ts index cc7b01a05..5bacfdfd4 100644 --- a/apps/client/src/common/hooks/useEventAction.ts +++ b/apps/client/src/common/hooks/useEventAction.ts @@ -1,7 +1,14 @@ import { useCallback } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { isOntimeEvent, MaybeString, OntimeEvent, OntimeRundownEntry, RundownCached } from 'ontime-types'; -import { getLinkedTimes, getPreviousEventNormal, reorderArray, swapEventData } from 'ontime-utils'; +import { + dayInMs, + getLinkedTimes, + getPreviousEventNormal, + MILLIS_PER_SECOND, + reorderArray, + swapEventData, +} from 'ontime-utils'; import { RUNDOWN } from '../api/constants'; import { @@ -215,9 +222,12 @@ export const useEventAction = () => { newValMillis = forgivingStringToMillis(value); } + // dont allow timer values over 23:59:59 + const cappedMillis = Math.min(newValMillis, dayInMs - MILLIS_PER_SECOND); + const newEvent = { id: eventId, - [field]: newValMillis, + [field]: cappedMillis, }; try { await _updateEventMutation.mutateAsync(newEvent); diff --git a/apps/server/src/api-integration/integration.utils.ts b/apps/server/src/api-integration/integration.utils.ts index 8b0014761..832d35020 100644 --- a/apps/server/src/api-integration/integration.utils.ts +++ b/apps/server/src/api-integration/integration.utils.ts @@ -1,16 +1,18 @@ import { OntimeEvent, isKeyOfType, isOntimeEvent } from 'ontime-types'; +import { MILLIS_PER_SECOND } from 'ontime-utils'; import { DataProvider } from '../classes/data-provider/DataProvider.js'; import { editEvent } from '../services/rundown-service/RundownService.js'; import { getEventWithId } from '../services/rundown-service/rundownUtils.js'; import { coerceBoolean, coerceColour, coerceNumber, coerceString } from '../utils/coerceType.js'; +import { maxDuration } from '../../../../packages/utils/src/date-utils/conversionUtils.js'; const whitelistedPayload = { title: coerceString, note: coerceString, cue: coerceString, - duration: (value: unknown) => coerceNumber(value) * 1000, + duration: (value: unknown) => Math.max(coerceNumber(value) * MILLIS_PER_SECOND, maxDuration), isPublic: coerceBoolean, skip: coerceBoolean,