import { useAppSelector } from 'app/store/storeHooks'; import { useIsRegionFocused } from 'common/hooks/focus'; import { useAssertSingleton } from 'common/hooks/useAssertSingleton'; import { selectIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice'; import { useImageActions } from 'features/gallery/hooks/useImageActions'; import { selectLastSelectedImage } from 'features/gallery/store/gallerySelectors'; import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { memo } from 'react'; import type { ImageDTO } from 'services/api/types'; export const GlobalImageHotkeys = memo(() => { useAssertSingleton('GlobalImageHotkeys'); const imageDTO = useAppSelector(selectLastSelectedImage); if (!imageDTO) { return null; } return ; }); GlobalImageHotkeys.displayName = 'GlobalImageHotkeys'; const GlobalImageHotkeysInternal = memo(({ imageDTO }: { imageDTO: ImageDTO }) => { const isGalleryFocused = useIsRegionFocused('gallery'); const isViewerFocused = useIsRegionFocused('viewer'); const imageActions = useImageActions(imageDTO); const isStaging = useAppSelector(selectIsStaging); const isUpscalingEnabled = useFeatureStatus('upscaling'); useRegisteredHotkeys({ id: 'loadWorkflow', category: 'viewer', callback: imageActions.loadWorkflow, options: { enabled: isGalleryFocused || isViewerFocused }, dependencies: [imageActions.loadWorkflow, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'recallAll', category: 'viewer', callback: imageActions.recallAll, options: { enabled: !isStaging && (isGalleryFocused || isViewerFocused) }, dependencies: [imageActions.recallAll, isStaging, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'recallSeed', category: 'viewer', callback: imageActions.recallSeed, options: { enabled: isGalleryFocused || isViewerFocused }, dependencies: [imageActions.recallSeed, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'recallPrompts', category: 'viewer', callback: imageActions.recallPrompts, options: { enabled: isGalleryFocused || isViewerFocused }, dependencies: [imageActions.recallPrompts, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'remix', category: 'viewer', callback: imageActions.remix, options: { enabled: isGalleryFocused || isViewerFocused }, dependencies: [imageActions.remix, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'useSize', category: 'viewer', callback: imageActions.recallSize, options: { enabled: !isStaging && (isGalleryFocused || isViewerFocused) }, dependencies: [imageActions.recallSize, isStaging, isGalleryFocused, isViewerFocused], }); useRegisteredHotkeys({ id: 'runPostprocessing', category: 'viewer', callback: imageActions.upscale, options: { enabled: isUpscalingEnabled && isViewerFocused }, dependencies: [isUpscalingEnabled, imageDTO, isViewerFocused], }); return null; }); GlobalImageHotkeysInternal.displayName = 'GlobalImageHotkeysInternal';