aboutsummaryrefslogtreecommitdiff
path: root/jb-ui/src/models/grlEventsSlice.ts
diff options
context:
space:
mode:
authorMax Nanis2026-03-02 06:33:59 -0500
committerMax Nanis2026-03-02 06:33:59 -0500
commitdec4f45c0755f65a322f6c66833c711dec2c6abb (patch)
tree0cadd7e8274f0694b4891816f49ac4a0a6529014 /jb-ui/src/models/grlEventsSlice.ts
parent19a97da80ae740bb1cf92fc911e6efc210aa05a8 (diff)
downloadamt-jb-dec4f45c0755f65a322f6c66833c711dec2c6abb.tar.gz
amt-jb-dec4f45c0755f65a322f6c66833c711dec2c6abb.zip
grlEventsReducers, EventMarquee, and workin on calc speed and animations from redux (rather than example's array)
Diffstat (limited to 'jb-ui/src/models/grlEventsSlice.ts')
-rw-r--r--jb-ui/src/models/grlEventsSlice.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/jb-ui/src/models/grlEventsSlice.ts b/jb-ui/src/models/grlEventsSlice.ts
new file mode 100644
index 0000000..f77bbc1
--- /dev/null
+++ b/jb-ui/src/models/grlEventsSlice.ts
@@ -0,0 +1,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