Skip to content

Commit 0c82fca

Browse files
committed
Refactor: split rendering into smaller functions and improve removeFavorite safety.
1 parent 2a222e9 commit 0c82fca

File tree

1 file changed

+81
-56
lines changed

1 file changed

+81
-56
lines changed

src/js/main.js

Lines changed: 81 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ let searchedSeries = [];
1212
let favoriteSeries = [];
1313

1414
// FUNCIONES
15+
// START FUNCTION
1516
function startApp() {
1617
getFromLocalStorage();
1718
renderAllFavourites(favoriteSeries);
1819
addEventListeners();
1920
}
2021

22+
// FAVORITES FUNCTIONS
23+
// Busca en favoritos el id que coincida con el id que se le pasa, devuelve el índice del elemento
2124
function getFavoriteIndex(id) {
2225
return favoriteSeries.findIndex((fav) => fav.id === id);
2326
}
@@ -26,7 +29,7 @@ function getFavoriteIndex(id) {
2629
function isSeriesInFavorites(series) {
2730
const favIndex = getFavoriteIndex(series.id);
2831

29-
// Devuelve false si no está, true si la encuentra
32+
// Devuelve false si no está (-1), true si la encuentra
3033
return favIndex !== -1;
3134
}
3235

@@ -38,7 +41,10 @@ function addFavorite(clickedSeries) {
3841
// Eliminar un favorite del array
3942
function removeFavorite(clickedId) {
4043
const favIndex = getFavoriteIndex(clickedId);
41-
favoriteSeries.splice(favIndex, 1);
44+
// Elimina solamente si encuentra el elemento
45+
if (favIndex !== -1) {
46+
favoriteSeries.splice(favIndex, 1);
47+
}
4248
}
4349

4450
// Añadir o eliminar del array
@@ -54,7 +60,8 @@ function toggleFavorite(clickedSeries) {
5460
}
5561
}
5662

57-
// Trae los datos de localStorage a la página
63+
// LOCALSTORAGE
64+
// Trae los datos de localStorage a la página siempre que existan
5865
function getFromLocalStorage() {
5966
const localStorageFavs = localStorage.getItem('favs');
6067

@@ -65,6 +72,7 @@ function getFromLocalStorage() {
6572

6673
// Guarda los datos en el localStorage solo si el array tiene elementos
6774
function setInLocalStorage() {
75+
// Si el array está vacío, borra el localStorage
6876
if (favoriteSeries.length === 0) {
6977
localStorage.removeItem('favs');
7078
} else {
@@ -73,6 +81,7 @@ function setInLocalStorage() {
7381
}
7482
}
7583

84+
// API FUNCTION
7685
function getSeriesDataFromAPI(searchedItem) {
7786
fetch(`//api.tvmaze.com/search/shows?q=${searchedItem}`)
7887
.then((response) => response.json())
@@ -93,70 +102,51 @@ function getSeriesDataFromAPI(searchedItem) {
93102
.catch((error) => console.error(error));
94103
}
95104

105+
// Actualiza los datos: localStorage, favorites y series
96106
function updateUI() {
97107
setInLocalStorage();
98108
renderAllFavourites(favoriteSeries);
99109
renderAllSeries(searchedSeries);
100110
}
101111

102-
function renderOneSeries(series) {
103-
const isFavorite = isSeriesInFavorites(series);
104-
112+
// RENDER FUNCTIONS
113+
function createSeriesItem(series, listType) {
105114
// Creación del <li>
106-
const liSeries = document.createElement('li');
107-
liSeries.classList.add('js_resultsLi', 'results__item');
108-
// Añade la clase solo si isFavorite es true
109-
if (isFavorite) {
110-
liSeries.classList.add('results__item--favorite');
115+
const li = document.createElement('li');
116+
li.classList.add(`js_${listType}Li`, `${listType}__item`);
117+
118+
if (listType === 'results') {
119+
// Añade la clase solo si isFavorite es true
120+
const isFavorite = isSeriesInFavorites(series);
121+
if (isFavorite) {
122+
li.classList.add('results__item--favorite');
123+
}
111124
}
112-
liSeries.dataset.id = `${series.id}`;
113-
resultsUl.appendChild(liSeries);
114125

115-
// Creación de la <img>
116-
const imgSeries = document.createElement('img');
117-
imgSeries.classList.add('results__img');
118-
imgSeries.src = `${series.image}`;
119-
imgSeries.alt = `Portada de ${series.name}`;
120-
liSeries.appendChild(imgSeries);
121-
122-
// Creación del <p>
123-
const titleSeries = document.createElement('p');
124-
titleSeries.classList.add('results__text');
125-
const textTitle = document.createTextNode(`${series.name}`);
126-
titleSeries.appendChild(textTitle);
127-
liSeries.appendChild(titleSeries);
126+
li.dataset.id = series.id;
127+
return li;
128128
}
129129

130-
function renderAllSeries(seriesList) {
131-
resultsUl.innerHTML = '';
130+
function createSeriesImage(series, listType) {
131+
// Creación de la <img>
132+
const img = document.createElement('img');
133+
img.classList.add(`${listType}__img`);
134+
img.src = series.image;
135+
img.alt = `Portada de ${series.name}`;
136+
return img;
137+
}
132138

133-
seriesList.forEach((series) => {
134-
renderOneSeries(series);
135-
});
139+
function createSeriesTitle(series, listType) {
140+
// Creación del <p>
141+
const title = document.createElement('p');
142+
title.classList.add(`${listType}__text`);
143+
const textTitle = document.createTextNode(series.name);
144+
title.appendChild(textTitle);
145+
return title;
136146
}
137147

138-
function renderOneFav(favorite) {
139-
// Creación de <li>
140-
const liFav = document.createElement('li');
141-
liFav.classList.add('favorites__item');
142-
liFav.dataset.id = `${favorite.id}`;
143-
favoritesUl.appendChild(liFav);
144-
145-
// Creación de <img>
146-
const imgFav = document.createElement('img');
147-
imgFav.classList.add('favorites__img');
148-
imgFav.src = `${favorite.image}`;
149-
imgFav.alt = `Portada de ${favorite.name}`;
150-
liFav.appendChild(imgFav);
151-
152-
// Creación de <p>
153-
const titleFav = document.createElement('p');
154-
titleFav.classList.add('favorites__text');
155-
const textTitle = document.createTextNode(`${favorite.name}`);
156-
titleFav.appendChild(textTitle);
157-
liFav.appendChild(titleFav);
158-
159-
//Creación de <button>
148+
function createFavoriteButton() {
149+
// Creación del <button> corazón de favoritos
160150
const btnFav = document.createElement('button');
161151
btnFav.classList.add('favorites__btn');
162152
btnFav.ariaLabel = 'Eliminar de favoritos';
@@ -184,7 +174,38 @@ function renderOneFav(favorite) {
184174
<path
185175
d="M481-83Q347-218 267.5-301t-121-138q-41.5-55-54-94T80-620q0-92 64-156t156-64q45 0 87 16.5t75 47.5l-62 216h120l-34 335 114-375H480l71-212q25-14 52.5-21t56.5-7q92 0 156 64t64 156q0 48-13 88t-55 95.5q-42 55.5-121 138T481-83Zm-71-186 21-211H294l75-263q-16-8-33.5-12.5T300-760q-58 0-99 41t-41 99q0 31 11.5 62t40 70.5q28.5 39.5 77 92T410-269Zm188-48q111-113 156.5-180T800-620q0-58-41-99t-99-41q-11 0-22 1.5t-22 5.5l-24 73h116L598-317Zm110-363ZM294-480Z"/>
186176
</svg> `;
187-
liFav.appendChild(btnFav);
177+
return btnFav;
178+
}
179+
180+
function createSeriesCard(series, listType) {
181+
// Creación de la card básica de series
182+
const li = createSeriesItem(series, listType);
183+
const img = createSeriesImage(series, listType);
184+
const title = createSeriesTitle(series, listType);
185+
186+
li.append(img, title);
187+
return li;
188+
}
189+
190+
function renderOneSeries(series) {
191+
const li = createSeriesCard(series, 'results');
192+
resultsUl.appendChild(li);
193+
}
194+
195+
function renderAllSeries(seriesList) {
196+
resultsUl.innerHTML = '';
197+
198+
seriesList.forEach((series) => {
199+
renderOneSeries(series);
200+
});
201+
}
202+
203+
function renderOneFav(favorite) {
204+
const li = createSeriesCard(favorite, 'favorites');
205+
const btn = createFavoriteButton();
206+
207+
li.appendChild(btn);
208+
favoritesUl.appendChild(li);
188209
}
189210

190211
function renderAllFavourites(favoriteList) {
@@ -196,13 +217,15 @@ function renderAllFavourites(favoriteList) {
196217
}
197218

198219
//FUNCIONES DE EVENTOS
220+
// Botón search: búsqueda en la API
199221
function handleClickSearchBtn(event) {
200222
event.preventDefault();
201223
const searchedValue = searchInput.value.trim();
202224

203225
getSeriesDataFromAPI(searchedValue);
204226
}
205227

228+
// Añade o elimina favoritos
206229
function handleToggleFavorite(event) {
207230
// Encontrar el li clicado en el ul
208231
const clickedLi = event.target.closest('li');
@@ -215,14 +238,15 @@ function handleToggleFavorite(event) {
215238
// Extraer el id del li clicado
216239
const clickedId = parseInt(clickedLi.dataset.id);
217240

218-
// Para saber si el click viene del botón de favoritos
241+
// Para saber si el click viene del botón de favoritos (devuelve el item o null)
219242
const isFavoriteList = clickedLi.closest('.favorites');
220243

221244
if (isFavoriteList) {
222245
// El click viene de favorites
223246
// encontrar el botón al que se ha clickado
224247
const btn = event.target.closest('.favorites__btn');
225-
// De no clicarse en el botón, no hace nada
248+
249+
// De no clicarse en el botón devuelve null y no hace nada
226250
if (!btn) {
227251
return;
228252
}
@@ -236,6 +260,7 @@ function handleToggleFavorite(event) {
236260

237261
toggleFavorite(clickedSeries);
238262
}
263+
239264
updateUI();
240265
}
241266

0 commit comments

Comments
 (0)