Skip to content

Commit 5dd87c9

Browse files
authored
Merge pull request #19 from Guzzler/feature/lqip-lazy-loading-in-react
Feature/LQIP and Lazy Loading Implementation Changes for IKImages as per VUE.js
2 parents f790e50 + 7451c14 commit 5dd87c9

File tree

2 files changed

+71
-16
lines changed

2 files changed

+71
-16
lines changed

src/components/IKImage/IKImage.js

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class IKImage extends ImageKitComponent {
88
this.imageRef = React.createRef();
99
this.state = {};
1010

11-
let state = { url: undefined };
11+
let state = { url: undefined, imageLoaded: false };
1212
this.state = Object.assign(state, this.prepareState(props, context));
1313
}
1414

@@ -33,35 +33,88 @@ class IKImage extends ImageKitComponent {
3333
return state;
3434
}
3535

36-
lqipload(quality) {
36+
lqipload(quality, blur, threshold) {
37+
const finalQuality = parseInt((quality || threshold), 10) || 20;
38+
const finalBlur = parseInt(blur, 10) || 6;
3739
let url = this.state.url;
3840
let lqip = "";
3941
if (this.props.path !== undefined) {
4042
let newUrl = url.split("tr:");
4143
if (newUrl[0] === url) {
4244
let newUrl = url.split("/");
43-
newUrl = `${newUrl[0]}//${newUrl[2]}/${newUrl[3]}/tr:q-${quality}/${newUrl[4]}`;
45+
newUrl = `${newUrl[0]}//${newUrl[2]}/${newUrl[3]}/tr:q-${finalQuality},bl-${finalBlur}/${newUrl[4]}`;
4446
lqip = `${newUrl}`;
4547
} else {
46-
newUrl = `${newUrl[0]}tr:q-${quality},${newUrl[1]}`;
48+
newUrl = `${newUrl[0]}tr:q-${finalQuality},bl-${finalBlur},${newUrl[1]}`;
4749
lqip = `${newUrl}`;
4850
}
4951
} else {
5052
if(url.includes("tr")){
51-
lqip = `${url}&q-${quality}`;
53+
lqip = `${url}&q-${finalQuality},bl-${finalBlur}`;
5254
}
5355
else {
54-
lqip = `${url}&tr=q-${quality}`;
56+
lqip = `${url}&tr=q-${finalQuality},bl-${finalBlur}`;
5557
}
5658

5759
}
5860
return lqip;
5961
}
6062

63+
getFinalImageSrcURL(loading, lqip){
64+
65+
/*
66+
No lazy loading no lqip
67+
src=originalImage
68+
No lazy loading lqip
69+
src=lqip
70+
src=originalImage (when loaded)
71+
lazy loading and no lqip
72+
src=''
73+
onIntersect:
74+
src=originalImage
75+
lazy loading and lqip
76+
src=lqip
77+
onIntersect:
78+
src=originalImage (when loaded)
79+
*/
80+
81+
const {
82+
imageLoaded,
83+
isIntersecting,
84+
} = this.state;
85+
86+
const {
87+
url
88+
} = this.state;
89+
90+
if (loading !== "lazy" && lqip === null) {
91+
return url;
92+
} else if (loading !== "lazy" && lqip && lqip.active) {
93+
if (imageLoaded) {
94+
return url;
95+
} else {
96+
return lqipload(lqip.quality, lqip.blur, lqip.threshold);
97+
}
98+
} else if (loading === "lazy" && lqip === null) {
99+
if (isIntersecting) {
100+
return url;
101+
} else {
102+
return "";
103+
}
104+
} else if (loading === "lazy" && lqip && lqip.active) {
105+
if (isIntersecting && imageLoaded) {
106+
return url;
107+
} else {
108+
return lqipload(lqip.quality, lqip.blur, lqip.threshold);
109+
}
110+
}
111+
}
112+
61113
componentDidMount() {
62114
const imageObserver = new IntersectionObserver(function (entry, observer) {
63115
if (entry[0].isIntersecting) {
64116
let image = entry[0].target;
117+
this.setState({isIntersecting: true});
65118
image.src = url;
66119
imageObserver.unobserve(image);
67120
}
@@ -83,15 +136,16 @@ class IKImage extends ImageKitComponent {
83136
let { url, alt } = this.state;
84137
const props = { ...this.props };
85138
const { nonImageKitProps } = extractImageKitProps(props);
86-
const lqip = props.lqip;
87-
88-
if (lqip !== undefined && lqip.active === true) {
89-
const { quality } = this.props.lqip;
90-
const url = this.lqipload(quality);
91-
return < img src={url} {...nonImageKitProps} ref={this.imageRef} alt={alt} />;
92-
} else {
93-
return < img src={url} {...nonImageKitProps} ref={this.imageRef} alt={alt} />;
94-
}
139+
const { lqip, loading } = props;
140+
const url = getfinalImageSrcURL(loading, lqip);
141+
142+
return <img
143+
src={url}
144+
{...nonImageKitProps}
145+
ref={this.imageRef}
146+
alt={alt}
147+
onLoad={() => this.setState({imageLoaded: true})}
148+
/>;
95149
}
96150
}
97151

src/util/extractImageKitProps.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const IMAGEKIT_PROPS = {
1414
responseFields: true,
1515
isPrivateFile: true,
1616
folder: true,
17-
customCoordinates: true
17+
customCoordinates: true,
18+
loading: true,
1819
};
1920

2021
const isDefined = (props, key) => {

0 commit comments

Comments
 (0)