import React, { FC, MouseEventHandler, useCallback, useMemo, useState } from 'react'; import classNames from 'classnames'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import styles from './styles.module.scss'; import { IFile } from '~/redux/types'; import { LoaderCircle } from '~/components/input/LoaderCircle'; import { Icon } from '~/components/input/Icon'; import { useResizeHandler } from '~/utils/hooks/useResizeHandler'; interface IProps { file: IFile; onLoad?: () => void; onClick?: MouseEventHandler; className?: string; } const DEFAULT_WIDTH = 1920; const DEFAULT_HEIGHT = 1020; const ImagePreloader: FC = ({ file, onLoad, onClick, className }) => { const [maxHeight, setMaxHeight] = useState(window.innerHeight - 140); const [loaded, setLoaded] = useState(false); const [hasError, setHasError] = useState(false); const onImageLoad = useCallback(() => { setLoaded(true); setHasError(false); if (onLoad) { onLoad(); } }, [setLoaded, onLoad]); const onResize = useCallback(() => { setMaxHeight(window.innerHeight - 140); }, [setMaxHeight]); const onError = useCallback(() => { setHasError(true); }, [setHasError]); const [width, height] = useMemo( () => [file?.metadata?.width || DEFAULT_WIDTH, file?.metadata?.height || DEFAULT_HEIGHT], [file?.metadata] ); useResizeHandler(onResize); return ( <> {!hasError && ( )} {!loaded && !hasError && } {hasError && (
Не удалось получить картинку
)} ); }; export { ImagePreloader };