Skip to content

Commit

Permalink
fix(TransformControls): prefer refcallbacks for handlers (#1095)
Browse files Browse the repository at this point in the history
  • Loading branch information
CodyJasonBennett committed Oct 13, 2022
1 parent d083b16 commit d0b21a6
Showing 1 changed file with 25 additions and 11 deletions.
36 changes: 25 additions & 11 deletions src/core/TransformControls.tsx
Expand Up @@ -86,24 +86,38 @@ export const TransformControls = React.forwardRef<TransformControlsImpl, Transfo
}
}, [controls, defaultControls])

const onChangeRef = React.useRef<(e?: THREE.Event) => void>()
const onMouseDownRef = React.useRef<(e?: THREE.Event) => void>()
const onMouseUpRef = React.useRef<(e?: THREE.Event) => void>()
const onObjectChangeRef = React.useRef<(e?: THREE.Event) => void>()

React.useLayoutEffect(() => (onChangeRef.current = onChange), [onChange])
React.useLayoutEffect(() => (onMouseDownRef.current = onMouseDown), [onMouseDown])
React.useLayoutEffect(() => (onMouseUpRef.current = onMouseUp), [onMouseUp])
React.useLayoutEffect(() => (onObjectChangeRef.current = onObjectChange), [onObjectChange])

React.useEffect(() => {
const callback = (e: THREE.Event) => {
const onChange = (e: THREE.Event) => {
invalidate()
if (onChange) onChange(e)
onChangeRef.current?.(e)
}

controls?.addEventListener?.('change', callback)
if (onMouseDown) controls?.addEventListener?.('mouseDown', onMouseDown)
if (onMouseUp) controls?.addEventListener?.('mouseUp', onMouseUp)
if (onObjectChange) controls?.addEventListener?.('objectChange', onObjectChange)
const onMouseDown = (e: THREE.Event) => onMouseDownRef.current?.(e)
const onMouseUp = (e: THREE.Event) => onMouseUpRef.current?.(e)
const onObjectChange = (e: THREE.Event) => onObjectChangeRef.current?.(e)

controls.addEventListener('change', onChange)
controls.addEventListener('mouseDown', onMouseDown)
controls.addEventListener('mouseUp', onMouseUp)
controls.addEventListener('objectChange', onObjectChange)

return () => {
controls?.removeEventListener?.('change', callback)
if (onMouseDown) controls?.removeEventListener?.('mouseDown', onMouseDown)
if (onMouseUp) controls?.removeEventListener?.('mouseUp', onMouseUp)
if (onObjectChange) controls?.removeEventListener?.('objectChange', onObjectChange)
controls.removeEventListener('change', onChange)
controls.removeEventListener('mouseDown', onMouseDown)
controls.removeEventListener('mouseUp', onMouseUp)
controls.removeEventListener('objectChange', onObjectChange)
}
}, [onChange, onMouseDown, onMouseUp, onObjectChange, controls, invalidate])
}, [invalidate, controls])

React.useEffect(() => {
if (makeDefault) {
Expand Down

1 comment on commit d0b21a6

@vercel
Copy link

@vercel vercel bot commented on d0b21a6 Oct 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.