qualiteer/src/ctx/StoreContext.jsx

91 lines
2.2 KiB
React
Raw Normal View History

2022-05-05 12:35:47 +00:00
import React, { useReducer, createContext, useMemo } from "react";
const StoreContext = createContext();
const ACTIONS = {
UPDATE: "u",
};
2022-08-06 12:25:56 +00:00
const localStorage = { setItem: () => {}, getItem: () => {} };
2022-08-05 13:03:48 +00:00
const localSettings = localStorage.getItem("settings");
const defaultSettings = {
2022-08-12 13:28:19 +00:00
focusJob: true,
simplifiedControls: true,
2022-08-05 13:03:48 +00:00
logAppDetails: true,
defaultRegion: "us",
2022-08-12 13:28:19 +00:00
defaultPage: "failing",
2022-08-05 13:03:48 +00:00
};
const settings = localSettings ? JSON.parse(localSettings) : defaultSettings;
const settingsKeys = Object.keys(defaultSettings);
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: [],
regions: [],
2022-05-23 00:24:21 +00:00
catalogSearch: "",
2022-08-05 13:03:48 +00:00
...settings,
};
const settingsUpdater = (oldState, storeUpdate) => {
const settingsToUpdate = {};
for (var k of settingsKeys) {
settingsToUpdate[k] = oldState[k];
if (storeUpdate[k] === undefined) continue;
settingsToUpdate[k] = storeUpdate[k];
}
localStorage.setItem("settings", JSON.stringify(settingsToUpdate));
2022-05-17 12:32:04 +00:00
};
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:
2022-08-05 13:03:48 +00:00
settingsUpdater(state, store);
2022-05-05 12:35:47 +00:00
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;