qualiteer/src/ctx/StoreContext.jsx

123 lines
3 KiB
React
Raw Normal View History

2022-05-05 12:35:47 +00:00
import React, { useReducer, createContext, useMemo } from "react";
2022-05-23 00:24:21 +00:00
import { jobStatus } from "./JobContext.jsx";
2022-05-05 12:35:47 +00:00
const StoreContext = createContext();
const ACTIONS = {
UPDATE: "u",
};
2022-06-22 00:47:19 +00:00
const silencedMock = new Array(10).fill(0).map((v, i) => ({
name: `Test${i + 1}`,
class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
method: "someMethod",
id: Date.now(),
silencedUntil: `2022-05-10T16:${2 + i}:33.810Z`,
}));
const catalogMock = new Array(10).fill(0).map((v, i) => ({
name: `Test${i + 1}`,
class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
repo: "Repo",
isCompound: i % 5 ? false : true,
type: i % 3 ? "api" : "ui",
}));
2022-07-06 20:20:27 +00:00
const failingMock = new Array(12).fill(0).map((v, i) => ({
2022-05-23 00:24:21 +00:00
class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`,
name: `TestThatDoesOneThing${i + 1}`,
2022-07-06 20:20:27 +00:00
timestamp: `2022-05-10T16:0${i < 10 ? i : i - 10}:33.810Z`,
2022-06-22 00:47:19 +00:00
method: `SomeMethod`,
2022-07-06 20:20:27 +00:00
silencedUntil: i % 4 ? null : `2022-05-10T16:0${i}:33.810Z`,
2022-05-23 00:24:21 +00:00
frequency: "1hour",
type: i % 3 ? "api" : "ui",
dailyFails: i + 1,
2022-07-06 20:20:27 +00:00
screenshot: "https://picsum.photos/1920/1080",
2022-05-23 00:24:21 +00:00
recentResults: [1, 0, 0, 1, 0],
isCompound: i % 5 ? false : true,
failedMessage: `Some Test FailureMessage ${i}`,
jobStatus: (() => {
switch (i) {
case 1:
return jobStatus.OK;
case 3:
return jobStatus.ERROR;
case 4:
return jobStatus.PENDING;
case 5:
return jobStatus.ACTIVE;
case 6:
return jobStatus.CANCELED;
case 8:
return jobStatus.QUEUED;
default:
return null;
}
})(),
}));
2022-05-17 12:32:04 +00:00
const initialState = {
2022-07-06 20:20:27 +00:00
pages: ["failing", "alerting", "jobs", "catalog", "settings", "about"],
2022-05-17 12:32:04 +00:00
intervals: [],
2022-06-22 00:47:19 +00:00
catalog: catalogMock,
failing: failingMock,
silenced: silencedMock,
2022-05-17 12:32:04 +00:00
regions: [],
2022-05-23 00:24:21 +00:00
catalogSearch: "",
2022-05-17 12:32:04 +00:00
focusJob: false,
2022-06-22 00:47:19 +00:00
simplifiedControls: true,
logAppDetails: true,
2022-05-17 12:32:04 +00:00
defaultRegion: "us", // Local Store
defaultPage: "failing", // Local Store
};
2022-05-05 12:35:47 +00:00
const reducer = (state, action) => {
2022-05-17 12:32:04 +00:00
const { store } = action;
2022-05-05 12:35:47 +00:00
// Actions
switch (action.type) {
case ACTIONS.UPDATE:
return { ...state, ...store };
default:
return state;
}
};
export const StoreProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, initialState);
2022-06-22 00:47:19 +00:00
function silenceRequest(silenceInfo) {
2022-07-06 20:20:27 +00:00
const req = {
name: silenceInfo.name ?? "*",
class: silenceInfo.class ?? "*",
method: silenceInfo.method ?? "*",
silencedUntil: silenceInfo.silencedUntil,
};
2022-06-22 00:47:19 +00:00
console.log("Would upsert silence", req);
}
2022-07-06 20:20:27 +00:00
function removeFailure(failure) {
const req = {
name: failure.name,
class: failure.class,
};
console.log("Would remove failure", req);
}
2022-05-05 12:35:47 +00:00
const context = {
state,
dispatch,
2022-06-22 00:47:19 +00:00
silenceRequest,
2022-07-06 20:20:27 +00:00
removeFailure,
2022-05-17 12:32:04 +00:00
updateStore: (store) => dispatch({ type: ACTIONS.UPDATE, store }),
2022-05-05 12:35:47 +00:00
};
const contextValue = useMemo(() => context, [state, dispatch]);
return (
<StoreContext.Provider value={contextValue}>
{children}
</StoreContext.Provider>
);
};
export default StoreContext;