import { ArrowsPointingOutIcon, XMarkIcon } from '@heroicons/react/24/outline'; import React, { useState, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useDebounceValueBind } from '../hooks'; import { Slider } from './ui/slider'; interface SizeSettingProps { onWidthChange: (val: number) => void; onHeightChange: (val: number) => void; width: number; height: number; children?: React.ReactNode | Iterable; } export const ResizeDialog: React.FC = (props) => { const { onWidthChange, onHeightChange, width, height, children } = props; const { t } = useTranslation('translation', { keyPrefix: 'main.tabpanel.settings.size_setting' }); const [innerWidth, setInnerWidth] = useDebounceValueBind(width, onWidthChange); const [innerHeight, setInnerHeight] = useDebounceValueBind(height, onHeightChange); const sliderWidthValue = useMemo(() => [Math.sqrt(innerWidth / 1000)], [innerWidth]); const sliderHeightValue = useMemo(() => [Math.sqrt(innerHeight / 1000)], [innerHeight]); return (
{children}
setInnerWidth(Math.round(v ** 2 * 1000))} value={sliderWidthValue} />
{`${t('width')}: ${innerWidth}`}
setInnerHeight(Math.round(v ** 2 * 1000))} value={sliderHeightValue} />
{`${t('height')}: ${innerHeight}`}
); }; const SizeSetting: React.FC = (props) => { const { onWidthChange, onHeightChange, width, height } = props; const [show, setShow] = useState(false); const { t } = useTranslation('translation', { keyPrefix: 'main.tabpanel.settings.size_setting' }); useEffect(() => { if (show) { const closeDialog = () => { setShow(false); }; let subscribed = false; const timer = setTimeout(() => { subscribed = true; document.body.addEventListener('click', closeDialog); }, 200); return () => { clearTimeout(timer); if (subscribed) { document.body.removeEventListener('click', closeDialog); } }; } }, [show]); return (
{ setShow((v) => !v); }} className="w-4 h-4 inline-block mr-0.5 text-gray-900" /> {show && ( <>
{ setShow(false); e.stopPropagation(); }} />
)}
); }; export default SizeSetting;