mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-01 20:39:18 +00:00
default view
temp changes to default view - countdown setup - prepare to create a separate preview window
This commit is contained in:
@@ -1,5 +1,21 @@
|
|||||||
import styles from './Countdown.module.css'
|
import { useEffect, useState } from 'react';
|
||||||
|
import styles from './Countdown.module.css';
|
||||||
|
|
||||||
|
function display(seconds) {
|
||||||
|
const format = (val) => `0${Math.floor(val)}`.slice(-2);
|
||||||
|
const hours = seconds / 3600;
|
||||||
|
const minutes = (seconds % 3600) / 60;
|
||||||
|
|
||||||
|
if (hours < 1) return [minutes, seconds % 60].map(format).join(':');
|
||||||
|
else return [hours, minutes, seconds % 60].map(format).join(':');
|
||||||
|
}
|
||||||
|
|
||||||
export default function Countdown({ time }) {
|
export default function Countdown({ time }) {
|
||||||
return <div className={styles.countdownClock}>{time}</div>;
|
const [counter, setCounter] = useState(time);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
|
||||||
|
}, [counter]);
|
||||||
|
|
||||||
|
return <div className={styles.countdownClock}>{display(counter)}</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export default function Editor() {
|
|||||||
<Heading style={{ paddingBottom: '0.25em' }}>List Events</Heading>
|
<Heading style={{ paddingBottom: '0.25em' }}>List Events</Heading>
|
||||||
<NumberedText number={3} text={'Preview layout'} />
|
<NumberedText number={3} text={'Preview layout'} />
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
<PreviewContainer />
|
<PreviewContainer data={selectedData} />
|
||||||
</div>
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
|
|||||||
@@ -1,33 +1,55 @@
|
|||||||
import { format } from 'date-fns';
|
import { differenceInSeconds, format, subMinutes } from 'date-fns';
|
||||||
import { useState } from 'react';
|
import addMinutes from 'date-fns/addMinutes';
|
||||||
import { sampleData } from '../../app/sampleData';
|
import { sampleData } from '../../app/sampleData';
|
||||||
import Countdown from '../../common/components/countdown/Countdown';
|
import Countdown from '../../common/components/countdown/Countdown';
|
||||||
import MyProgressBar from '../../common/components/myProgressBar/MyProgressBar';
|
import MyProgressBar from '../../common/components/myProgressBar/MyProgressBar';
|
||||||
import SmallTimer from '../../common/components/smallTimer/SmallTimer';
|
import SmallTimer from '../../common/components/smallTimer/SmallTimer';
|
||||||
import './viewers.css';
|
import './viewers.css';
|
||||||
|
|
||||||
export default function DefaultPresenter() {
|
export default function DefaultPresenter(props) {
|
||||||
const [data, setData] = useState(sampleData);
|
const data = sampleData;
|
||||||
const [timer, setTimer] = useState(sampleData.timerDuration);
|
const now = new Date();
|
||||||
const [elapsed, setElapsed] = useState(0);
|
const values = props.data ?? {
|
||||||
|
title: 'Presentation Title',
|
||||||
|
subtitle: 'Presentation Subtitle',
|
||||||
|
presenter: 'Presenter Name',
|
||||||
|
timerDuration: 10,
|
||||||
|
timeStart: now,
|
||||||
|
timeEnd: now,
|
||||||
|
};
|
||||||
|
|
||||||
const timeNow = new Date();
|
// NITE: test only
|
||||||
|
const clockStarted = addMinutes(now, 6);
|
||||||
|
|
||||||
|
const timer = differenceInSeconds(
|
||||||
|
now,
|
||||||
|
subMinutes(clockStarted, values.timerDuration)
|
||||||
|
);
|
||||||
|
|
||||||
|
const timeStart = format(values.timeStart, 'HH:mm');
|
||||||
|
const currentTime = format(now, 'HH:mm');
|
||||||
|
const timeEnd = format(values.timeEnd, 'HH:mm');
|
||||||
|
const elapsed = timer / (values.timerDuration * 60);
|
||||||
|
|
||||||
|
console.log('timers', timer, timeStart, currentTime, timeEnd, elapsed);
|
||||||
|
|
||||||
|
if (props?.preview) return <div>Preview</div>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='presenter'>
|
<div className='presenter'>
|
||||||
<div className='presentationTitle'>{data.title}</div>
|
<div className='presentationTitle'>{values.title}</div>
|
||||||
<div className='presentationSub'>{data.subtitle}</div>
|
<div className='presentationSub'>{values.subtitle}</div>
|
||||||
<Countdown time={format(timer, 'mm.ss')} />
|
<Countdown time={timer} />
|
||||||
{!data.message.active && <MyProgressBar normalisedComplete={0.9} />}
|
{!data.message.active && <MyProgressBar normalisedComplete={elapsed} />}
|
||||||
<div
|
<div
|
||||||
className={data.message.active ? 'userMessage' : 'userMessage hidden'}
|
className={data.message.active ? 'userMessage' : 'userMessage hidden'}
|
||||||
>
|
>
|
||||||
{data.message.text}
|
{data.message.text}
|
||||||
</div>
|
</div>
|
||||||
<div className='extra'>
|
<div className='extra'>
|
||||||
<SmallTimer label='Scheduled Start' time={data.timeStart} />
|
<SmallTimer label='Scheduled Start' time={timeStart} />
|
||||||
<SmallTimer label='Current Time' time={format(timeNow, 'HH:mm')} />
|
<SmallTimer label='Current Time' time={currentTime} />
|
||||||
<SmallTimer label='Scheduled End' time={data.timeEnd} />
|
<SmallTimer label='Scheduled End' time={timeEnd} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,18 +1,27 @@
|
|||||||
import DefaultPresenter from './DefaultPresenter';
|
import DefaultPresenter from './DefaultPresenter';
|
||||||
import styles from './PreviewContainer.module.css';
|
import styles from './PreviewContainer.module.css';
|
||||||
|
|
||||||
export default function PreviewContainer() {
|
export default function PreviewContainer(props) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.previewContainer}>
|
<div className={styles.previewContainer}>
|
||||||
|
<div className={styles.previewItem}>
|
||||||
<div className={styles.preview}>
|
<div className={styles.preview}>
|
||||||
{/* <DefaultPresenter /> */}
|
<DefaultPresenter data={props.data} preview/>
|
||||||
|
</div>
|
||||||
|
<div className={styles.label}>Default Presenter</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.label}>Default Presenter</div>
|
<div className={styles.previewItem}>
|
||||||
|
<div className={styles.preview}></div>
|
||||||
<div className={styles.preview}>
|
<div className={styles.label}>Audience</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.previewItem}>
|
||||||
|
<div className={styles.preview}></div>
|
||||||
|
<div className={styles.label}>Stage Manager</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.previewItem}>
|
||||||
|
<div className={styles.preview}></div>
|
||||||
|
<div className={styles.label}>Lower third</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.label}>Audience</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user