stream-chat-react
Version:
React components to create chat conversations or livestream style chat
58 lines (57 loc) • 2.46 kB
JavaScript
import React, { useContext, useState } from 'react';
import { useEffect } from 'react';
import { AudioPlayerPool } from './AudioPlayerPool';
import { audioPlayerNotificationsPluginFactory } from './plugins/AudioPlayerNotificationsPlugin';
import { useChatContext, useTranslationContext } from '../../context';
import { useStateStore } from '../../store';
const AudioPlayerContext = React.createContext({
audioPlayers: null,
});
export const WithAudioPlayback = ({ allowConcurrentPlayback, children, }) => {
const [audioPlayers] = useState(() => new AudioPlayerPool({ allowConcurrentPlayback }));
useEffect(() => () => {
audioPlayers.clear();
}, [audioPlayers]);
return (React.createElement(AudioPlayerContext.Provider, { value: { audioPlayers } }, children));
};
const makeAudioPlayerId = ({ requester, src }) => `${requester ?? 'requester-unknown'}:${src}`;
export const useAudioPlayer = ({ durationSeconds, fileSize, mimeType, playbackRates, plugins, requester = '', src, title, waveformData, }) => {
const { client } = useChatContext();
const { t } = useTranslationContext();
const { audioPlayers } = useContext(AudioPlayerContext);
const audioPlayer = src && audioPlayers
? audioPlayers.getOrAdd({
durationSeconds,
fileSize,
id: makeAudioPlayerId({ requester, src }),
mimeType,
playbackRates,
plugins,
src,
title,
waveformData,
})
: undefined;
useEffect(() => {
if (!audioPlayer)
return;
/**
* Avoid having to pass client and translation function to AudioPlayer instances
* and instead provide plugin that takes care of translated notifications.
*/
const notificationsPlugin = audioPlayerNotificationsPluginFactory({ client, t });
audioPlayer.setPlugins((currentPlugins) => [
...currentPlugins.filter((plugin) => plugin.id !== notificationsPlugin.id),
notificationsPlugin,
]);
}, [audioPlayer, client, t]);
return audioPlayer;
};
const activeAudioPlayerSelector = ({ activeAudioPlayer }) => ({
activeAudioPlayer,
});
export const useActiveAudioPlayer = () => {
const { audioPlayers } = useContext(AudioPlayerContext);
const { activeAudioPlayer } = useStateStore(audioPlayers?.state, activeAudioPlayerSelector) ?? {};
return activeAudioPlayer;
};