import React, { useReducer, createContext, useMemo } from "react"; import { jobStatus } from "./JobContext.jsx"; const StoreContext = createContext(); const ACTIONS = { UPDATE: "u", }; 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", })); const failingMock = new Array(12).fill(0).map((v, i) => ({ class: `SomeTestClass${i % 2 ? i - 1 : i / 2}`, name: `TestThatDoesOneThing${i + 1}`, timestamp: `2022-05-10T16:0${i < 10 ? i : i - 10}:33.810Z`, method: `SomeMethod`, silencedUntil: i % 4 ? null : `2022-05-10T16:0${i}:33.810Z`, frequency: "1hour", type: i % 3 ? "api" : "ui", dailyFails: i + 1, screenshot: "https://picsum.photos/1920/1080", 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; } })(), })); const initialState = { pages: ["failing", "alerting", "jobs", "catalog", "settings", "about"], intervals: [], catalog: catalogMock, failing: failingMock, silenced: silencedMock, regions: [], catalogSearch: "", focusJob: false, simplifiedControls: true, logAppDetails: true, defaultRegion: "us", // Local Store defaultPage: "failing", // Local Store }; const reducer = (state, action) => { const { store } = action; // Actions switch (action.type) { case ACTIONS.UPDATE: return { ...state, ...store }; default: return state; } }; export const StoreProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); function silenceRequest(silenceInfo) { const req = { name: silenceInfo.name ?? "*", class: silenceInfo.class ?? "*", method: silenceInfo.method ?? "*", silencedUntil: silenceInfo.silencedUntil, }; console.log("Would upsert silence", req); } function removeFailure(failure) { const req = { name: failure.name, class: failure.class, }; console.log("Would remove failure", req); } const context = { state, dispatch, silenceRequest, removeFailure, updateStore: (store) => dispatch({ type: ACTIONS.UPDATE, store }), }; const contextValue = useMemo(() => context, [state, dispatch]); return ( {children} ); }; export default StoreContext;