1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Move cluster failed to list namespaces to injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-02-21 12:15:45 -05:00
parent 504d086bbf
commit 38de2edc50
5 changed files with 70 additions and 30 deletions

View File

@ -0,0 +1,11 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { ClusterId } from "../../../../common/cluster-types";
import type { MessageChannel } from "../../../../common/utils/channel/message-channel-listener-injection-token";
export const clusterFailedToListNamespacesChannel: MessageChannel<ClusterId> = {
id: "cluster-failed-to-list-namespaces",
};

View File

@ -0,0 +1,21 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { MessageChannelSender } from "../../../../common/utils/channel/message-to-channel-injection-token";
import { sendMessageToChannelInjectionToken } from "../../../../common/utils/channel/message-to-channel-injection-token";
import { clusterFailedToListNamespacesChannel } from "../common/channel";
export type EmitClusterFailedToListNamespaces = MessageChannelSender<typeof clusterFailedToListNamespacesChannel>;
const emitClusterFailedToListNamespacesInjectable = getInjectable({
id: "emit-cluster-failed-to-list-namespaces",
instantiate: (di): EmitClusterFailedToListNamespaces => {
const sendMessageToChannel = di.inject(sendMessageToChannelInjectionToken);
return (clusterId) => sendMessageToChannel(clusterFailedToListNamespacesChannel, clusterId);
},
});
export default emitClusterFailedToListNamespacesInjectable;

View File

@ -3,15 +3,13 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import navigateToEntitySettingsInjectable from "../../common/front-end-routing/routes/entity-settings/navigate-to-entity-settings.injectable";
import type { ListNamespaceForbiddenArgs } from "../../common/ipc/cluster";
import { Button } from "../components/button";
import type { IpcRendererEvent } from "electron";
import navigateToEntitySettingsInjectable from "../../../../common/front-end-routing/routes/entity-settings/navigate-to-entity-settings.injectable";
import { Button } from "../../../../renderer/components/button";
import React from "react";
import notificationsStoreInjectable from "../components/notifications/notifications-store.injectable";
import { getMillisecondsFromUnixEpoch } from "../../common/utils/date/get-current-date-time";
import getClusterByIdInjectable from "../../common/cluster-store/get-by-id.injectable";
import showSuccessNotificationInjectable from "../components/notifications/show-success-notification.injectable";
import { getMillisecondsFromUnixEpoch } from "../../../../common/utils/date/get-current-date-time";
import getClusterByIdInjectable from "../../../../common/cluster-store/get-by-id.injectable";
import showSuccessNotificationInjectable from "../../../../renderer/components/notifications/show-success-notification.injectable";
import type { ClusterId } from "../../../../common/cluster-types";
const intervalBetweenNotifications = 1000 * 60; // 60s
@ -20,15 +18,11 @@ const listNamespacesForbiddenHandlerInjectable = getInjectable({
instantiate: (di) => {
const navigateToEntitySettings = di.inject(navigateToEntitySettingsInjectable);
const notificationsStore = di.inject(notificationsStoreInjectable);
const getClusterById = di.inject(getClusterByIdInjectable);
const notificationLastDisplayedAt = new Map<string, number>();
const showSuccessNotification = di.inject(showSuccessNotificationInjectable);
return (
event: IpcRendererEvent,
...[clusterId]: ListNamespaceForbiddenArgs
): void => {
return (clusterId: ClusterId) => {
const lastDisplayedAt = notificationLastDisplayedAt.get(clusterId);
const now = getMillisecondsFromUnixEpoch();
@ -42,14 +36,7 @@ const listNamespacesForbiddenHandlerInjectable = getInjectable({
return;
}
const notificationId = `list-namespaces-forbidden:${clusterId}`;
if (notificationsStore.getById(notificationId)) {
// notification is still visible
return;
}
showSuccessNotification(
const closeNotification = showSuccessNotification(
(
<div className="flex column gaps">
<b>Add Accessible Namespaces</b>
@ -65,18 +52,18 @@ const listNamespacesForbiddenHandlerInjectable = getInjectable({
label="Go to Accessible Namespaces Settings"
onClick={() => {
navigateToEntitySettings(clusterId, "namespaces");
notificationsStore.remove(notificationId);
closeNotification();
}}
/>
</div>
</div>
),
{
id: notificationId,
id: `list-namespaces-forbidden:${clusterId}`,
/**
* Set the time when the notification is closed as well so that there is at
* least a minute between closing the notification as seeing it again
*/
* Set the time when the notification is closed as well so that there is at
* least a minute between closing the notification as seeing it again
*/
onClose: () => notificationLastDisplayedAt.set(clusterId, getMillisecondsFromUnixEpoch()),
},
);

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { noop } from "../../../../common/utils";
import { getMessageChannelListenerInjectable } from "../../../../common/utils/channel/message-channel-listener-injection-token";
import currentlyInClusterFrameInjectable from "../../../../renderer/routes/currently-in-cluster-frame.injectable";
import { clusterFailedToListNamespacesChannel } from "../common/channel";
import listNamespacesForbiddenHandlerInjectable from "./list-namespaces-forbidden-handler.injectable";
const clusterFailedToListNamespacesListenerInjectable = getMessageChannelListenerInjectable({
channel: clusterFailedToListNamespacesChannel,
id: "main",
handler: (di) => {
const currentlyInClusterFrame = di.inject(currentlyInClusterFrameInjectable);
if (currentlyInClusterFrame) {
return noop;
}
return di.inject(listNamespacesForbiddenHandlerInjectable);
},
});
export default clusterFailedToListNamespacesListenerInjectable;

View File

@ -4,22 +4,18 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { defaultHotbarCells } from "../../common/hotbars/types";
import { clusterListNamespaceForbiddenChannel } from "../../common/ipc/cluster";
import { hotbarTooManyItemsChannel } from "../../common/ipc/hotbar";
import showErrorNotificationInjectable from "../components/notifications/show-error-notification.injectable";
import ipcRendererInjectable from "../utils/channel/ipc-renderer.injectable";
import listNamespacesForbiddenHandlerInjectable from "./list-namespaces-forbidden-handler.injectable";
const registerIpcListenersInjectable = getInjectable({
id: "register-ipc-listeners",
instantiate: (di) => {
const listNamespacesForbiddenHandler = di.inject(listNamespacesForbiddenHandlerInjectable);
const ipcRenderer = di.inject(ipcRendererInjectable);
const showErrorNotification = di.inject(showErrorNotificationInjectable);
return () => {
ipcRenderer.on(clusterListNamespaceForbiddenChannel, listNamespacesForbiddenHandler);
ipcRenderer.on(hotbarTooManyItemsChannel, () => {
showErrorNotification(`Cannot have more than ${defaultHotbarCells} items pinned to a hotbar`);
});