mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-07 15:29:10 +00:00
playback control
DRAFT, timer not implemented yet
This commit is contained in:
@@ -1,19 +1,18 @@
|
|||||||
import { Button } from '@chakra-ui/button';
|
import { Button } from '@chakra-ui/button';
|
||||||
import style from './PlaybackControl.module.css';
|
import style from './PlaybackControl.module.css';
|
||||||
import Countdown from '../../common/components/countdown/Countdown';
|
import Countdown from '../../common/components/countdown/Countdown';
|
||||||
import { useState } from 'react';
|
|
||||||
import { ArrowBackIcon, ArrowForwardIcon } from '@chakra-ui/icons';
|
import { ArrowBackIcon, ArrowForwardIcon } from '@chakra-ui/icons';
|
||||||
|
|
||||||
export default function PlaybackControl() {
|
// BUTTON DEFINITION
|
||||||
const [time] = useState(15);
|
const defProps = {
|
||||||
const [roll, setRoll] = useState(false);
|
colorScheme: 'blackAlpha',
|
||||||
|
variant: 'outline',
|
||||||
|
};
|
||||||
|
|
||||||
const defProps = {
|
const bigSize = 120;
|
||||||
colorScheme: 'blackAlpha',
|
|
||||||
variant: 'outline',
|
|
||||||
};
|
|
||||||
|
|
||||||
const bigSize = 120;
|
export default function PlaybackControl(props) {
|
||||||
|
const { time, roll } = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={style.mainContainer}>
|
<div className={style.mainContainer}>
|
||||||
@@ -28,6 +27,7 @@ export default function PlaybackControl() {
|
|||||||
colorScheme='green'
|
colorScheme='green'
|
||||||
className={style.start}
|
className={style.start}
|
||||||
disabled={roll}
|
disabled={roll}
|
||||||
|
onClick={() => props.playbackControl('start')}
|
||||||
>
|
>
|
||||||
Start
|
Start
|
||||||
</Button>
|
</Button>
|
||||||
@@ -36,6 +36,7 @@ export default function PlaybackControl() {
|
|||||||
colorScheme='orange'
|
colorScheme='orange'
|
||||||
className={style.pause}
|
className={style.pause}
|
||||||
disabled={roll}
|
disabled={roll}
|
||||||
|
onClick={() => props.playbackControl('pause')}
|
||||||
>
|
>
|
||||||
Pause
|
Pause
|
||||||
</Button>
|
</Button>
|
||||||
@@ -47,6 +48,7 @@ export default function PlaybackControl() {
|
|||||||
leftIcon={<ArrowBackIcon />}
|
leftIcon={<ArrowBackIcon />}
|
||||||
className={style.prev}
|
className={style.prev}
|
||||||
disabled={roll}
|
disabled={roll}
|
||||||
|
onClick={() => props.playbackControl('previous')}
|
||||||
>
|
>
|
||||||
Prev
|
Prev
|
||||||
</Button>
|
</Button>
|
||||||
@@ -56,6 +58,7 @@ export default function PlaybackControl() {
|
|||||||
rightIcon={<ArrowForwardIcon />}
|
rightIcon={<ArrowForwardIcon />}
|
||||||
className={style.next}
|
className={style.next}
|
||||||
disabled={roll}
|
disabled={roll}
|
||||||
|
onClick={() => props.playbackControl('next')}
|
||||||
>
|
>
|
||||||
Next
|
Next
|
||||||
</Button>
|
</Button>
|
||||||
@@ -63,7 +66,7 @@ export default function PlaybackControl() {
|
|||||||
width={bigSize}
|
width={bigSize}
|
||||||
colorScheme='blue'
|
colorScheme='blue'
|
||||||
className={style.reset}
|
className={style.reset}
|
||||||
onClick={() => setRoll(!roll)}
|
onClick={() => props.playbackControl('roll')}
|
||||||
>
|
>
|
||||||
Roll
|
Roll
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
+123
-12
@@ -2,9 +2,12 @@ import { IconButton } from '@chakra-ui/button';
|
|||||||
import { SettingsIcon } from '@chakra-ui/icons';
|
import { SettingsIcon } from '@chakra-ui/icons';
|
||||||
import { Grid, GridItem, Heading } from '@chakra-ui/layout';
|
import { Grid, GridItem, Heading } from '@chakra-ui/layout';
|
||||||
import { Box } from '@chakra-ui/layout';
|
import { Box } from '@chakra-ui/layout';
|
||||||
|
import { getHours, getMinutes } from 'date-fns';
|
||||||
|
import { differenceInSeconds } from 'date-fns/esm';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { EventContext } from '../../app/context/eventContext';
|
import { EventContext } from '../../app/context/eventContext';
|
||||||
|
import { EventListContext } from '../../app/context/eventListContext';
|
||||||
import NumberedText from '../../common/components/text/NumberedText';
|
import NumberedText from '../../common/components/text/NumberedText';
|
||||||
import PlaybackControl from '../control/PlaybackControl';
|
import PlaybackControl from '../control/PlaybackControl';
|
||||||
import MessageForm from '../form/MessageForm';
|
import MessageForm from '../form/MessageForm';
|
||||||
@@ -14,15 +17,111 @@ import EventList from './list/EventList';
|
|||||||
|
|
||||||
export default function Editor() {
|
export default function Editor() {
|
||||||
const [formMode, setFormMode] = useState(null);
|
const [formMode, setFormMode] = useState(null);
|
||||||
const [event] = useContext(EventContext);
|
const [events] = useContext(EventListContext);
|
||||||
|
const [event, setEvent] = useContext(EventContext);
|
||||||
|
const [playback, setPlayback] = useState({
|
||||||
|
current: null,
|
||||||
|
next: null,
|
||||||
|
currentTimer: null,
|
||||||
|
numEvents: 0,
|
||||||
|
state: 'pause',
|
||||||
|
prevState: 'pause',
|
||||||
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
const updatePlayback = (vals) => {
|
||||||
if (event === null) {
|
setPlayback({ ...playback, ...vals });
|
||||||
setFormMode(null);
|
};
|
||||||
} else {
|
|
||||||
setFormMode('edit');
|
// ?? I have already done this a few times,
|
||||||
|
// maybe loop once and get all data?
|
||||||
|
const getCurrentTime = (target) => {
|
||||||
|
if (events !== null) {
|
||||||
|
// loop through events to find target
|
||||||
|
const filteredEvents = events.filter((e) => e.type === 'event');
|
||||||
|
const curEvent = filteredEvents[target];
|
||||||
|
|
||||||
|
// set as event
|
||||||
|
setEvent(curEvent);
|
||||||
|
|
||||||
|
// extract time only from dates
|
||||||
|
let minStart = getHours(curEvent.timeStart) * 60;
|
||||||
|
minStart = minStart + getMinutes(curEvent.timeStart);
|
||||||
|
|
||||||
|
let minEnd = getHours(curEvent.timeEnd) * 60;
|
||||||
|
minEnd = minEnd + getMinutes(curEvent.timeEnd);
|
||||||
|
|
||||||
|
|
||||||
|
// return time in seconds
|
||||||
|
return ((minEnd - minStart) * 60);
|
||||||
}
|
}
|
||||||
}, [event]);
|
};
|
||||||
|
|
||||||
|
const playbackControl = (action, payload) => {
|
||||||
|
switch (action) {
|
||||||
|
case 'start': {
|
||||||
|
if (playback.state !== 'play') {
|
||||||
|
updatePlayback({ state: 'play', prevState: playback.state });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'pause': {
|
||||||
|
if (playback.state !== 'pause') {
|
||||||
|
updatePlayback({ state: 'pause', prevState: playback.state });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'roll': {
|
||||||
|
if (playback.state === 'roll' && playback.prevState !== 'roll') {
|
||||||
|
updatePlayback({ state: playback.prevState, prevState: 'roll' });
|
||||||
|
} else {
|
||||||
|
updatePlayback({ state: 'roll', prevState: playback.state });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'previous': {
|
||||||
|
if (playback.numEvents !== null) {
|
||||||
|
let cur = null,
|
||||||
|
nxt = null;
|
||||||
|
if (playback.current === null || playback.current === 0) {
|
||||||
|
cur = 0;
|
||||||
|
} else {
|
||||||
|
cur = playback.current - 1;
|
||||||
|
}
|
||||||
|
if (playback.numEvents > 1) nxt = cur + 1;
|
||||||
|
if (nxt > playback.numEvents) nxt = playback.numEvents;
|
||||||
|
|
||||||
|
// get time
|
||||||
|
let time = getCurrentTime(cur);
|
||||||
|
// update playback
|
||||||
|
updatePlayback({ current: cur, next: nxt, currentTimer: time });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'next': {
|
||||||
|
if (playback.numEvents !== null) {
|
||||||
|
let cur = null,
|
||||||
|
nxt = null;
|
||||||
|
if (playback.current === null) {
|
||||||
|
cur = 0;
|
||||||
|
} else {
|
||||||
|
cur = playback.next;
|
||||||
|
}
|
||||||
|
if (playback.numEvents > 1) nxt = cur + 1;
|
||||||
|
if (nxt >= playback.numEvents) nxt = playback.numEvents - 1;
|
||||||
|
|
||||||
|
// get time
|
||||||
|
let time = getCurrentTime(cur);
|
||||||
|
// update playback
|
||||||
|
updatePlayback({ current: cur, next: nxt, currentTimer: time });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('playback here', playback);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid
|
<Grid
|
||||||
@@ -38,7 +137,12 @@ export default function Editor() {
|
|||||||
</Heading>
|
</Heading>
|
||||||
<NumberedText number={1} text={'Manage and select event to run'} />
|
<NumberedText number={1} text={'Manage and select event to run'} />
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
<EventList formMode={formMode} setFormMode={setFormMode} />
|
<EventList
|
||||||
|
formMode={formMode}
|
||||||
|
setFormMode={setFormMode}
|
||||||
|
selected={playback.current}
|
||||||
|
updatePlayback={updatePlayback}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
</GridItem>
|
</GridItem>
|
||||||
@@ -64,8 +168,9 @@ export default function Editor() {
|
|||||||
number={2}
|
number={2}
|
||||||
text={'Show realtime messages on separate screen types'}
|
text={'Show realtime messages on separate screen types'}
|
||||||
/>
|
/>
|
||||||
<div className={styles.content}></div>
|
<div className={styles.content}>
|
||||||
<MessageForm />
|
<MessageForm />
|
||||||
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
</GridItem>
|
</GridItem>
|
||||||
|
|
||||||
@@ -75,8 +180,14 @@ export default function Editor() {
|
|||||||
Time Control
|
Time Control
|
||||||
</Heading>
|
</Heading>
|
||||||
<NumberedText number={3} text={'Control Timer'} />
|
<NumberedText number={3} text={'Control Timer'} />
|
||||||
<div className={styles.content}></div>
|
<div className={styles.content}>
|
||||||
<PlaybackControl />
|
<PlaybackControl
|
||||||
|
playback={playback}
|
||||||
|
playbackControl={playbackControl}
|
||||||
|
time={playback.currentTimer}
|
||||||
|
roll={playback.state === 'roll'}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
</GridItem>
|
</GridItem>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user