diff --git a/apps/client/src/common/utils/socket.ts b/apps/client/src/common/utils/socket.ts index a9366cc36..6a16ba04d 100644 --- a/apps/client/src/common/utils/socket.ts +++ b/apps/client/src/common/utils/socket.ts @@ -242,12 +242,12 @@ export function maybeInvalidateRundownCache(revision: MaybeNumber, rundownId?: s return; } - // skip if we dont recognise the ID the revision is lower const queryKey = getRundownQueryKey(rundownId); const cachedRundown = ontimeQueryClient.getQueryData<{ revision: number }>(queryKey); - if (revision === cachedRundown?.revision) { - // we already have the latest change + // we already have this change, or something newer + // messages can arrive after a refetch has already brought in a later revision + if (revision !== null && cachedRundown !== undefined && revision <= cachedRundown.revision) { return; } diff --git a/apps/server/src/api-data/rundown/rundown.service.ts b/apps/server/src/api-data/rundown/rundown.service.ts index a1155dbf9..7aafcc84b 100644 --- a/apps/server/src/api-data/rundown/rundown.service.ts +++ b/apps/server/src/api-data/rundown/rundown.service.ts @@ -816,27 +816,23 @@ export async function createNewRundown(title: string) { * @throws if the provided id does not exist */ export async function renameRundown(id: string, title: string) { - const dataProvider = getDataProvider(); - const rundown = dataProvider.getRundown(id); + const { rundown, commit } = createTransaction({ rundownId: id, mutableRundown: true }); - await dataProvider.setRundown(id, { ...rundown, title, revision: rundown.revision + 1 }); - - /** - * If we are modifying the loaded rundown we re-init it - * This is likely over-kill but the simplest way to ensure state consistency - */ - if (isCurrentRundown(id)) { - const rundown = dataProvider.getRundown(id); - const customField = dataProvider.getCustomFields(); - // init rundown does its own refetch - await initRundown(rundown, customField); - } else { - setImmediate(() => { - sendRefetch(RefetchKey.ProjectRundowns); - }); + if (rundown.title === title) { + return getDataProvider().getProjectRundowns(); } - return dataProvider.getProjectRundowns(); + rundown.title = title; + + // a title has no bearing on the schedule, there is nothing to process and no runtime to notify + const { rundownMetadata, revision } = await commit(false); + + setImmediate(() => { + notifyChanges(id, rundownMetadata, revision, { external: true }); + sendRefetch(RefetchKey.ProjectRundowns); + }); + + return getDataProvider().getProjectRundowns(); } /**