broadcast/ui/src/features/radio/Radio.tsx

77 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-03-07 00:56:35 +01:00
import React, { useEffect } from 'react';
import useWebSocket from 'react-use-websocket';
import { useAppSelector, useAppDispatch } from '../../app/hooks';
import { RadioState, ConnectionState } from '../../app/types';
import {
toggleRadioState,
selectLoading,
selectRadio,
selectConnection,
} from './radioSlice';
import {
getOnWSOpen,
getOnWSClose,
getOnWSMessage,
} from './radioWS';
2023-03-07 23:08:22 +01:00
import styles from './Radio.module.scss';
2023-03-07 00:56:35 +01:00
const getWSUrl = async () => {
const wsUrl = process.env.WS_ADDR ? process.env.WS_ADDR : "ws://localhost/liveness";
console.log("WS ADDR: %s", wsUrl);
return wsUrl;
};
export function RadioToggler() {
2023-03-07 23:08:22 +01:00
const loading = useAppSelector(selectLoading);
2023-03-07 00:56:35 +01:00
const radioState = useAppSelector(selectRadio);
const connectionState = useAppSelector(selectConnection);
const dispatch = useAppDispatch();
const { lastJsonMessage } = useWebSocket(getWSUrl,
{
onOpen: getOnWSOpen(dispatch),
onClose: getOnWSClose(dispatch),
});
const onWSMessage = getOnWSMessage(dispatch);
useEffect(() => {
if (lastJsonMessage != null) {
2023-03-07 23:08:22 +01:00
if (!loading) {
onWSMessage(lastJsonMessage);
}
2023-03-07 00:56:35 +01:00
}
}, [lastJsonMessage]);
2023-03-07 00:56:35 +01:00
2023-03-07 23:08:22 +01:00
let buttonStatus = "";
let circleStyle = styles.circleDisconnected;
if (loading) {
buttonStatus = "Loading";
circleStyle = styles.circleLoading;
} else if (connectionState) {
switch (radioState) {
case RadioState.STARTED:
buttonStatus = "ON AIR";
circleStyle = styles.circleStarted;
break;
case RadioState.STOPPED:
buttonStatus = "OFFLINE";
circleStyle = styles.circleStopped;
break;
}
2023-03-07 00:56:35 +01:00
}
return (
<div>
2023-03-07 23:08:22 +01:00
<div className={styles.buttonWrap} aria-label="toggle-radio-state">
<div
className={styles.clicker}
2023-03-07 00:56:35 +01:00
onClick={() => dispatch(toggleRadioState())}
2023-03-07 23:08:22 +01:00
>{buttonStatus}</div>
<div className={circleStyle}></div>
2023-03-07 00:56:35 +01:00
</div>
2023-03-07 23:08:22 +01:00
</div >
2023-03-07 00:56:35 +01:00
);
}