v1.7.0/call volume handling

This commit is contained in:
2020-09-05 18:02:07 -04:00
parent e8f2b676db
commit 93c903cc45
4 changed files with 97 additions and 90 deletions
-1
View File
@@ -12,7 +12,6 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION.
/*global chrome*/ /*global chrome*/
const API_HOST = 'https://api.chromewatchparty.com'; const API_HOST = 'https://api.chromewatchparty.com';
// const API_HOST = 'http://localhost:5000/watch-party-crx/us-central1/widgets';
export const PLAYER_STATUS = { export const PLAYER_STATUS = {
PLAYING: 'PLAYING', PLAYING: 'PLAYING',
+36 -10
View File
@@ -157,12 +157,6 @@ export default class CallManager {
usingVideo: false, usingVideo: false,
conference: null, conference: null,
}); });
document.querySelectorAll('.vxt-video').forEach((v) => {
v.srcObject.getTracks().forEach((track) => {
track.stop();
});
v.remove();
});
}); });
} }
async openSession() { async openSession() {
@@ -212,24 +206,56 @@ export default class CallManager {
const vidNode = document.createElement('video'); const vidNode = document.createElement('video');
vidNode.id = participant.id; vidNode.id = participant.id;
vidNode.muted = true; vidNode.muted = true;
vidNode.classList.add('vxt-video');
document.querySelector('.vxt-video-container').appendChild(vidNode);
vidNode.srcObject = stream; vidNode.srcObject = stream;
vidNode.onloadedmetadata = vidNode.play; vidNode.onloadedmetadata = vidNode.play;
const vidContainerNode = document.createElement('div');
vidContainerNode.classList.add('vxt-video');
vidContainerNode.setAttribute('data-id', participant.id);
vidContainerNode.setAttribute('data-name', participant.info.name || '');
vidContainerNode.appendChild(vidNode);
console.log(participant);
if (participant.info.externalId !== LocalData().userUid) {
const volSliderNode = document.createElement('input');
volSliderNode.setAttribute('type', 'range');
volSliderNode.min = '0';
volSliderNode.max = '1';
volSliderNode.value = '1';
volSliderNode.step = '0.1';
volSliderNode.id = 'vxt-slider-' + participant.id;
volSliderNode.classList.add('vxt-slider');
volSliderNode.onchange = (e) => {
const v = e.target.value;
const audioOuts = document.querySelectorAll('audio.vxt-audio');
if (audioOuts.length > 0) {
audioOuts.forEach((el) => {
if (el.id === `audio-${participant.id}`) {
el.volume = v;
}
});
}
};
vidContainerNode.appendChild(volSliderNode);
}
document.querySelector('.vxt-video-container').appendChild(vidContainerNode);
} }
this.listener({ callActionPending: false }); this.listener({ callActionPending: false });
}); });
VoxeetSDK.conference.on('streamRemoved', (participant, stream) => { VoxeetSDK.conference.on('streamRemoved', (participant, stream) => {
const vcid = ".vxt-video[data-id='" + participant.id + "']";
const vid = 'video#' + participant.id; const vid = 'video#' + participant.id;
if (document.querySelector(vid)) { if (document.querySelector(vcid)) {
document document
.querySelector(vid) .querySelector(vid)
.srcObject.getTracks() .srcObject.getTracks()
.forEach((track) => { .forEach((track) => {
track.stop(); track.stop();
}); });
document.querySelector(vid).remove(); document.querySelector(vcid).remove();
} }
this.listener({ callActionPending: false }); this.listener({ callActionPending: false });
}); });
+10 -78
View File
@@ -492,19 +492,6 @@ export default class Chat extends Component {
} }
return null; return null;
} }
setVideoVolume(v, id) {
const audioOuts = document.querySelectorAll('audio.vxt-audio');
if (audioOuts.length >= 0) {
audioOuts.forEach((el) => {
if (el.id === `audio-${id}`) {
el.volume = v * 0.1;
const { volumes } = this.state;
volumes[id] = v;
this.setState({ volumes });
}
});
}
}
handleVideo() { handleVideo() {
const { usingVideo } = this.state; const { usingVideo } = this.state;
this.mCallManager.toggleVideo(!usingVideo); this.mCallManager.toggleVideo(!usingVideo);
@@ -688,55 +675,6 @@ export default class Chat extends Component {
<Chip className="party-controls-users-chip" clickable size="small" label={user} /> <Chip className="party-controls-users-chip" clickable size="small" label={user} />
))} ))}
</div> </div>
{Object.keys(usersOnCall).length > 0 ? (
<Typography className="party-controls-users-title" variant="overline">
MEMBERS IN CALL
</Typography>
) : null}
{Object.keys(usersOnCall).length > 0 ? (
<div className="party-controls-users-container">
{Object.keys(usersOnCall).map((id) => {
return usersOnCall[id].status === 'Connected' ||
usersOnCall[id].status === 'Connecting' ? (
<Tooltip
interactive
title={
<Grid className="party-controls-users-volume" container spacing={2}>
<Grid item>
<VolumeDown />
</Grid>
<Grid item xs>
<Slider
max={10}
min={0}
step={1}
color="secondary"
value={volumes[id] || 10}
onChangeCommitted={(e, v) => this.setVideoVolume(v, id)}
/>
</Grid>
<Grid item>
<VolumeUp />
</Grid>
</Grid>
}
>
<Chip
color={
usersOnCall[id].info.externalId === LocalData().userUid
? 'secondary'
: 'default'
}
className="party-controls-users-chip"
clickable
size="small"
label={usersOnCall[id].info.name || ' '}
/>
</Tooltip>
) : null;
})}
</div>
) : null}
</ExpansionPanelDetails> </ExpansionPanelDetails>
</ExpansionPanel> </ExpansionPanel>
{player ? ( {player ? (
@@ -852,22 +790,16 @@ export default class Chat extends Component {
{gif || newMessage ? null : callActionPending ? ( {gif || newMessage ? null : callActionPending ? (
<CircularProgress className="icon-button" color="secondary" /> <CircularProgress className="icon-button" color="secondary" />
) : ( ) : (
<IconButton <Tooltip placement="top" title={onCall ? 'Leave Call' : 'Join Call'}>
disabled={callActionPending} <IconButton
onClick={() => this.handlePhoneCall(false)} disabled={callActionPending}
color={!onCall ? 'secondary' : 'primary'} onClick={() => this.handlePhoneCall(false)}
className="icon-button" color={!onCall ? 'secondary' : 'primary'}
> className="icon-button"
{onCall ? ( >
<Tooltip placement="top" title="Leave Call"> {onCall ? <PhoneDisable /> : <PhoneEnable />}
<PhoneDisable /> </IconButton>
</Tooltip> </Tooltip>
) : (
<Tooltip placement="top" title="Join Voice Call">
<PhoneEnable />
</Tooltip>
)}
</IconButton>
)} )}
{!gif && !newMessage && onCall && !muted ? ( {!gif && !newMessage && onCall && !muted ? (
<Tooltip title="Mute Mic" placement="top"> <Tooltip title="Mute Mic" placement="top">
+51 -1
View File
@@ -985,14 +985,64 @@ button.giphy-list-item {
.vxt-video { .vxt-video {
max-width: calc(50% - 10px) !important; max-width: calc(50% - 10px) !important;
min-height: calc(0.66 * calc(0.5 * var(--party-width))) !important; min-height: calc(0.66 * calc(0.5 * var(--party-width))) !important;
max-height: 200px !important; max-height: calc(0.66 * calc(0.5 * var(--party-width))) !important;
height: 200px; height: 200px;
border-radius: 10px; border-radius: 10px;
margin: 0 5px; margin: 0 5px;
margin-top: 5px; margin-top: 5px;
display: inline-flex !important; display: inline-flex !important;
background-color: black; background-color: black;
overflow: hidden;
position: relative;
} }
.vxt-video::after {
content: attr(data-name);
left: 0;
bottom: 0;
font-size: 12px;
text-align: center;
width: 100%;
z-index: 999;
position: absolute;
padding: 10px 0px;
background-color: #353535;
letter-spacing: 4px;
font-family: sans-serif;
text-transform: uppercase;
opacity: 0;
bottom: -30px;
transition: all ease-in-out 0.2s;
}
.vxt-video:first-of-type { .vxt-video:first-of-type {
margin-top: 15px; margin-top: 15px;
} }
.vxt-video video {
max-width: 100%;
max-height: 100%;
}
.vxt-slider {
position: absolute;
bottom: 0px;
opacity: 0;
left: 0;
z-index: 9999;
width: 100%;
margin: 0 !important;
border-radius: 0 !important;
height: 2.5px;
outline: none;
transition: all ease-in-out 0.2s;
}
.vxt-video:hover::after {
opacity: 1;
bottom: 0;
}
.vxt-video:hover .vxt-slider {
bottom: 34px;
opacity: 1;
}