You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.1 KiB
101 lines
2.1 KiB
import { Fragment, useMemo } from 'react'
|
|
|
|
import type { MediaPlaylist } from 'hls.js'
|
|
|
|
import map from 'lodash/map'
|
|
|
|
import { OutsideClick } from 'features/OutsideClick'
|
|
|
|
import { useToggle } from 'hooks'
|
|
|
|
import { isMobileDevice } from 'config/userAgent'
|
|
|
|
import {
|
|
AudioTrackItem,
|
|
AudioTrackItemText,
|
|
AudioTracksWrapper,
|
|
ScHeader,
|
|
ScModal,
|
|
SelectedAudioTrack,
|
|
IconArrow,
|
|
} from './styled'
|
|
|
|
export type AudioTracksProps = {
|
|
audioTracks: Array<MediaPlaylist>,
|
|
changeAudioTrack: (trackId: number) => void,
|
|
isFullscreen?: boolean,
|
|
selectedAudioTrack: MediaPlaylist,
|
|
}
|
|
|
|
export const AudioTracks = ({
|
|
audioTracks,
|
|
changeAudioTrack,
|
|
isFullscreen,
|
|
selectedAudioTrack,
|
|
}: AudioTracksProps) => {
|
|
const {
|
|
close,
|
|
isOpen,
|
|
open,
|
|
} = useToggle()
|
|
|
|
const AudioTracksList = useMemo(() => (
|
|
map(audioTracks, (track) => (
|
|
<AudioTrackItem
|
|
key={`${track.id}_${track.name}`}
|
|
isFullScreen={Boolean(isFullscreen)}
|
|
selected={track.id === selectedAudioTrack?.id}
|
|
onClick={() => {
|
|
changeAudioTrack(track.id)
|
|
close()
|
|
}}
|
|
>
|
|
<AudioTrackItemText>
|
|
{track.name}
|
|
</AudioTrackItemText>
|
|
</AudioTrackItem>
|
|
))
|
|
), [
|
|
audioTracks,
|
|
changeAudioTrack,
|
|
close,
|
|
isFullscreen,
|
|
selectedAudioTrack?.id,
|
|
])
|
|
|
|
const content = isMobileDevice && !isFullscreen
|
|
? (
|
|
<ScModal
|
|
closeSize={12}
|
|
close={close}
|
|
isOpen={isOpen}
|
|
>
|
|
<ScHeader>Audio</ScHeader>
|
|
{AudioTracksList}
|
|
</ScModal>
|
|
)
|
|
: (
|
|
<Fragment>
|
|
{isOpen && (
|
|
<AudioTracksWrapper>
|
|
<OutsideClick onClick={close}>
|
|
{AudioTracksList}
|
|
</OutsideClick>
|
|
</AudioTracksWrapper>
|
|
)}
|
|
</Fragment>
|
|
)
|
|
|
|
return (
|
|
<Fragment>
|
|
{audioTracks?.length > 1 && (
|
|
<SelectedAudioTrack onClick={open}>
|
|
{!selectedAudioTrack && audioTracks[0].name}
|
|
{selectedAudioTrack?.name}
|
|
<IconArrow active={isOpen} />
|
|
</SelectedAudioTrack>
|
|
)}
|
|
{content}
|
|
</Fragment>
|
|
)
|
|
}
|
|
|