Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 34x 20x 20x 24x 24x 20x 20x 20x 20x 2x 2x 4x 4x 4x 4x 2x 2x 20x | import { useEffect, useState, useCallback } from 'react'; import { DisplaySet } from '../types'; /** * Hook that listens for changes in the active viewport and its display sets. * It returns the display sets associated with the active viewport. * * @param servicesManager - Services manager instance * @returns Array of display sets for the active viewport */ const useActiveViewportDisplaySets = ({ servicesManager }): DisplaySet[] => { const { displaySetService, viewportGridService } = servicesManager.services; // Move this function outside useEffect and memoize it const getDisplaySetsForViewport = useCallback( (viewportId: string) => { const displaySetUIDs = viewportGridService.getDisplaySetsUIDsForViewport(viewportId) || []; return displaySetUIDs.map(uid => displaySetService.getDisplaySetByUID(uid)).filter(Boolean); }, [displaySetService, viewportGridService] ); // Get initial state const viewportId = viewportGridService.getActiveViewportId(); const displaySetsNew = getDisplaySetsForViewport(viewportId) || []; const [displaySets, setDisplaySets] = useState<DisplaySet[]>(displaySetsNew); useEffect(() => { const handleViewportChange = ({ viewportId }) => { const displaySetsNew = getDisplaySetsForViewport(viewportId); setDisplaySets(displaySetsNew); }; const handleGridStateChange = ({ state }) => { const activeViewportId = state.activeViewportId; if (activeViewportId) { const displaySetsNew = getDisplaySetsForViewport(activeViewportId); setDisplaySets(displaySetsNew); } }; // Subscribe to viewport changes const subscriptions = [ viewportGridService.subscribe( viewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED, handleViewportChange ), viewportGridService.subscribe( viewportGridService.EVENTS.GRID_STATE_CHANGED, handleGridStateChange ), ]; return () => { subscriptions.forEach(subscription => subscription.unsubscribe()); }; }, [viewportGridService, getDisplaySetsForViewport]); // Only depend on stable references return displaySets; }; export default useActiveViewportDisplaySets; |