1+ /* eslint react-hooks/exhaustive-deps: 1 */
12import * as React from 'react'
23import { Object3D } from 'three'
34import { useThree , useFrame } from '@react-three/fiber'
45import { Falsey } from 'utility-types'
56
6- type HelperType = Object3D & { update : ( ) => void ; dispose : ( ) => void }
7- type HelperConstructor = new ( ...args : any [ ] ) => any
8- type HelperArgs < T > = T extends [ infer _ , ...infer R ] ? R : never
7+ type HelperConstructor = new ( ...args : any [ ] ) => Object3D & { update : ( ) => void ; dispose ?: ( ) => void }
8+ type HelperArgs < T > = T extends [ any , ...infer R ] ? R : never
99
10- export function useHelper < T extends HelperConstructor > (
11- object3D : React . MutableRefObject < Object3D > | Falsey ,
12- helperConstructor : T ,
13- ...args : HelperArgs < ConstructorParameters < T > >
10+ export function useHelper < H extends HelperConstructor > (
11+ object3D : React . RefObject < ConstructorParameters < H > [ 0 ] > | Falsey ,
12+ helperConstructor : H ,
13+ ...args : HelperArgs < ConstructorParameters < H > >
1414) {
15- const helper = React . useRef < HelperType > ( )
15+ const helper = React . useRef < InstanceType < H > > ( null ! )
1616 const scene = useThree ( ( state ) => state . scene )
1717 React . useLayoutEffect ( ( ) => {
18- let currentHelper : HelperType = undefined !
18+ let currentHelper : InstanceType < H > = undefined !
1919
2020 if ( object3D && object3D ?. current && helperConstructor ) {
2121 helper . current = currentHelper = new ( helperConstructor as any ) ( object3D . current , ...args )
@@ -26,28 +26,28 @@ export function useHelper<T extends HelperConstructor>(
2626 currentHelper . traverse ( ( child ) => ( child . raycast = ( ) => null ) )
2727 scene . add ( currentHelper )
2828 return ( ) => {
29- helper . current = undefined
29+ helper . current = null !
3030 scene . remove ( currentHelper )
3131 currentHelper . dispose ?.( )
3232 }
3333 }
34- } , [ scene , helperConstructor , object3D , ... args ] )
34+ } , [ scene , helperConstructor , object3D , args ] )
3535
3636 useFrame ( ( ) => void helper . current ?. update ?.( ) )
3737 return helper
3838}
3939
4040//
4141
42- export type HelperProps < T extends HelperConstructor > = {
43- type : T
44- args ?: HelperArgs < ConstructorParameters < T > >
42+ export type HelperProps < H extends HelperConstructor > = {
43+ type : H
44+ args ?: HelperArgs < ConstructorParameters < H > >
4545}
4646
47- export const Helper = < T extends HelperConstructor > ( {
47+ export const Helper = < H extends HelperConstructor > ( {
4848 type : helperConstructor ,
4949 args = [ ] as never ,
50- } : HelperProps < T > ) => {
50+ } : HelperProps < H > ) => {
5151 const thisRef = React . useRef < Object3D > ( null ! )
5252 const parentRef = React . useRef < Object3D > ( null ! )
5353
0 commit comments