|
import { IconButton, Menu, MenuButton, MenuGroup, MenuItem, MenuList } from '@invoke-ai/ui-library'; |
|
import { useAppDispatch } from 'app/store/storeHooks'; |
|
import { |
|
useNewCanvasSession, |
|
useNewGallerySession, |
|
} from 'features/controlLayers/components/NewSessionConfirmationAlertDialog'; |
|
import { useClearQueue } from 'features/queue/components/ClearQueueConfirmationAlertDialog'; |
|
import { QueueCountBadge } from 'features/queue/components/QueueCountBadge'; |
|
import { usePauseProcessor } from 'features/queue/hooks/usePauseProcessor'; |
|
import { useResumeProcessor } from 'features/queue/hooks/useResumeProcessor'; |
|
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; |
|
import { setActiveTab } from 'features/ui/store/uiSlice'; |
|
import { memo, useCallback, useRef } from 'react'; |
|
import { useTranslation } from 'react-i18next'; |
|
import { |
|
PiImageBold, |
|
PiListBold, |
|
PiPaintBrushBold, |
|
PiPauseFill, |
|
PiPlayFill, |
|
PiQueueBold, |
|
PiTrashSimpleBold, |
|
PiXBold, |
|
} from 'react-icons/pi'; |
|
|
|
export const QueueActionsMenuButton = memo(() => { |
|
const ref = useRef<HTMLDivElement>(null); |
|
const dispatch = useAppDispatch(); |
|
const { t } = useTranslation(); |
|
const isPauseEnabled = useFeatureStatus('pauseQueue'); |
|
const isResumeEnabled = useFeatureStatus('resumeQueue'); |
|
const { newGallerySessionWithDialog } = useNewGallerySession(); |
|
const { newCanvasSessionWithDialog } = useNewCanvasSession(); |
|
const clearQueue = useClearQueue(); |
|
const { |
|
resumeProcessor, |
|
isLoading: isLoadingResumeProcessor, |
|
isDisabled: isDisabledResumeProcessor, |
|
} = useResumeProcessor(); |
|
const { |
|
pauseProcessor, |
|
isLoading: isLoadingPauseProcessor, |
|
isDisabled: isDisabledPauseProcessor, |
|
} = usePauseProcessor(); |
|
const openQueue = useCallback(() => { |
|
dispatch(setActiveTab('queue')); |
|
}, [dispatch]); |
|
|
|
return ( |
|
<> |
|
<Menu placement="bottom-end"> |
|
<MenuButton ref={ref} as={IconButton} size="lg" aria-label="Queue Actions Menu" icon={<PiListBold />} /> |
|
<MenuList> |
|
<MenuGroup title={t('common.new')}> |
|
<MenuItem icon={<PiImageBold />} onClick={newGallerySessionWithDialog}> |
|
{t('controlLayers.newGallerySession')} |
|
</MenuItem> |
|
<MenuItem icon={<PiPaintBrushBold />} onClick={newCanvasSessionWithDialog}> |
|
{t('controlLayers.newCanvasSession')} |
|
</MenuItem> |
|
</MenuGroup> |
|
<MenuGroup title={t('queue.queue')}> |
|
<MenuItem |
|
isDestructive |
|
icon={<PiXBold />} |
|
onClick={clearQueue.openDialog} |
|
isLoading={clearQueue.isLoading} |
|
isDisabled={clearQueue.isDisabled} |
|
> |
|
{t('queue.cancelTooltip')} |
|
</MenuItem> |
|
<MenuItem |
|
isDestructive |
|
icon={<PiTrashSimpleBold />} |
|
onClick={clearQueue.openDialog} |
|
isLoading={clearQueue.isLoading} |
|
isDisabled={clearQueue.isDisabled} |
|
> |
|
{t('queue.clearTooltip')} |
|
</MenuItem> |
|
{isResumeEnabled && ( |
|
<MenuItem |
|
icon={<PiPlayFill />} |
|
onClick={resumeProcessor} |
|
isLoading={isLoadingResumeProcessor} |
|
isDisabled={isDisabledResumeProcessor} |
|
> |
|
{t('queue.resumeTooltip')} |
|
</MenuItem> |
|
)} |
|
{isPauseEnabled && ( |
|
<MenuItem |
|
icon={<PiPauseFill />} |
|
onClick={pauseProcessor} |
|
isLoading={isLoadingPauseProcessor} |
|
isDisabled={isDisabledPauseProcessor} |
|
> |
|
{t('queue.pauseTooltip')} |
|
</MenuItem> |
|
)} |
|
<MenuItem icon={<PiQueueBold />} onClick={openQueue}> |
|
{t('queue.openQueue')} |
|
</MenuItem> |
|
</MenuGroup> |
|
</MenuList> |
|
</Menu> |
|
{/* The badge is dynamically positioned, needs a ref to the target element */} |
|
<QueueCountBadge targetRef={ref} /> |
|
</> |
|
); |
|
}); |
|
|
|
QueueActionsMenuButton.displayName = 'QueueActionsMenuButton'; |
|
|