apply suggestions
continuous-integration/drone/push Build is failing Details

pull/82/head
maxime.batista 1 year ago
parent ec46fb78a2
commit 1e6978be6e

1
.gitignore vendored

@ -8,6 +8,7 @@ vendor
composer.lock composer.lock
*.phar *.phar
/dist /dist
.guard
# sqlite database files # sqlite database files
*.sqlite *.sqlite

@ -7,6 +7,7 @@ import {
useLayoutEffect, useLayoutEffect,
useRef, useRef,
useState, useState,
MouseEvent as ReactMouseEvent,
} from "react" } from "react"
import { import {
add, add,
@ -115,6 +116,24 @@ export default function BendableArrow({
const styleWidth = style?.width ?? ArrowStyleDefaults.width 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), // 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. // it does not unwind to this arrow's component parent until validated.
// The changes are validated (meaning that onSegmentsChanges is called) when the // 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. // If the (original) segments changes, overwrite the current ones.
useLayoutEffect(() => { useLayoutEffect(() => {
setInternalSegments(computeInternalSegments(segments)) setInternalSegments(computeInternalSegments(segments))
}, [startPos, segments]) }, [startPos, segments, computeInternalSegments])
const [isSelected, setIsSelected] = useState(false) const [isSelected, setIsSelected] = useState(false)
const headRef = useRef<HTMLDivElement>(null) const headRef = useRef<HTMLDivElement>(null)
const tailRef = useRef<HTMLDivElement>(null) const tailRef = useRef<HTMLDivElement>(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 * Computes and return the segments edition points
@ -398,14 +401,12 @@ export default function BendableArrow({
} }
}, [update, containerRef]) }, [update, containerRef])
// Inserts a segment where the mouse double clicks on the arrow const addSegment = useCallback(
useEffect(() => { (e: ReactMouseEvent) => {
if (forceStraight) return if (forceStraight) return
const addSegment = (e: MouseEvent) => {
const parentBase = area.current!.getBoundingClientRect() 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( const clickPosBaseRatio = ratioWithinBase(
clickAbsolutePos, clickAbsolutePos,
parentBase, parentBase,
@ -473,14 +474,9 @@ export default function BendableArrow({
}, },
), ),
) )
} },
[area, forceStraight, onSegmentsChanges, segments, startPos],
pathRef?.current?.addEventListener("dblclick", addSegment) )
return () => {
pathRef?.current?.removeEventListener("dblclick", addSegment)
}
}, [pathRef, segments, onSegmentsChanges])
return ( return (
<div <div
@ -503,6 +499,7 @@ export default function BendableArrow({
} }
fill="none" fill="none"
tabIndex={0} tabIndex={0}
onDoubleClick={addSegment}
onKeyUp={(e) => { onKeyUp={(e) => {
if (onDeleteRequested && e.key == "Delete") if (onDeleteRequested && e.key == "Delete")
onDeleteRequested() onDeleteRequested()

@ -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 * A player that is placed on the court, which can be selected, and moved in the associated bounds
* */ * */
export default function CourtPlayer<A extends ReactNode>({ export default function CourtPlayer({
player, player,
onDrag, onDrag,
onChange, onChange,
@ -50,7 +50,7 @@ export default function CourtPlayer<A extends ReactNode>({
team: player.team, team: player.team,
role: player.role, role: player.role,
hasBall: player.hasBall, hasBall: player.hasBall,
} as Player) })
}}> }}>
<div <div
id={player.id} id={player.id}

Loading…
Cancel
Save