Skip to content

Commit bf3b4b0

Browse files
committed
Added shimmer
1 parent 7c8bc87 commit bf3b4b0

File tree

3 files changed

+131
-15
lines changed

3 files changed

+131
-15
lines changed

Day-25-Movie-Search-App/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<meta charset="UTF-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
77
<link rel="stylesheet" href="style.css">
8+
<link rel="stylesheet" href="shimmer.css">
89
<link href="https://cdn.jsdelivr.net/npm/[email protected]/fonts/remixicon.css" rel="stylesheet" />
910
<title>Movie Search App</title>
1011
</head>

Day-25-Movie-Search-App/script.js

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const API = "41357241";
22
const button = document.querySelector("button");
33
const searchIcon = document.querySelector("#searchIcon");
44
const toggle = document.querySelector("#toggle");
5+
const search = document.querySelector("#search");
56

67
//1. Toggle sun moon ✅
78
toggle.addEventListener("click", () => {
@@ -24,25 +25,31 @@ document.addEventListener("keydown", (event) => {
2425
(event.type = "click" && event.target === searchBtn)
2526
) {
2627
fetchMovie();
28+
search.value = "";
2729
}
2830
});
2931

3032
async function fetchMovie() {
31-
const response = await fetch(
32-
`https://www.omdbapi.com/?s=${search.value}&apikey=${API}`
33-
);
34-
const data = await response.json();
35-
const imdbId = data.Search.map((item) => item.imdbID);
36-
const arr = await Promise.all(
37-
imdbId.map(async (id) => {
38-
const response = await fetch(
39-
`https://www.omdbapi.com/?i=${id}&apikey=${API}`
40-
);
41-
return response.json();
42-
})
43-
);
44-
console.log(arr);
45-
populateData(arr);
33+
showShimmer();
34+
try {
35+
const response = await fetch(
36+
`https://www.omdbapi.com/?s=${search.value}&apikey=${API}`
37+
);
38+
const data = await response.json();
39+
const imdbId = data.Search.map((item) => item.imdbID);
40+
const arr = await Promise.all(
41+
imdbId.map(async (id) => {
42+
const response = await fetch(
43+
`https://www.omdbapi.com/?i=${id}&apikey=${API}`
44+
);
45+
return response.json();
46+
})
47+
);
48+
hideShimmer();
49+
populateData(arr);
50+
} catch (error) {
51+
console.error("Error aya", error);
52+
}
4653
}
4754

4855
// 4.after fetching data populate it to container class ✅
@@ -98,3 +105,36 @@ function popup(movie) {
98105
document.querySelector(".popupContainer").classList.remove("show");
99106
});
100107
}
108+
109+
function showShimmer() {
110+
const container = document.querySelector(".container");
111+
container.innerHTML = `
112+
<div class="shimmer-container">
113+
<div class="shimmer-movie-detail">
114+
<div class="shimmer-image"></div>
115+
<div class="shimmer-rating"></div>
116+
<div class="shimmer-title"></div>
117+
<div class="shimmer-year"></div>
118+
<div class="shimmer-button"></div>
119+
</div>
120+
<div class="shimmer-movie-detail">
121+
<div class="shimmer-image"></div>
122+
<div class="shimmer-rating"></div>
123+
<div class="shimmer-title"></div>
124+
<div class="shimmer-year"></div>
125+
<div class="shimmer-button"></div>
126+
</div>
127+
<div class="shimmer-movie-detail">
128+
<div class="shimmer-image"></div>
129+
<div class="shimmer-rating"></div>
130+
<div class="shimmer-title"></div>
131+
<div class="shimmer-year"></div>
132+
<div class="shimmer-button"></div>
133+
</div>
134+
</div>`;
135+
}
136+
137+
function hideShimmer() {
138+
const container = document.querySelector(".container");
139+
container.innerHTML = ""; // Clear shimmer effect
140+
}

Day-25-Movie-Search-App/shimmer.css

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
.shimmer-container {
2+
display: flex;
3+
flex-wrap: wrap;
4+
}
5+
6+
.shimmer-movie-detail {
7+
width: 200px;
8+
padding: 10px;
9+
background-color: #f0f0f0;
10+
margin: 10px;
11+
border-radius: 10px;
12+
position: relative;
13+
overflow: hidden;
14+
}
15+
16+
.shimmer-image,
17+
.shimmer-rating,
18+
.shimmer-title,
19+
.shimmer-year,
20+
.shimmer-button {
21+
background-color: #e0e0e0;
22+
border-radius: 5px;
23+
}
24+
25+
.shimmer-image {
26+
width: 100%;
27+
height: 250px;
28+
}
29+
30+
.shimmer-rating,
31+
.shimmer-title,
32+
.shimmer-year {
33+
height: 20px;
34+
margin-top: 10px;
35+
}
36+
37+
.shimmer-rating {
38+
width: 30%;
39+
}
40+
41+
.shimmer-title {
42+
width: 80%;
43+
}
44+
45+
.shimmer-year {
46+
width: 50%;
47+
}
48+
49+
.shimmer-button {
50+
width: 100%;
51+
height: 40px;
52+
margin-top: 15px;
53+
}
54+
55+
.shimmer-movie-detail::after {
56+
content: "";
57+
position: absolute;
58+
top: 0;
59+
left: -150px;
60+
height: 100%;
61+
width: 150px;
62+
background: linear-gradient(
63+
90deg,
64+
transparent,
65+
rgba(255, 255, 255, 0.6),
66+
transparent
67+
);
68+
animation: shimmer 1.5s infinite;
69+
}
70+
71+
@keyframes shimmer {
72+
100% {
73+
transform: translateX(300%);
74+
}
75+
}

0 commit comments

Comments
 (0)