Spaces:
Runtime error
Runtime error
import { useEffect, useRef } from "react" | |
import { RenderedScene } from "@/types" | |
import { MouseEventHandler } from "@/app/interface/renderer/types" | |
import { FullScreenIcon } from "@/components/icons/full-screen" | |
import { FullScreenButton } from "@/app/interface/renderer/full-screen-button" | |
export function CartesianImage({ | |
rendered, | |
onEvent, | |
className, | |
debug | |
}: { | |
rendered: RenderedScene | |
onEvent: MouseEventHandler | |
className?: string | |
debug?: boolean | |
}) { | |
const ref = useRef<HTMLImageElement>(null) | |
const cacheRef = useRef("") | |
useEffect(() => { | |
const listener = (e: DragEvent) => { | |
if (!ref.current) { return } | |
// TODO: check if we are currently dragging an object | |
// if yes, then we should check if clientX and clientY are matching the | |
const boundingRect = ref.current.getBoundingClientRect() | |
// abort if we are not currently dragging over our display area | |
if (e.clientX < boundingRect.left) { return } | |
if (e.clientX > (boundingRect.left + boundingRect.width)) { return } | |
if (e.clientY < boundingRect.top) { return } | |
if (e.clientY > (boundingRect.top + boundingRect.height)) { return } | |
const containerX = e.clientX - boundingRect.left | |
const containerY = e.clientY - boundingRect.top | |
const relativeX = containerX / boundingRect.width | |
const relativeY = containerY / boundingRect.height | |
const key = `${relativeX},${relativeY}` | |
// to avoid use | |
if (cacheRef.current === key) { | |
return | |
} | |
// console.log(`DRAG: calling onEvent("hover", ${relativeX}, ${relativeY})`) | |
cacheRef.current = key | |
onEvent("hover", relativeX, relativeY) | |
} | |
document.addEventListener('drag', listener) | |
return () => { | |
document.removeEventListener('drag', listener) | |
} | |
}, [onEvent]) | |
const handleEvent = async (event: React.MouseEvent<HTMLImageElement, MouseEvent>, isClick: boolean) => { | |
if (!ref.current) { | |
// console.log("element isn't ready") | |
return | |
} | |
const boundingRect = ref.current.getBoundingClientRect() | |
// const x = (event.clientX - boundingRect.left) * 1.03 | |
// const y = (event.clientY - boundingRect.top) //* 1.03 | |
// those X and Y will be based on the current size of the container, which might be variable | |
const containerX = event.clientX - boundingRect.left | |
const containerY = event.clientY - boundingRect.top | |
// then we convert them to relative coordinates | |
const relativeX = containerX / boundingRect.width | |
const relativeY = containerY / boundingRect.height | |
const eventType = isClick ? "click" : "hover" | |
onEvent(eventType, relativeX, relativeY) | |
} | |
if (!rendered.assetUrl) { | |
return null | |
} | |
return ( | |
<> | |
<img | |
src={rendered.assetUrl || undefined} | |
ref={ref} | |
className="fixed w-screen top-0 left-0 right-0" | |
onMouseUp={(event) => handleEvent(event, true)} | |
onMouseMove={(event) => handleEvent(event, false)} | |
/> | |
{debug && <img | |
src={rendered.maskUrl || undefined} | |
className="fixed w-screen top-0 left-0 right-0 opacity-50 pointer-events-none" | |
/>} | |
{/* <FullScreenButton /> */} | |
</> | |
) | |
} |