feat(view): add viewport activity island

This commit is contained in:
syntaxbullet
2026-07-03 11:43:00 +02:00
parent 8965532c3a
commit b0732c8af1
3 changed files with 126 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
import { useEffect, useRef, useState } from "react";
import type { ViewportState } from "@editor/state";
import type { BottomControlsAction } from "./BottomControlsIsland";
export type ViewportActivityIslandState = {
visible: boolean;
action: BottomControlsAction;
};
export function useViewportActivityIsland(viewport: ViewportState): ViewportActivityIslandState {
const [visible, setVisible] = useState(false);
const [action, setAction] = useState<BottomControlsAction>("zoom");
const previousViewport = useRef({ zoom: viewport.zoom, center: viewport.center });
useEffect(() => {
const previous = previousViewport.current;
const zoomChanged = previous.zoom !== viewport.zoom;
const centerChanged = previous.center.x !== viewport.center.x || previous.center.y !== viewport.center.y;
if (!zoomChanged && !centerChanged) return;
previousViewport.current = { zoom: viewport.zoom, center: viewport.center };
setAction(zoomChanged ? "zoom" : "pan");
setVisible(true);
const timeout = window.setTimeout(() => setVisible(false), 1200);
return () => window.clearTimeout(timeout);
}, [viewport.center, viewport.zoom]);
return { visible, action };
}