const $result = document.querySelector('#result');
const $input = document.querySelector('#input');
const $timer = document.querySelector('#timer');
const $update = document.querySelector('#update');
const $swap = document.querySelector('#swap');
const $c_from = document.querySelector('#c-from');
const $c_to = document.querySelector('#c-to');
const urlApi = (c_from, c_to) =>
`https://api.fixer.io/latest?base=${c_from}`; // &symbols=${c_to}`;
const ajaxRequest = () => Rx.DOM.ajax({
url: urlApi($c_from.value, $c_to.value),
responseType: 'json',
});
const formatResponse = val => ({
datetime: Date.now(),
rate: val.response.rates[$c_to.value],
});
const update$ = Rx.Observable.fromEvent($update, 'click')
.startWith('°-°')
.switchMap(() => converter$)
.publish()
.refCount();
const timer$ = Rx.Observable.interval(1e3)
.startWith(Date.now())
.map(Date.now);
const converter$ = Rx.Observable.interval(9e3)
.startWith('°‿°')
.flatMap(ajaxRequest)
.map(formatResponse);
const input$ = Rx.Observable.fromEvent($input, 'keyup')
.startWith($input.value)
.distinctUntilChanged()
.map(() => $input.value);
Rx.Observable
.combineLatest(input$, update$,
function (s1, s2) {
return +s1 * +s2.rate;
})
.subscribe(
function (val) {
var data = $c_from.value !== $c_to.value ? val : $input.value;
$result.textContent = Number(data).toFixed(4);
});
Rx.Observable
.combineLatest(timer$, update$,
function (s1, s2) {
return (s1 <= s2.datetime ? 0 : (s1 - s2.datetime) / 1000).toFixed();
})
.subscribe(
function (val) {
$timer.textContent = val;
});
Rx.Observable.fromEvent($c_from, 'change')
.subscribe(() => $update.click());
Rx.Observable.fromEvent($c_to, 'change')
.subscribe(() => $update.click());
Rx.Observable.fromEvent($swap, 'click')
.subscribe(function () {
[$c_from.value, $c_to.value] = [$c_to.value, $c_from.value];
$update.click();
});
<input id="input" type="text" value="1">
<span>
<select id="c-from">
<option value="AUD">AUD</option>
<option value="BGN">BGN</option>
<option value="BRL">BRL</option>
<option value="CAD">CAD</option>
<option value="CHF">CHF</option>
<option value="CNY">CNY</option>
<option value="CZK">CZK</option>
<option value="DKK">DKK</option>
<option value="EUR">EUR</option>
<option value="GBP">GBP</option>
<option value="HKD">HKD</option>
<option value="HRK">HRK</option>
<option value="HUF">HUF</option>
<option value="IDR">IDR</option>
<option value="ILS">ILS</option>
<option value="INR">INR</option>
<option value="JPY">JPY</option>
<option value="KRW">KRW</option>
<option value="MXN">MXN</option>
<option value="MYR">MYR</option>
<option value="NOK">NOK</option>
<option value="NZD">NZD</option>
<option value="PHP">PHP</option>
<option value="PLN">PLN</option>
<option value="RON">RON</option>
<option value="RUB">RUB</option>
<option value="SEK">SEK</option>
<option value="SGD">SGD</option>
<option value="THB">THB</option>
<option value="TRY">TRY</option>
<option value="USD" selected>USD</option>
<option value="ZAR">ZAR</option>
</select>
= <span id="result"></span>
<select id="c-to">
<option value="AUD">AUD</option>
<option value="BGN" selected>BGN</option>
<option value="BRL">BRL</option>
<option value="CAD">CAD</option>
<option value="CHF">CHF</option>
<option value="CNY">CNY</option>
<option value="CZK">CZK</option>
<option value="DKK">DKK</option>
<option value="EUR">EUR</option>
<option value="GBP">GBP</option>
<option value="HKD">HKD</option>
<option value="HRK">HRK</option>
<option value="HUF">HUF</option>
<option value="IDR">IDR</option>
<option value="ILS">ILS</option>
<option value="INR">INR</option>
<option value="JPY">JPY</option>
<option value="KRW">KRW</option>
<option value="MXN">MXN</option>
<option value="MYR">MYR</option>
<option value="NOK">NOK</option>
<option value="NZD">NZD</option>
<option value="PHP">PHP</option>
<option value="PLN">PLN</option>
<option value="RON">RON</option>
<option value="RUB">RUB</option>
<option value="SEK">SEK</option>
<option value="SGD">SGD</option>
<option value="THB">THB</option>
<option value="TRY">TRY</option>
<option value="USD">USD</option>
<option value="ZAR">ZAR</option>
</select>
</span>
<br>
<span class="info">updated <span id="timer">0</span> seconds ago
<span id="update">update now</span> /
<span id="swap">swap</span>
</span>
input[type=text] {
width: 64px;
padding: 7px;
font-size: 12px;
background-color: #eee;
border: 1px solid #ddd;
}
.info {
font-size: 85%;
color: #777;
}
#result {
font-size: 93%;
}
#update,
#swap {
font-weight: bold;
cursor: pointer;
}
select {
border: 1px solid #111;
background: transparent;
width: 44px;
padding-left: 8px;
font-size: 13px;
border: none;
background: #eee;
height: 34px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
External resources loaded into this fiddle: