mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-20 14:39:06 +00:00
feat: lower third message
This commit is contained in:
@@ -1,10 +1,14 @@
|
|||||||
import { FormControl, FormLabel } from '@chakra-ui/form-control';
|
import { FormControl } from '@chakra-ui/form-control';
|
||||||
import { Input } from '@chakra-ui/input';
|
import { Input } from '@chakra-ui/input';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useSocket } from '../../app/context/socketContext';
|
import { useSocket } from '../../app/context/socketContext';
|
||||||
import VisibleIconBtn from '../../common/components/buttons/VisibleIconBtn';
|
import VisibleIconBtn from '../../common/components/buttons/VisibleIconBtn';
|
||||||
import style from './MessageControl.module.css';
|
import style from './MessageControl.module.css';
|
||||||
|
|
||||||
|
const inputProps = {
|
||||||
|
size: 'sm',
|
||||||
|
};
|
||||||
|
|
||||||
export default function MessageControl() {
|
export default function MessageControl() {
|
||||||
const socket = useSocket();
|
const socket = useSocket();
|
||||||
const [pres, setPres] = useState({
|
const [pres, setPres] = useState({
|
||||||
@@ -15,6 +19,10 @@ export default function MessageControl() {
|
|||||||
text: '',
|
text: '',
|
||||||
visible: false,
|
visible: false,
|
||||||
});
|
});
|
||||||
|
const [lower, setLower] = useState({
|
||||||
|
text: '',
|
||||||
|
visible: false,
|
||||||
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (socket == null) return;
|
if (socket == null) return;
|
||||||
@@ -29,14 +37,19 @@ export default function MessageControl() {
|
|||||||
setPubl({ ...data });
|
setPubl({ ...data });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Handle lower third messages
|
||||||
|
socket.on('messages-lower', (data) => {
|
||||||
|
setLower({ ...data });
|
||||||
|
});
|
||||||
|
|
||||||
// Ask for up to date data
|
// Ask for up to date data
|
||||||
socket.emit('get-presenter');
|
socket.emit('get-messages');
|
||||||
socket.emit('get-public');
|
|
||||||
|
|
||||||
// Clear listeners
|
// Clear listeners
|
||||||
return () => {
|
return () => {
|
||||||
socket.off('messages-public');
|
socket.off('messages-public');
|
||||||
socket.off('messages-presenter');
|
socket.off('messages-presenter');
|
||||||
|
socket.off('messages-lower');
|
||||||
};
|
};
|
||||||
}, [socket]);
|
}, [socket]);
|
||||||
|
|
||||||
@@ -54,6 +67,12 @@ export default function MessageControl() {
|
|||||||
case 'toggle-publ-visible':
|
case 'toggle-publ-visible':
|
||||||
socket.emit('set-public-visible', !publ.visible);
|
socket.emit('set-public-visible', !publ.visible);
|
||||||
break;
|
break;
|
||||||
|
case 'lower-text':
|
||||||
|
socket.emit('set-lower-text', payload);
|
||||||
|
break;
|
||||||
|
case 'toggle-lower-visible':
|
||||||
|
socket.emit('set-lower-visible', !lower.visible);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -64,35 +83,55 @@ export default function MessageControl() {
|
|||||||
<>
|
<>
|
||||||
<div className={style.inputContainer}>
|
<div className={style.inputContainer}>
|
||||||
<FormControl id='presenterMessage'>
|
<FormControl id='presenterMessage'>
|
||||||
<FormLabel>Presenter screen message</FormLabel>
|
<span className={style.label}>Presenter screen message</span>
|
||||||
<Input
|
<Input
|
||||||
placeholder='only the presenter screens see this'
|
placeholder='only the presenter screens see this'
|
||||||
onChange={(event) =>
|
onChange={(event) =>
|
||||||
messageControl('pres-text', event.target.value)
|
messageControl('pres-text', event.target.value)
|
||||||
}
|
}
|
||||||
|
{...inputProps}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<VisibleIconBtn
|
<VisibleIconBtn
|
||||||
size='md'
|
|
||||||
active={pres.visible}
|
active={pres.visible}
|
||||||
clickHandler={() => messageControl('toggle-pres-visible')}
|
clickHandler={() => messageControl('toggle-pres-visible')}
|
||||||
|
{...inputProps}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={style.inputContainerWGap}>
|
<div className={style.inputContainerWGap}>
|
||||||
<FormControl id='generalMessage'>
|
<FormControl id='generalMessage'>
|
||||||
<FormLabel>Public screen message</FormLabel>
|
<span className={style.label}>Public screen message</span>
|
||||||
<Input
|
<Input
|
||||||
placeholder='all screens will render this'
|
placeholder='all screens will render this'
|
||||||
onChange={(event) =>
|
onChange={(event) =>
|
||||||
messageControl('publ-text', event.target.value)
|
messageControl('publ-text', event.target.value)
|
||||||
}
|
}
|
||||||
|
{...inputProps}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<VisibleIconBtn
|
<VisibleIconBtn
|
||||||
size='md'
|
|
||||||
active={publ.visible}
|
active={publ.visible}
|
||||||
clickHandler={() => messageControl('toggle-publ-visible')}
|
clickHandler={() => messageControl('toggle-publ-visible')}
|
||||||
|
{...inputProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={style.inputContainerWGap}>
|
||||||
|
<FormControl id='lowerMessage'>
|
||||||
|
<span className={style.label}>Lower third message</span>
|
||||||
|
<Input
|
||||||
|
placeholder='visible in lower third screen'
|
||||||
|
onChange={(event) =>
|
||||||
|
messageControl('lower-text', event.target.value)
|
||||||
|
}
|
||||||
|
{...inputProps}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<VisibleIconBtn
|
||||||
|
active={lower.visible}
|
||||||
|
clickHandler={() => messageControl('toggle-lower-visible')}
|
||||||
|
{...inputProps}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -6,5 +6,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inputContainerWGap {
|
.inputContainerWGap {
|
||||||
padding-top: 1em;
|
padding-top: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,13 @@ const initiateSocket = (server, config) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// playback API
|
// playback API
|
||||||
|
|
||||||
|
socket.on('get-messages', () => {
|
||||||
|
socket.emit('messages-presenter', global.timer.presenter);
|
||||||
|
socket.emit('messages-public', global.timer.public);
|
||||||
|
socket.emit('messages-lower', global.timer.lower);
|
||||||
|
});
|
||||||
|
|
||||||
socket.on('set-presenter-text', (data) => {
|
socket.on('set-presenter-text', (data) => {
|
||||||
global.timer.presenterText = data;
|
global.timer.presenterText = data;
|
||||||
socket.emit('messages-presenter', global.timer.presenter);
|
socket.emit('messages-presenter', global.timer.presenter);
|
||||||
@@ -67,6 +74,19 @@ const initiateSocket = (server, config) => {
|
|||||||
socket.emit('messages-public', global.timer.public);
|
socket.emit('messages-public', global.timer.public);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
socket.on('set-lower-text', (data) => {
|
||||||
|
global.timer.lowerText = data;
|
||||||
|
socket.emit('messages-lower', global.timer.lower);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('set-lower-visible', (data) => {
|
||||||
|
global.timer.lowerVisible = data;
|
||||||
|
socket.emit('messages-lower', global.timer.lower);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('get-lower', () => {
|
||||||
|
socket.emit('messages-lower', global.timer.lower);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user