()((set, get) => ({
const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);
// create new set with range of ids from start to end
- const selectedEventIds = eventIds.slice(start, end);
+ const selectedEventIds = events.slice(start, end).map((event) => event.id);
return set({
selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),
diff --git a/apps/client/src/features/viewers/ViewWrapper.tsx b/apps/client/src/features/viewers/ViewWrapper.tsx
index 4058c92a6..90e72d922 100644
--- a/apps/client/src/features/viewers/ViewWrapper.tsx
+++ b/apps/client/src/features/viewers/ViewWrapper.tsx
@@ -1,4 +1,4 @@
-import { ComponentType } from 'react';
+import { ComponentType, useMemo } from 'react';
import { ViewExtendedTimer } from 'common/models/TimeManager.type';
import {
CustomFields,
@@ -8,6 +8,7 @@ import {
Runtime,
Settings,
SimpleTimerState,
+ SupportedEvent,
TimerType,
ViewSettings,
} from 'ontime-types';
@@ -24,15 +25,19 @@ import { useViewOptionsStore } from '../../common/stores/viewOptions';
type WithDataProps = {
auxTimer: SimpleTimerState;
- events: OntimeEvent[];
+ backstageEvents: OntimeEvent[];
customFields: CustomFields;
eventNext: OntimeEvent | null;
eventNow: OntimeEvent | null;
+ events: OntimeEvent[];
general: ProjectData;
isMirrored: boolean;
message: MessageState;
nextId: string | null;
onAir: boolean;
+ publicEventNext: OntimeEvent | null;
+ publicEventNow: OntimeEvent | null;
+ publicSelectedId: string | null;
runtime: Runtime;
selectedId: string | null;
settings: Settings | undefined; // TODO: what is the case for this being undefined?
@@ -56,9 +61,17 @@ const withData = (Component: ComponentType
) => {
const { data: settings } = useSettings();
const { data: customFields } = useCustomFields();
+ const publicEvents = useMemo(() => {
+ if (Array.isArray(rundownData)) {
+ return rundownData.filter((e) => e.type === SupportedEvent.Event && e.title && e.isPublic);
+ }
+ return [];
+ }, [rundownData]);
+
// websocket data
- const { clock, timer, message, onAir, eventNext, eventNow, runtime, auxtimer1 } =
+ const { clock, timer, message, onAir, eventNext, publicEventNext, publicEventNow, eventNow, runtime, auxtimer1 } =
useStore(runtimeStore);
+ const publicSelectedId = publicEventNow?.id ?? null;
const selectedId = eventNow?.id ?? null;
const nextId = eventNext?.id ?? null;
@@ -78,15 +91,19 @@ const withData =
(Component: ComponentType
) => {
{
- if (!events) {
+ if (!backstageEvents) {
return;
}
@@ -62,6 +63,7 @@ export default function Countdown(props: CountdownProps) {
}
let followThis: OntimeEvent | null = null;
+ const events: OntimeEvent[] = [...backstageEvents].filter((event) => event.type === SupportedEvent.Event);
if (eventId !== null) {
followThis = events.find((event) => event.id === eventId) || null;
@@ -70,11 +72,11 @@ export default function Countdown(props: CountdownProps) {
}
if (followThis !== null) {
setFollow(followThis);
- const idx: number = events.findIndex((event: OntimeEntry) => event.id === followThis?.id);
- const delayToEvent = events[idx]?.delay ?? 0;
+ const idx: number = backstageEvents.findIndex((event: OntimeRundownEntry) => event.id === followThis?.id);
+ const delayToEvent = backstageEvents[idx]?.delay ?? 0;
setDelay(delayToEvent);
}
- }, [events, searchParams]);
+ }, [backstageEvents, searchParams]);
const { message: runningMessage, timer: runningTimer } = fetchTimerData(time, follow, selectedId, runtime.offset);
@@ -117,7 +119,7 @@ export default function Countdown(props: CountdownProps) {
{general?.projectLogo && }
{follow === null ? (
-
+
) : (
diff --git a/apps/client/src/features/viewers/countdown/CountdownSelect.tsx b/apps/client/src/features/viewers/countdown/CountdownSelect.tsx
index 0fd9676a4..a23eddf4b 100644
--- a/apps/client/src/features/viewers/countdown/CountdownSelect.tsx
+++ b/apps/client/src/features/viewers/countdown/CountdownSelect.tsx
@@ -1,5 +1,5 @@
import { Link } from 'react-router-dom';
-import { OntimeEntry, OntimeEvent, SupportedEntry } from 'ontime-types';
+import { OntimeEvent, OntimeRundownEntry, SupportedEvent } from 'ontime-types';
import Empty from '../../../common/components/state/Empty';
import { formatTime } from '../../../common/utils/time';
@@ -10,7 +10,7 @@ import { sanitiseTitle } from './countdown.helpers';
import './Countdown.scss';
interface CountdownSelectProps {
- events: OntimeEntry[];
+ events: OntimeRundownEntry[];
}
const scheduleFormat = { format12: 'hh:mm a', format24: 'HH:mm' };
@@ -19,7 +19,9 @@ export default function CountdownSelect(props: CountdownSelectProps) {
const { events } = props;
const { getLocalizedString } = useTranslation();
- const filteredEvents = events.filter((event: OntimeEntry) => event.type === SupportedEntry.Event) as OntimeEvent[];
+ const filteredEvents = events.filter(
+ (event: OntimeRundownEntry) => event.type === SupportedEvent.Event,
+ ) as OntimeEvent[];
return (
diff --git a/apps/client/src/features/viewers/countdown/__tests__/Countdown.test.ts b/apps/client/src/features/viewers/countdown/__tests__/Countdown.test.js
similarity index 80%
rename from apps/client/src/features/viewers/countdown/__tests__/Countdown.test.ts
rename to apps/client/src/features/viewers/countdown/__tests__/Countdown.test.js
index f1e93d163..b87f3fed4 100644
--- a/apps/client/src/features/viewers/countdown/__tests__/Countdown.test.ts
+++ b/apps/client/src/features/viewers/countdown/__tests__/Countdown.test.js
@@ -1,5 +1,3 @@
-import { ViewExtendedTimer } from 'common/models/TimeManager.type';
-import { OntimeEvent } from 'ontime-types';
import { dayInMs } from 'ontime-utils';
import { fetchTimerData, sanitiseTitle, TimerMessage } from '../countdown.helpers';
@@ -16,7 +14,7 @@ describe('sanitiseTitle() function', () => {
it('should return {no title} when invalid', () => {
const invalidTitles = ['', undefined, null];
for (const title of invalidTitles) {
- expect(sanitiseTitle(title as unknown as string)).toBe('{no title}');
+ expect(sanitiseTitle(title)).toBe('{no title}');
}
});
});
@@ -25,10 +23,10 @@ describe('fetchTimerData() function', () => {
it('shows current timer if current is the one we follow', () => {
const followId = 'testId';
const currentMockValue = 13;
- const follow = { id: followId } as OntimeEvent;
- const time = { current: currentMockValue } as ViewExtendedTimer;
+ const follow = { id: followId };
+ const time = { current: currentMockValue };
- const { message, timer } = fetchTimerData(time, follow, followId, 0);
+ const { message, timer } = fetchTimerData(time, follow, followId);
expect(message).toBe(TimerMessage.running);
expect(timer).toBe(currentMockValue);
});
@@ -36,10 +34,10 @@ describe('fetchTimerData() function', () => {
it('shows the countdown to an upcoming event', () => {
const startMockValue = 10000;
const timeNow = 1000;
- const follow = { id: 'anotherevent', timeStart: startMockValue } as OntimeEvent;
- const time = { clock: timeNow } as ViewExtendedTimer;
+ const follow = { id: 'anotherevent', timeStart: startMockValue };
+ const time = { clock: timeNow };
- const { message, timer } = fetchTimerData(time, follow, 'notthesameevent', 0);
+ const { message, timer } = fetchTimerData(time, follow, 'notthesameevent');
expect(message).toBe(TimerMessage.toStart);
expect(timer).toBe(startMockValue - timeNow);
});
@@ -49,10 +47,10 @@ describe('fetchTimerData() function', () => {
const endMockValue = 20000;
const timeNow = 15000;
const followId = 'testId';
- const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue } as OntimeEvent;
- const time = { clock: timeNow, current: endMockValue - startMockValue } as ViewExtendedTimer;
+ const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue };
+ const time = { clock: timeNow, current: endMockValue - startMockValue };
- const { message, timer } = fetchTimerData(time, follow, 'notthesameevent', 0);
+ const { message, timer } = fetchTimerData(time, follow, 'notthesameevent');
expect(message).toBe(TimerMessage.waiting);
expect(timer).toBe(endMockValue - startMockValue);
});
@@ -62,10 +60,10 @@ describe('fetchTimerData() function', () => {
const endMockValue = 20000;
const timeNow = 30000;
const followId = 'testId';
- const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue } as OntimeEvent;
- const time = { clock: timeNow, current: endMockValue - startMockValue } as ViewExtendedTimer;
+ const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue };
+ const time = { clock: timeNow, current: endMockValue - startMockValue };
- const { message, timer } = fetchTimerData(time, follow, 'notthesameevent', 0);
+ const { message, timer } = fetchTimerData(time, follow, 'notthesameevent');
expect(message).toBe(TimerMessage.ended);
expect(timer).toBe(endMockValue);
});
@@ -75,10 +73,10 @@ describe('fetchTimerData() function', () => {
const endMockValue = 1000;
const timeNow = 15000;
const followId = 'testId';
- const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue } as OntimeEvent;
- const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue } as ViewExtendedTimer;
+ const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue };
+ const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue };
- const { message, timer } = fetchTimerData(time, follow, 'notthesameevent', 0);
+ const { message, timer } = fetchTimerData(time, follow, 'notthesameevent');
expect(message).toBe(TimerMessage.waiting);
expect(timer).toBe(dayInMs + endMockValue - startMockValue);
});
@@ -88,10 +86,10 @@ describe('fetchTimerData() function', () => {
const endMockValue = 1000;
const timeNow = 15000;
const followId = 'testId';
- const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue } as OntimeEvent;
- const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue } as ViewExtendedTimer;
+ const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue };
+ const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue };
- const { message, timer } = fetchTimerData(time, follow, followId, 0);
+ const { message, timer } = fetchTimerData(time, follow, followId);
expect(message).toBe(TimerMessage.running);
expect(timer).toBe(dayInMs + endMockValue - startMockValue);
});
@@ -101,10 +99,10 @@ describe('fetchTimerData() function', () => {
const endMockValue = 1000;
const timeNow = 2000;
const followId = 'testId';
- const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue } as OntimeEvent;
- const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue } as ViewExtendedTimer;
+ const follow = { id: followId, timeStart: startMockValue, timeEnd: endMockValue };
+ const time = { clock: timeNow, current: dayInMs + endMockValue - startMockValue };
- const { message, timer } = fetchTimerData(time, follow, 'notthesameevent', 0);
+ const { message, timer } = fetchTimerData(time, follow, 'notthesameevent');
expect(message).toBe(TimerMessage.toStart);
expect(timer).toBe(startMockValue - timeNow);
});
diff --git a/apps/client/src/features/viewers/lower-thirds/LowerThird.tsx b/apps/client/src/features/viewers/lower-thirds/LowerThird.tsx
index d124b0999..ccbbd35f7 100644
--- a/apps/client/src/features/viewers/lower-thirds/LowerThird.tsx
+++ b/apps/client/src/features/viewers/lower-thirds/LowerThird.tsx
@@ -26,7 +26,7 @@ export default function LowerThird(props: LowerProps) {
const animationTimeout = useRef();
const [playState, setPlayState] = useState(false);
const [textValue, setTextValue] = useState<{ top: string; bottom: string }>({ top: '', bottom: '' });
- useRuntimeStylesheet(viewSettings?.overrideStyles ? overrideStylesURL : undefined);
+ useRuntimeStylesheet(viewSettings?.overrideStyles && overrideStylesURL);
const options = useLowerOptions();
const { playback } = time;
diff --git a/apps/client/src/features/viewers/studio/StudioClock.tsx b/apps/client/src/features/viewers/studio/StudioClock.tsx
index 8c8949530..0c6a85220 100644
--- a/apps/client/src/features/viewers/studio/StudioClock.tsx
+++ b/apps/client/src/features/viewers/studio/StudioClock.tsx
@@ -1,5 +1,5 @@
import { useSearchParams } from 'react-router-dom';
-import type { MaybeString, OntimeEntry, OntimeEvent, ProjectData, Settings } from 'ontime-types';
+import type { MaybeString, OntimeEvent, OntimeRundown, ProjectData, Settings } from 'ontime-types';
import { Playback } from 'ontime-types';
import { millisToString, removeSeconds, secondsInMillis } from 'ontime-utils';
@@ -17,7 +17,7 @@ import StudioClockSchedule from './StudioClockSchedule';
import './StudioClock.scss';
interface StudioClockProps {
- events: OntimeEntry[];
+ backstageEvents: OntimeRundown;
eventNext: OntimeEvent | null;
general: ProjectData;
isMirrored: boolean;
@@ -29,7 +29,7 @@ interface StudioClockProps {
}
export default function StudioClock(props: StudioClockProps) {
- const { events, eventNext, general, isMirrored, time, selectedId, nextId, onAir, settings } = props;
+ const { backstageEvents, eventNext, general, isMirrored, time, selectedId, nextId, onAir, settings } = props;
const [searchParams] = useSearchParams();
@@ -102,7 +102,7 @@ export default function StudioClock(props: StudioClockProps) {
{!hideRight && (
-
+
)}
);
diff --git a/apps/client/src/features/viewers/studio/StudioClockSchedule.tsx b/apps/client/src/features/viewers/studio/StudioClockSchedule.tsx
index b1ba3a54c..c97f7057b 100644
--- a/apps/client/src/features/viewers/studio/StudioClockSchedule.tsx
+++ b/apps/client/src/features/viewers/studio/StudioClockSchedule.tsx
@@ -1,4 +1,4 @@
-import { isOntimeEvent, MaybeString, OntimeEntry, OntimeEvent } from 'ontime-types';
+import { isOntimeEvent, MaybeString, OntimeEvent, OntimeRundown } from 'ontime-types';
import { formatTime } from '../../../common/utils/time';
import SuperscriptTime from '../common/superscript-time/SuperscriptTime';
@@ -8,7 +8,7 @@ import { trimRundown } from './studioClock.utils';
import './StudioClock.scss';
interface StudioClockScheduleProps {
- rundown: OntimeEntry[];
+ rundown: OntimeRundown;
selectedId: MaybeString;
nextId: MaybeString;
onAir: boolean;
diff --git a/apps/client/src/theme/ontimeModal.ts b/apps/client/src/theme/ontimeModal.ts
index 0f0a4740b..b71235b2c 100644
--- a/apps/client/src/theme/ontimeModal.ts
+++ b/apps/client/src/theme/ontimeModal.ts
@@ -27,7 +27,6 @@ export const ontimeModal = {
footer: {
padding: '1rem',
display: 'flex',
- alignItems: 'left',
gap: '0.5rem',
},
};
diff --git a/apps/client/src/translation/TranslationProvider.tsx b/apps/client/src/translation/TranslationProvider.tsx
index ca0d471ad..7aa37cb01 100644
--- a/apps/client/src/translation/TranslationProvider.tsx
+++ b/apps/client/src/translation/TranslationProvider.tsx
@@ -32,7 +32,7 @@ interface TranslationContextValue {
getLocalizedString: (key: keyof typeof langEn, lang?: string) => string;
}
-const TranslationContext = createContext({
+export const TranslationContext = createContext({
getLocalizedString: () => '',
});
diff --git a/apps/client/src/translation/languages/de.ts b/apps/client/src/translation/languages/de.ts
index 080bc0909..a181246f0 100644
--- a/apps/client/src/translation/languages/de.ts
+++ b/apps/client/src/translation/languages/de.ts
@@ -5,6 +5,7 @@ export const langDe: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Jetzt',
'common.next': 'Nächste',
+ 'common.public_message': 'Öffentliche Nachricht',
'common.scheduled_start': 'Geplanter beginn',
'common.scheduled_end': 'Geplantes ende',
'common.projected_start': 'Erwartetes beginn',
@@ -27,4 +28,6 @@ export const langDe: TranslationObject = {
'project.description': 'Beschreibung',
'project.backstage_info': 'Backstage-Informationen',
'project.backstage_url': 'Backstage-URL',
+ 'project.public_info': 'Öffentliche Informationen',
+ 'project.public_url': 'Öffentliche URL',
};
diff --git a/apps/client/src/translation/languages/en.ts b/apps/client/src/translation/languages/en.ts
index be7b5a355..8e3af15f8 100644
--- a/apps/client/src/translation/languages/en.ts
+++ b/apps/client/src/translation/languages/en.ts
@@ -3,6 +3,7 @@ export const langEn = {
'common.minutes': 'min',
'common.now': 'Now',
'common.next': 'Next',
+ 'common.public_message': 'Public message',
'common.scheduled_start': 'Scheduled start',
'common.scheduled_end': 'Scheduled end',
'common.projected_start': 'Projected start',
@@ -25,6 +26,8 @@ export const langEn = {
'project.description': 'Description',
'project.backstage_info': 'Backstage Info',
'project.backstage_url': 'Backstage URL',
+ 'project.public_info': 'Public Info',
+ 'project.public_url': 'Public URL',
};
export type TranslationObject = Record;
diff --git a/apps/client/src/translation/languages/es.ts b/apps/client/src/translation/languages/es.ts
index b70d2aaae..58fad6884 100644
--- a/apps/client/src/translation/languages/es.ts
+++ b/apps/client/src/translation/languages/es.ts
@@ -5,6 +5,7 @@ export const langEs: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Ahora',
'common.next': 'Siguiente',
+ 'common.public_message': 'Mensaje público',
'common.scheduled_start': 'Inicio programado',
'common.scheduled_end': 'Fin programado',
'common.projected_start': 'Inicio previsto',
@@ -27,4 +28,6 @@ export const langEs: TranslationObject = {
'project.description': 'Descripción',
'project.backstage_info': 'Información de backstage',
'project.backstage_url': 'URL de backstage',
+ 'project.public_info': 'Información pública',
+ 'project.public_url': 'URL pública',
};
diff --git a/apps/client/src/translation/languages/fr.ts b/apps/client/src/translation/languages/fr.ts
index 46973da11..1ba565860 100644
--- a/apps/client/src/translation/languages/fr.ts
+++ b/apps/client/src/translation/languages/fr.ts
@@ -5,6 +5,7 @@ export const langFr: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Maintenant',
'common.next': 'A suivre',
+ 'common.public_message': 'Message public',
'common.scheduled_start': 'Début prévu',
'common.scheduled_end': 'Fin prévue',
'common.projected_start': 'Début projeté',
@@ -27,5 +28,6 @@ export const langFr: TranslationObject = {
'project.description': 'Description',
'project.backstage_info': 'Informations des coulisses',
'project.backstage_url': 'URL des coulisses',
-
+ 'project.public_info': 'Informations publiques',
+ 'project.public_url': 'URL publique',
};
diff --git a/apps/client/src/translation/languages/hu.ts b/apps/client/src/translation/languages/hu.ts
index 26233aaf9..05efe2738 100644
--- a/apps/client/src/translation/languages/hu.ts
+++ b/apps/client/src/translation/languages/hu.ts
@@ -5,6 +5,7 @@ export const langHu: TranslationObject = {
'common.minutes': 'perc',
'common.now': 'Most',
'common.next': 'Következő',
+ 'common.public_message': 'Nyilvános közlemény',
'common.scheduled_start': 'Ütemezett kezdés',
'common.scheduled_end': 'Ütemezett befejezés',
'common.projected_start': 'Várható kezdés',
@@ -27,4 +28,6 @@ export const langHu: TranslationObject = {
'project.description': 'Leírás',
'project.backstage_info': 'Kulisszák mögötti információ',
'project.backstage_url': 'Kulisszák mögötti URL',
+ 'project.public_info': 'Nyilvános információ',
+ 'project.public_url': 'Nyilvános URL',
};
diff --git a/apps/client/src/translation/languages/it.ts b/apps/client/src/translation/languages/it.ts
index 569c8efb0..ec0c6cacf 100644
--- a/apps/client/src/translation/languages/it.ts
+++ b/apps/client/src/translation/languages/it.ts
@@ -5,6 +5,7 @@ export const langIt: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Adesso',
'common.next': 'Prossimo',
+ 'common.public_message': 'Messaggio pubblico',
'common.scheduled_start': 'Inizio programmato',
'common.scheduled_end': 'Fine programmata',
'common.projected_start': 'Inizio previsto',
@@ -27,4 +28,6 @@ export const langIt: TranslationObject = {
'project.description': 'Descrizione',
'project.backstage_info': 'Informazioni di backstage',
'project.backstage_url': 'URL di backstage',
+ 'project.public_info': 'Informazioni pubbliche',
+ 'project.public_url': 'URL pubblico',
};
diff --git a/apps/client/src/translation/languages/no.ts b/apps/client/src/translation/languages/no.ts
index 516b53100..cc67302b3 100644
--- a/apps/client/src/translation/languages/no.ts
+++ b/apps/client/src/translation/languages/no.ts
@@ -5,6 +5,7 @@ export const langNo: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Nå',
'common.next': 'Neste',
+ 'common.public_message': 'Offentlig beskjed',
'common.scheduled_start': 'Planlagt start',
'common.scheduled_end': 'Planlagt slutt',
'common.projected_start': 'Forventet start',
@@ -27,4 +28,6 @@ export const langNo: TranslationObject = {
'project.description': 'Beskrivelse',
'project.backstage_info': 'Backstage-informasjon',
'project.backstage_url': 'Backstage-URL',
+ 'project.public_info': 'Offentlig informasjon',
+ 'project.public_url': 'Offentlig URL',
};
diff --git a/apps/client/src/translation/languages/pl.ts b/apps/client/src/translation/languages/pl.ts
index d8f142534..246230fe3 100644
--- a/apps/client/src/translation/languages/pl.ts
+++ b/apps/client/src/translation/languages/pl.ts
@@ -5,6 +5,7 @@ export const langPl: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Teraz',
'common.next': 'Następnie',
+ 'common.public_message': 'Wiadomość publiczna',
'common.scheduled_start': 'Planowany początek',
'common.scheduled_end': 'Planowany koniec',
'common.projected_start': 'Przewidywany początek',
@@ -27,4 +28,6 @@ export const langPl: TranslationObject = {
'project.description': 'Opis',
'project.backstage_info': 'Informacje zaplecza',
'project.backstage_url': 'URL zaplecza',
+ 'project.public_info': 'Informacje publiczne',
+ 'project.public_url': 'URL publiczny',
};
diff --git a/apps/client/src/translation/languages/pt.ts b/apps/client/src/translation/languages/pt.ts
index ff7d5abf8..94a200a75 100644
--- a/apps/client/src/translation/languages/pt.ts
+++ b/apps/client/src/translation/languages/pt.ts
@@ -5,6 +5,7 @@ export const langPt: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Agora',
'common.next': 'Próximo',
+ 'common.public_message': 'Mensagem pública',
'common.scheduled_start': 'Início programado',
'common.scheduled_end': 'Fim programado',
'common.projected_start': 'Início previsto',
@@ -27,4 +28,6 @@ export const langPt: TranslationObject = {
'project.description': 'Descrição',
'project.backstage_info': 'Informações de bastidores',
'project.backstage_url': 'URL de bastidores',
+ 'project.public_info': 'Informações públicas',
+ 'project.public_url': 'URL pública',
};
diff --git a/apps/client/src/translation/languages/sv.ts b/apps/client/src/translation/languages/sv.ts
index 459a839cd..699473155 100644
--- a/apps/client/src/translation/languages/sv.ts
+++ b/apps/client/src/translation/languages/sv.ts
@@ -5,6 +5,7 @@ export const langSv: TranslationObject = {
'common.minutes': 'min',
'common.now': 'Nu',
'common.next': 'Nästa',
+ 'common.public_message': 'Offentligt meddelande',
'common.scheduled_start': 'Planerad start',
'common.scheduled_end': 'Planerad slut',
'common.projected_start': 'Beräknad start',
@@ -27,4 +28,6 @@ export const langSv: TranslationObject = {
'project.description': 'Beskrivning',
'project.backstage_info': 'Backstageinformation',
'project.backstage_url': 'Backstage-URL',
+ 'project.public_info': 'Offentlig information',
+ 'project.public_url': 'Offentlig URL',
};
diff --git a/apps/client/src/translation/languages/zh.ts b/apps/client/src/translation/languages/zh.ts
index ee814d174..de49f751b 100644
--- a/apps/client/src/translation/languages/zh.ts
+++ b/apps/client/src/translation/languages/zh.ts
@@ -5,6 +5,7 @@ export const langZhCn: TranslationObject = {
'common.minutes': '分钟',
'common.now': '现在',
'common.next': '接下来',
+ 'common.public_message': '公众消息',
'common.scheduled_start': '计划开始',
'common.scheduled_end': '计划结束',
'common.projected_start': '预计开始',
@@ -27,4 +28,6 @@ export const langZhCn: TranslationObject = {
'project.description': '描述',
'project.backstage_info': '后台信息',
'project.backstage_url': '后台网址',
+ 'project.public_info': '公开信息',
+ 'project.public_url': '公开网址',
};
diff --git a/apps/client/src/viewerConfig.ts b/apps/client/src/viewerConfig.ts
index 475e7c552..1ac97f085 100644
--- a/apps/client/src/viewerConfig.ts
+++ b/apps/client/src/viewerConfig.ts
@@ -4,6 +4,7 @@ export const navigatorConstants = [
{ url: 'clock', label: 'Wall Clock' },
{ url: 'backstage', label: 'Backstage' },
{ url: 'timeline', label: 'Timeline (beta)' },
+ { url: 'public', label: 'Public' },
{ url: 'lower', label: 'Lower Thirds' },
{ url: 'studio', label: 'Studio Clock' },
{ url: 'countdown', label: 'Countdown' },
diff --git a/apps/client/src/views/ViewLoader.tsx b/apps/client/src/views/ViewLoader.tsx
index 1e15552d9..919d665c3 100644
--- a/apps/client/src/views/ViewLoader.tsx
+++ b/apps/client/src/views/ViewLoader.tsx
@@ -8,7 +8,7 @@ import style from './ViewLoader.module.scss';
export default function ViewLoader({ children }: PropsWithChildren) {
const { data } = useViewSettings();
- const { shouldRender } = useRuntimeStylesheet(data.overrideStyles ? overrideStylesURL : undefined);
+ const { shouldRender } = useRuntimeStylesheet(data.overrideStyles && overrideStylesURL);
// eventually we would want to leverage suspense here
// while the feature is not ready, we simply trigger a loader
diff --git a/apps/client/src/views/backstage/Backstage.tsx b/apps/client/src/views/backstage/Backstage.tsx
index 804f237e3..3064eed36 100644
--- a/apps/client/src/views/backstage/Backstage.tsx
+++ b/apps/client/src/views/backstage/Backstage.tsx
@@ -23,7 +23,7 @@ import { getCardData, getIsPendingStart, getShowProgressBar, isOvertime } from '
import './Backstage.scss';
interface BackstageProps {
- events: OntimeEvent[];
+ backstageEvents: OntimeEvent[];
customFields: CustomFields;
eventNext: OntimeEvent | null;
eventNow: OntimeEvent | null;
@@ -37,7 +37,7 @@ interface BackstageProps {
export default function Backstage(props: BackstageProps) {
const {
- events,
+ backstageEvents,
customFields,
eventNext,
eventNow,
@@ -68,7 +68,7 @@ export default function Backstage(props: BackstageProps) {
}, [selectedId]);
// gather card data
- const hasEvents = events.length > 0;
+ const hasEvents = backstageEvents.length > 0;
const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(
eventNow,
eventNext,
@@ -176,7 +176,7 @@ export default function Backstage(props: BackstageProps) {
)}