feat: volume and mute indicator

This commit is contained in:
Tristan Yang
2023-03-30 08:45:35 +08:00
parent bd6b02d19a
commit a5e4a198e5
10 changed files with 127 additions and 58 deletions
+38 -24
View File
@@ -4,16 +4,29 @@ export type VoiceBasicInfo = {
context: "channel" | "dm"
id: number,
}
export type VoicingInfo = {
downlinkNetworkQuality?: number,
muted: boolean,
members: number[]
} & VoiceBasicInfo
export type VoicingMemberInfo = {
speakingVolume?: number,
muted?: boolean
}
export type VoicingMembers = {
ids: number[],
byId: {
[key: number]: VoicingMemberInfo
}
}
export type VoiceInfo = {
memberCount: number
} & VoiceBasicInfo
interface State {
voicing: VoicingInfo | null,
voicingMembers: VoicingMembers,
list: VoiceInfo[]
}
// const initialInfo = {
@@ -23,6 +36,10 @@ interface State {
// };
const initialState: State = {
voicing: null,
voicingMembers: {
ids: [],
byId: {}
},
list: []
};
@@ -34,13 +51,10 @@ const voiceSlice = createSlice({
reducers: {
updateVoicingInfo(state, { payload }: PayloadAction<VoicingInfo | null>) {
if (payload && state.voicing) {
const { members, ...rest } = payload;
const tmpArr = [...state.voicing.members, ...members];
console.log("tmmp arr", tmpArr);
state.voicing = { ...rest, members: Array.from(new Set(tmpArr)) };
state.voicing = { ...state.voicing, ...payload };
} else {
state.voicing = payload;
}
state.voicing = payload;
},
updateMuteStatus(state, { payload }: PayloadAction<boolean>) {
if (state.voicing) {
@@ -56,30 +70,30 @@ const voiceSlice = createSlice({
state.list = payload;
},
addVoiceMember(state, { payload }: PayloadAction<number>) {
if (state.voicing) {
if (!state.voicing.members.includes(payload)) {
state.voicing.members.push(payload);
}
} else {
// tricky?
state.voicing = {
id: 0,
context: "channel",
muted: false,
members: [payload]
if (!state.voicingMembers.ids.includes(payload)) {
state.voicingMembers.ids.push(payload);
state.voicingMembers.byId[payload] = {
speakingVolume: 0,
muted: false
};
}
},
removeVoiceMember(state, { payload }: PayloadAction<number>) {
if (state.voicing) {
const idx = state.voicing.members.findIndex((uid) => uid == payload);
if (idx > -1) {
state.voicing.members.splice(idx, 1);
}
const idx = state.voicingMembers.ids.findIndex((uid) => uid == payload);
if (idx > -1) {
state.voicingMembers.ids.splice(idx, 1);
delete state.voicingMembers.byId[payload];
}
},
updateVoicingMember(state, { payload }: PayloadAction<{ uid: number, info: VoicingMemberInfo }>) {
const idx = state.voicingMembers.ids.findIndex((uid) => uid == payload.uid);
if (idx > -1) {
const { uid, info } = payload;
state.voicingMembers.byId[uid] = { ...state.voicingMembers.byId[uid], ...info };
}
}
},
});
export const { addVoiceMember, removeVoiceMember, updateVoiceList, updateVoicingInfo, updateVoicingNetworkQuality, updateMuteStatus } = voiceSlice.actions;
export const { addVoiceMember, removeVoiceMember, updateVoiceList, updateVoicingInfo, updateVoicingNetworkQuality, updateMuteStatus, updateVoicingMember } = voiceSlice.actions;
export default voiceSlice.reducer;