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}
)}