import type { SystemStyleObject } from '@invoke-ai/ui-library'; import { Box, Button, chakra, Flex, Icon, Popover, PopoverArrow, PopoverBody, PopoverContent, PopoverTrigger, Portal, Text, useCheckbox, useToken, } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { selectSendToCanvas, settingsSendToCanvasChanged } from 'features/controlLayers/store/canvasSettingsSlice'; import { selectIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice'; import { $imageViewer } from 'features/gallery/components/ImageViewer/useImageViewer'; import { activeTabCanvasRightPanelChanged, setActiveTab } from 'features/ui/store/uiSlice'; import type { ChangeEvent, PropsWithChildren } from 'react'; import { memo, useCallback, useMemo } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { PiImageBold, PiPaintBrushBold } from 'react-icons/pi'; const getSx = (padding: string | number): SystemStyleObject => ({ bg: 'base.700', w: '72px', cursor: 'pointer', '&[data-checked]': { '.thumb': { left: `calc(100% - ${padding})`, transform: 'translateX(-100%)', bg: 'invokeGreen.300', }, '.unchecked-icon': { color: 'base.50', opacity: 0.4, }, '.checked-icon': { color: 'base.900', opacity: 1, }, }, '&[data-disabled]': { bg: 'base.700', '.thumb': { bg: 'base.500', }, '.unchecked-icon': { color: 'base.800', }, '.checked-icon': { color: 'base.800', }, }, '.thumb': { transition: 'left 0.1s ease-in-out, transform 0.1s ease-in-out', left: padding, transform: 'translateX(0)', bg: 'invokeBlue.400', shadow: 'md', }, '.unchecked-icon': { color: 'base.900', opacity: 1, }, '.checked-icon': { color: 'base.50', opacity: 0.4, }, }); export const SendToToggle = memo(() => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const sendToCanvas = useAppSelector(selectSendToCanvas); const isStaging = useAppSelector(selectIsStaging); const gap = useToken('space', 1); const sx = useMemo(() => getSx(gap), [gap]); const onChange = useCallback( (e: ChangeEvent) => { dispatch(settingsSendToCanvasChanged(e.target.checked)); }, [dispatch] ); const { getCheckboxProps, getInputProps, htmlProps } = useCheckbox({ onChange, isChecked: sendToCanvas, isDisabled: isStaging, }); return ( ); }); SendToToggle.displayName = 'SendToToggle'; const TooltipContent = memo(() => { const { t } = useTranslation(); const sendToCanvas = useAppSelector(selectSendToCanvas); const isStaging = useAppSelector(selectIsStaging); if (isStaging) { return ( {t('controlLayers.sendingToCanvas')} }} /> ); } return ( {sendToCanvas ? t('controlLayers.sendToCanvas') : t('controlLayers.sendToGallery')} {sendToCanvas ? t('controlLayers.sendToCanvasDesc') : t('controlLayers.sendToGalleryDesc')} ); }); TooltipContent.displayName = 'TooltipContent'; const ActivateCanvasButton = memo((props: PropsWithChildren) => { const dispatch = useAppDispatch(); const onClick = useCallback(() => { dispatch(setActiveTab('canvas')); dispatch(activeTabCanvasRightPanelChanged('layers')); $imageViewer.set(false); }, [dispatch]); return ( ); }); ActivateCanvasButton.displayName = 'ActivateCanvasButton';