Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
116 lines (107 loc) · 3.61 KB
/
Copy pathindex.js
File metadata and controls
116 lines (107 loc) · 3.61 KB
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
import { Header, Nav, Main, Footer } from "./components";
import * as store from "./store";
import Navigo from "navigo";
import { capitalize } from "lodash";
import axios from "axios";
const router = new Navigo("/");
function render(state = store.Home) {
document.querySelector("#root").innerHTML = `
${Header(state)}
${Nav(store.Links)}
${Main(state)}
${Footer()}
`;
router.updatePageLinks();
afterRender();
}
function afterRender() {
// add menu toggle to bars icon in nav bar
document.querySelector(".fa-bars").addEventListener("click", () => {
document.querySelector("nav > ul").classList.toggle("hidden--mobile");
});
}
router.hooks({
before: (done, params) => {
// We need to know what view we are on to know what data to fetch
const view =
params && params.data && params.data.view
? capitalize(params.data.view)
: "Home";
// Add a switch case statement to handle multiple routes
switch (view) {
// New Case for the Home View
case "Home":
axios
// Get request to retrieve the current weather data using the API key and providing a city name
.get(
`https://api.openweathermap.org/data/2.5/weather?appid=${process.env.OPEN_WEATHER_MAP_API_KEY}&q=st%20louis`
)
.then(response => {
// Convert Kelvin to Fahrenheit since OpenWeatherMap does provide otherwise
const kelvinToFahrenheit = kelvinTemp =>
Math.round((kelvinTemp - 273.15) * (9 / 5) + 32);
// Create an object to be stored in the Home state from the response
store.Home.weather = {
city: response.data.name,
temp: kelvinToFahrenheit(response.data.main.temp),
feelsLike: kelvinToFahrenheit(response.data.main.feels_like),
description: response.data.weather[0].main
};
// An alternate method would be to store the values independently
/*
store.Home.weather.city = response.data.name;
store.Home.weather.temp = kelvinToFahrenheit(response.data.main.temp);
store.Home.weather.feelsLike = kelvinToFahrenheit(response.data.main.feels_like);
store.Home.weather.description = response.data.weather[0].main;
*/
done();
})
.catch(err => {
console.log(err);
done();
});
break;
// Add a case for each view that needs data from an API
case "Pizza":
// New Axios get request utilizing already made environment variable
axios
.get(`${process.env.PIZZA_PLACE_API_URL}/pizzas`)
.then(response => {
// We need to store the response to the state, in the next step but in the meantime let's see what it looks like so that we know what to store from the response.
console.log("response", response);
store.Pizza.pizzas = response.data;
done();
})
.catch(error => {
console.log("It puked", error);
done();
});
break;
default:
done();
}
},
already: params => {
const view =
params && params.data && params.data.view
? capitalize(params.data.view)
: "Home";
render(store[view]);
}
});
router
.on({
"/": () => render(),
":view": params => {
let view = capitalize(params.data.view);
if (view in store) {
render(store[view]);
} else {
render(store.Viewnotfound);
console.log(`View ${view} not defined`);
}
}
})
.resolve();
//render function moved into router.on() above
// render();