Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wip: improve modal perf #4986

Draft
wants to merge 7 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions app/packages/core/src/components/Grid/Grid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,11 @@ function Grid() {

element && spotlight.attach(element);
spotlight.addEventListener("load", mount);
spotlight.addEventListener("rowchange", set);

return () => {
freeVideos();
spotlight.removeEventListener("load", mount);
spotlight.removeEventListener("rowchange", set);

spotlight.destroy();
document.dispatchEvent(new CustomEvent("grid-unmount"));
};
Expand Down
1 change: 1 addition & 0 deletions app/packages/core/src/components/Grid/useAt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export default function useAt(pageReset: string) {
const set = useRecoilTransaction_UNSTABLE(
({ set }) =>
({ at, page, offset }: { at: ID; page: number; offset: number }) => {
console.log("SCROLL");
set(gridPage, page);
set(gridAt, at.description);
set(gridOffset, offset);
Expand Down
12 changes: 0 additions & 12 deletions app/packages/core/src/components/Grid/useSelect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,6 @@ export default function useSelect(
const { init, deferred } = fos.useDeferrer();

const selected = useRecoilValue(fos.selectedSamples);
useEffect(() => {
deferred(() => {
const fontSize = getFontSize();
spotlight?.updateItems((id) => {
store.get(id)?.updateOptions({
...options,
fontSize,
selected: selected.has(id.description),
});
});
});
}, [deferred, getFontSize, options, selected, spotlight, store]);

useEffect(() => {
return spotlight ? init() : undefined;
Expand Down
4 changes: 2 additions & 2 deletions app/packages/core/src/components/Modal/Modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import { useRecoilCallback, useRecoilValue } from "recoil";
import styled from "styled-components";
import { ModalActionsRow } from "../Actions";
import Sidebar from "../Sidebar";
import { useLookerHelpers } from "./hooks";
import { modalContext } from "./modal-context";
import ModalNavigation from "./ModalNavigation";
import { ModalSpace } from "./ModalSpace";
import { TooltipInfo } from "./TooltipInfo";
import { useLookerHelpers } from "./hooks";
import { modalContext } from "./modal-context";
import { useModalSidebarRenderEntry } from "./use-sidebar-render-entry";

const ModalWrapper = styled.div`
Expand Down
61 changes: 24 additions & 37 deletions app/packages/core/src/components/Modal/use-looker.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import * as fos from "@fiftyone/state";
import React, { useEffect, useRef, useState } from "react";
import { useErrorHandler } from "react-error-boundary";
import { useRecoilValue, useSetRecoilState } from "recoil";
import { useRecoilValue } from "recoil";
import { v4 as uuid } from "uuid";
import { useClearSelectedLabels, useShowOverlays } from "./ModalLooker";
import { useLookerOptionsUpdate, useModalContext } from "./hooks";
import { useLookerOptionsUpdate } from "./hooks";
import useKeyEvents from "./use-key-events";
import { shortcutToHelpItems } from "./utils";

Expand All @@ -18,28 +18,26 @@ function useLooker<L extends fos.Lookers>({
const [id] = useState(() => uuid());
const initialRef = useRef<boolean>(true);
const ref = useRef<HTMLDivElement>(null);
const [reset, setReset] = useState(false);
const lookerOptions = fos.useLookerOptions(true);
const [reset, setReset] = useState(false);
const createLooker = fos.useCreateLooker(
true,
false,
lookerOptions,
undefined,
true
);
const selectedMediaField = useRecoilValue(fos.selectedMediaField(true));
const colorScheme = useRecoilValue(fos.colorScheme);
const looker = React.useMemo(() => {
/** start refreshers */
reset;
selectedMediaField;
/** end refreshers */

return createLooker.current(sample);
}, [createLooker, reset, sample, selectedMediaField]) as L;
}, [createLooker, reset, sample]) as L;
const handleError = useErrorHandler();
const updateLookerOptions = useLookerOptionsUpdate();

const selectedMediaField = useRecoilValue(fos.selectedMediaField(true));
const colorScheme = useRecoilValue(fos.colorScheme);
fos.useEventHandler(looker, "clear", useClearSelectedLabels());
fos.useEventHandler(looker, "error", (event) => handleError(event.detail));
fos.useEventHandler(looker, "options", (e) => updateLookerOptions(e.detail));
Expand All @@ -59,27 +57,8 @@ function useLooker<L extends fos.Lookers>({
!initialRef.current && looker.updateSample(sample.sample);
}, [colorScheme, looker, sample]);

useEffect(() => {
initialRef.current = false;
}, []);

useEffect(() => {
ref.current?.dispatchEvent(
new CustomEvent("looker-attached", { bubbles: true })
);
}, []);

useEffect(() => {
looker.attach(id);
}, [looker, id]);

useEffect(() => {
return () => looker?.destroy();
}, [looker]);

const jsonPanel = fos.useJSONPanel();
const helpPanel = fos.useHelpPanel();

fos.useEventHandler(
looker,
"panels",
Expand All @@ -94,7 +73,6 @@ function useLooker<L extends fos.Lookers>({
helpPanel[showHelp](shortcutToHelpItems(SHORTCUTS));
}
}

updateLookerOptions({}, (updatedOptions) =>
looker.updateOptions(updatedOptions)
);
Expand All @@ -103,21 +81,30 @@ function useLooker<L extends fos.Lookers>({

useKeyEvents(initialRef, sample.sample._id, looker);

const setModalLooker = useSetRecoilState(fos.modalLooker);
useEffect(() => {
ref.current?.dispatchEvent(
new CustomEvent("looker-attached", { bubbles: true })
);
}, []);
useEffect(() => {
initialRef.current = false;
}, []);

const { setActiveLookerRef } = useModalContext();
useEffect(() => {
ref.current?.dispatchEvent(
new CustomEvent("looker-attached", { bubbles: true })
);
}, []);

useEffect(() => {
setModalLooker(looker);
}, [looker, setModalLooker]);
looker.attach(id);
}, [looker, id]);

useEffect(() => {
if (looker) {
setActiveLookerRef(looker as fos.Lookers);
}
}, [looker, setActiveLookerRef]);
return () => looker?.destroy();
}, [looker]);

return { id, looker, ref, sample, updateLookerOptions };
return { id, looker, ref, sample };
}

export default useLooker;
1 change: 1 addition & 0 deletions app/packages/core/src/plugins/samples.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ registerComponent({
name: "Samples",
label: "Samples",
component: () => {
console.log("RENDER");
return (
<Container>
<Grid key={"grid"} />
Expand Down
7 changes: 3 additions & 4 deletions app/packages/looker/src/lookers/abstract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -536,10 +536,9 @@ export abstract class AbstractLooker<

destroy() {
this.resizeObserver.disconnect();
this.lookerElement.element.parentElement &&
this.lookerElement.element.parentElement.removeChild(
this.lookerElement.element
);
this.lookerElement.element.parentElement.removeChild(
this.lookerElement.element
);
this.updater({ destroyed: true });
}
disable() {
Expand Down
4 changes: 2 additions & 2 deletions app/packages/spaces/src/components/Panel.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CenteredStack, scrollable } from "@fiftyone/components";
import * as fos from "@fiftyone/state";
import React, { useEffect } from "react";
import { useRecoilValue, useSetRecoilState } from "recoil";
import { useSetRecoilState } from "recoil";
import { PANEL_LOADING_TIMEOUT } from "../constants";
import { PanelContext } from "../contexts";
import { useReactivePanel } from "../hooks";
Expand All @@ -20,7 +20,7 @@ function Panel(props: PanelProps) {
const setPanelIdToScope = useSetRecoilState(panelIdToScopeAtom);
const scope = isModalPanel ? "modal" : "grid";

const thisModalUniqueId = useRecoilValue(fos.currentModalUniqueId);
const thisModalUniqueId = null;

useEffect(() => {
setPanelIdToScope((ids) => ({ ...ids, [node.id]: scope }));
Expand Down
15 changes: 10 additions & 5 deletions app/packages/spotlight/src/createScrollReader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,17 @@ export default function createScrollReader(
let timeout: ReturnType<typeof setTimeout>;
let zooming = false;

element.addEventListener("scroll", () => {
const scroll = () => {
scrolling = true;
});
};
element.addEventListener("scroll", scroll);

element.addEventListener("scrollend", () => {
const scrollEnd = () => {
scrolling = false;
requestAnimationFrame(() => render(zooming, true));
});
};

element.addEventListener("scrollend", scrollEnd);

const updateScrollStatus = () => {
const threshold = getScrollSpeedThreshold();
Expand Down Expand Up @@ -68,7 +71,9 @@ export default function createScrollReader(
return {
destroy: () => {
destroyed = true;
element.removeEventListener("scroll", scroll);
element.removeEventListener("scrollend", scrollEnd)
},
zooming: () => zooming
zooming: () => zooming,
};
}
10 changes: 5 additions & 5 deletions app/packages/spotlight/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
SCROLLBAR_WIDTH,
TWO,
ZERO,
ZOOMING_COEFFICIENT
ZOOMING_COEFFICIENT,
} from "./constants";
import createScrollReader from "./createScrollReader";
import { Load, RowChange } from "./events";
Expand Down Expand Up @@ -107,8 +107,8 @@ export default class Spotlight<K, V> extends EventTarget {
throw new Error("spotlight is not attached");
}

this.#backward?.remove();
this.#forward?.remove();
this.#backward?.destroy();
this.#forward?.destroy();
this.#element?.classList.remove(styles.spotlightLoaded);
this.#element?.remove();
this.#scrollReader?.destroy();
Expand Down Expand Up @@ -203,7 +203,7 @@ export default class Spotlight<K, V> extends EventTarget {
const backward = this.#forward;
this.#forward = section;
this.#forward.attach(this.#element);
this.#backward.remove();
this.#backward.destroy();
this.#backward = backward;
offset = before - this.#containerHeight + this.#config.spacing;
}
Expand Down Expand Up @@ -271,7 +271,7 @@ export default class Spotlight<K, V> extends EventTarget {
this.#backward = result.section;
this.#backward.attach(this.#element);

this.#forward.remove();
this.#forward.destroy();
this.#forward = forward;
}

Expand Down
24 changes: 12 additions & 12 deletions app/packages/spotlight/src/row.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export default class Row<K, V> {
#from: number;
#hidden: boolean;

readonly #aborter: AbortController = new AbortController();
readonly #config: SpotlightConfig<K, V>;
readonly #dangle?: boolean;
readonly #container: HTMLDivElement = create(DIV);
Expand Down Expand Up @@ -47,7 +48,7 @@ export default class Row<K, V> {
element.style.top = pixels(ZERO);

if (config.onItemClick) {
element.addEventListener("click", (event) => {
const handler = (event) => {
if (event.metaKey || event.shiftKey) {
return;
}
Expand All @@ -59,18 +60,13 @@ export default class Row<K, V> {
item,
iter,
});
};

element.addEventListener("click", handler, {
signal: this.#aborter.signal,
});
element.addEventListener("contextmenu", (event) => {
if (event.metaKey || event.shiftKey) {
return;
}
event.preventDefault();
focus(item.id);
config.onItemClick({
event,
item,
iter,
});
element.addEventListener("contextmenu", handler, {
signal: this.#aborter.signal,
});
}

Expand Down Expand Up @@ -123,6 +119,10 @@ export default class Row<K, V> {
return this.#row[this.#row.length - ONE].item.id;
}

destroy() {
this.#aborter.abort();
}

has(item: string) {
for (const i of this.#row) {
if (i.item.id.description === item) {
Expand Down
13 changes: 8 additions & 5 deletions app/packages/spotlight/src/section.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,14 @@ export default class Section<K, V> {
: element.appendChild(this.#section);
}

destroy() {
this.#section.remove();
for (const row of this.#rows) {
row.destroy();
}
this.#rows = [];
}

find(item: string): Row<K, V> | null {
for (const row of this.#rows) {
if (row.has(item)) {
Expand All @@ -118,11 +126,6 @@ export default class Section<K, V> {
return null;
}

remove() {
this.#section.remove();
this.#rows = [];
}

render({
config,
target,
Expand Down
2 changes: 1 addition & 1 deletion app/packages/state/src/hooks/useSetExpandedSample.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export default () => {
[]
);

const commit = useRecoilCallback(
return useRecoilCallback(
({ set }) =>
async (selector: ModalSelector) => {
set(modalSelector, selector);
Expand Down
Loading