From 1e6978be6e11984cdcb4def64a3d53164a656243 Mon Sep 17 00:00:00 2001 From: "maxime.batista" Date: Thu, 4 Jan 2024 17:34:40 +0100 Subject: [PATCH] apply suggestions --- .gitignore | 1 + front/components/arrows/BendableArrow.tsx | 61 +++++++++++------------ front/components/editor/CourtPlayer.tsx | 4 +- sql/.guard | 0 4 files changed, 32 insertions(+), 34 deletions(-) delete mode 100644 sql/.guard diff --git a/.gitignore b/.gitignore index 61df6e7..a02dfdf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ vendor composer.lock *.phar /dist +.guard # sqlite database files *.sqlite diff --git a/front/components/arrows/BendableArrow.tsx b/front/components/arrows/BendableArrow.tsx index c69a653..6ecdb44 100644 --- a/front/components/arrows/BendableArrow.tsx +++ b/front/components/arrows/BendableArrow.tsx @@ -7,6 +7,7 @@ import { useLayoutEffect, useRef, useState, + MouseEvent as ReactMouseEvent, } from "react" import { add, @@ -115,6 +116,24 @@ export default function BendableArrow({ const styleWidth = style?.width ?? ArrowStyleDefaults.width + const computeInternalSegments = useCallback((segments: Segment[]) => { + return segments.map((segment, idx) => { + if (idx == 0) { + return { + start: startPos, + controlPoint: segment.controlPoint ?? null, + end: segment.next, + } + } + const start = segments[idx - 1].next + return { + start, + controlPoint: segment.controlPoint ?? null, + end: segment.next, + } + }) + }, [segments, startPos]) + // Cache the segments so that when the user is changing the segments (it moves an ArrowPoint), // it does not unwind to this arrow's component parent until validated. // The changes are validated (meaning that onSegmentsChanges is called) when the @@ -125,30 +144,14 @@ export default function BendableArrow({ // If the (original) segments changes, overwrite the current ones. useLayoutEffect(() => { setInternalSegments(computeInternalSegments(segments)) - }, [startPos, segments]) + }, [startPos, segments, computeInternalSegments]) const [isSelected, setIsSelected] = useState(false) const headRef = useRef(null) const tailRef = useRef(null) - function computeInternalSegments(segments: Segment[]): FullSegment[] { - return segments.map((segment, idx) => { - if (idx == 0) { - return { - start: startPos, - controlPoint: segment.controlPoint ?? null, - end: segment.next, - } - } - const start = segments[idx - 1].next - return { - start, - controlPoint: segment.controlPoint ?? null, - end: segment.next, - } - }) - } + /** * Computes and return the segments edition points @@ -398,14 +401,12 @@ export default function BendableArrow({ } }, [update, containerRef]) - // Inserts a segment where the mouse double clicks on the arrow - useEffect(() => { - if (forceStraight) return - - const addSegment = (e: MouseEvent) => { + const addSegment = useCallback( + (e: ReactMouseEvent) => { + if (forceStraight) return const parentBase = area.current!.getBoundingClientRect() - const clickAbsolutePos: Pos = { x: e.x, y: e.y } + const clickAbsolutePos: Pos = { x: e.pageX, y: e.pageY } const clickPosBaseRatio = ratioWithinBase( clickAbsolutePos, parentBase, @@ -473,14 +474,9 @@ export default function BendableArrow({ }, ), ) - } - - pathRef?.current?.addEventListener("dblclick", addSegment) - - return () => { - pathRef?.current?.removeEventListener("dblclick", addSegment) - } - }, [pathRef, segments, onSegmentsChanges]) + }, + [area, forceStraight, onSegmentsChanges, segments, startPos], + ) return (
{ if (onDeleteRequested && e.key == "Delete") onDeleteRequested() diff --git a/front/components/editor/CourtPlayer.tsx b/front/components/editor/CourtPlayer.tsx index aa120b2..3d5ffde 100644 --- a/front/components/editor/CourtPlayer.tsx +++ b/front/components/editor/CourtPlayer.tsx @@ -17,7 +17,7 @@ export interface PlayerProps { /** * A player that is placed on the court, which can be selected, and moved in the associated bounds * */ -export default function CourtPlayer({ +export default function CourtPlayer({ player, onDrag, onChange, @@ -50,7 +50,7 @@ export default function CourtPlayer({ team: player.team, role: player.role, hasBall: player.hasBall, - } as Player) + }) }}>