mirror of https://github.com/espruino/BangleApps
119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
let settings = require("Storage").readJSON("tinycmc.json", 1);
|
|
const apiKey = settings.apikey || null;
|
|
const cmcBase = 'https://pro-api.coinmarketcap.com/';
|
|
const version = ['v1', 'v2'];
|
|
const path = {
|
|
latest: '/cryptocurrency/listings/latest',
|
|
quote: '/cryptocurrency/quotes/latest'
|
|
};
|
|
let page = 0;
|
|
function displayLatest(offset) {
|
|
g.clear();
|
|
if (page === 0) {
|
|
E.showMessage('Getting Top 10');
|
|
} else {
|
|
E.showMessage(`Getting Top ${offset} to ${offset + 9}`);
|
|
}
|
|
|
|
const uri = offset ? `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10&start=${offset}` : `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10`;
|
|
Bangle.http(uri,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
"X-CMC_PRO_API_KEY": apiKey,
|
|
}
|
|
}).then(data=>{
|
|
const result = JSON.parse(data.resp).data;
|
|
let menu = {
|
|
"" : { title : "-- Select --" },
|
|
};
|
|
//FIXME: Menu can also take an array of items, this would be easier to compose using map
|
|
result.forEach(listing => {
|
|
menu[listing.name] = {
|
|
title: `${listing.cmc_rank}: ${listing.symbol} ${Number(listing.quote.EUR.percent_change_24h).toFixed(3)}`,
|
|
onchange: function() { E.showMenu(); displayQuote(listing.symbol);} };
|
|
});
|
|
menu.Next = function() {
|
|
E.showMenu();
|
|
g.clear();
|
|
page = page + 1;
|
|
displayLatest((page * 10) + 1);
|
|
}; // remove the menu
|
|
menu.Exit = function() {
|
|
E.showMenu();
|
|
g.clear();
|
|
Bangle.showClock();
|
|
}; // remove the menu
|
|
g.clear();
|
|
E.showMenu(menu);
|
|
setWatch(() => {
|
|
g.clear();
|
|
displayMenu();
|
|
}, BTN, {edge:"rising", debounce:50, repeat:true});
|
|
}).catch(error=>{
|
|
console.log('Error');
|
|
console.log(error);
|
|
E.showMessage(`${error}\nTo go back press BTN`);
|
|
setWatch(() => {
|
|
g.clear();
|
|
displayMenu();
|
|
}, BTN, {edge:"rising", debounce:50, repeat:true});
|
|
});
|
|
}
|
|
|
|
function displayQuote(symb) {
|
|
g.clear();
|
|
E.showMessage(`Getting latest for ${symb}`);
|
|
Bangle.http(`${cmcBase}${version[1]}${path.quote}?symbol=${symb}&convert=EUR`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
"X-CMC_PRO_API_KEY": apiKey,
|
|
}
|
|
}).then(data=>{
|
|
g.clear();
|
|
const result = JSON.parse(data.resp).data[symb][0];
|
|
E.showMessage(`#${result.cmc_rank}: ${result.symbol}\n${Number(result.quote.EUR.price).toFixed(2)}\n%24h:
|
|
${result.quote.EUR.percent_change_24h}`);
|
|
setWatch(() => {
|
|
g.clear();
|
|
displayMenu();
|
|
}, BTN, {edge:"rising", debounce:50, repeat:true});
|
|
}).catch(error=>{
|
|
E.showMessage(`${error}\nTo go back press BTN`);
|
|
setWatch(() => {
|
|
g.clear();
|
|
displayMenu();
|
|
}, BTN, {edge:"rising", debounce:50, repeat:true});
|
|
});
|
|
}
|
|
|
|
function displayMenu() {
|
|
if (!apiKey) {
|
|
E.showMessage("Please provide a Coinmarketcap API Key");
|
|
} else {
|
|
// Actually display the menu
|
|
E.showMenu({
|
|
"" : { title : "-- Select --" }, // options
|
|
"Latest": function() { E.showMenu(); displayLatest(); },
|
|
"BTC" : function() { E.showMenu(); displayQuote('BTC'); },
|
|
"ETH" : function() { E.showMenu(); displayQuote('ETH'); },
|
|
"XMR" : function() { E.showMenu(); displayQuote('XMR'); },
|
|
"ADA" : function() { E.showMenu(); displayQuote('ADA'); },
|
|
"DOGE" : function() { E.showMenu(); displayQuote('DOGE'); },
|
|
"LTC" : function() { E.showMenu(); displayQuote('LTC'); },
|
|
"Exit" : function() {
|
|
E.showMenu();
|
|
g.clear();
|
|
Bangle.showClock();
|
|
}, // remove the menu
|
|
});
|
|
}
|
|
}
|
|
|
|
function main () {
|
|
displayMenu();
|
|
}
|
|
|
|
main ();
|