diff --git a/src/components/common/ImageWithSSRLoad/index.tsx b/src/components/common/ImageWithSSRLoad/index.tsx new file mode 100644 index 00000000..467540c1 --- /dev/null +++ b/src/components/common/ImageWithSSRLoad/index.tsx @@ -0,0 +1,20 @@ +import React, { useEffect, useRef, VFC } from 'react'; + +interface ImgProps + extends React.DetailedHTMLProps, HTMLImageElement> { + onLoad?: () => void; +} + +/** fixes the situation when img not fires onLoad at SSR */ +const ImageWithSSRLoad: VFC = ({ onLoad, ...rest }) => { + const ref = useRef(null); + + useEffect(() => { + if (!ref.current?.complete || !onLoad) return; + onLoad(); + }, [ref, onLoad]); + + return {rest.alt}; +}; + +export { ImageWithSSRLoad }; diff --git a/src/components/containers/CoverBackdrop/index.tsx b/src/components/containers/CoverBackdrop/index.tsx index d5824b58..5030de81 100644 --- a/src/components/containers/CoverBackdrop/index.tsx +++ b/src/components/containers/CoverBackdrop/index.tsx @@ -33,6 +33,9 @@ const CoverBackdrop: FC = ({ cover }) => { className={classNames(styles.cover, { [styles.active]: is_loaded })} style={{ backgroundImage: `url("${image}")` }} > + { + // TODO: use ImageWithSSRLoad here if you will face any bugs + } ); diff --git a/src/components/media/ImagePreloader/index.tsx b/src/components/media/ImagePreloader/index.tsx index fbf73bb8..e09eba94 100644 --- a/src/components/media/ImagePreloader/index.tsx +++ b/src/components/media/ImagePreloader/index.tsx @@ -8,6 +8,7 @@ import { LoaderCircle } from '~/components/input/LoaderCircle'; import { Icon } from '~/components/input/Icon'; import { useResizeHandler } from '~/hooks/dom/useResizeHandler'; import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; +import { ImageWithSSRLoad } from '~/components/common/ImageWithSSRLoad'; interface IProps { file: IFile; @@ -83,7 +84,7 @@ const ImagePreloader: FC = ({ file, color, onLoad, onClick, className }) - ; @@ -89,7 +90,7 @@ const NodeRelatedItem: FC = memo(({ item }) => { )} - loader setIsLoaded(true)} /> + setIsLoaded(true)} /> ); });