From 3eaa56f0306ead818f64c3d99fc6d230d9b970a4 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Wed, 18 Feb 2026 20:42:03 -0500 Subject: HERE WE GO, HERE WE GO, HERE WE GO --- jb-ui/src/models/grlStatsSlice.ts | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 jb-ui/src/models/grlStatsSlice.ts (limited to 'jb-ui/src/models/grlStatsSlice.ts') diff --git a/jb-ui/src/models/grlStatsSlice.ts b/jb-ui/src/models/grlStatsSlice.ts new file mode 100644 index 0000000..9385256 --- /dev/null +++ b/jb-ui/src/models/grlStatsSlice.ts @@ -0,0 +1,54 @@ +import { StatsSnapshot } from "@/api_fsb"; +import { RootState } from "@/store"; +import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit'; + + +const initialState: StatsSnapshot[] = [] + +const grlStatsSlice = createSlice({ + name: 'grlStats', + initialState, + reducers: { + + addStatsData(state, action: PayloadAction) { + state.push(action.payload); + } + } +}) + +export const { + addStatsData +} = grlStatsSlice.actions; +export default grlStatsSlice.reducer + + +export const selectRecentStats = createSelector( + [ + (state: RootState) => state.stats, + ], + (stats): StatsSnapshot | null => { + const lastStat = stats[stats.length - 1]; + return lastStat ?? null; + } +); + +export const activeUsers = createSelector( + [selectRecentStats], + (recentStats): number | null => { + return recentStats?.active_users_last_24h ?? null; + } +); + +export const activeSurveys = createSelector( + [selectRecentStats], + (recentStats): number | null => { + return recentStats?.live_task_count?.total ?? null; + } +); + +export const maxPayout = createSelector( + [selectRecentStats], + (recentStats): number | null => { + return recentStats?.live_tasks_max_payout?.value ?? null; + } +); -- cgit v1.2.3