|
import { useCamera, useSigma } from '@react-sigma/core' |
|
import { useCallback } from 'react' |
|
import Button from '@/components/ui/Button' |
|
import { ZoomInIcon, ZoomOutIcon, FullscreenIcon, RotateCwIcon, RotateCcwIcon } from 'lucide-react' |
|
import { controlButtonVariant } from '@/lib/constants' |
|
import { useTranslation } from 'react-i18next'; |
|
|
|
|
|
|
|
|
|
const ZoomControl = () => { |
|
const { zoomIn, zoomOut, reset } = useCamera({ duration: 200, factor: 1.5 }) |
|
const sigma = useSigma() |
|
const { t } = useTranslation(); |
|
|
|
const handleZoomIn = useCallback(() => zoomIn(), [zoomIn]) |
|
const handleZoomOut = useCallback(() => zoomOut(), [zoomOut]) |
|
const handleResetZoom = useCallback(() => { |
|
if (!sigma) return |
|
|
|
try { |
|
|
|
sigma.setCustomBBox(null) |
|
sigma.refresh() |
|
|
|
|
|
const graph = sigma.getGraph() |
|
|
|
|
|
if (!graph?.order || graph.nodes().length === 0) { |
|
|
|
reset() |
|
return |
|
} |
|
|
|
sigma.getCamera().animate( |
|
{ x: 0.5, y: 0.5, ratio: 1.1 }, |
|
{ duration: 1000 } |
|
) |
|
} catch (error) { |
|
console.error('Error resetting zoom:', error) |
|
|
|
reset() |
|
} |
|
}, [sigma, reset]) |
|
|
|
const handleRotate = useCallback(() => { |
|
if (!sigma) return |
|
|
|
const camera = sigma.getCamera() |
|
const currentAngle = camera.angle |
|
const newAngle = currentAngle + Math.PI / 8 |
|
|
|
camera.animate( |
|
{ angle: newAngle }, |
|
{ duration: 200 } |
|
) |
|
}, [sigma]) |
|
|
|
const handleRotateCounterClockwise = useCallback(() => { |
|
if (!sigma) return |
|
|
|
const camera = sigma.getCamera() |
|
const currentAngle = camera.angle |
|
const newAngle = currentAngle - Math.PI / 8 |
|
|
|
camera.animate( |
|
{ angle: newAngle }, |
|
{ duration: 200 } |
|
) |
|
}, [sigma]) |
|
|
|
return ( |
|
<> |
|
<Button |
|
variant={controlButtonVariant} |
|
onClick={handleRotate} |
|
tooltip={t('graphPanel.sideBar.zoomControl.rotateCamera')} |
|
size="icon" |
|
> |
|
<RotateCwIcon /> |
|
</Button> |
|
<Button |
|
variant={controlButtonVariant} |
|
onClick={handleRotateCounterClockwise} |
|
tooltip={t('graphPanel.sideBar.zoomControl.rotateCameraCounterClockwise')} |
|
size="icon" |
|
> |
|
<RotateCcwIcon /> |
|
</Button> |
|
<Button |
|
variant={controlButtonVariant} |
|
onClick={handleResetZoom} |
|
tooltip={t('graphPanel.sideBar.zoomControl.resetZoom')} |
|
size="icon" |
|
> |
|
<FullscreenIcon /> |
|
</Button> |
|
<Button variant={controlButtonVariant} onClick={handleZoomIn} tooltip={t('graphPanel.sideBar.zoomControl.zoomIn')} size="icon"> |
|
<ZoomInIcon /> |
|
</Button> |
|
<Button variant={controlButtonVariant} onClick={handleZoomOut} tooltip={t('graphPanel.sideBar.zoomControl.zoomOut')} size="icon"> |
|
<ZoomOutIcon /> |
|
</Button> |
|
</> |
|
) |
|
} |
|
|
|
export default ZoomControl |
|
|