feat(canvas): share magnet state across connection drags

This commit is contained in:
2026-04-11 08:41:14 +02:00
parent 52d5d487b8
commit 1d691999dd
5 changed files with 635 additions and 211 deletions

View File

@@ -0,0 +1,51 @@
"use client";
import {
createContext,
useContext,
useMemo,
useState,
type ReactNode,
} from "react";
import type { CanvasMagnetTarget } from "@/components/canvas/canvas-connection-magnetism";
type CanvasConnectionMagnetismState = {
activeTarget: CanvasMagnetTarget | null;
setActiveTarget: (target: CanvasMagnetTarget | null) => void;
};
const CanvasConnectionMagnetismContext =
createContext<CanvasConnectionMagnetismState | null>(null);
export function CanvasConnectionMagnetismProvider({
children,
}: {
children: ReactNode;
}) {
const [activeTarget, setActiveTarget] = useState<CanvasMagnetTarget | null>(null);
const value = useMemo(
() => ({
activeTarget,
setActiveTarget,
}),
[activeTarget],
);
return (
<CanvasConnectionMagnetismContext.Provider value={value}>
{children}
</CanvasConnectionMagnetismContext.Provider>
);
}
export function useCanvasConnectionMagnetism(): CanvasConnectionMagnetismState {
const context = useContext(CanvasConnectionMagnetismContext);
if (!context) {
throw new Error(
"useCanvasConnectionMagnetism must be used within CanvasConnectionMagnetismProvider",
);
}
return context;
}