diff --git a/src/redux/skybrowser/skybrowserMiddleware.ts b/src/redux/skybrowser/skybrowserMiddleware.ts index a8ae39df..5a94784d 100644 --- a/src/redux/skybrowser/skybrowserMiddleware.ts +++ b/src/redux/skybrowser/skybrowserMiddleware.ts @@ -5,6 +5,7 @@ import { api } from '@/api/api'; import { onCloseConnection } from '@/redux/connection/connectionSlice'; import { AppStartListening } from '@/redux/listenerMiddleware'; import { ConnectionStatus } from '@/types/enums'; +import { Batcher } from '@/util/batcher'; import { resetSkyBrowser, @@ -26,9 +27,15 @@ export const setupSubscription = createAsyncThunk( event: 'start_subscription' }); + function updateData(data: Partial) { + thunkAPI.dispatch(updateSkyBrowser(data)); + } + + const batcher = new Batcher(updateData); + (async () => { - for await (const data of skybrowserTopic.iterator()) { - thunkAPI.dispatch(updateSkyBrowser(data as SkyBrowserUpdate)); + for await (const data of skybrowserTopic.iterator() as AsyncIterable) { + batcher.add(data); } })(); thunkAPI.dispatch(subscriptionIsSetup()); @@ -40,7 +47,7 @@ function tearDownSubscription() { return; } skybrowserTopic.talk({ - event: 'stop_supscription' + event: 'stop_subscription' }); skybrowserTopic.cancel(); } diff --git a/src/redux/skybrowser/skybrowserSlice.ts b/src/redux/skybrowser/skybrowserSlice.ts index 30ea1ff0..3dfee8dd 100644 --- a/src/redux/skybrowser/skybrowserSlice.ts +++ b/src/redux/skybrowser/skybrowserSlice.ts @@ -42,9 +42,13 @@ export const skyBrowserSlice = createSlice({ state.isInitialized = true; return state; }, - updateSkyBrowser: (state, action: PayloadAction) => { - state.cameraInSolarSystem = action.payload.cameraInSolarSystem; - state.selectedBrowserId = action.payload.selectedBrowserId; + updateSkyBrowser: (state, action: PayloadAction>) => { + if (action.payload.cameraInSolarSystem !== undefined) { + state.cameraInSolarSystem = action.payload.cameraInSolarSystem; + } + if (action.payload.selectedBrowserId !== undefined) { + state.selectedBrowserId = action.payload.selectedBrowserId; + } if (action.payload.browsers && state.selectedBrowserId in action.payload.browsers) { state.browsers = action.payload.browsers; @@ -54,15 +58,10 @@ export const skyBrowserSlice = createSlice({ typeof idx === 'string' ? parseInt(idx) : idx ); } - // Derived state for easier access - state.browserIds = Object.keys(action.payload.browsers) ?? []; - state.browserColors = state.browserIds.map( - (id) => action.payload.browsers[id].color - ); - state.browserNames = state.browserIds.map( - (id) => action.payload.browsers[id].name - ); + state.browserIds = Object.keys(state.browsers); + state.browserColors = state.browserIds.map((id) => state.browsers[id].color); + state.browserNames = state.browserIds.map((id) => state.browsers[id].name); } else { // If the update is invalid, reset the state state.selectedBrowserId = '';