import type { SystemStyleObject } from '@invoke-ai/ui-library'; import { Box, Flex, IconButton, Text, Tooltip, useToken } from '@invoke-ai/ui-library'; import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { selectCanvasSettingsSlice, settingsSendToCanvasChanged, } from 'features/controlLayers/store/canvasSettingsSlice'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PiImageBold, PiPaintBrushBold } from 'react-icons/pi'; const TooltipSendToGallery = memo(() => { const { t } = useTranslation(); return ( {t('controlLayers.sendToGallery')} {t('controlLayers.sendToGalleryDesc')} ); }); TooltipSendToGallery.displayName = 'TooltipSendToGallery'; const TooltipSendToCanvas = memo(() => { const { t } = useTranslation(); return ( {t('controlLayers.sendToCanvas')} {t('controlLayers.sendToCanvasDesc')} ); }); TooltipSendToCanvas.displayName = 'TooltipSendToCanvas'; const selectSendToCanvas = createSelector(selectCanvasSettingsSlice, (canvasSettings) => canvasSettings.sendToCanvas); const getSx = (padding: string | number): SystemStyleObject => ({ transition: 'left 0.1s ease-in-out, transform 0.1s ease-in-out', '&[data-checked="true"]': { left: `calc(100% - ${padding})`, transform: 'translateX(-100%)', }, '&[data-checked="false"]': { left: padding, transform: 'translateX(0)', }, }); export const SendToToggle = memo(() => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const sendToCanvas = useAppSelector(selectSendToCanvas); const gap = useToken('space', 1.5); const sx = useMemo(() => getSx(gap), [gap]); const onClickSendToGallery = useCallback(() => { if (!sendToCanvas) { return; } dispatch(settingsSendToCanvasChanged(false)); }, [dispatch, sendToCanvas]); const onClickSendToCanvas = useCallback(() => { if (sendToCanvas) { return; } dispatch(settingsSendToCanvasChanged(true)); }, [dispatch, sendToCanvas]); return ( }> } onClick={onClickSendToGallery} variant={!sendToCanvas ? 'solid' : 'ghost'} colorScheme={!sendToCanvas ? 'invokeBlue' : 'base'} aria-label={t('controlLayers.sendToGallery')} data-checked={!sendToCanvas} w={12} alignSelf="stretch" h="auto" /> }> } onClick={onClickSendToCanvas} variant={sendToCanvas ? 'solid' : 'ghost'} colorScheme={sendToCanvas ? 'invokeGreen' : 'base'} aria-label={t('controlLayers.sendToCanvas')} data-checked={sendToCanvas} w={12} alignSelf="stretch" h="auto" /> ); }); SendToToggle.displayName = 'CanvasSendToToggle';