@@ -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
0 commit comments