-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
104 lines (84 loc) · 3.61 KB
/
main.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
import dictionary from './dictionary.js';
console.log(dictionary)
const apiKey = 'ed9b19c86d874da68b5161953242611';
const inputLatitude = document.querySelector('#inputLatitude');
const inputLongitude = document.querySelector('#inputLongitude');
const header = document.querySelector('.header');
const searchButton = document.querySelector('.search__button');
searchButton.onclick = handleSearch;
function handleSearch() {
const latitude = inputLatitude.value.trim();
const longitude = inputLongitude.value.trim();
if (!isInputValid(latitude, longitude)) return;
fetchWeatherData(latitude, longitude);
}
function isInputValid(lat, lon) {
if (!lat || !lon) {
alert("Пожалуйста, введите как широту, так и долготу.");
return false;
} else if (!isValidLatitude(lat)) {
alert("Пожалуйста, введите широту в верном формате. Должно быть число от -90 до 90.");
return false;
} else if (!isValidLongitude(lon)) {
alert("Пожалуйста, введите долготу в верном формате. Должно быть число от -180 до 180.");
return false;
}
return true;
}
function isValidLatitude(lat) {
const parsedLat = parseFloat(lat);
return !isNaN(parsedLat) && parsedLat >= -90 && parsedLat <= 90;
}
function isValidLongitude(lon) {
const parsedLon = parseFloat(lon);
return !isNaN(parsedLon) && parsedLon >= -180 && parsedLon <= 180;
}
async function fetchWeatherData(lat, lon) {
const url = `https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${lat}, ${lon}`;
const response = await fetch(url);
const data = await response.json();
displayWeatherData(data);
}
function displayWeatherData(data) {
if (data.error) {
alert("Такой широты и долготы не существует.");
return;
}
const info = dictionary.find((obj) => obj.code === data.current.condition.code);
const filePath = `./img/${data.current.is_day ? 'day/' : 'night/'}`;
const fileName = `${data.current.is_day ? info.day : info.night}.png`;
const imgPath = filePath + fileName;
const html = createWeatherCard(data, info, imgPath);
header.insertAdjacentHTML('afterend', html);
initMap(data.location.lat, data.location.lon);
const deleteButton = header.nextElementSibling.querySelector('.del__button');
deleteButton.onclick = function() {
const card = deleteButton.closest('.card');
if (card) {
card.remove();
}
};
}
function createWeatherCard(data, info, imgPath) {
return `<div class="card">
<div class="card__info">
<div class="card__important_info">
<p class="degrees">${data.current.temp_c}°</p>
<p>${data.location.name}, ${data.location.country}</p>
<p>${data.location.localtime}</p>
<p>${data.current.is_day ? info.languages[23]['day_text'] : info.languages[23]['night_text']}</p>
</div>
<img class="card__weather" src="${imgPath}" width="318" height="318" alt="Погода">
</div>
<div id="map"></div>
<button class="del__button">Удалить карточку</button>
</div>`;
}
function initMap(lat, lon) {
const map = new ymaps.Map("map", {
center: [lat, lon],
zoom: 12
});
const placemark = new ymaps.Placemark([lat, lon]);
map.geoObjects.add(placemark);
}