Skip to content

Commit a42fa38

Browse files
committed
loader ui
Signed-off-by: HIMANSHU RAI <[email protected]>
1 parent dd2d1ff commit a42fa38

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

src/sections/Home/Partners-home/index.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from "react";
1+
import React, { useEffect, useState } from "react";
22
import { Container, Row } from "../../../reusecore/Layout";
33
import SectionTitle from "../../../reusecore/SectionTitle";
44
import PartnerItemWrapper from "./partnerSection.style";
@@ -8,7 +8,7 @@ import Slider from "react-slick";
88

99
const settings = {
1010
initialSlide: 1,
11-
lazyLoad: false, // disable slick's lazyLoad
11+
lazyLoad: false, // disabled to avoid visual glitches
1212
arrows: false,
1313
dots: false,
1414
infinite: true,
@@ -30,18 +30,21 @@ const Projects = () => {
3030
const [allImagesLoaded, setAllImagesLoaded] = useState(false);
3131

3232
useEffect(() => {
33-
const imagePromises = partners.map(partner => {
34-
return new Promise((resolve, reject) => {
35-
const img = new Image();
36-
img.src = partner.imageLink;
37-
img.onload = resolve;
38-
img.onerror = reject;
39-
});
40-
});
33+
let loadedCount = 0;
34+
35+
const handleImageLoad = () => {
36+
loadedCount += 1;
37+
if (loadedCount === partners.length) {
38+
setAllImagesLoaded(true);
39+
}
40+
};
4141

42-
Promise.all(imagePromises)
43-
.then(() => setAllImagesLoaded(true))
44-
.catch(() => setAllImagesLoaded(true)); // still render even if some fail
42+
partners.forEach((partner) => {
43+
const img = new Image();
44+
img.src = partner.imageLink;
45+
img.onload = handleImageLoad;
46+
img.onerror = handleImageLoad; // count failed as loaded
47+
});
4548
}, []);
4649

4750
return (
@@ -58,7 +61,11 @@ const Projects = () => {
5861
</Row>
5962
</Container>
6063

61-
{allImagesLoaded ? (
64+
{!allImagesLoaded ? (
65+
<div className="loading-indicator">
66+
<span className="loader" />
67+
</div>
68+
) : (
6269
<Slider {...settings}>
6370
{partners.map((partner, index) => (
6471
<Link className="partner-card" to={partner.imageRoute} key={index}>
@@ -75,8 +82,6 @@ const Projects = () => {
7582
</Link>
7683
))}
7784
</Slider>
78-
) : (
79-
<div style={{ height: "100px", textAlign: "center" }}>Loading...</div>
8085
)}
8186
</PartnerItemWrapper>
8287
);

src/sections/Home/Partners-home/partnerSection.style.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,29 @@ const PartnerItemWrapper = styled.section`
116116
padding: 2.5rem;
117117
}
118118
} */
119+
120+
.loading-indicator {
121+
display: flex;
122+
justify-content: center;
123+
align-items: center;
124+
min-height: 120px;
125+
}
126+
127+
.loader {
128+
width: 32px;
129+
height: 32px;
130+
border: 4px solid rgba(0, 0, 0, 0.2);
131+
border-top: 4px solid ${props => props.theme.green009A89ToGreen00B39F};
132+
border-radius: 50%;
133+
animation: spin 0.8s linear infinite;
134+
}
135+
136+
@keyframes spin {
137+
to {
138+
transform: rotate(360deg);
139+
}
140+
}
141+
119142
`;
120143

121144
export default PartnerItemWrapper;

0 commit comments

Comments
 (0)