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 ( ); };