@@ -3,12 +3,25 @@ Creamos un objeto teniendo en cuenta los parámetros que nos devuelve la API en
3
3
Link: https://www.pexels.com/es-es/api/documentation/#photos-overview.
4
4
*/
5
5
class Photo {
6
- constructor ( id , url , src , photographer , alt ) {
6
+ /* constructor(id, url, src, photographer, alt){
7
7
this.id = id; // Nro identificador de cada foto en particular.
8
8
this.url = url; // URL de la imagen original subida en Pexels.
9
9
this.src = src; // URL de la imagen para ser utilizada en nuestro proyecto.
10
10
this.photographer = photographer; // Nombre del fotografo.
11
11
this.alt = alt; // Texto descriptivo de la imagen el cual usa la API para filtrar y devolver resultados de búsqueda.
12
+ } */
13
+ // Creamos el constructor de la clase a partir de las propiedades del objeto dado por un json de una API.
14
+ constructor ( json ) {
15
+ Object . assign ( this , json ) ;
16
+ }
17
+ showModal ( ) {
18
+ galleryItem . addEventListener ( 'click' , ( ) => {
19
+ Swal . fire ( {
20
+ imageUrl : this . src ,
21
+ imageHeight : 500 ,
22
+ imageAlt : this . alt
23
+ } ) ;
24
+ } ) ;
12
25
}
13
26
}
14
27
@@ -18,21 +31,29 @@ const generateId = () => {
18
31
return id ;
19
32
}
20
33
21
- // Creamos un array que simule la base de datos donde se almacenan las fotos.
22
- const photos = [
23
- new Photo ( generateId ( ) , 'ejemploURL' , '/dist/assets/images/caballomontaña.jpg' , 'Jose Molina' , 'Caballos en montaña' ) ,
24
- new Photo ( generateId ( ) , 'ejemploURL' , '/dist/assets/images/gatosaltando.jpg' , 'Ignacio Fernandez' , 'Gato saltando' ) ,
25
- new Photo ( generateId ( ) , 'ejemploURL' , '/dist/assets/images/formula1.jpg' , 'Martin Caro' , 'Autos de Formula 1' ) ,
26
- new Photo ( generateId ( ) , 'ejemploURL' , '/dist/assets/images/buenosaires.jpg' , 'Beatriz Quiroga' , 'Buenos Aires' ) ,
27
- new Photo ( generateId ( ) , 'ejemploURL' , '/dist/assets/images/personamontaña.jpg' , 'Jose Molina' , 'Persona en montaña' )
34
+ // Creamos un array que simule el json que devuelve una API. Los primeros 8 elementos representan fotos random. El resto representan fotos para ser buscadas.
35
+ const apiPhotos = [
36
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (1).jpeg' , photographer : '' , alt : '' } ,
37
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (2).jpeg' , photographer : '' , alt : '' } ,
38
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (3).jpeg' , photographer : '' , alt : '' } ,
39
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (4).jpeg' , photographer : '' , alt : '' } ,
40
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (5).jpeg' , photographer : '' , alt : '' } ,
41
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (6).jpeg' , photographer : '' , alt : '' } ,
42
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (7).jpeg' , photographer : '' , alt : '' } ,
43
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/example (8).jpeg' , photographer : '' , alt : '' } ,
44
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/caballomontaña.jpg' , photographer : 'Jose Molina' , alt : 'Caballos en montaña' } ,
45
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/gatosaltando.jpg' , photographer : 'Ignacio Fernandez' , alt : 'Gato saltando' } ,
46
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/formula1.jpg' , photographer : 'Martin Caro' , alt : 'Autos de Formula 1' } ,
47
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/buenosaires.jpg' , photographer : 'Beatriz Quiroga' , alt : 'Buenos Aires' } ,
48
+ { id : generateId ( ) , url : 'ejemploURL' , src : '/dist/assets/images/personamontaña.jpg' , photographer : 'Jose Molina' , alt : 'Persona en montaña' }
28
49
] ;
29
50
30
51
let errorAlert = document . getElementById ( 'errorAlert' ) ;
31
- let inputSearch = document . querySelector ( 'input' ) ;
32
52
let clearInputButton = document . getElementById ( 'clearInput' ) ;
33
53
let searchForm = document . getElementById ( 'searchForm' ) ;
34
54
let gallery = document . getElementById ( 'gallery' ) ;
35
55
let galleryContainer = document . getElementById ( 'galleryContainer' ) ;
56
+ let galleryItem = document . getElementsByClassName ( 'gallery__item' ) ;
36
57
37
58
// Creamos una función que nos permita validar si lo que ingresa el usuario cumple el requisito especificado. Si no lo cumple devuelve 'false', y si lo cumple devuelve 'true'.
38
59
const validateSearch = ( word ) => {
@@ -53,46 +74,47 @@ const removeAllChild = (parent) => {
53
74
}
54
75
55
76
// Creamos una función que nos permita crear nuevos elementos (fotos) para la galería.
56
- const createNewGalleryItem = ( galleryTitle ) => {
77
+ const createNewGalleryItem = ( photoObject ) => {
78
+ // Creamos un nuevo objeto 'Photo' a partir del objeto que nos dá el 'json'.
79
+ const photo = new Photo ( photoObject ) ;
57
80
// Creamos un nuevo elemento article.
58
81
let newGalleryItem = document . createElement ( 'article' ) ;
59
82
// Le asignamos la clase que define los estilos que poseerán las fotos.
60
83
newGalleryItem . classList . add ( 'gallery__item' ) ;
61
- // Y le ponemos lo que el usuario quiera mostrar .
62
- newGalleryItem . innerHTML = galleryTitle ;
84
+ // Y le ponemos una etiqueta img con los datos del objeto para que se muestren .
85
+ newGalleryItem . innerHTML = `<img src=" ${ photo . src } " alt=" ${ photo . alt } "></img>` ;
63
86
// Y por último le agregamos ese nuevo elemento a la galería. Utilicé el 'prepend' ya que quiero que se agregue al principio, para respetar el orden que simulo en el array.
64
87
galleryContainer . prepend ( newGalleryItem ) ;
65
88
}
66
89
67
90
// Creamos una función que nos permita saber si lo que ingresa el usuario coincide de alguna forma con el atributo 'Alt' de alguna foto.
68
91
const filterPhotos = ( search ) => {
69
92
// Filtramos el array de objetos para ver si la palabra buscada se encuentra en el alt de la foto.
70
- let filteredPhotos = photos . filter ( photo => photo . alt . toLowerCase ( ) . includes ( search ) ) ;
93
+ let filteredPhotos = apiPhotos . filter ( photo => photo . alt . toLowerCase ( ) . includes ( search ) ) ;
71
94
/*
72
95
Array.filter() devuelve un array nuevo si se cumple la condición y uno vacío si no se cumple.
73
96
Comprobamos si el array está vacío, es decir, que la plabra buscada no matcheó con ningún objeto de nuestro array(simulador de base de datos).
74
97
*/
75
- if ( filteredPhotos . length == 0 ) {
98
+ if ( filteredPhotos . length === 0 ) {
76
99
// Mostramos que ocurrió un error mediante un h2.
77
100
gallery . innerHTML = `<h2>No se pudo encontrar ninguna foto relacionada a "${ search } ".</h2>` ;
78
101
} else {
79
102
// Eliminamos todas las fotos de la gelería.
80
103
removeAllChild ( galleryContainer ) ;
81
-
82
104
// Aplicando la función 'forEach' de orden superior. Por cada foto filtrada devolvemos un nuevo elemento para la galería.
83
105
filteredPhotos . forEach ( ( photo ) => {
84
- // Llamamos la función que crea un nuevo elemento de la galería.
85
- createNewGalleryItem ( `<img src=" ${ photo . src } " alt=" ${ photo . alt } "></img>` ) ;
106
+ // Llamamos la función que crea un nuevo elemento de la galería. 'photo' simula un objeto de un json que nos devuelve la API.
107
+ createNewGalleryItem ( photo ) ;
86
108
} ) ;
87
109
}
88
110
}
89
111
90
112
// Creamos una función que al cargarse la página simule que se trajeron fotos aleatoriamente. La misma cargará 8 fotos.
91
- const getInitialRandomPhotos = ( ) => {
92
- for ( let i = 1 ; i <= 8 ; i ++ ) {
93
- // Llamamos la función que crea un nuevo elemento de la galería.
94
- createNewGalleryItem ( `<img src="/dist/assets/images/example ( ${ i } ).jpeg" alt="Foto( ${ i } )"></img>` ) ;
95
- }
113
+ const getInitialRandomPhotos = ( photosArray ) => {
114
+ let firstEightItems = photosArray . slice ( 0 , 8 ) ;
115
+ firstEightItems . forEach ( ( photo ) => {
116
+ createNewGalleryItem ( photo ) ;
117
+ } ) ;
96
118
}
97
119
98
120
// Eveneto submit del form, donde se llama a una función que trae las fotos a partir de la búsqueda.
@@ -104,10 +126,11 @@ searchForm.addEventListener('submit', (e) => {
104
126
clearInputButton . addEventListener ( 'click' , ( ) => {
105
127
document . getElementById ( 'searchInput' ) . value = '' ;
106
128
removeAllChild ( galleryContainer ) ;
107
- getInitialRandomPhotos ( ) ;
129
+ getInitialRandomPhotos ( apiPhotos ) ;
108
130
errorAlert . innerText = '' ;
109
131
} ) ;
110
132
133
+
111
134
// Creamos una función que nos permita tomar lo que el usuario ingresa en la barra de búsqueda y fijarnos si matchea con alguna de las fotos que tenemos guardadas en el array (simulador de base de datos).
112
135
const getSearchedPhotos = ( e ) => {
113
136
// Evitamos el funcionamiento por defualt del evento submit.
@@ -129,7 +152,7 @@ const getSearchedPhotos = (e) => {
129
152
130
153
// Cuando se carge la ventana, llamamos a la función que nos carga 8 fotos simulando que son fotos aleatorias.
131
154
window . addEventListener ( 'load' , ( ) => {
132
- getInitialRandomPhotos ( ) ;
155
+ getInitialRandomPhotos ( apiPhotos ) ;
133
156
} ) ;
134
157
135
158
// Toggle theme functionality
@@ -152,20 +175,12 @@ const disableDarkTheme = () => {
152
175
ball . style . transform = 'translateX(0)' ;
153
176
}
154
177
155
- if ( theme === 'darkTheme' ) {
156
- enableDarkTheme ( ) ;
157
- } else {
158
- disableDarkTheme ( ) ;
159
- }
178
+ theme === 'darkTheme' ? enableDarkTheme ( ) : disableDarkTheme ( ) ;
160
179
161
180
// Cuando se aplique el evento click al botón toggle, si el local storage 'theme' no es 'darkTheme', lo habilitamos y sino lo deshabilitamos.
162
181
toggleTheme . addEventListener ( 'click' , ( ) => {
163
182
// Actualizamos el local storage cuando se hace click.
164
183
theme = localStorage . getItem ( 'theme' ) ;
165
- if ( theme != 'darkTheme' ) {
166
- enableDarkTheme ( ) ;
167
- } else {
168
- disableDarkTheme ( ) ;
169
- }
184
+ theme != 'darkTheme' ? enableDarkTheme ( ) : disableDarkTheme ( ) ;
170
185
} ) ;
171
186
0 commit comments