MCPcopy Create free account
hub / github.com/AmazingAng/PolyWorld / usePanelDrag

Function usePanelDrag

src/hooks/usePanelDrag.ts:362–890  ·  view source on GitHub ↗
(config: {
  grids: PanelDragGrid[];
  getPanelGeometry: (panelId: string, containerIdx: number) => PanelGeometry;
  onTransfer?: (
    panelId: string,
    fromIdx: number,
    toIdx: number,
    newFromOrder: string[],
    newToOrder: string[],
  ) => void;
  onDragStateChange?: (dragging: boolean) => void;
})

Source from the content-addressed store, hash-verified

360}
361
362export function usePanelDrag(config: {
363 grids: PanelDragGrid[];
364 getPanelGeometry: (panelId: string, containerIdx: number) => PanelGeometry;
365 onTransfer?: (
366 panelId: string,
367 fromIdx: number,
368 toIdx: number,
369 newFromOrder: string[],
370 newToOrder: string[],
371 ) => void;
372 onDragStateChange?: (dragging: boolean) => void;
373}) {
374 const configRef = useRef(config);
375 const dragStateRef = useRef<DragRuntimeState>({
376 activeId: null,
377 sourceContainerIdx: -1,
378 preferredContainerIdx: -1,
379 latestClientX: 0,
380 latestClientY: 0,
381 projectedVisibleOrders: null,
382 lastTargetKey: "none",
383 });
384 const scrollCleanupRef = useRef<(() => void) | null>(null);
385 const overlayPointerRef = useRef<OverlayPointerState>({
386 active: false,
387 startClientX: 0,
388 startClientY: 0,
389 originLeft: 0,
390 originTop: 0,
391 anchorX: OVERLAY_CURSOR_MIN_MARGIN_PX,
392 anchorY: OVERLAY_CURSOR_MIN_MARGIN_PX,
393 scrollDeltaX: 0,
394 scrollDeltaY: 0,
395 initialScrollPositions: [],
396 });
397 const [activeId, setActiveId] = useState<string | null>(null);
398 const [overlay, setOverlay] = useState<PanelDragOverlayData | null>(null);
399 const [projectedVisibleOrders, setProjectedVisibleOrders] = useState<string[][] | null>(null);
400 const [disableTransforms, setDisableTransforms] = useState(false);
401 const sensors = useSensors(
402 useSensor(PointerSensor, {
403 activationConstraint: { distance: DRAG_THRESHOLD },
404 }),
405 );
406 const overlayModifiers = useMemo<Modifier[]>(() => [
407 ({ transform }) => {
408 const pointer = overlayPointerRef.current;
409 if (!pointer.active) return transform;
410 return {
411 ...transform,
412 x: pointer.startClientX + transform.x - pointer.originLeft - pointer.anchorX,
413 y: pointer.startClientY + transform.y - pointer.originTop - pointer.anchorY,
414 };
415 },
416 ], []);
417
418 useEffect(() => {
419 configRef.current = config;

Callers 1

HomeFunction · 0.90

Calls 12

rafScheduleFunction · 0.90
buildContainerMetricsFunction · 0.85
distanceToRectFunction · 0.85
getPointerGridCellFunction · 0.85
buildPreviewRectsFunction · 0.85
scorePreviewRectFunction · 0.85
candidateContainsCellFunction · 0.85
isPointInsideRectFunction · 0.85
mergeVisibleOrderFunction · 0.85
arraysEqualFunction · 0.85
mergeTransferredOrderFunction · 0.85
readClientPointFunction · 0.85

Tested by

no test coverage detected