Skip to content

Commit bc372b2

Browse files
author
Amr Wagdy
committed
fix: change image src doesn't request re-render
1 parent 117004a commit bc372b2

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

src/Img.js

+13-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react';
22
import Image from 'next/image';
33
import { getImgSRC, processReactNode, generateAlt } from 'cloudimage-responsive-utils';
44

5-
import { computeImageStyles, getWrapperClassname, computeImageSize } from './utils/compute';
5+
import { computeImageStyles, getWrapperClassName, computeImageSize } from './utils/compute';
66
import { parseParams, parseImageSrc } from './utils/parse';
77
import { WRAPPER_STYLES } from './styles.constants';
88

@@ -16,7 +16,7 @@ function Img(props) {
1616
customDomain, domain, token, apiVersion,
1717
doNotReplaceURL: imagesDoNotReplaceURL, baseURL, params: imagesParams,
1818
quality: imagesQuality, layout: imagesLayout, objectFit: imagesObjectFit,
19-
lowPreviewQuality: imagesLowPreviewQuality, transitionDuration: imagesTransitonDuration,
19+
lowPreviewQuality: imagesLowPreviewQuality, transitionDuration: imagesTransitionDuration,
2020
ssr: imagesSsr, objectPosition: imagesObjectPosition, lazyload: imagesLazyload,
2121
} = config;
2222

@@ -25,7 +25,7 @@ function Img(props) {
2525
layout = imagesLayout, objectFit = imagesObjectFit,
2626
lowPreviewQuality = imagesLowPreviewQuality, onImgLoad,
2727
width, height, doNotReplaceURL = imagesDoNotReplaceURL,
28-
className, alt, transitionDuration = imagesTransitonDuration,
28+
className, alt, transitionDuration = imagesTransitionDuration,
2929
style = {}, ssr = imagesSsr, children, background, objectPosition = imagesObjectPosition,
3030
lazyload = imagesLazyload,
3131
} = props;
@@ -35,6 +35,7 @@ function Img(props) {
3535
const [cloudImgSrcSet, setCloudImgSrcSet] = useState('');
3636

3737
const wrapperRef = useRef();
38+
const previousSrc = useRef();
3839

3940
let previousWidth;
4041
const cName = customDomain ? domain : `${token}.${domain}`;
@@ -59,6 +60,7 @@ function Img(props) {
5960

6061
const onImageLoad = (event) => {
6162
setLoaded(true);
63+
previousSrc.current = src;
6264

6365
if (typeof onImgLoad === 'function') {
6466
onImgLoad(event);
@@ -104,27 +106,30 @@ function Img(props) {
104106
}
105107
};
106108

107-
const wrapperClassname = background
108-
? classes.ciBackgroundWrapper : classes[getWrapperClassname(layout)];
109+
const wrapperClassName = background
110+
? classes.ciBackgroundWrapper : classes[getWrapperClassName(layout)];
109111

110112
useEffect(() => {
111113
if (ssr) return;
112114

113115
previousWidth = window.innerWidth;
116+
setLoaded(false);
114117

115118
processImage();
119+
116120
window.addEventListener('resize', handleWindowResize);
117121

118122
return () => {
119123
window.removeEventListener('resize', handleWindowResize);
120124
};
121-
}, []);
125+
}, [src]);
126+
122127

123128
return (
124129
<div
125130
ref={wrapperRef}
126131
style={{ ...WRAPPER_STYLES, ...style }}
127-
className={`${wrapperClassname}${className ? ` ${className}` : ''}`}
132+
className={`${wrapperClassName}${className ? ` ${className}` : ''}`}
128133
>
129134
<Image
130135
src={src}
@@ -157,7 +162,7 @@ function Img(props) {
157162
srcSet={cloudImgSrcSet}
158163
alt={_alt}
159164
onLoad={onImageLoad}
160-
style={computeImageStyles(loaded, transitionDuration, objectFit, objectPosition)}
165+
style={computeImageStyles(loaded, transitionDuration, objectFit, objectPosition, !previousSrc.current)}
161166
className={classes.ciSsgImage}
162167
loading={lazyload ? 'lazy' : 'eager'}
163168
/>

src/utils/compute.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@ import { LAYOUTS } from '../constants';
22
import { LOADED_IMAGE_STYLES } from '../styles.constants';
33

44

5-
const computeImageStyles = (loaded, transitionDuration, objectFit, objectPosition) => ({
6-
transitionTimingFunction: 'ease',
7-
willChange: 'opacity, transform',
5+
const computeImageStyles = (loaded, transitionDuration, objectFit, objectPosition, transitionEnabled) => ({
6+
transitionTimingFunction: 'ease-out',
87
transitionDuration,
9-
transitionDelay: '100ms',
10-
transitionProperty: 'opacity, transform',
8+
transitionProperty: transitionEnabled ? 'opacity, transform' : 'none',
9+
transitionDelay: transitionEnabled ? '100ms' : 0,
1110
opacity: 0,
1211
...(objectFit ? { objectFit } : {}),
1312
...(objectPosition ? { objectPosition } : {}),
1413
...(loaded ? LOADED_IMAGE_STYLES : {}),
1514
});
1615

17-
const getWrapperClassname = (layout) => {
16+
const getWrapperClassName = (layout) => {
1817
switch (layout) {
1918
case LAYOUTS.FIXED: {
2019
return 'ciFixedImage';
@@ -47,6 +46,6 @@ const computeImageSize = (layout, width, height) => {
4746

4847
export {
4948
computeImageStyles,
50-
getWrapperClassname,
49+
getWrapperClassName,
5150
computeImageSize,
5251
};

0 commit comments

Comments
 (0)