-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrates_lookup.js
122 lines (102 loc) · 4.13 KB
/
rates_lookup.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
// =================================
// ------- State variables
// =================================
init_done = false;
current_base = "";
// =================================
// --------- Display functions
// =================================
// returns html text of a rate's display
function rateHTML(currency, rate) {
return "<div id='"+currency+"' class='rate_card'><span onclick='baseChange(\""+currency+"\")'>"+
currency+"</span><span>"+rate+"</span></div>";
}
//insert rateHTML after an element of given ID
function insertAfterID(id, currency, rate) {
document.getElementById(id).insertAdjacentHTML("afterend", rateHTML(currency, rate));
}
//update given currency's rate
function rateUpdate(currency, rate) {
document.getElementById(currency).lastChild.innerText = rate;
}
//update (or initialize) display for one day's rates
//result is object of expected content { base: text; date: text; rates: [ (currency: number)* ];}
function day_rates(result){
if(init_done) {
//update date (because when not available like weekends, request rate is not result rate)
document.getElementById("date").value = result.date;
//update base rate (security)
rateUpdate(result.base, 1);
//update all rates
for (var currency in result.rates){ rateUpdate(currency, result.rates[currency]); }
}
}
// =================================
// --------- API call functions
// =================================
//GET latest with default options (base EUR, latest date available)
function APILatest(){
return fetch("https://api.exchangeratesapi.io/latest")
.then(response => response.json());
}
function APIDate(date, base="EUR"){
return fetch("https://api.exchangeratesapi.io/"+date+"?base="+base)
.then(response => response.json());
}
// ------- UI handler functions
// call upon API to get given day's (or previous) rates with given base currency, updates display
function newRequest(base, date) {
APIDate(date, base).then(result => day_rates(result));
}
// the date of rates to show has changed -> make request
function dateChange(date) {
newRequest(current_base, date);
}
// if new base != current base, change currency and update rates
function baseChange(new_base) {
if (new_base != current_base) {
currency_element = document.getElementById(new_base);
if (currency_element.parentNode.id == "timeout"){
return;
} else {
// exchange classes for display
document.getElementById(current_base).classList.toggle("current_base");
document.getElementById(new_base).classList.toggle("current_base");
// update state variable and hidden form
current_base = new_base;
document.getElementById("base").setAttribute("value", current_base);
// GET new rates
//TODO: recalculate client-side from known rates
newRequest(new_base, document.getElementById("date").value);
}
}
}
// =================================
// --------- Initialization
// =================================
function initApp() {
// populate with default data (latest day available, base EUR)
APILatest().then(result => {
// update latest date: show current date, limit max date
document.getElementById("date").setAttribute("max",result.date);
document.getElementById("date").value = result.date;;
// input base rate display
insertAfterID("input_base", result.base, 1);
document.getElementById(result.base).classList.add("current_base");
// input all rates
for (var currency in result.rates){ insertAfterID("flex_linebreak", currency, result.rates[currency]); }
// update state variable
init_done = true;
current_base = result.base;
});
}
function initDrag() {
dragula([document.getElementById("body"), document.getElementById("timeout")], {
invalid: function (element, handle){
if (element.classList.contains("immobile")||element.classList.contains("current_base"))
return true;
else
return false;
}
});
}