All files / platform/core/src/hooks useActiveViewportDisplaySets.ts

91.66% Statements 22/24
60% Branches 3/5
87.5% Functions 7/8
90.9% Lines 20/22

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 63                    55x 30x 30x   30x   35x 35x           30x 30x 30x   30x 6x         6x 5x 5x 5x 5x         6x                     6x 2x       30x        
import { useEffect, useState, useCallback } from 'react';
import { DisplaySet } from '../types';
import { useSystem } from '../';
/**
 * 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 = (): DisplaySet[] => {
  const { servicesManager } = useSystem();
  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;