1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/components/dock/logs/view.tsx
Jim Ehrismann abcbadb46b proper fix
Signed-off-by: Jim Ehrismann <jehrismann@mirantis.com>
2022-03-03 19:07:14 -05:00

102 lines
3.2 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React, { createRef, useEffect } from "react";
import { observer } from "mobx-react";
import { InfoPanel } from "../info-panel";
import { LogResourceSelector } from "./resource-selector";
import { LogList } from "./list";
import { LogSearch } from "./search";
import { LogControls } from "./controls";
import { withInjectables } from "@ogre-tools/injectable-react";
import logsViewModelInjectable from "./logs-view-model.injectable";
import type { LogTabViewModel } from "./logs-view-model";
import type { DockTab } from "../dock/store";
import { cssNames, Disposer } from "../../../utils";
import type { KubeWatchSubscribeStoreOptions } from "../../../kube-watch-api/kube-watch-api";
import subscribeStoresInjectable from "../../../kube-watch-api/subscribe-stores.injectable";
import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store";
import type { KubeObject } from "../../../../common/k8s-api/kube-object";
import { podsStore } from "../../+workloads-pods/pods.store";
export interface LogsDockTabProps {
className?: string;
tab: DockTab;
}
interface Dependencies {
model: LogTabViewModel;
subscribeStores: (stores: KubeObjectStore<KubeObject>[], opts?: KubeWatchSubscribeStoreOptions) => Disposer;
}
const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStores }: Dependencies & LogsDockTabProps) => {
const logListElement = createRef<LogList>();
const data = model.logTabData.get();
useEffect(() => {
model.reloadLogs();
return model.stopLoadingLogs;
}, [tab.id]);
useEffect(() => subscribeStores([
podsStore,
], {
namespaces: data ? [data.namespace] : [],
}), [data?.namespace]);
const scrollToOverlay = (overlayLine: number | undefined) => {
if (!logListElement.current || overlayLine === undefined) {
return;
}
// Scroll vertically
logListElement.current.scrollToItem(overlayLine, "center");
// Scroll horizontally in timeout since virtual list need some time to prepare its contents
setTimeout(() => {
const overlay = document.querySelector(".PodLogs .list span.active");
if (!overlay) return;
overlay.scrollIntoViewIfNeeded();
}, 100);
};
if (!data) {
return null;
}
return (
<div className={cssNames("PodLogs flex column", className)}>
<InfoPanel
tabId={tab.id}
controls={(
<div className="flex gaps">
<LogResourceSelector model={model} />
<LogSearch
model={model}
scrollToOverlay={scrollToOverlay}
/>
</div>
)}
showSubmitClose={false}
showButtons={false}
showStatusPanel={false}
/>
<LogList model={model} ref={logListElement} />
<LogControls model={model} />
</div>
);
});
export const LogsDockTab = withInjectables<Dependencies, LogsDockTabProps>(NonInjectedLogsDockTab, {
getProps: (di, props) => ({
model: di.inject(logsViewModelInjectable, {
tabId: props.tab.id,
}),
subscribeStores: di.inject(subscribeStoresInjectable),
...props,
}),
});