-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
160 lines (138 loc) · 5.83 KB
/
app.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
160
/*-----------Variables globales e imports-----------*/
import {convertirTemperatura, convertirViento, limpiarHtml, spinner} from "./funciones.js";
const inputCiudad = document.querySelector("#header_inputCiudad");
const formularioCiudad = document.querySelector("#header_formulario");
const header = document.querySelector("header");
const divMain = document.querySelector("#main");
const divMainApp = document.querySelector("#main_app");
const divSpinner = document.querySelector(".loader");
const divInicio = document.querySelector("#inicio");
/*----------------Event Listeners-------------------*/
document.addEventListener("DOMContentLoaded", () => {
eventListeners(); //inicio de App
});
function eventListeners() {
formularioCiudad.addEventListener("submit", validarCiudad);
}
/*---------------------Clases-----------------------*/
class UI {
mostrarAlerta(mensaje){
limpiarHtml();
mostrarInicio();
divMain.style.display = "none";
const div = document.createElement("DIV");
const p = document.createElement("P");
div.style.background = "transparent";
div.style.position = "absolute";
div.classList.add("opacidad", "headerAlerta");
p.classList.add("red");
p.textContent = mensaje;
div.appendChild(p);
header.appendChild(div);
inputCiudad.classList.add("redBg");
setTimeout(()=>{
div.remove();
inputCiudad.classList.remove("redBg");
}, 1500);
}
}
const ui = new UI();
/*>>>>>>>>>>>>>>>>>>>>>>> APP <<<<<<<<<<<<<<<<<<<<<<*/
//Toma la ciudad escrita en el input del header y la valida.
function validarCiudad(e) {
e.preventDefault();
const valorInput = inputCiudad.value;
if (valorInput === "" || valorInput.length <= 1 || !isNaN(valorInput)) {
ui.mostrarAlerta("Debe escribir una ciudad Válida");
return;
} else {
//De pasar la primer validacion, enviamos la ciudad a la siguiente funcion.
buscarCiudad(valorInput);
}
formularioCiudad.reset()
}
//Toma la ciudad validada e inicia la busqueda y la llamada a la API.
function buscarCiudad(ciudad) {
const key = "67d2517366b8eccebed9147f76f96007";
const url = `https://api.openweathermap.org/data/2.5/weather?q=${ciudad}&appid=${key}`;
divMain.style.display = "flex";
ocultarInicio();
spinner();
fetch(url)
.then(data => data.json())
.then(data => {
console.log(data);
const codigo = data.cod;
//validamos si la ciudad realmente existe en la base de datos. De no existir, se muestra un error.
if(codigo === "404"){
ui.mostrarAlerta("La Ciudad No Existe en la Base de Datos");
return;
}else{
mostrarClima(data);
}
})
}
/*Toma la ciudad validada por completo y se aplica destructuring. Luego mediante Scripting
muestra por pantalla todos los datos relacionados al clima de la ciudad elegida.
Algunas funciones utilizadas son importadas de "/funciones.js".*/
function mostrarClima(data) {
const { name, clouds: { all }, main: { humidity, pressure, feels_like, temp,
temp_max, temp_min }, visibility, wind: { deg, speed } } = data;
limpiarHtml();
divSpinner.style.visibility = "hidden";
divMainApp.style.visibility = "visible";
const tempCentigrados = convertirTemperatura(temp);
const tempMaxCentigrados = convertirTemperatura(temp_max);
const tempMinCentigrados = convertirTemperatura(temp_min);
const sensacionTermica = convertirTemperatura(feels_like);
const direccionViento = convertirViento(deg);
const p1 = document.createElement("P");
const div1 = document.createElement("DIV");
p1.style.color = "white";
p1.innerHTML += `
<div class="contenedor opacidad">
<h1 class="contenedor">Clima en la ciudad de ${name}.</h1>
<div class="tarjetaClimaPrincipal">
<p><img class="icono" src="./assets/media/img/termometro.png"/>Temperatura Actual: ${tempCentigrados}°c</p>
</div>
<span class="tarjetaClimaSecundario">
<p>Temperatura Mínima: <span class="skyblue">${tempMinCentigrados}°c</span></p>
</span>
<span class="tarjetaClimaSecundario">
<p>Temperatura Máxima: <span class="red">${tempMaxCentigrados}°c</span></p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/termometro.png"/>Sensación Térmica: ${sensacionTermica}°</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/nube.png"/>Nubosidad: ${all}%</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/humedad.png"/>Humedad: ${humidity}%</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/visibilidad.png"/>Visibilidad: ${visibility}</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/barometro.png"/>Presion: ${pressure}hPa</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/viento.png"/>Dirección del Viento: ${direccionViento}</p>
</span>
<span class="tarjetaClimaTerciario">
<p><img class="icono" src="./assets/media/img/wind.png"/>Velocidad: ${speed}m/s</p>
</span>
</div>
`;
div1.appendChild(p1);
divMainApp.appendChild(div1);
}
function ocultarInicio(){
divInicio.style.display = "none";
divInicio.style.visibility = "hidden";
}
function mostrarInicio(){
divInicio.style.display = "flex";
divInicio.style.visibility = "visible";
}
//Fin de la Aplicacion.