Files
ontime/apps/client/src/views/cuesheet/useApplyCuesheetPolicy.ts
T
Carlos Valente 0e6d6cd416 refactor: allow secondary rundowns (#2086)
* refactor: allow secondary rundowns

* ui: move dropdown

* feat: follow loaded

* ui: background edit warning

ui: fix disable radio button

* feat(ui): add loaded sufix in the rundown list

* feat(ui): add direct link to background edit from rundown manager

* fix: better fallback

* fix: default to is isCurrentRundown for nav bar colour

* chore: rename navigate to cuesheet

---------

Co-authored-by: alex-arc <ac@omnivox.dk>
2026-06-07 13:33:38 +02:00

74 lines
2.4 KiB
TypeScript

import { useSessionStorage } from '@mantine/hooks';
import { URLPreset } from 'ontime-types';
import { useCallback, useEffect, useMemo } from 'react';
import { sessionScope } from '../../externals';
import { AppMode, sessionKeys } from '../../ontimeConfig';
import { getCuesheetPermissionsPolicy } from './cuesheet.policies';
import type { CuesheetPermissions } from './useTablePermissions';
import { useCuesheetPermissions } from './useTablePermissions';
type CuesheetPolicyOptions = {
// Run mode is only meaningful for the loaded rundown — background rundowns force Edit.
canRunMode: boolean;
};
export function getEffectiveCuesheetMode(
permissions: Pick<CuesheetPermissions, 'canChangeMode'>,
storedMode: AppMode,
{ canRunMode }: CuesheetPolicyOptions,
) {
if (!permissions.canChangeMode) {
return AppMode.Run;
}
return canRunMode ? storedMode : AppMode.Edit;
}
/**
* Applies cuesheet permissions to shared state and exposes the effective mode for the UI.
*/
export function useApplyCuesheetPolicy(
preset: URLPreset | undefined,
{ canRunMode }: CuesheetPolicyOptions,
): {
cuesheetMode: AppMode;
setCuesheetMode: (mode: AppMode) => void;
} {
const setPermissions = useCuesheetPermissions((state) => state.setPermissions);
const canShareInSession = sessionScope === 'rw';
const permissions = useMemo(
() => getCuesheetPermissionsPolicy(preset, canShareInSession),
[preset, canShareInSession],
);
const [storedCuesheetMode, setStoredCuesheetMode] = useSessionStorage({
key: preset ? `${preset.alias}${sessionKeys.cuesheetMode}` : sessionKeys.cuesheetMode,
defaultValue: preset ? AppMode.Run : AppMode.Edit,
});
const cuesheetMode = getEffectiveCuesheetMode(permissions, storedCuesheetMode, { canRunMode });
const setCuesheetMode = useCallback(
(mode: AppMode) => {
if (!permissions.canChangeMode || !canRunMode) return;
setStoredCuesheetMode(mode);
},
[canRunMode, permissions.canChangeMode, setStoredCuesheetMode],
);
// Keep the shared permissions store aligned with the active preset policy.
useEffect(() => {
setPermissions(permissions);
}, [permissions, setPermissions]);
// Force Run mode whenever the policy forbids mode switching.
useEffect(() => {
if (!permissions.canChangeMode) {
setStoredCuesheetMode((mode) => (mode === AppMode.Run ? mode : AppMode.Run));
}
}, [permissions.canChangeMode, setStoredCuesheetMode]);
return { cuesheetMode, setCuesheetMode };
}