Move presenter logic to video grid
This commit is contained in:
parent
23763422d8
commit
c094e820d1
5 changed files with 61 additions and 54 deletions
|
@ -247,7 +247,6 @@ export class ConferenceCallManager extends EventEmitter {
|
||||||
stream,
|
stream,
|
||||||
audioMuted: this.audioMuted,
|
audioMuted: this.audioMuted,
|
||||||
videoMuted: this.videoMuted,
|
videoMuted: this.videoMuted,
|
||||||
presenter: false,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.participants.push(this.localParticipant);
|
this.participants.push(this.localParticipant);
|
||||||
|
@ -401,17 +400,6 @@ export class ConferenceCallManager extends EventEmitter {
|
||||||
this.emit("participants_changed");
|
this.emit("participants_changed");
|
||||||
}
|
}
|
||||||
|
|
||||||
setPresenter(userId, presenter) {
|
|
||||||
const participant = this.participants.find(
|
|
||||||
(participant) => participant.userId === userId
|
|
||||||
);
|
|
||||||
|
|
||||||
if (participant) {
|
|
||||||
participant.presenter = presenter;
|
|
||||||
this.emit("participants_changed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logout() {
|
logout() {
|
||||||
localStorage.removeItem("matrix-auth-store");
|
localStorage.removeItem("matrix-auth-store");
|
||||||
}
|
}
|
||||||
|
@ -545,7 +533,6 @@ export class ConferenceCallManager extends EventEmitter {
|
||||||
stream,
|
stream,
|
||||||
audioMuted,
|
audioMuted,
|
||||||
videoMuted,
|
videoMuted,
|
||||||
presenter: false,
|
|
||||||
};
|
};
|
||||||
this.participants.push(participant);
|
this.participants.push(participant);
|
||||||
}
|
}
|
||||||
|
@ -645,7 +632,6 @@ export class ConferenceCallManager extends EventEmitter {
|
||||||
stream: null,
|
stream: null,
|
||||||
audioMuted: false,
|
audioMuted: false,
|
||||||
videoMuted: false,
|
videoMuted: false,
|
||||||
presenter: false,
|
|
||||||
};
|
};
|
||||||
// TODO: Should we wait until the call has been answered to push the participant?
|
// TODO: Should we wait until the call has been answered to push the participant?
|
||||||
// Or do we hide the participant until their stream is live?
|
// Or do we hide the participant until their stream is live?
|
||||||
|
|
|
@ -339,17 +339,6 @@ export function useVideoRoom(manager, roomId, timeout = 5000) {
|
||||||
setState((prevState) => ({ ...prevState, videoMuted: manager.videoMuted }));
|
setState((prevState) => ({ ...prevState, videoMuted: manager.videoMuted }));
|
||||||
}, [manager]);
|
}, [manager]);
|
||||||
|
|
||||||
const togglePresenter = useCallback((selectedParticipant) => {
|
|
||||||
manager.setPresenter(
|
|
||||||
selectedParticipant.userId,
|
|
||||||
!selectedParticipant.presenter
|
|
||||||
);
|
|
||||||
setState((prevState) => ({
|
|
||||||
...prevState,
|
|
||||||
participants: [...manager.participants],
|
|
||||||
}));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
loading,
|
loading,
|
||||||
joined,
|
joined,
|
||||||
|
@ -361,7 +350,6 @@ export function useVideoRoom(manager, roomId, timeout = 5000) {
|
||||||
leaveCall,
|
leaveCall,
|
||||||
toggleMuteVideo,
|
toggleMuteVideo,
|
||||||
toggleMuteAudio,
|
toggleMuteAudio,
|
||||||
togglePresenter,
|
|
||||||
videoMuted,
|
videoMuted,
|
||||||
audioMuted,
|
audioMuted,
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,19 +20,6 @@ export function GridDemo() {
|
||||||
]);
|
]);
|
||||||
}, [stream]);
|
}, [stream]);
|
||||||
|
|
||||||
const togglePresenter = useCallback((selectedParticipant) => {
|
|
||||||
setParticipants((participants) =>
|
|
||||||
participants.map((participant) =>
|
|
||||||
participant === selectedParticipant
|
|
||||||
? {
|
|
||||||
...participant,
|
|
||||||
presenter: !participant.presenter,
|
|
||||||
}
|
|
||||||
: participant
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const removeParticipant = useCallback((key) => {
|
const removeParticipant = useCallback((key) => {
|
||||||
setParticipants((participants) =>
|
setParticipants((participants) =>
|
||||||
participants.filter((participant) => participant.userId !== key)
|
participants.filter((participant) => participant.userId !== key)
|
||||||
|
@ -56,7 +43,7 @@ export function GridDemo() {
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<VideoGrid participants={participants} onClickNameTag={togglePresenter} />
|
<VideoGrid participants={participants} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,6 @@ export function Room({ manager }) {
|
||||||
leaveCall,
|
leaveCall,
|
||||||
toggleMuteVideo,
|
toggleMuteVideo,
|
||||||
toggleMuteAudio,
|
toggleMuteAudio,
|
||||||
togglePresenter,
|
|
||||||
videoMuted,
|
videoMuted,
|
||||||
audioMuted,
|
audioMuted,
|
||||||
} = useVideoRoom(manager, roomId);
|
} = useVideoRoom(manager, roomId);
|
||||||
|
@ -112,10 +111,7 @@ export function Room({ manager }) {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!loading && room && joined && participants.length > 0 && (
|
{!loading && room && joined && participants.length > 0 && (
|
||||||
<VideoGrid
|
<VideoGrid participants={participants} />
|
||||||
participants={participants}
|
|
||||||
onClickNameTag={togglePresenter}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
{!loading && room && joined && (
|
{!loading && room && joined && (
|
||||||
<div className={styles.footer}>
|
<div className={styles.footer}>
|
||||||
|
|
|
@ -446,7 +446,7 @@ function getSubGridPositions(
|
||||||
return newTilePositions;
|
return newTilePositions;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function VideoGrid({ participants, onClickNameTag }) {
|
export function VideoGrid({ participants }) {
|
||||||
const [{ tiles, tilePositions }, setTileState] = useState({
|
const [{ tiles, tilePositions }, setTileState] = useState({
|
||||||
tiles: [],
|
tiles: [],
|
||||||
tilePositions: [],
|
tilePositions: [],
|
||||||
|
@ -467,12 +467,17 @@ export function VideoGrid({ participants, onClickNameTag }) {
|
||||||
(participant) => participant.userId === tile.key
|
(participant) => participant.userId === tile.key
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (tile.presenter) {
|
||||||
|
presenterTileCount++;
|
||||||
|
}
|
||||||
|
|
||||||
if (participant) {
|
if (participant) {
|
||||||
// Existing tiles
|
// Existing tiles
|
||||||
newTiles.push({
|
newTiles.push({
|
||||||
key: participant.userId,
|
key: participant.userId,
|
||||||
participant: participant,
|
participant: participant,
|
||||||
remove: false,
|
remove: false,
|
||||||
|
presenter: tile.presenter,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Removed tiles
|
// Removed tiles
|
||||||
|
@ -481,15 +486,12 @@ export function VideoGrid({ participants, onClickNameTag }) {
|
||||||
key: tile.key,
|
key: tile.key,
|
||||||
participant: tile.participant,
|
participant: tile.participant,
|
||||||
remove: true,
|
remove: true,
|
||||||
|
presenter: tile.presenter,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const participant of participants) {
|
for (const participant of participants) {
|
||||||
if (participant.presenter) {
|
|
||||||
presenterTileCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newTiles.some(({ key }) => participant.userId === key)) {
|
if (newTiles.some(({ key }) => participant.userId === key)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -499,13 +501,11 @@ export function VideoGrid({ participants, onClickNameTag }) {
|
||||||
key: participant.userId,
|
key: participant.userId,
|
||||||
participant,
|
participant,
|
||||||
remove: false,
|
remove: false,
|
||||||
|
presenter: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
newTiles.sort(
|
newTiles.sort((a, b) => (b.presenter ? 1 : 0) - (a.presenter ? 1 : 0));
|
||||||
(a, b) =>
|
|
||||||
(b.participant.presenter ? 1 : 0) - (a.participant.presenter ? 1 : 0)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (removedTileKeys.length > 0) {
|
if (removedTileKeys.length > 0) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
@ -613,6 +613,19 @@ export function VideoGrid({ participants, onClickNameTag }) {
|
||||||
|
|
||||||
if (isInside(cursorPosition, hoverTilePosition)) {
|
if (isInside(cursorPosition, hoverTilePosition)) {
|
||||||
newTiles = moveArrItem(tiles, dragTileIndex, hoverTileIndex);
|
newTiles = moveArrItem(tiles, dragTileIndex, hoverTileIndex);
|
||||||
|
|
||||||
|
newTiles = newTiles.map((tile) => {
|
||||||
|
if (tile === hoverTile) {
|
||||||
|
return { ...tile, presenter: dragTile.presenter };
|
||||||
|
} else if (tile === dragTile) {
|
||||||
|
return { ...tile, presenter: hoverTile.presenter };
|
||||||
|
} else {
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
newTiles.sort((a, b) => (b.presenter ? 1 : 0) - (a.presenter ? 1 : 0));
|
||||||
|
|
||||||
setTileState((state) => ({ ...state, tiles: newTiles }));
|
setTileState((state) => ({ ...state, tiles: newTiles }));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -636,6 +649,43 @@ export function VideoGrid({ participants, onClickNameTag }) {
|
||||||
api.start(animate(newTiles));
|
api.start(animate(newTiles));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const onClickNameTag = useCallback(
|
||||||
|
(participant) => {
|
||||||
|
setTileState((state) => {
|
||||||
|
let presenterTileCount = 0;
|
||||||
|
|
||||||
|
const newTiles = state.tiles.map((tile) => {
|
||||||
|
let newTile = tile;
|
||||||
|
|
||||||
|
if (tile.participant === participant) {
|
||||||
|
newTile = { ...tile, presenter: !tile.presenter };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newTile.presenter) {
|
||||||
|
presenterTileCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newTile;
|
||||||
|
});
|
||||||
|
|
||||||
|
newTiles.sort((a, b) => (b.presenter ? 1 : 0) - (a.presenter ? 1 : 0));
|
||||||
|
|
||||||
|
presenterTileCount;
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
tiles: newTiles,
|
||||||
|
tilePositions: getTilePositions(
|
||||||
|
newTiles.length,
|
||||||
|
gridBounds,
|
||||||
|
presenterTileCount
|
||||||
|
),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[gridBounds]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.grid} ref={gridRef}>
|
<div className={styles.grid} ref={gridRef}>
|
||||||
{springs.map(({ shadow, ...style }, i) => {
|
{springs.map(({ shadow, ...style }, i) => {
|
||||||
|
|
Loading…
Reference in a new issue