File size: 2,194 Bytes
8a37e0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { entitySelected } from 'features/controlLayers/store/canvasSlice';
import {
  selectBookmarkedEntityIdentifier,
  selectSelectedEntityIdentifier,
} from 'features/controlLayers/store/selectors';
import type { CanvasEntityIdentifier } from 'features/controlLayers/store/types';
import { useImageViewer } from 'features/gallery/components/ImageViewer/useImageViewer';
import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData';
import { useCallback, useEffect, useState } from 'react';

export const useCanvasEntityQuickSwitchHotkey = () => {
  const dispatch = useAppDispatch();
  const [prev, setPrev] = useState<CanvasEntityIdentifier | null>(null);
  const [current, setCurrent] = useState<CanvasEntityIdentifier | null>(null);
  const selected = useAppSelector(selectSelectedEntityIdentifier);
  const bookmarked = useAppSelector(selectBookmarkedEntityIdentifier);
  const imageViewer = useImageViewer();

  // Update prev and current when selected entity changes
  useEffect(() => {
    if (current?.id !== selected?.id) {
      setPrev(current);
      setCurrent(selected);
    }
  }, [current, selected]);

  const onQuickSwitch = useCallback(() => {
    if (bookmarked) {
      if (current?.id !== bookmarked.id) {
        // Switch between current (non-bookmarked) and bookmarked
        setPrev(current);
        setCurrent(bookmarked);
        dispatch(entitySelected({ entityIdentifier: bookmarked }));
      } else if (prev) {
        // Switch back to the last non-bookmarked entity
        setCurrent(prev);
        dispatch(entitySelected({ entityIdentifier: prev }));
      }
    } else if (prev !== null && current !== null) {
      // Switch between prev and current if no bookmarked entity
      setPrev(current);
      setCurrent(prev);
      dispatch(entitySelected({ entityIdentifier: prev }));
    }
  }, [bookmarked, current, dispatch, prev]);

  useRegisteredHotkeys({
    id: 'quickSwitch',
    category: 'canvas',
    callback: onQuickSwitch,
    options: { enabled: !imageViewer.isOpen },
    dependencies: [onQuickSwitch, imageViewer.isOpen],
  });
};