socket context

This commit is contained in:
cv
2021-04-10 13:56:28 +02:00
parent c2521404ca
commit 9410a33f2e
3 changed files with 51 additions and 27 deletions
+15 -12
View File
@@ -6,23 +6,26 @@ import { PresenterMessageProvider } from './app/context/presenterMessageContext'
import Editor from './features/editors/Editor';
import DefaultPresenter from './features/viewers/DefaultPresenter';
import { QueryClient, QueryClientProvider } from 'react-query';
import SocketProvider from './app/context/socketContext';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<PresenterMessageProvider>
<EventProvider>
<div className='App'>
<Route path='/' exact component={DefaultPresenter} />
<EventListProvider>
<Route path='/editor' exact component={Editor} />
</EventListProvider>
</div>
</EventProvider>
</PresenterMessageProvider>
</QueryClientProvider>
<SocketProvider>
<QueryClientProvider client={queryClient}>
<PresenterMessageProvider>
<EventProvider>
<div className='App'>
<Route path='/' exact component={DefaultPresenter} />
<EventListProvider>
<Route path='/editor' exact component={Editor} />
</EventListProvider>
</div>
</EventProvider>
</PresenterMessageProvider>
</QueryClientProvider>
</SocketProvider>
);
}
+26
View File
@@ -0,0 +1,26 @@
import { createContext, useContext, useEffect, useState } from 'react';
import io from 'socket.io-client';
import { serverURL } from '../api/apiConstants';
export const SocketContext = createContext([[], () => {}]);
export const useSocket = () => {
return useContext(SocketContext);
};
function SocketProvider(props) {
const [socket, setSocket] = useState();
useEffect(() => {
const socket = io(serverURL);
setSocket(socket);
return () => socket.disconnect();
}, []);
return (
<SocketContext.Provider value={socket}>
{props.children}
</SocketContext.Provider>
);
}
export default SocketProvider;
+10 -15
View File
@@ -11,8 +11,6 @@ import {
import { format } from 'date-fns';
import { timeFormatSeconds } from '../../common/dateConfig';
import { useEffect, useState } from 'react';
import { io } from 'socket.io-client';
import { serverURL } from '../../app/api/apiConstants';
import {
getStart,
getPause,
@@ -20,6 +18,7 @@ import {
getPrevious,
getNext,
} from '../../app/api/playbackApi';
import { useSocket } from '../../app/context/socketContext';
// BUTTON DEFINITION
const defProps = {
@@ -33,28 +32,24 @@ const size = {
export default function PlaybackControl(props) {
const [playback, setPlayback] = useState(null);
const socket = useSocket();
const [timer, setTimer] = useState({
currentSeconds: null,
startedAt: null,
expectedFinish: null,
});
const updateTimer = (vals) => {
setTimer({ ...timer, ...vals });
};
// WEBSOCKETZ
useEffect(() => {
// TODO: add namespace?
const socket = io(serverURL, { transport: ['websocket'] });
console.log('websocket started');
if (socket == null) return;
// Handle timer
socket.on('timer', (data) => {
updateTimer(data);
setTimer({ ...data });
});
return () => socket.disconnect();
}, []);
return () => socket.off('timer');
}, [socket]);
const playbackControl = async (action, payload) => {
switch (action) {
@@ -83,10 +78,10 @@ export default function PlaybackControl(props) {
}
};
const started = timer.startedAt
const started = timer?.startedAt
? format(timer.startedAt, timeFormatSeconds)
: '...';
const finish = timer.expectedFinish
const finish = timer?.expectedFinish
? format(timer.expectedFinish, timeFormatSeconds)
: '...';
@@ -94,7 +89,7 @@ export default function PlaybackControl(props) {
<div className={style.mainContainer}>
<div className={style.timeContainer}>
<div className={style.timer}>
<Countdown time={timer.currentSeconds} small />
<Countdown time={timer?.currentSeconds} small />
</div>
<div className={style.start}>
<span className={style.tag}>Started at </span>