diff --git a/frontend/packages/console-shared/src/hooks/useGetUserSettingConfigMap.ts b/frontend/packages/console-shared/src/hooks/useGetUserSettingConfigMap.ts new file mode 100644 index 000000000000..9083844a0393 --- /dev/null +++ b/frontend/packages/console-shared/src/hooks/useGetUserSettingConfigMap.ts @@ -0,0 +1,47 @@ +import { createHash } from 'crypto'; +import * as React from 'react'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: FIXME out-of-sync @types/react-redux version as new types cause many build errors +import { useSelector } from 'react-redux'; +import { getImpersonate, getUser, K8sResourceKind } from '@console/dynamic-plugin-sdk/src'; +import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook'; +import { ConfigMapModel } from '@console/internal/models'; +import { RootState } from '@console/internal/redux'; +import { USER_SETTING_CONFIGMAP_NAMESPACE } from '../utils/user-settings'; + +export const useGetUserSettingConfigMap = () => { + const hashNameOrKubeadmin = (name: string): string | null => { + if (!name) { + return null; + } + + if (name === 'kube:admin') { + return 'kubeadmin'; + } + const hash = createHash('sha256'); + hash.update(name); + return hash.digest('hex'); + }; + // User and impersonate + const userUid = useSelector((state: RootState) => { + const impersonateName = getImpersonate(state)?.name; + const { uid, username } = getUser(state) ?? {}; + const hashName = hashNameOrKubeadmin(username); + return impersonateName || uid || hashName || ''; + }); + + const configMapResource = React.useMemo( + () => + !userUid + ? null + : { + kind: ConfigMapModel.kind, + namespace: USER_SETTING_CONFIGMAP_NAMESPACE, + isList: false, + name: `user-settings-${userUid}`, + }, + [userUid], + ); + const [cfData, cfLoaded, cfLoadError] = useK8sWatchResource(configMapResource); + return [cfData, cfLoaded, cfLoadError]; +}; diff --git a/frontend/packages/topology/src/components/side-bar/components/SideBarAlerts.tsx b/frontend/packages/topology/src/components/side-bar/components/SideBarAlerts.tsx index 401114354cb7..581b1c045690 100644 --- a/frontend/packages/topology/src/components/side-bar/components/SideBarAlerts.tsx +++ b/frontend/packages/topology/src/components/side-bar/components/SideBarAlerts.tsx @@ -7,7 +7,10 @@ import { isDetailsResourceAlert, useResolvedExtensions, } from '@console/dynamic-plugin-sdk'; -import { USERSETTINGS_PREFIX, useUserSettings } from '@console/shared'; +import { USERSETTINGS_PREFIX } from '@console/shared'; +import { useGetUserSettingConfigMap } from '@console/shared/src/hooks/useGetUserSettingConfigMap'; +import { useUserSettingsLocalStorage } from '@console/shared/src/hooks/useUserSettingsLocalStorage'; +import { deseralizeData } from '@console/shared/src/utils/user-settings'; const SIDEBAR_ALERTS = 'sideBarAlerts'; @@ -16,14 +19,28 @@ const ResolveResourceAlerts: React.FC<{ useResourceAlertsContent?: (element: GraphElement) => DetailsResourceAlertContent; element: GraphElement; }> = observer(function ResolveResourceAlerts({ id, useResourceAlertsContent, element }) { - const [showAlert, setShowAlert, loaded] = useUserSettings( - `${USERSETTINGS_PREFIX}.${SIDEBAR_ALERTS}.${id}.${element.getId()}`, - true, + const [cfData, cfLoaded, cfLoadError] = useGetUserSettingConfigMap(); + const [showAlert, setShowAlert] = useUserSettingsLocalStorage( + `${USERSETTINGS_PREFIX}/${SIDEBAR_ALERTS}/${id}`, + `${element.getId()}`, + deseralizeData( + cfData?.data?.[`${USERSETTINGS_PREFIX}.${SIDEBAR_ALERTS}.${id}.${element.getId()}`], + ) || true, ); + + React.useEffect(() => { + if (cfData && cfLoaded && !cfLoadError) { + const alertSetting = deseralizeData( + cfData?.data?.[`${USERSETTINGS_PREFIX}.${SIDEBAR_ALERTS}.${id}.${element.getId()}`], + ); + setShowAlert(alertSetting); + } + }, [setShowAlert, cfData, cfLoaded, cfLoadError, id, element]); + const alertConfigs = useResourceAlertsContent(element); if (!alertConfigs) return null; const { variant, content, actionLinks, dismissible, title } = alertConfigs; - return loaded && showAlert ? ( + return showAlert ? (