mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-17 21:24:11 +00:00
0e6d6cd416
* 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>
66 lines
2.4 KiB
TypeScript
66 lines
2.4 KiB
TypeScript
import { useSessionStorage } from '@mantine/hooks';
|
|
import { startTransition, useCallback, useMemo } from 'react';
|
|
import { useNavigate } from 'react-router';
|
|
|
|
import { useOrderedProjectList } from '../../common/hooks-query/useProjectList';
|
|
import { useProjectRundowns } from '../../common/hooks-query/useProjectRundowns';
|
|
import { serverURL } from '../../externals';
|
|
|
|
export const FOLLOW_LOADED_RUNDOWN_ID = '__follow-loaded__' as const;
|
|
|
|
export function getCuesheetRundownStorageKey(server: string, projectFilename: string) {
|
|
return `cuesheet-selected-rundown:${server}:${projectFilename}`;
|
|
}
|
|
|
|
export function resolveSelectedRundownId(storedSelectedRundownId: string | null, availableRundownIds: Set<string>) {
|
|
if (storedSelectedRundownId && availableRundownIds.has(storedSelectedRundownId)) return storedSelectedRundownId;
|
|
return FOLLOW_LOADED_RUNDOWN_ID;
|
|
}
|
|
|
|
export function useCuesheetRundownSelection() {
|
|
'use memo';
|
|
|
|
const { data: projectRundowns } = useProjectRundowns();
|
|
const {
|
|
data: { lastLoadedProject },
|
|
} = useOrderedProjectList();
|
|
const storageKey = useMemo(() => getCuesheetRundownStorageKey(serverURL, lastLoadedProject), [lastLoadedProject]);
|
|
const [storedSelectedRundownId, setStoredSelectedRundownId] = useSessionStorage<string | null>({
|
|
key: storageKey,
|
|
defaultValue: FOLLOW_LOADED_RUNDOWN_ID,
|
|
});
|
|
|
|
const availableRundownIds = new Set(projectRundowns.rundowns.map(({ id }) => id)).add(FOLLOW_LOADED_RUNDOWN_ID);
|
|
const { loaded: loadedRundownId } = projectRundowns;
|
|
|
|
const selectedRundownId = resolveSelectedRundownId(storedSelectedRundownId, availableRundownIds);
|
|
|
|
return {
|
|
loadedRundownId,
|
|
selectedRundownId,
|
|
projectRundowns: projectRundowns.rundowns,
|
|
setSelectedRundownId: (rundownId: string) => {
|
|
startTransition(() => {
|
|
setStoredSelectedRundownId(rundownId);
|
|
});
|
|
},
|
|
};
|
|
}
|
|
|
|
export function useDirectLinkToBackgroundEdit() {
|
|
const {
|
|
data: { lastLoadedProject },
|
|
} = useOrderedProjectList();
|
|
const navigate = useNavigate();
|
|
const storageKey = getCuesheetRundownStorageKey(serverURL, lastLoadedProject);
|
|
const [_, setStoredSelectedRundownId] = useSessionStorage<string | null>({ key: storageKey, defaultValue: null });
|
|
|
|
return useCallback(
|
|
async (rundownId: string) => {
|
|
await navigate('/cuesheet');
|
|
startTransition(() => setStoredSelectedRundownId(rundownId));
|
|
},
|
|
[setStoredSelectedRundownId, navigate],
|
|
);
|
|
}
|