aboutsummaryrefslogtreecommitdiff
path: root/jb-ui/src/models/grlEventsSlice.ts
blob: f77bbc10ed3d50660c90dd6b87a3f11fa7459614 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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<EventEnvelope>) => {
            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