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

82.6% Statements 19/23
60% Branches 3/5
62.5% Functions 5/8
85.71% Lines 18/21

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;