From 5449aee0b0214083ee4036056cbeebb31350fe45 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Mon, 10 May 2021 23:21:06 +0200 Subject: [PATCH] improvements - stage manager sees timer with negative values - time up only shows if timer has been running - use spacebar to toggle navbar - pip shows times with delays improve iterate --- client/src/common/components/nav/NavLogo.jsx | 15 ++++++++++- client/src/features/viewers/ViewWrapper.jsx | 11 +++----- .../viewers/backstage/StageManager.jsx | 10 +++---- .../viewers/presenter/PresenterView.jsx | 2 ++ .../src/features/viewers/production/Pip.jsx | 27 ++++++++++++++++++- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/client/src/common/components/nav/NavLogo.jsx b/client/src/common/components/nav/NavLogo.jsx index be4583504..6ed8310d1 100644 --- a/client/src/common/components/nav/NavLogo.jsx +++ b/client/src/common/components/nav/NavLogo.jsx @@ -1,7 +1,8 @@ import { Link, Redirect } from 'react-router-dom'; import { Image } from '@chakra-ui/react'; import { AnimatePresence, motion } from 'framer-motion'; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; +import tinykeys from 'tinykeys'; import navlogo from '../../../assets/images/logos/LOGO-72.png'; import style from './NavLogo.module.css'; @@ -12,6 +13,18 @@ export default function NavLogo() { setShowNav(!showNav); }; + // Handle keyboard shortcuts + useEffect(() => { + let unsubscribe = tinykeys(window, { + Space: () => { + setShowNav((s) => !s); + }, + }); + return () => { + unsubscribe(); + }; + }, []); + return ( { /*** -------------------------------- ***/ /******************************************/ + // inject info: // is timer finished - let finished = timer.currentSeconds <= 0; - - // get clock - let clock = stringFromMillis(timer.clock); - + // get clock string const timeManager = { ...timer, - finished: finished, - clock: clock, + finished: timer.running <= 0 && timer.startedAt, + clock: stringFromMillis(timer.clock), playstate: playback, }; diff --git a/client/src/features/viewers/backstage/StageManager.jsx b/client/src/features/viewers/backstage/StageManager.jsx index d8fc34787..7595997c3 100644 --- a/client/src/features/viewers/backstage/StageManager.jsx +++ b/client/src/features/viewers/backstage/StageManager.jsx @@ -24,14 +24,14 @@ export default function StageManager(props) { // Add running delay let delay = 0; - events.forEach((e) => { + for (const e of events) { if (e.type === 'block') delay = 0; else if (e.type === 'delay') delay = delay + e.duration; else if (e.type === 'event' && delay > 0) { e.timeStart += delay; e.timeEnd += delay; } - }); + } // filter just events let filtered = events.filter((e) => e.type === 'event'); @@ -41,10 +41,8 @@ export default function StageManager(props) { // Format messages const showPubl = publ.text !== '' && publ.visible; - const stageTimer = - time.currentSeconds != null && !isNaN(time.currentSeconds) - ? formatDisplay(time.currentSeconds, true) - : ''; + let stageTimer = formatDisplay(Math.abs(time.running), true); + if (time.running < 0) stageTimer = '-' + stageTimer; // motion const titleVariants = { diff --git a/client/src/features/viewers/presenter/PresenterView.jsx b/client/src/features/viewers/presenter/PresenterView.jsx index c29798f91..3a63ad888 100644 --- a/client/src/features/viewers/presenter/PresenterView.jsx +++ b/client/src/features/viewers/presenter/PresenterView.jsx @@ -14,6 +14,8 @@ export default function PresenterView(props) { document.title = 'ontime - Speaker Screen'; }, []); + + const showOverlay = pres.text !== '' && pres.visible; const isPlaying = time.playstate === 'start'; diff --git a/client/src/features/viewers/production/Pip.jsx b/client/src/features/viewers/production/Pip.jsx index 01b357d78..bb05e6ffa 100644 --- a/client/src/features/viewers/production/Pip.jsx +++ b/client/src/features/viewers/production/Pip.jsx @@ -11,7 +11,9 @@ export default function Pip(props) { const { time, backstageEvents, selectedId, general } = props; const [size, setSize] = useState(''); const ref = useRef(null); + const [filteredEvents, setFilteredEvents] = useState(null); + // calculcate pip size useEffect(() => { const h = ref.current.clientHeight; const w = ref.current.clientWidth; @@ -23,6 +25,29 @@ export default function Pip(props) { document.title = 'ontime - Pip'; }, []); + // calculate delays if any + useEffect(() => { + if (backstageEvents == null) return; + + let events = [...backstageEvents]; + + // Add running delay + let delay = 0; + for (const e of events) { + if (e.type === 'block') delay = 0; + else if (e.type === 'delay') delay = delay + e.duration; + else if (e.type === 'event' && delay > 0) { + e.timeStart += delay; + e.timeEnd += delay; + } + } + + // filter just events + let filtered = events.filter((e) => e.type === 'event'); + + setFilteredEvents(filtered); + }, [backstageEvents]); + // Format messages const showInfo = general.backstageInfo !== '' && general.backstageInfo != null; @@ -43,7 +68,7 @@ export default function Pip(props) {