From 2a06a5f3cfec907aae935e2d14b9d0d3836b9989 Mon Sep 17 00:00:00 2001 From: Victor Oliva Date: Mon, 28 Oct 2024 10:39:55 +0100 Subject: [PATCH] feat: binary highlight nested enums --- src/codec-components/EditCodec/Tree/CEnum.tsx | 12 +++++++--- .../EditCodec/Tree/codec-components.tsx | 22 ++----------------- src/components/Modal.tsx | 19 +++++++++++++++- src/pages/Extrinsics/EditMode.tsx | 2 ++ 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/codec-components/EditCodec/Tree/CEnum.tsx b/src/codec-components/EditCodec/Tree/CEnum.tsx index cb735dc..339e53f 100644 --- a/src/codec-components/EditCodec/Tree/CEnum.tsx +++ b/src/codec-components/EditCodec/Tree/CEnum.tsx @@ -11,6 +11,7 @@ import { TitleContext, useReportBinaryStatus, } from "./codec-components" +import { setHovered } from "@/codec-components/common/paths.state" export const CEnum: EditEnum = ({ value, @@ -39,12 +40,17 @@ export const CEnum: EditEnum = ({ if (value === NOTIN) return null const innerPath = [...path, value.type] + const pathStr = path.join(".") if (titleContainer) { return ( <> {titleElement ? ( - scrollToMarker(innerPath)}> + scrollToMarker(innerPath)} + onMouseEnter={() => setHovered({ id: pathStr, hover: true })} + onMouseLeave={() => setHovered({ id: pathStr, hover: false })} + > / {value.type} @@ -67,9 +73,9 @@ export const CEnum: EditEnum = ({
scrollToMarker(innerPath)} + onNavigate={() => scrollToMarker(path)} onZoom={innerIsComplex ? () => focus.setFocus(innerPath) : undefined} binaryStatus={{ encodedValue, diff --git a/src/codec-components/EditCodec/Tree/codec-components.tsx b/src/codec-components/EditCodec/Tree/codec-components.tsx index 1236f33..c6c66b7 100644 --- a/src/codec-components/EditCodec/Tree/codec-components.tsx +++ b/src/codec-components/EditCodec/Tree/codec-components.tsx @@ -23,9 +23,7 @@ import { PropsWithChildren, ReactElement, useContext, - useEffect, useLayoutEffect, - useRef, useState, } from "react" import { twMerge } from "tailwind-merge" @@ -140,33 +138,17 @@ export const ItemTitle: FC< const [binaryOpen, setBinaryOpen] = useState(false) const isActive = useStateObservable(isActive$(path)) - // react listeners don't work across portals, we need native listeners - const ref = useRef(null) - useEffect(() => { - if (!ref.current) return - const element = ref.current - const onMouseEnter = () => setHovered({ id: path, hover: true }) - const onMouseLeave = () => setHovered({ id: path, hover: false }) - - element.addEventListener("mouseenter", onMouseEnter) - element.addEventListener("mouseleave", onMouseLeave) - return () => { - element.removeEventListener("mouseenter", onMouseEnter) - element.removeEventListener("mouseleave", onMouseLeave) - onMouseLeave() - } - }, [path]) - return ( <>
setHovered({ id: path, hover: true })} + onMouseLeave={() => setHovered({ id: path, hover: false })} > = ({ if (ref.open && !open) { ref.close() } else if (!ref.open && open) { - ref.showModal() + // Not sure why, having this run in a useEffect (or useLayoutEffect) causes + // an issue: on EditCodec+Tree, when hovering over a line of the tree view + // and pressing on "Edit binary", the modal causes the `mouseleave` event + // to not trigger, so the line becomes "Active" (and the binary view shows + // highlight of something not being hovered on). + // Seems that if `.showModal()` is called synchronously it doesn't happen. + // It doesn't happen if `.showModal()` is called in a setTimeout. + // But within a useEffect, the issue is present. + let canceled = false + setTimeout(() => { + if (canceled) { + return + } + ref.showModal() + }) + return () => { + canceled = true + } } }, [open, ref]) diff --git a/src/pages/Extrinsics/EditMode.tsx b/src/pages/Extrinsics/EditMode.tsx index ec797e1..bbc74ec 100644 --- a/src/pages/Extrinsics/EditMode.tsx +++ b/src/pages/Extrinsics/EditMode.tsx @@ -1,4 +1,5 @@ import { + Marker, MarkersContextProvider, VisibleWindow, } from "@/codec-components/common/Markers" @@ -66,6 +67,7 @@ export const EditMode: React.FC<{
+