import { classNames, IconType } from '@standardnotes/snjs' import { FunctionComponent, useCallback, useEffect, useState } from 'react' import IconButton from '../Button/IconButton' import { ImageZoomLevelProps } from './ImageZoomLevelProps' type Props = { objectUrl: string isEmbeddedInSuper: boolean } & ImageZoomLevelProps const MinimumZoomPercent = 10 const DefaultZoomPercent = 100 const MaximumZoomPercent = 1000 const ZoomPercentModifier = 10 const PercentageDivisor = 100 const ImagePreview: FunctionComponent = ({ objectUrl, isEmbeddedInSuper, imageZoomLevel, setImageZoomLevel, }) => { const [imageHeight, setImageHeight] = useState(0) const [imageZoomPercent, setImageZoomPercent] = useState(imageZoomLevel ? imageZoomLevel : DefaultZoomPercent) const [isZoomInputVisible, setIsZoomInputVisible] = useState(false) useEffect(() => { setImageZoomPercent(imageZoomLevel ? imageZoomLevel : DefaultZoomPercent) }, [imageZoomLevel]) const setImageZoom = useCallback( (zoomLevel: number) => { setImageZoomPercent(zoomLevel) setImageZoomLevel?.(zoomLevel) }, [setImageZoomLevel], ) useEffect(() => { const image = new Image() image.src = objectUrl image.onload = () => { setImageHeight(image.height) } }, [objectUrl]) const heightIfEmbedded = imageHeight * (imageZoomPercent / PercentageDivisor) return (
{isEmbeddedInSuper ? 'Size' : 'Zoom'}: { const newPercent = imageZoomPercent - ZoomPercentModifier if (newPercent >= ZoomPercentModifier) { setImageZoom(newPercent) } else { setImageZoom(imageZoomPercent) } }} /> {isZoomInputVisible ? (
{ event.stopPropagation() if (event.key === 'Enter') { const value = parseInt(event.currentTarget.value) if (value >= MinimumZoomPercent && value <= MaximumZoomPercent) { setImageZoom(value) } setIsZoomInputVisible(false) } }} onBlur={(event) => { setIsZoomInputVisible(false) const value = parseInt(event.currentTarget.value) if (value >= MinimumZoomPercent && value <= MaximumZoomPercent) { setImageZoom(value) } }} /> %
) : ( )} { setImageZoom(imageZoomPercent + ZoomPercentModifier) }} />
) } export default ImagePreview