From 28ac88ec64858565951a4f0d8b4cd96d3be5cc77 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Mon, 21 Jun 2021 17:56:23 +0700 Subject: [PATCH] added error handling on image load --- src/components/media/ImagePreloader/index.tsx | 31 ++++++++++++++----- .../media/ImagePreloader/styles.module.scss | 24 ++++++++++++++ src/sprites/Sprites.tsx | 8 +++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/components/media/ImagePreloader/index.tsx b/src/components/media/ImagePreloader/index.tsx index 6eed8472..31b43dab 100644 --- a/src/components/media/ImagePreloader/index.tsx +++ b/src/components/media/ImagePreloader/index.tsx @@ -6,6 +6,7 @@ import styles from './styles.module.scss'; import { IFile } from '~/redux/types'; import { LoaderCircleInner } from '~/components/input/LoaderCircleInner'; import { LoaderCircle } from '~/components/input/LoaderCircle'; +import { Icon } from '~/components/input/Icon'; interface IProps { file: IFile; @@ -17,9 +18,11 @@ interface IProps { 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(); @@ -30,6 +33,10 @@ const ImagePreloader: FC = ({ file, onLoad, onClick, className }) => { setMaxHeight(window.innerHeight - 140); }, [setMaxHeight]); + const onError = useCallback(() => { + setHasError(true); + }, [setHasError]); + useEffect(() => { window.addEventListener('resize', onResize); @@ -64,12 +71,14 @@ const ImagePreloader: FC = ({ file, onLoad, onClick, className }) => { - + {!hasError && ( + + )} = ({ file, onLoad, onClick, className }) => { onLoad={onImageLoad} style={{ maxHeight }} onClick={onClick} + onError={onError} /> - {!loaded && } + {!loaded && !hasError && } + + {hasError && ( +
+
Не удалось получить картинку
+ +
+ )} ); }; diff --git a/src/components/media/ImagePreloader/styles.module.scss b/src/components/media/ImagePreloader/styles.module.scss index e792017a..0db4b813 100644 --- a/src/components/media/ImagePreloader/styles.module.scss +++ b/src/components/media/ImagePreloader/styles.module.scss @@ -28,3 +28,27 @@ fill: currentColor; } } + +.error { + position: absolute; + right: 30px; + bottom: 40px; + opacity: 0.4; + color: $orange; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + svg { + fill: $orange; + } + + &__text { + max-width: 200px; + text-align: right; + margin-right: $gap; + font: $font_16_semibold; + line-height: 24px; + } +} diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 949c302d..ee948c65 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -302,6 +302,14 @@ const Sprites: FC = () => ( /> + + + + +