asynqmon/ui/src/reducers/queueStatsReducer.ts
2020-12-27 16:45:28 -08:00

79 lines
1.8 KiB
TypeScript

import {
LIST_QUEUES_SUCCESS,
QueuesActionTypes,
} from "../actions/queuesActions";
import {
LIST_QUEUE_STATS_BEGIN,
LIST_QUEUE_STATS_ERROR,
LIST_QUEUE_STATS_SUCCESS,
QueueStatsActionTypes,
} from "../actions/queueStatsActions";
import { DailyStat } from "../api";
interface QueueStatsState {
loading: boolean;
data: { [qname: string]: DailyStat[] };
}
const initialState: QueueStatsState = {
loading: false,
data: {},
};
export default function queueStatsReducer(
state = initialState,
action: QueueStatsActionTypes | QueuesActionTypes
): QueueStatsState {
switch (action.type) {
case LIST_QUEUE_STATS_BEGIN:
return {
...state,
loading: true,
};
case LIST_QUEUE_STATS_SUCCESS:
return {
data: action.payload.stats,
loading: false,
};
case LIST_QUEUE_STATS_ERROR:
return {
...state,
loading: false,
};
case LIST_QUEUES_SUCCESS: {
// Copy to avoid mutation.
let newData = { ...state.data };
// Update today's stats with most up-to-date data.
for (const q of action.payload.queues) {
const stats = newData[q.queue];
if (!stats) {
continue;
}
const newStats = stats.map((stat) => {
if (isSameDate(stat.date, q.timestamp)) {
return {
...stat,
processed: q.processed,
failed: q.failed,
};
}
return stat;
});
newData[q.queue] = newStats;
}
return { ...state, data: newData };
}
default:
return state;
}
}
// Returns true if two timestamps are from the same date.
function isSameDate(ts1: string, ts2: string): boolean {
return new Date(ts1).toDateString() === new Date(ts2).toDateString();
}