@@ -12,12 +12,15 @@ let searchedSeries = [];
1212let favoriteSeries = [ ] ;
1313
1414// FUNCIONES
15+ // START FUNCTION
1516function 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
2124function getFavoriteIndex ( id ) {
2225 return favoriteSeries . findIndex ( ( fav ) => fav . id === id ) ;
2326}
@@ -26,7 +29,7 @@ function getFavoriteIndex(id) {
2629function 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
3942function 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
5865function 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
6774function 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
7685function 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
96106function 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
190211function renderAllFavourites ( favoriteList ) {
@@ -196,13 +217,15 @@ function renderAllFavourites(favoriteList) {
196217}
197218
198219//FUNCIONES DE EVENTOS
220+ // Botón search: búsqueda en la API
199221function handleClickSearchBtn ( event ) {
200222 event . preventDefault ( ) ;
201223 const searchedValue = searchInput . value . trim ( ) ;
202224
203225 getSeriesDataFromAPI ( searchedValue ) ;
204226}
205227
228+ // Añade o elimina favoritos
206229function 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