-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.js
159 lines (150 loc) · 5.33 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"use strict";
// const BASE_POSTER_URL = "httpp://img.omdbapi.com/";
const API_KEY = "?apikey=c9eedd0f";
const BASE_URL = "https://www.omdbapi.com/";
const form = document.getElementById("search-form");
const pagination = document.querySelector(".pagination");
const moviesEl = document.querySelector(".movies");
const errorEl = document.querySelector(".error-msg");
const movieErrorEl = document.querySelector(".movie-error-msg");
const yearInput = document.getElementById("year");
const typeInput = document.getElementById("type");
const searchInput = document.getElementById("search");
const searchResultsEl = document.querySelector(".search-results");
const movieInfoEl = document.querySelector(".movie-info");
const movieInfoElements = {
img: document.querySelector(".movie-about img"),
rating: document.querySelector(".movie-about .rating"),
title: document.querySelector(".movie-about .title"),
genre: document.querySelector(".movie-about .genre"),
plot: document.querySelector(".movie-about .plot"),
director: document.querySelector(".movie-about .director"),
};
form.addEventListener("submit", getMovies);
async function getMovies(event, pageNum = 1) {
console.log(event);
event.preventDefault();
let data;
//reset elements
moviesEl.innerHTML = "";
errorEl.textContent = "";
pagination.innerHTML = "";
//reset elements
//check inputs and construct url
let s = searchInput.value.trim();
if (!s) {
e.target.reset();
return;
}
s = "&s=" + s.replace(" ", "+");
let y = yearInput.value ? "&y=" + yearInput.value : "";
let type = typeInput.value ? "&type=" + typeInput.value : "";
let page = !pageNum ? "" : "&page=" + pageNum;
//check inputs and construct url
try {
data = await fetchMovies(BASE_URL + API_KEY + s + y + type + page);
} catch (e) {
errorEl.textContent = "Application failed";
console.log(e);
return;
}
if (!data) {
errorEl.textContent = "Nothing found";
return;
}
//if data render everything
console.log(data);
let pages = Math.ceil(data.totalResults / 10);
let totalResults = data.Search.forEach((item) => {
moviesEl.appendChild(createMovieEl(item));
});
pagination.innerHTML = `
<button aria-label="Previous page" onclick="getMovies(event, ${pageNum - 1})" class="pagination-button ${!pageNum || pageNum === 1 ? "disabled" : ""}">
<i class="fa fa-arrow-circle-left" aria-hidden="true"></i>
</button>
<span class="pagination-button disabled active">${pageNum}/${pages}</span>
<button aria-label="Next page" onclick="getMovies(event, ${pageNum + 1})" class="pagination-button ${pageNum === pages ? "disabled" : ""}">
<i class="fa fa-arrow-circle-right" aria-hidden="true"></i>
</button>
`;
}
async function fetchMovies(url) {
const response = await fetch(url);
if (response.status !== 200) {
throw new Error("Application failed");
}
console.log(response);
const data = await response.json();
if (data.Response === "False") {
return false;
}
console.log(data);
return data;
}
async function showMovieInfo(event) {
console.log(event.target.dataset.id);
let id = event.target.dataset.id;
let data;
searchResultsEl.classList.add("hidden");
movieInfoEl.classList.remove("hidden");
try {
data = await fetchMovies(BASE_URL + API_KEY + "&i=" + id);
} catch (e) {
movieErrorEl.textContent = "Application failed";
return;
}
if (!data) {
movieErrorEl.textContent = "No more data about movie";
}
console.log(data);
if (!data.Poster || data.Poster !== "N/A") {
movieInfoElements.img.src = data.Poster;
if (movieInfoElements.img.classList.contains("hidden")) {
movieInfoElements.img.classList.remove("hidden");
}
} else {
movieInfoElements.img.classList.add("hidden");
}
movieInfoElements.rating.textContent = data.imdbRating;
movieInfoElements.title.textContent = data.Title;
movieInfoElements.genre.textContent = data.Genre + " " + data.Type;
movieInfoElements.plot.textContent = data.Plot;
movieInfoElements.director.textContent = data.Director;
}
function backToSearch() {
searchResultsEl.classList.remove("hidden");
movieInfoEl.classList.add("hidden");
}
function createMovieEl(movie) {
let div = document.createElement("div");
div.setAttribute("onclick", "showMovieInfo(event)");
div.setAttribute("data-id", movie.imdbID);
div.setAttribute("tabindex", 0); //to make focusable with tab
div.classList.add("movie");
let p = document.createElement("p");
p.classList.add("movie-year");
let year = movie.Year.trim();
year = year.endsWith("–") ? year.slice(0, -1) : year;
let pText = document.createTextNode(year);
p.appendChild(pText);
div.appendChild(p);
if (movie.Poster) {
let picture = document.createElement("picture");
picture.classList.add("movie-img");
let source = document.createElement("source");
source.setAttribute("srcset", movie.Poster !== "N/A" ? movie.Poster : "./assets/img/placeholder.jpg");
picture.appendChild(source);
let img = document.createElement("img");
img.setAttribute("src", "./assets/img/placeholder.jpg");
img.setAttribute("alt", movie.Title);
picture.appendChild(img);
div.appendChild(picture);
}
let h3 = document.createElement("h3");
let h3Text = document.createTextNode(movie.Title);
h3.classList.add("movie-title");
h3.classList.add("title");
h3.appendChild(h3Text);
div.appendChild(h3);
return div;
}