import React, { useEffect, useRef } from 'react';
import { selectTrackAudioByID, useHMSVanillaStore } from '@100mslive/react-sdk';
import { Box, Flex } from '../Layout';
import { keyframes } from '../Theme';
//@ts-ignore
import bg from './audio-level.png';
// keep the calculated values before hand to avoid recalcuation everytime
const positionValues = new Array(101).fill(0).reduce((acc, _, index) => {
acc[index] = Math.round((index / 100) * 4) / 4; // convert to 0.25 multiples
return acc;
}, {});
const barAnimation = keyframes({
from: {
maskSize: '4em .8em',
'-webkit-mask-position-y': '.1em',
maskPosition: 'initial .1em',
},
'50%': {
maskSize: '4em 1em',
'-webkit-mask-position-y': 0,
maskPosition: 'initial 0',
},
to: {
maskSize: '4em .8em',
'-webkit-mask-position-y': '.1em',
maskPosition: 'initial 0.1em',
},
});
const AudioBar = () => {
return (
);
};
export const AudioLevel = ({ trackId, size }: { trackId?: string; size?: 'small' | 'medium' }) => {
const ref = useRef(null);
const vanillaStore = useHMSVanillaStore();
useEffect(() => {
const unsubscribe = vanillaStore.subscribe(audioLevel => {
if (ref.current) {
let index = 0;
//@ts-ignore
for (const child of ref.current.children) {
const element = child as HTMLElement;
const positionX = `-${positionValues[audioLevel] * (index === 1 ? 2.5 : 1.25)}em`;
(element.style as any)['-webkit-mask-position-x'] = positionX;
(element.style as any)['mask-position'] = `${positionX} 0`;
element.style.animation =
positionValues[audioLevel] > 0 ? `${barAnimation} 0.6s steps(3,jump-none) 0s infinite` : 'none';
index++;
}
}
}, selectTrackAudioByID(trackId));
return unsubscribe;
}, [vanillaStore, trackId]);
return (
);
};