From 2d9d330fe34ed176cff6148afce506ebf8ecd721 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Sun, 18 Apr 2021 13:33:26 +0200 Subject: [PATCH] move logic to HOC --- client/src/App.jsx | 25 +++- client/src/features/viewers/ViewWrapper.jsx | 124 ++++++++++++++++++ .../viewers/presenter/PresenterView.jsx | 100 +++----------- 3 files changed, 161 insertions(+), 88 deletions(-) create mode 100644 client/src/features/viewers/ViewWrapper.jsx diff --git a/client/src/App.jsx b/client/src/App.jsx index ea0fa7be6..1aa7cb1b1 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -1,20 +1,35 @@ -import { Route } from 'react-router'; +import { Route, Switch } from 'react-router-dom'; import './App.css'; import Editor from './features/editors/Editor'; import DefaultPresenter from './features/viewers/DefaultPresenter'; +import PresenterView from './features/viewers/presenter/PresenterView'; import { QueryClient, QueryClientProvider } from 'react-query'; import SocketProvider from './app/context/socketContext'; +import PresenterSimple from './features/viewers/presenter/PresenterSimple'; +import StageManager from './features/viewers/backstage/StageManager'; +import withSocket from './features/viewers/ViewWrapper'; const queryClient = new QueryClient(); +const SDefault = withSocket(DefaultPresenter); +const SSpeaker = withSocket(PresenterView); +const SSpeakerSimple = withSocket(PresenterSimple); +const SStageManager = withSocket(StageManager); + function App() { return (
- - - - + + + + + + + + + +
); diff --git a/client/src/features/viewers/ViewWrapper.jsx b/client/src/features/viewers/ViewWrapper.jsx new file mode 100644 index 000000000..ab98ada94 --- /dev/null +++ b/client/src/features/viewers/ViewWrapper.jsx @@ -0,0 +1,124 @@ +import { useEffect, useState } from 'react'; +import { useSocket } from '../../app/context/socketContext'; +import { stringFromMillis } from '../../common/dateConfig'; + +const withSocket = (Component) => { + const WrappedComponent = (props) => { + const socket = useSocket(); + const [pres, setPres] = useState({ + text: '', + visible: false, + }); + const [publ, setPubl] = useState({ + text: '', + visible: false, + }); + const [lower, setLower] = useState({ + text: '', + visible: false, + }); + const [timer, setTimer] = useState({ + clock: null, + currentSeconds: null, + startedAt: null, + expectedFinish: null, + }); + const [titles, setTitles] = useState({ + titleNow: '', + subtitleNow: '', + presenterNow: '', + titleNext: '', + subtitleNext: '', + presenterNext: '', + }); + + // Ask for update on load + useEffect(() => { + if (socket == null) return; + + // Handle presenter messages + socket.on('messages-presenter', (data) => { + setPres({ ...data }); + }); + + // Handle public messages + socket.on('messages-public', (data) => { + setPubl({ ...data }); + }); + + // Handle lower third messages + socket.on('messages-lower', (data) => { + setLower({ ...data }); + }); + + // Handle timer + socket.on('timer', (data) => { + setTimer({ ...data }); + }); + + // Handle timer + socket.on('titles', (data) => { + setTitles({ ...data }); + }); + + // Ask for up to date data + socket.emit('get-messages'); + + // Ask for up to data + socket.emit('get-presenter'); + + // Ask for up titles + socket.emit('get-titles'); + + // Clear listeners + return () => { + socket.off('messages-public'); + socket.off('messages-presenter'); + socket.off('messages-lower'); + socket.off('timer'); + socket.off('titles'); + }; + }, [socket]); + + /********************************************/ + /*** + titleManager ***/ + /*** WRAP INFORMATION RELATED TO TITLES ***/ + /*** ---------------------------------- ***/ + /********************************************/ + // is there a next field? + let showNext = true; + if (!titles.titleNext && !titles.subtitleNext && !titles.presenterNext) + showNext = false; + + const titleManager = { ...titles, showNext: showNext }; + + /******************************************/ + /*** + timeManager ***/ + /*** WRAP INFORMATION RELATED TO TIME ***/ + /*** -------------------------------- ***/ + /******************************************/ + + // is timer finished + let finished = timer.currentSeconds <= 0; + + // get clock + let clock = stringFromMillis(timer.clock); + + const timeManager = { ...timer, finished: finished, clock: clock }; + + return ( + + ); + }; + + return WrappedComponent; +}; + +export default withSocket; diff --git a/client/src/features/viewers/presenter/PresenterView.jsx b/client/src/features/viewers/presenter/PresenterView.jsx index fc8f1649b..77ed48a29 100644 --- a/client/src/features/viewers/presenter/PresenterView.jsx +++ b/client/src/features/viewers/presenter/PresenterView.jsx @@ -1,82 +1,16 @@ -import { useEffect, useState } from 'react'; -import { useSocket } from '../../../app/context/socketContext'; import Countdown from '../../../common/components/countdown/Countdown'; import MyProgressBar from '../../../common/components/myProgressBar/MyProgressBar'; -import { stringFromMillis } from '../../../common/dateConfig'; import style from './PresenterView.module.css'; -export default function PresenterView() { - const socket = useSocket(); - const [pres, setPres] = useState({ - text: '', - visible: false, - }); - const [timer, setTimer] = useState({ - clock: null, - currentSeconds: null, - durationSeconds: null, - startedAt: null, - expectedFinish: null, - }); - const [titles, setTitles] = useState({ - titleNow: '', - subtitleNow: '', - presenterNow: '', - titleNext: '', - subtitleNext: '', - presenterNext: '', - }); - // Ask for update on load - useEffect(() => { - if (socket == null) return; +export default function PresenterView(props) { + const { pres, publ, lower, title, time } = props; - // Handle presenter messages - socket.on('messages-presenter', (data) => { - setPres({ ...data }); - }); - - // Handle timer - socket.on('timer', (data) => { - setTimer({ ...data }); - }); - - // Handle timer - socket.on('titles', (data) => { - setTitles({ ...data }); - }); - - // Ask for up to data - socket.emit('get-presenter'); - - // Ask for up titles - socket.emit('get-titles'); - - // Clear listeners - return () => { - socket.off('messages-presenter'); - socket.off('timer'); - socket.off('titles'); - }; - }, [socket]); - - // is there a next field? - let showNext = true; - if (!titles.titleNext && !titles.subtitleNext && !titles.presenterNext) - showNext = false; - - // should show message overlay - let showOverlay = pres.visible && pres.text !== ''; - - // is timer finished - let finished = timer.currentSeconds <= 0; - - // get clock - let clock = stringFromMillis(timer.clock); + let showOverlay = pres.text !== '' && pres.visible; return (
Time Now
-
{clock}
+
{time.clock}
- {finished ? ( + {time.finished ? (
TIME UP
) : (
- +
)}
- {!finished && ( + {!time.finished && (
)}
Now
-
{titles.titleNow}
-
{titles.subtitleNow}
-
{titles.presenterNow}
+
{title.titleNow}
+
{title.subtitleNow}
+
{title.presenterNow}
- {showNext && ( + {title.showNext && (
Next
-
{titles.titleNext}
-
{titles.subtitleNext}
-
{titles.presenterNext}
+
{title.titleNext}
+
{title.subtitleNext}
+
{title.presenterNext}
)}