View difference between Paste ID: Yms7jQCV and Hy9j4d7a
SHOW: | | - or go back to the newest paste.
1
(() => {
2
3
    const BASE_URL = "https://judgetests.firebaseio.com/locations.json";
4
    const WEATHER_URL = "https://judgetests.firebaseio.com/forecast/{status}/{code}.json";
5
6
    const elements = {
7
        locationInput: document.querySelector("#location"),
8
        button: document.querySelector("#submit"),
9
        notificationHeading: document.querySelector('h1.notification'),
10
        currentDiv: document.querySelector('#current'),
11
        upcomingDiv: document.querySelector('#upcoming'),
12
        forecastWrapper: document.querySelector('#forecast')
13
    };
14
15
    const weatherSymbols = {
16
        "s": "☀",
17
        "p": "⛅",
18
        "o": "☁",
19
        "r": "☂",
20
        "d": "°"
21
    };
22
23
    const errorHandler = (e) => {
24
        console.dir(e);
25
        elements.notificationHeading.textContent = e.message;
26
    };
27
28
    const jsonMiddleware = (r) => r.json();
29
30
    elements.button.addEventListener("click", getLocationValue);
31
32
    function getLocationValue() {
33
34
        const location = elements.locationInput.value;
35
36
        fetch(BASE_URL)
37
            .then(jsonMiddleware)
38
            .then((data) => {
39
                const { name, code } = data.find((o) => o.name === location);
40
41
                const CURRENT_TODAY_URL = WEATHER_URL.replace('{status}/{code}', `today/${code}`);
42
                const CURRENT_UPCOMING_URL = WEATHER_URL.replace('{status}/{code}', `upcoming/${code}`);
43
44
                Promise.all([
45
                    fetch(CURRENT_TODAY_URL).then(jsonMiddleware),
46
                    fetch(CURRENT_UPCOMING_URL).then(jsonMiddleware)
47
                ])
48
                    .then(showWeatherLocation)
49
                    .catch(errorHandler)
50
            })
51
            .catch(errorHandler)
52
    }
53
54
    function showWeatherLocation([todayData, upcomingData]) {
55
56
        const { condition, high, low } = todayData.forecast;
57
58
        let forecastsDiv = createHTMLElement('div', ['forecasts']);
59
        let symbolSpan = createHTMLElement('span', ['condition', 'symbol'], weatherSymbols[condition[0].toLowerCase()]);
60
        let conditionSpan = createHTMLElement('span', ['condition']);
61
62
        let forecastFirstDataSpan = createHTMLElement('span', ['forecast-data'], todayData.name);
63
64
        let degreesInfo = `${low}${weatherSymbols.d}/${high}${weatherSymbols.d}`;
65
        let forecastSecondDataSpan = createHTMLElement('span', ['forecast-data'], degreesInfo);
66
67
        let forecastThirdDataSpan = createHTMLElement('span', ['forecast-data'], condition);
68
69
        conditionSpan.appendChild(forecastFirstDataSpan);
70
        conditionSpan.appendChild(forecastSecondDataSpan);
71
        conditionSpan.appendChild(forecastThirdDataSpan);
72
73
        forecastsDiv.appendChild(symbolSpan);
74
        forecastsDiv.appendChild(conditionSpan);
75
76
        elements.currentDiv.appendChild(forecastsDiv);
77
        elements.forecastWrapper.style.display = "block";
78
79
        showUpcomingWeatherLocation(upcomingData);
80
    }
81
82
    function showUpcomingWeatherLocation({ forecast, name }) {
83
84
        let forecastInfoDiv = createHTMLElement('div', ['forecast-info']);
85
86
        forecast.forEach(({ condition, high, low }) => {
87
            let upcomingSpan = createHTMLElement('span', ['upcoming']);
88
89
            let locationSpan = createHTMLElement('span', ['location-name'], name);
90
91
            let symbolSpan = createHTMLElement('span', ['symbol'], weatherSymbols[condition[0].toLowerCase()]);
92
93
            let degreeseInfo = `${low}${weatherSymbols.d}/${high}${weatherSymbols.d}`;
94
            let degreeseSpan = createHTMLElement('span', ['forecast-data'], degreeseInfo);
95
96
            let conditionSpan = createHTMLElement('span', ['forecast-data'], condition);
97
98
            upcomingSpan.appendChild(locationSpan);
99
            upcomingSpan.appendChild(symbolSpan);
100
            upcomingSpan.appendChild(degreeseSpan);
101
            upcomingSpan.appendChild(conditionSpan);
102
103
            forecastInfoDiv.appendChild(upcomingSpan);
104
        });
105
        
106
        elements.upcomingDiv.appendChild(forecastInfoDiv);
107
    }
108
109
})();
110
111
function createHTMLElement(tagName, classNames, textContent) {
112
    let element = document.createElement(tagName);
113
114
    if (classNames) {
115
        element.classList.add(...classNames);
116
    }
117
118
    if (textContent) {
119
        element.textContent = textContent;
120
    }
121
122
    return element;
123
}