jiti-meet/react/features/conference/components/ConferenceTimer.tsx

107 lines
2.6 KiB
TypeScript

import React, { useCallback, useEffect, useRef, useState } from 'react';
import { useSelector } from 'react-redux';
// @ts-ignore
import { ConferenceTimerDisplay } from '..';
import { getConferenceTimestamp } from '../../base/conference/functions';
import { getLocalizedDurationFormatter } from '../../base/i18n/dateUtil';
/**
* The type of the React {@code Component} props of {@link ConferenceTimer}.
*/
interface IProps {
/**
* Style to be applied to the rendered text.
*/
textStyle?: Object;
}
export interface IDisplayProps {
/**
* Style to be applied to text (native only).
*/
textStyle: Object;
/**
* String to display as time.
*/
timerValue: string;
}
const ConferenceTimer = ({ textStyle }: IProps) => {
const startTimestamp = useSelector(getConferenceTimestamp);
const [ timerValue, setTimerValue ] = useState(getLocalizedDurationFormatter(0));
const interval = useRef<number>();
/**
* Sets the current state values that will be used to render the timer.
*
* @param {number} refValueUTC - The initial UTC timestamp value.
* @param {number} currentValueUTC - The current UTC timestamp value.
*
* @returns {void}
*/
const setStateFromUTC = useCallback((refValueUTC, currentValueUTC) => {
if (!refValueUTC || !currentValueUTC) {
return;
}
if (currentValueUTC < refValueUTC) {
return;
}
const timerMsValue = currentValueUTC - refValueUTC;
const localizedTime = getLocalizedDurationFormatter(timerMsValue);
setTimerValue(localizedTime);
}, []);
/**
* Start conference timer.
*
* @returns {void}
*/
const startTimer = useCallback(() => {
if (!interval.current && startTimestamp) {
setStateFromUTC(startTimestamp, new Date().getTime());
interval.current = window.setInterval(() => {
setStateFromUTC(startTimestamp, new Date().getTime());
}, 1000);
}
}, [ startTimestamp, interval ]);
/**
* Stop conference timer.
*
* @returns {void}
*/
const stopTimer = useCallback(() => {
if (interval.current) {
clearInterval(interval.current);
}
setTimerValue(getLocalizedDurationFormatter(0));
}, [ interval ]);
useEffect(() => {
startTimer();
return () => stopTimer();
}, [ startTimestamp ]);
if (!startTimestamp) {
return null;
}
return (<ConferenceTimerDisplay
textStyle = { textStyle }
timerValue = { timerValue } />);
};
export default ConferenceTimer;