1+ import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData' ;
12import AbstractImageMapper , {
23 vtkAbstractImageMapper ,
34} from '@kitware/vtk.js/Rendering/Core/AbstractImageMapper' ;
@@ -23,13 +24,13 @@ import { IDownstream, IRepresentation } from '../types';
2324import { compareShallowObject } from '../utils/comparators' ;
2425import useBooleanAccumulator from '../utils/useBooleanAccumulator' ;
2526import useComparableEffect from '../utils/useComparableEffect' ;
26- import useLatest from '../utils/useLatest' ;
2727import {
2828 DownstreamContext ,
2929 RepresentationContext ,
3030 useRendererContext ,
3131} from './contexts' ;
3232import useColorTransferFunction from './modules/useColorTransferFunction' ;
33+ import useDataEvents from './modules/useDataEvents' ;
3334import useMapper from './modules/useMapper' ;
3435import useProp from './modules/useProp' ;
3536
@@ -162,6 +163,11 @@ export default forwardRef(function SliceRepresentation(
162163 return getInternalMapper ( ) ;
163164 } , [ mapperInstance , getInternalMapper ] ) ;
164165
166+ const getInputData = useCallback (
167+ ( ) => getMapper ( ) . getInputData ( ) ,
168+ [ getMapper ]
169+ ) ;
170+
165171 // --- actor --- //
166172
167173 const actorProps = {
@@ -254,15 +260,15 @@ export default forwardRef(function SliceRepresentation(
254260
255261 // --- events --- //
256262
257- const onDataAvailable = useLatest ( props . onDataAvailable ) ;
263+ const { dataChangedEvent, dataAvailableEvent } =
264+ useDataEvents < vtkImageData > ( props ) ;
265+
266+ // trigger data available event
258267 useEffect ( ( ) => {
259268 if ( dataAvailable ) {
260- // trigger onDataAvailable after making updates to the actor and mapper
261- onDataAvailable . current ?.( ) ;
269+ dataAvailableEvent . current . dispatchEvent ( getInputData ( ) ) ;
262270 }
263- // onDataAvailable is a ref
264- // eslint-disable-next-line react-hooks/exhaustive-deps
265- } , [ dataAvailable ] ) ;
271+ } , [ dataAvailable , dataAvailableEvent , getInputData ] ) ;
266272
267273 // --- //
268274
@@ -278,6 +284,7 @@ export default forwardRef(function SliceRepresentation(
278284 const representation = useMemo < IRepresentation > (
279285 ( ) => ( {
280286 dataChanged : ( ) => {
287+ dataChangedEvent . current . dispatchEvent ( getInputData ( ) ) ;
281288 renderer . requestRender ( ) ;
282289 } ,
283290 dataAvailable : ( available = true ) => {
@@ -286,8 +293,17 @@ export default forwardRef(function SliceRepresentation(
286293 } ,
287294 getActor,
288295 getMapper,
296+ onDataAvailable : ( cb ) => dataAvailableEvent . current . addEventListener ( cb ) ,
297+ onDataChanged : ( cb ) => dataChangedEvent . current . addEventListener ( cb ) ,
289298 } ) ,
290- [ renderer , getActor , getMapper ]
299+ [
300+ renderer ,
301+ getActor ,
302+ getMapper ,
303+ getInputData ,
304+ dataAvailableEvent ,
305+ dataChangedEvent ,
306+ ]
291307 ) ;
292308
293309 const downstream = useMemo < IDownstream > (
0 commit comments