import { EventEnvelope } from "@/api_fsb"; import { RootState } from "@/store"; import { createEntityAdapter, createSlice, PayloadAction } from '@reduxjs/toolkit'; const eventAdapter = createEntityAdapter({ selectId: (model: EventEnvelope) => model.event_uuid!, sortComparer: (a, b) => { return b.timestamp!.localeCompare(a.timestamp!); }, }); const grlEventsSlice = createSlice({ name: 'grlEvents', // initialState: eventAdapter.getInitialState(), initialState: eventAdapter.getInitialState({ latestEvent: null as EventEnvelope | null }), reducers: { addEvents: eventAdapter.addMany, upsertEvent: eventAdapter.upsertOne, // add or update // addEvent: eventAdapter.addOne, addEvent: (state, action: PayloadAction) => { eventAdapter.addOne(state, action.payload); const incoming = action.payload.timestamp!; if (!state.latestEvent || incoming.localeCompare(state.latestEvent.timestamp!) > 0) { state.latestEvent = action.payload; } }, } }) export const { addEvent, addEvents, upsertEvent } = grlEventsSlice.actions; // Add this after the slice, before exports export const eventSelectors = eventAdapter.getSelectors( (state: RootState) => state.events ); export const selectLatestEvents = (count: number) => (state: RootState) => eventSelectors.selectAll(state).slice(0, count); export const selectLatestEvent = (state: RootState) => state.events.latestEvent; export default grlEventsSlice.reducer