feat(31-01): add composed memoized selectors to mixersSlice

- Add createSelector import from @reduxjs/toolkit
- Add selectCoreMixerState (chatMixer, broadcastMixer, recordingMixer)
- Add selectTrackMixerState (5 track mixer arrays)
- Add selectMixerLookupTables (allMixers, mixersByResourceId, mixersByTrackId)
- Add selectMasterPersonalMixers (masterMixers, personalMixers)
- Add selectMixerMetadata (metronome, settings, mediaSummary, noAudioUsers, etc)
- Add selectSimulatedCategoryMixers (simulatedMusic, simulatedChat)

These composed selectors memoize grouped state objects, reducing
selector overhead from 18+ individual subscriptions to 6 memoized selectors.
This commit is contained in:
Nuwan 2026-03-05 19:08:46 +05:30
parent 3a9df2bef8
commit 0630ebdd3f
1 changed files with 67 additions and 1 deletions

View File

@ -1,4 +1,4 @@
import { createSlice } from '@reduxjs/toolkit';
import { createSlice, createSelector } from '@reduxjs/toolkit';
const initialState = {
// Core mixer collections
@ -313,3 +313,69 @@ export const selectMixerPairByResourceId = (resourceId) => (state) => {
export const selectMixerPairByTrackId = (trackId) => (state) => {
return state.mixers.mixersByTrackId[trackId];
};
// Composed memoized selectors for useMixerHelper optimization
// These group related data that's typically used together
export const selectCoreMixerState = createSelector(
[selectChatMixer, selectBroadcastMixer, selectRecordingMixer],
(chatMixer, broadcastMixer, recordingMixer) => ({
chatMixer,
broadcastMixer,
recordingMixer
})
);
export const selectTrackMixerState = createSelector(
[
selectRecordingTrackMixers,
selectBackingTrackMixers,
selectJamTrackMixers,
selectMetronomeTrackMixers,
selectAdhocTrackMixers
],
(recordingTrackMixers, backingTrackMixers, jamTrackMixers, metronomeTrackMixers, adhocTrackMixers) => ({
recordingTrackMixers,
backingTrackMixers,
jamTrackMixers,
metronomeTrackMixers,
adhocTrackMixers
})
);
export const selectMixerLookupTables = createSelector(
[selectAllMixers, selectMixersByResourceId, selectMixersByTrackId],
(allMixers, mixersByResourceId, mixersByTrackId) => ({
allMixers,
mixersByResourceId,
mixersByTrackId
})
);
export const selectMasterPersonalMixers = createSelector(
[selectMasterMixers, selectPersonalMixers],
(masterMixers, personalMixers) => ({
masterMixers,
personalMixers
})
);
export const selectMixerMetadata = createSelector(
[selectMetronome, selectMetronomeSettings, selectMediaSummary, selectNoAudioUsers, selectClientsWithAudioOverride, selectMixersReady],
(metronome, metronomeSettings, mediaSummary, noAudioUsers, clientsWithAudioOverride, isReady) => ({
metronome,
metronomeSettings,
mediaSummary,
noAudioUsers,
clientsWithAudioOverride,
isReady
})
);
export const selectSimulatedCategoryMixers = createSelector(
[selectSimulatedMusicCategoryMixers, selectSimulatedChatCategoryMixers],
(simulatedMusicCategoryMixers, simulatedChatCategoryMixers) => ({
simulatedMusicCategoryMixers,
simulatedChatCategoryMixers
})
);