mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
fix ref logic error
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
9dc5872f77
commit
383a50cdbf
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
import "./list.scss";
|
import "./list.scss";
|
||||||
|
|
||||||
|
import type { ForwardedRef } from "react";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import AnsiUp from "ansi_up";
|
import AnsiUp from "ansi_up";
|
||||||
import DOMPurify from "dompurify";
|
import DOMPurify from "dompurify";
|
||||||
@ -28,8 +29,12 @@ export interface LogListProps {
|
|||||||
|
|
||||||
const colorConverter = new AnsiUp();
|
const colorConverter = new AnsiUp();
|
||||||
|
|
||||||
|
export interface LogListRef {
|
||||||
|
scrollToItem: (index: number, align: Align) => void;
|
||||||
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class LogList extends React.Component<LogListProps> {
|
class NonForwardedLogList extends React.Component<LogListProps & { innerRef: ForwardedRef<LogListRef> }> {
|
||||||
@observable isJumpButtonVisible = false;
|
@observable isJumpButtonVisible = false;
|
||||||
@observable isLastLineVisible = true;
|
@observable isLastLineVisible = true;
|
||||||
|
|
||||||
@ -37,7 +42,7 @@ export class LogList extends React.Component<LogListProps> {
|
|||||||
private virtualListRef = React.createRef<VirtualListRef>(); // A reference for VirtualList component
|
private virtualListRef = React.createRef<VirtualListRef>(); // A reference for VirtualList component
|
||||||
private lineHeight = 18; // Height of a log line. Should correlate with styles in pod-log-list.scss
|
private lineHeight = 18; // Height of a log line. Should correlate with styles in pod-log-list.scss
|
||||||
|
|
||||||
constructor(props: LogListProps) {
|
constructor(props: any) {
|
||||||
super(props);
|
super(props);
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
autoBind(this);
|
autoBind(this);
|
||||||
@ -51,6 +56,27 @@ export class LogList extends React.Component<LogListProps> {
|
|||||||
this.onUserScrolledUp(logs, prevLogs);
|
this.onUserScrolledUp(logs, prevLogs);
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
|
this.bindInnerRef({
|
||||||
|
scrollToItem: this.scrollToItem,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
this.bindInnerRef({
|
||||||
|
scrollToItem: this.scrollToItem,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.bindInnerRef(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bindInnerRef(value: LogListRef | null) {
|
||||||
|
if (typeof this.props.innerRef === "function") {
|
||||||
|
this.props.innerRef(value);
|
||||||
|
} else if (this.props.innerRef && typeof this.props.innerRef === "object") {
|
||||||
|
this.props.innerRef.current = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onLogsInitialLoad(logs: string[], prevLogs: string[]) {
|
onLogsInitialLoad(logs: string[], prevLogs: string[]) {
|
||||||
@ -246,3 +272,7 @@ export class LogList extends React.Component<LogListProps> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const LogList = React.forwardRef<LogListRef, LogListProps>((props, ref) => (
|
||||||
|
<NonForwardedLogList {...props} innerRef={ref} />
|
||||||
|
));
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import React, { createRef, useEffect } from "react";
|
|||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import { InfoPanel } from "../info-panel";
|
import { InfoPanel } from "../info-panel";
|
||||||
import { LogResourceSelector } from "./resource-selector";
|
import { LogResourceSelector } from "./resource-selector";
|
||||||
|
import type { LogListRef } from "./list";
|
||||||
import { LogList } from "./list";
|
import { LogList } from "./list";
|
||||||
import { LogSearch } from "./search";
|
import { LogSearch } from "./search";
|
||||||
import { LogControls } from "./controls";
|
import { LogControls } from "./controls";
|
||||||
@ -30,7 +31,7 @@ interface Dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStores }: Dependencies & LogsDockTabProps) => {
|
const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStores }: Dependencies & LogsDockTabProps) => {
|
||||||
const logListElement = createRef<LogList>();
|
const logListElement = createRef<LogListRef>();
|
||||||
const data = model.logTabData.get();
|
const data = model.logTabData.get();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
// API docs: https://react-window.now.sh
|
// API docs: https://react-window.now.sh
|
||||||
import "./virtual-list.scss";
|
import "./virtual-list.scss";
|
||||||
|
|
||||||
import type { ForwardedRef, PropsWithoutRef, RefObject } from "react";
|
import type { ForwardedRef } from "react";
|
||||||
import React, { createRef, forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
|
import React, { createRef, forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { Align, ListChildComponentProps, ListOnScrollProps } from "react-window";
|
import type { Align, ListChildComponentProps, ListOnScrollProps } from "react-window";
|
||||||
@ -28,7 +28,7 @@ export interface VirtualListProps<T extends { getId(): string } | string> {
|
|||||||
selectedItemId?: string;
|
selectedItemId?: string;
|
||||||
getRow?: (uid: T extends string ? number : string) => React.ReactElement | undefined | null;
|
getRow?: (uid: T extends string ? number : string) => React.ReactElement | undefined | null;
|
||||||
onScroll?: (props: ListOnScrollProps) => void;
|
onScroll?: (props: ListOnScrollProps) => void;
|
||||||
outerRef?: React.Ref<any>;
|
outerRef?: React.Ref<HTMLDivElement>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If specified then AutoSizer will not be used and instead a fixed height
|
* If specified then AutoSizer will not be used and instead a fixed height
|
||||||
@ -53,7 +53,8 @@ function VirtualListInner<T extends { getId(): string } | string>({
|
|||||||
onScroll = noop,
|
onScroll = noop,
|
||||||
outerRef,
|
outerRef,
|
||||||
fixedHeight,
|
fixedHeight,
|
||||||
}: VirtualListProps<T>, ref: ForwardedRef<VirtualListRef>) {
|
forwardedRef,
|
||||||
|
}: VirtualListProps<T> & { forwardedRef?: ForwardedRef<VirtualListRef> }) {
|
||||||
const [overscanCount, setOverscanCount] = useState(initialOffset);
|
const [overscanCount, setOverscanCount] = useState(initialOffset);
|
||||||
const listRef = createRef<VariableSizeList>();
|
const listRef = createRef<VariableSizeList>();
|
||||||
const prevItems = useRef(items);
|
const prevItems = useRef(items);
|
||||||
@ -75,7 +76,7 @@ function VirtualListInner<T extends { getId(): string } | string>({
|
|||||||
}), [selectedItemId, [items]]);
|
}), [selectedItemId, [items]]);
|
||||||
const getItemSize = (index: number) => rowHeights[index];
|
const getItemSize = (index: number) => rowHeights[index];
|
||||||
|
|
||||||
useImperativeHandle(ref, () => ({
|
useImperativeHandle(forwardedRef, () => ({
|
||||||
scrollToItem: (index, align) => listRef.current?.scrollToItem(index, align),
|
scrollToItem: (index, align) => listRef.current?.scrollToItem(index, align),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -130,13 +131,9 @@ function VirtualListInner<T extends { getId(): string } | string>({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ForwardedVirtualList = forwardRef(VirtualListInner);
|
export const VirtualList = forwardRef<VirtualListRef, VirtualListProps<string>>((props, ref) => (
|
||||||
|
<VirtualListInner {...props} forwardedRef={ref} />
|
||||||
export function VirtualList<T extends { getId(): string } | string>(
|
)) as <T extends { getId(): string } | string>(props: VirtualListProps<T> & { ref?: ForwardedRef<VirtualListRef> }) => JSX.Element;
|
||||||
props: PropsWithoutRef<VirtualListProps<T>> & { ref?: RefObject<VirtualListRef> },
|
|
||||||
) {
|
|
||||||
return <ForwardedVirtualList {...props as never} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface RowData<T extends { getId(): string } | string> {
|
interface RowData<T extends { getId(): string } | string> {
|
||||||
items: T[];
|
items: T[];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user