prometheus/web/ui/mantine-ui/src/state/localStorageMiddleware.ts
Julius Volz 84e0f43a0c Paginate rule groups, add infinite scroll to rules within groups
This addresses extreme slowness when you have thousands of rules in
potentially hundreds of rule groups. It can still be a bit slow even with
pagination and infinite scroll for very large use cases, but it's much
better already than before.

Fixes https://github.com/prometheus/prometheus/issues/15551

Signed-off-by: Julius Volz <julius.volz@gmail.com>
2024-12-14 22:38:18 +01:00

72 lines
2.0 KiB
TypeScript

import { createListenerMiddleware } from "@reduxjs/toolkit";
import { AppDispatch, RootState } from "./store";
import {
localStorageKeyCollapsedPools as localStorageKeyTargetsPageCollapsedPools,
setCollapsedPools as targetsPageSetCollapsedPools,
} from "./targetsPageSlice";
import {
localStorageKeyCollapsedPools as localStorageKeyServiceDiscoveryPageCollapsedPools,
setCollapsedPools as serviceDiscoveryPageSetCollapsedPools,
} from "./serviceDiscoveryPageSlice";
import { updateSettings } from "./settingsSlice";
import {
addQueryToHistory,
localStorageKeyQueryHistory,
} from "./queryPageSlice";
const persistToLocalStorage = <T>(key: string, value: T) => {
localStorage.setItem(key, JSON.stringify(value));
};
export const localStorageMiddleware = createListenerMiddleware();
const startAppListening = localStorageMiddleware.startListening.withTypes<
RootState,
AppDispatch
>();
startAppListening({
actionCreator: targetsPageSetCollapsedPools,
effect: ({ payload }) => {
persistToLocalStorage(localStorageKeyTargetsPageCollapsedPools, payload);
},
});
startAppListening({
actionCreator: serviceDiscoveryPageSetCollapsedPools,
effect: ({ payload }) => {
persistToLocalStorage(
localStorageKeyServiceDiscoveryPageCollapsedPools,
payload
);
},
});
startAppListening({
actionCreator: addQueryToHistory,
effect: (_, { getState }) => {
persistToLocalStorage(
localStorageKeyQueryHistory,
getState().queryPage.queryHistory
);
},
});
startAppListening({
actionCreator: updateSettings,
effect: ({ payload }) => {
Object.entries(payload).forEach(([key, value]) => {
switch (key) {
case "useLocalTime":
case "enableQueryHistory":
case "enableAutocomplete":
case "enableSyntaxHighlighting":
case "enableLinter":
case "showAnnotations":
case "ruleGroupsPerPage":
return persistToLocalStorage(`settings.${key}`, value);
}
});
},
});