1
1
// Obtenemos la ID del producto guardado previamente en el localStorage
2
2
const productID = localStorage . getItem ( 'productID' )
3
3
4
+ const commentsSection = document . getElementById ( 'comments-section' )
5
+
4
6
// Creamos un elemento para el carrusel con la imagen correspondiente
5
7
const createCarouselItem = ( imgSrc , isActive , altText ) => `
6
8
<div class="carousel-item ${ isActive ? 'active' : '' } ">
@@ -42,11 +44,11 @@ fetch(`https://japceibal.github.io/emercado-api/products/${productID}.json`)
42
44
43
45
// Generamos el contenido del carrusel horizontal
44
46
const carouselInner = images
45
- . slice ( 1 , 4 ) // Seleccionamos solo las imágenes necesarias
47
+ . slice ( 1 , 4 ) // Seleccionamos solo las imágenes necesarias
46
48
. map ( ( imgSrc , index ) =>
47
49
createCarouselItem (
48
50
imgSrc ,
49
- index === 0 , // Marcamos la primera imagen como activa
51
+ index === 0 , // Marcamos la primera imagen como activa
50
52
`Imagen ${ index + 1 } de ${ name } `
51
53
)
52
54
)
@@ -71,12 +73,12 @@ fetch(`https://japceibal.github.io/emercado-api/products/${productID}.json`)
71
73
72
74
// Generamos el contenido de las imágenes verticales
73
75
const verticalImagesInner = images
74
- . slice ( 1 , 4 ) // Seleccionamos las imágenes necesarias
76
+ . slice ( 1 , 4 ) // Seleccionamos las imágenes necesarias
75
77
. map ( ( imgSrc , index , array ) =>
76
78
createImageElement (
77
79
imgSrc ,
78
80
`Imagen ${ index + 1 } de ${ name } ` ,
79
- index === array . length - 1 // Eliminamos margen para la última imagen
81
+ index === array . length - 1 // Eliminamos margen para la última imagen
80
82
)
81
83
)
82
84
. join ( '' )
@@ -92,11 +94,114 @@ fetch(`https://japceibal.github.io/emercado-api/products/${productID}.json`)
92
94
93
95
// Ajustamos los carruseles según el tamaño de la pantalla al cargar la página
94
96
adjustCarousels ( horizontalCarousel , verticalImages )
95
- window . addEventListener ( 'resize' , ( ) =>
96
- adjustCarousels ( horizontalCarousel , verticalImages ) // Reajustamos carruseles al redimensionar la ventana
97
+ window . addEventListener ( 'resize' , ( ) => adjustCarousels ( horizontalCarousel , verticalImages ) // Reajustamos carruseles al redimensionar la ventana
97
98
)
98
99
}
99
100
)
100
101
. catch ( ( error ) => {
101
- console . error ( 'Error fetching datos del producto:' , error ) // Capturamos errores en la obtención de datos
102
+ console . error ( 'Error fetching datos del producto:' , error ) // Capturamos errores en la obtención de datos
103
+ } )
104
+
105
+ // Fetch para listar los comentarios provinientes de la API
106
+ fetch ( `https://japceibal.github.io/emercado-api/products_comments/${ productID } .json` )
107
+ . then ( ( res ) => res . json ( ) )
108
+ . then ( ( comments ) => {
109
+ comments . forEach ( ( { score, description, user, dateTime } ) => {
110
+ commentsSection . innerHTML += createComment ( user , dateTime , score , description )
111
+ } )
112
+ } )
113
+ . catch ( ( error ) => console . error ( 'Error fetching comentarios:' , error ) )
114
+
115
+ // Función para crear un comentario
116
+ function createComment ( user , dateTime , score , description ) {
117
+ return `
118
+ <div class="my-1">
119
+ <div class="row">
120
+ <div class="col-md-8 w-100">
121
+ <div class="card review-card shadow-sm">
122
+ <div class="card-body">
123
+ <div class="row">
124
+ <div class="col-md-4 border-end">
125
+ <h5 class="mb-0 customer-name">${ user } </h5>
126
+ <small class="text-muted">${ formatDate ( dateTime ) } </small>
127
+ </div>
128
+ <div class="col-md-8">
129
+ <div class="stars mb-2" aria-label="Rating: ${ score } out of 5 stars">
130
+ ${ createStars ( score ) }
131
+ </div>
132
+ <p class="review-text mb-2">${ description } </p>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ `
141
+ }
142
+
143
+ // Función para crear las estrellas
144
+ function createStars ( userScore ) {
145
+ let estrellasHTML = ''
146
+ for ( let i = 1 ; i <= 5 ; i ++ ) {
147
+ estrellasHTML += `<i class="fa fa-star ${ i <= userScore ? 'checked' : '' } "></i>`
148
+ }
149
+
150
+ return estrellasHTML
151
+ }
152
+
153
+ // Función para formatear la fecha que viene por la API
154
+ function formatDate ( dateTimeString ) {
155
+ const date = new Date ( dateTimeString ) // Creamos una instancia de Date a partir del string de la fecha que viene de la API
156
+
157
+ // Opciones para formatear la fecha
158
+ const options = {
159
+ year : 'numeric' ,
160
+ month : 'short' ,
161
+ day : 'numeric' ,
162
+ hour : '2-digit' ,
163
+ minute : '2-digit'
164
+ }
165
+
166
+ // Formateamos la fecha con toLocaleDateString 'es-ES' para español
167
+ return date . toLocaleDateString ( 'es-ES' , options )
168
+ }
169
+
170
+ // Simulación de envío de comentario
171
+ function submitComment ( ) {
172
+ const user = localStorage . getItem ( 'userName' )
173
+ const commentText = document . getElementById ( 'rating-text' ) . value . trim ( )
174
+ const ratingStars = document . getElementById ( 'rating-stars' ) . value
175
+
176
+ const newComment = createComment ( user , new Date ( ) , ratingStars , commentText )
177
+
178
+ commentsSection . innerHTML += newComment
179
+ document . getElementById ( 'rating-text' ) . value = ''
180
+ }
181
+
182
+ // Cargar los productos relacionados desde la API
183
+ fetch ( `https://japceibal.github.io/emercado-api/products/${ productID } .json` )
184
+ . then ( ( response ) => response . json ( ) )
185
+ . then ( ( { relatedProducts } ) => {
186
+ const relatedSection = document . getElementById ( 'related-products' )
187
+
188
+ relatedProducts . forEach ( ( { id, name, image } ) => {
189
+ relatedSection . innerHTML += `
190
+ <div class="col-12 col-md-6 col-lg-4 my-2" style="width: 18rem;">
191
+ <div class="related-product card cursor-active" onclick="selectProduct(${ id } )">
192
+ <img src="${ image } " class="card-img-top" alt="${ name } " loading="lazy">
193
+ <div class="card-body">
194
+ <h5 class="card-title">${ name } </h5>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ `
199
+ } )
102
200
} )
201
+ . catch ( ( error ) => console . error ( 'Error fetching related products:' , error ) )
202
+
203
+ // Actualizamos el ID del producto en el localStorage y redirigimos
204
+ function selectProduct ( id ) {
205
+ localStorage . setItem ( 'productID' , id )
206
+ window . location = 'product-info.html'
207
+ }
0 commit comments