Start the process of splitting JS files
I am a JS noob so this is probably poorly thought out. But it is a wip and I dont really care about the quality, just more the learning experience.
This commit is contained in:
parent
27eb2ccb45
commit
a51d3f8d7b
22
src/datum.js
Normal file
22
src/datum.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
export default class Datum {
|
||||||
|
constructor(time, price) {
|
||||||
|
this._time = time;
|
||||||
|
this._price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTime() {
|
||||||
|
return this._time;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPrice() {
|
||||||
|
return this._price;
|
||||||
|
}
|
||||||
|
|
||||||
|
getX() {
|
||||||
|
return this.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
getY() {
|
||||||
|
return this.getPrice();
|
||||||
|
}
|
||||||
|
}
|
4
src/fetchCurrent.js
Normal file
4
src/fetchCurrent.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export default async function fetchCurrent() {
|
||||||
|
const resp = await fetch("https://data.wowtoken.app/token/current.json");
|
||||||
|
return await resp.json();
|
||||||
|
}
|
13
src/fetchData.js
Normal file
13
src/fetchData.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import Datum from "./datum";
|
||||||
|
import urlBuilder from "./urlBuilder";
|
||||||
|
|
||||||
|
export default async function fetchData(currentRegionSelection, currentTimeSelection, currentAggregateSelection) {
|
||||||
|
const data = [];
|
||||||
|
const resp = await fetch(urlBuilder(currentRegionSelection, currentTimeSelection, currentAggregateSelection));
|
||||||
|
const respData = await resp.json();
|
||||||
|
for (let i = 0, l = respData.length; i < l; i++) {
|
||||||
|
let datum = new Datum(Date.parse(respData[i]['time']), respData[i]['value']);
|
||||||
|
data.push(datum);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
127
src/index.js
127
src/index.js
@ -12,6 +12,12 @@ import {
|
|||||||
import 'chartjs-adapter-dayjs-3';
|
import 'chartjs-adapter-dayjs-3';
|
||||||
import "./style.css"
|
import "./style.css"
|
||||||
|
|
||||||
|
import fetchCurrent from "./fetchCurrent";
|
||||||
|
import fetchData from "./fetchData";
|
||||||
|
import {addLoader, removeLoader} from "./loader";
|
||||||
|
import TokenChart from "./tokenChart";
|
||||||
|
import Datum from "./datum";
|
||||||
|
|
||||||
// TODO: This file should be seperated into multiple with better ownership
|
// TODO: This file should be seperated into multiple with better ownership
|
||||||
|
|
||||||
Chart.register(
|
Chart.register(
|
||||||
@ -29,13 +35,14 @@ let currentRegionSelection = '';
|
|||||||
let currentTimeSelection = '';
|
let currentTimeSelection = '';
|
||||||
let currentAggregateSelection = '';
|
let currentAggregateSelection = '';
|
||||||
let startYAtZero = false;
|
let startYAtZero = false;
|
||||||
|
let chart;
|
||||||
const currentPriceHash = {
|
const currentPriceHash = {
|
||||||
us: 0,
|
us: 0,
|
||||||
eu: 0,
|
eu: 0,
|
||||||
kr: 0,
|
kr: 0,
|
||||||
tw: 0
|
tw: 0
|
||||||
};
|
};
|
||||||
let chartData = {
|
const chartData = {
|
||||||
us: [],
|
us: [],
|
||||||
eu: [],
|
eu: [],
|
||||||
kr: [],
|
kr: [],
|
||||||
@ -68,7 +75,7 @@ function populateChart() {
|
|||||||
datasets: [{
|
datasets: [{
|
||||||
borderColor: 'gold',
|
borderColor: 'gold',
|
||||||
label: currentRegionSelection.toUpperCase() + " WoW Token Price",
|
label: currentRegionSelection.toUpperCase() + " WoW Token Price",
|
||||||
data: chartJsData,
|
data: [],
|
||||||
cubicInterpolationMode: 'monotone',
|
cubicInterpolationMode: 'monotone',
|
||||||
pointRadius: 0
|
pointRadius: 0
|
||||||
}]
|
}]
|
||||||
@ -122,42 +129,35 @@ function lookupTimeUnit(query){
|
|||||||
return lookup[query.charAt(query.length - 1)]
|
return lookup[query.charAt(query.length - 1)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function callUpdateURL() {
|
async function callUpdateURL() {
|
||||||
let resp = await fetch("https://data.wowtoken.app/token/current.json");
|
await updateTokens(await fetchCurrent());
|
||||||
let data = await resp.json();
|
|
||||||
updateTokens(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTokens(data) {
|
async function updateTokens(data) {
|
||||||
updateRegionalToken('us', data);
|
await Promise.all([
|
||||||
updateRegionalToken('eu', data);
|
updateRegionalToken('us', data),
|
||||||
updateRegionalToken('kr', data);
|
updateRegionalToken('eu', data),
|
||||||
updateRegionalToken('tw', data);
|
updateRegionalToken('kr', data),
|
||||||
|
updateRegionalToken('tw', data)
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateRegionalToken(region, data) {
|
async function updateRegionalToken(region, data) {
|
||||||
if (currentPriceHash[region] !== data['price_data'][region]) {
|
if (currentPriceHash[region] !== data['price_data'][region]) {
|
||||||
currentPriceHash[region] = data['price_data'][region];
|
currentPriceHash[region] = data['price_data'][region];
|
||||||
if (region === currentRegionSelection) {
|
if (region === currentRegionSelection) {
|
||||||
formatToken();
|
formatToken();
|
||||||
if (currentAggregateSelection === 'none') {
|
const datum = new Datum(data['current_time'], data['price']);
|
||||||
addDataToChart(region, data);
|
if (currentAggregateSelection === 'none' && chart.active()) {
|
||||||
|
await chart.addDataToChart(datum);
|
||||||
|
}
|
||||||
|
else if (currentAggregateSelection === 'none' && !chart.active()) {
|
||||||
|
await chart.lateUpdate(datum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDataToChart(region, data) {
|
|
||||||
if (tokenChart) {
|
|
||||||
const datum = {x: data['current_time'], y: data['price_data'][region]}
|
|
||||||
tokenChart.data.datasets.forEach((dataset) => {
|
|
||||||
dataset.data.push(datum);
|
|
||||||
})
|
|
||||||
tokenChart.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function aggregateFunctionToggle() {
|
async function aggregateFunctionToggle() {
|
||||||
// TODO: We should probably make these global or something
|
// TODO: We should probably make these global or something
|
||||||
// so if the need to be updated in the future we can do so easily
|
// so if the need to be updated in the future we can do so easily
|
||||||
@ -177,54 +177,33 @@ async function aggregateFunctionToggle() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addLoader() {
|
async function updateRegionPreference(newRegion) {
|
||||||
let loader = document.getElementById('loader');
|
|
||||||
if (!loader) {
|
|
||||||
const blank_div = document.createElement('div');
|
|
||||||
let loaderNode = blank_div.cloneNode();
|
|
||||||
loaderNode.id = 'loader';
|
|
||||||
loaderNode.className = 'lds-ripple';
|
|
||||||
loaderNode.appendChild(blank_div.cloneNode());
|
|
||||||
loaderNode.appendChild(blank_div.cloneNode());
|
|
||||||
let chartNode = document.getElementById('token-chart');
|
|
||||||
chartNode.before(loaderNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeLoader () {
|
|
||||||
let loader = document.getElementById('loader');
|
|
||||||
if (loader) {
|
|
||||||
loader.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateRegionPreference(newRegion) {
|
|
||||||
if (newRegion !== currentRegionSelection) {
|
if (newRegion !== currentRegionSelection) {
|
||||||
tokenChart.destroy();
|
await chart.destroyChart();
|
||||||
addLoader();
|
addLoader();
|
||||||
currentRegionSelection = newRegion;
|
currentRegionSelection = newRegion;
|
||||||
}
|
}
|
||||||
formatToken();
|
formatToken();
|
||||||
pullChartData().then(populateChart);
|
await pullChartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTimePreference(newTime) {
|
async function updateTimePreference(newTime) {
|
||||||
if (newTime !== currentTimeSelection) {
|
if (newTime !== currentTimeSelection) {
|
||||||
tokenChart.destroy();
|
await chart.destroyChart();
|
||||||
addLoader();
|
addLoader();
|
||||||
currentTimeSelection = newTime;
|
currentTimeSelection = newTime;
|
||||||
aggregateFunctionToggle();
|
await aggregateFunctionToggle();
|
||||||
}
|
}
|
||||||
pullChartData().then(populateChart);
|
await pullChartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAggregatePreference(newAggregate) {
|
async function updateAggregatePreference(newAggregate) {
|
||||||
if (newAggregate !== currentAggregateSelection) {
|
if (newAggregate !== currentAggregateSelection) {
|
||||||
tokenChart.destroy();
|
await chart.destroyChart();
|
||||||
addLoader();
|
addLoader();
|
||||||
currentAggregateSelection = newAggregate;
|
currentAggregateSelection = newAggregate;
|
||||||
}
|
}
|
||||||
pullChartData().then(populateChart);
|
await pullChartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleAdvancedSetting() {
|
function toggleAdvancedSetting() {
|
||||||
@ -241,33 +220,19 @@ function toggleAdvancedSetting() {
|
|||||||
|
|
||||||
function toggleStartYAtZero(){
|
function toggleStartYAtZero(){
|
||||||
startYAtZero = document.getElementById('y-start').checked;
|
startYAtZero = document.getElementById('y-start').checked;
|
||||||
if (tokenChart){
|
chart.toggleYStart(startYAtZero);
|
||||||
tokenChart.options.scales.y.beginAtZero = startYAtZero;
|
|
||||||
tokenChart.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function urlBuilder() {
|
|
||||||
let url = "https://data.wowtoken.app/token/history/";
|
|
||||||
if (currentAggregateSelection !== 'none') {
|
|
||||||
url += `${currentAggregateSelection}/`
|
|
||||||
}
|
|
||||||
url += `${currentRegionSelection}/${currentTimeSelection}.json`
|
|
||||||
return url;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function pullChartData() {
|
async function pullChartData() {
|
||||||
let resp = await fetch(urlBuilder());
|
chartData[currentRegionSelection] = await fetchData(currentRegionSelection, currentTimeSelection, currentAggregateSelection);
|
||||||
let chartData = await resp.json();
|
if (!chart.active()) {
|
||||||
let newChartJSData = [];
|
await chart.createChart(currentRegionSelection, currentTimeSelection, startYAtZero, chartData[currentRegionSelection]);
|
||||||
for (let i = 0; i < chartData.length; i++) {
|
}
|
||||||
let datum = {
|
else {
|
||||||
x: chartData[i]['time'],
|
for (let i = 0; i < chartData[currentRegionSelection].length; i++) {
|
||||||
y: chartData[i]['value']
|
await chart.addDataToChart(chartData[currentRegionSelection][i]);
|
||||||
};
|
}
|
||||||
newChartJSData.push(datum);
|
|
||||||
}
|
}
|
||||||
chartJsData = newChartJSData;
|
|
||||||
removeLoader();
|
removeLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,7 +393,11 @@ function registerOptionHandlers() {
|
|||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
registerEventHandles();
|
registerEventHandles();
|
||||||
detectURLQuery();
|
detectURLQuery();
|
||||||
Promise.all([callUpdateURL(), pullChartData()]).then(populateChart)
|
chart = new TokenChart();
|
||||||
|
Promise.all([
|
||||||
|
callUpdateURL(),
|
||||||
|
]).then(pullChartData);
|
||||||
|
|
||||||
setInterval(callUpdateURL, 60*1000);
|
setInterval(callUpdateURL, 60*1000);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
|
22
src/loader.js
Normal file
22
src/loader.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
function addLoader() {
|
||||||
|
let loader = document.getElementById('loader');
|
||||||
|
if (!loader) {
|
||||||
|
const blank_div = document.createElement('div');
|
||||||
|
let loaderNode = blank_div.cloneNode();
|
||||||
|
loaderNode.id = 'loader';
|
||||||
|
loaderNode.className = 'lds-ripple';
|
||||||
|
loaderNode.appendChild(blank_div.cloneNode());
|
||||||
|
loaderNode.appendChild(blank_div.cloneNode());
|
||||||
|
let chartNode = document.getElementById('token-chart');
|
||||||
|
chartNode.before(loaderNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeLoader () {
|
||||||
|
let loader = document.getElementById('loader');
|
||||||
|
if (loader) {
|
||||||
|
loader.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {addLoader, removeLoader};
|
135
src/tokenChart.js
Normal file
135
src/tokenChart.js
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import {
|
||||||
|
Chart,
|
||||||
|
Legend,
|
||||||
|
LinearScale,
|
||||||
|
LineController,
|
||||||
|
LineElement,
|
||||||
|
PointElement,
|
||||||
|
TimeSeriesScale,
|
||||||
|
Title,
|
||||||
|
Tooltip
|
||||||
|
} from 'chart.js';
|
||||||
|
import 'chartjs-adapter-dayjs-3';
|
||||||
|
|
||||||
|
function lookupTimeUnit(query){
|
||||||
|
const lookup = {
|
||||||
|
'h': 'day',
|
||||||
|
'd': 'week',
|
||||||
|
'm': 'month',
|
||||||
|
'y': 'month',
|
||||||
|
'l': 'year'
|
||||||
|
}
|
||||||
|
return lookup[query.charAt(query.length - 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class TokenChart {
|
||||||
|
constructor() {
|
||||||
|
this._context = document.getElementById("token-chart").getContext('2d');
|
||||||
|
this._chartActive = false;
|
||||||
|
this._lastDatum = null;
|
||||||
|
this._lateUpdate = true
|
||||||
|
}
|
||||||
|
|
||||||
|
async createChart(region, time, yLevel, data = []) {
|
||||||
|
const chartData = [];
|
||||||
|
let lateUpdateData = this._lastDatum;
|
||||||
|
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
this._lastDatum = data[i];
|
||||||
|
chartData.push({
|
||||||
|
x: data[i].getX(),
|
||||||
|
y: data[i].getY(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._lateUpdate) {
|
||||||
|
if (this._lastDatum.getPrice() !== lateUpdateData.getPrice() &&
|
||||||
|
this._lastDatum.getTime() < lateUpdateData.getTime()) {
|
||||||
|
chartData.push({
|
||||||
|
x: lateUpdateData.getX(),
|
||||||
|
y: lateUpdateData.getY(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this._lateUpdate = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this._chart = new Chart(this._context, {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
borderColor: 'gold',
|
||||||
|
label: region.toUpperCase() + " WoW Token Price",
|
||||||
|
data: chartData,
|
||||||
|
cubicInterpolationMode: 'monotone',
|
||||||
|
pointRadius: 0
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
mode: "index"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
type: 'time',
|
||||||
|
grid: {
|
||||||
|
color: '#625f62',
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
color: '#a7a4ab',
|
||||||
|
font: {
|
||||||
|
size: 18,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
time: {
|
||||||
|
unit: lookupTimeUnit(time)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
beginAtZero: yLevel,
|
||||||
|
grid: {
|
||||||
|
color: '#2f2c2f',
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
color: '#a7a4ab',
|
||||||
|
font: {
|
||||||
|
size: 18,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this._chartActive = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async destroyChart() {
|
||||||
|
await this._chart.destroy();
|
||||||
|
this._chartActive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async lateUpdate(datum){
|
||||||
|
this._lastDatum = datum;
|
||||||
|
this._lateUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async addDataToChart(datum) {
|
||||||
|
this._chart.data.datasets.forEach((dataset) => {
|
||||||
|
dataset.data.push({
|
||||||
|
x: datum.getX(),
|
||||||
|
y: datum.getY(),
|
||||||
|
})
|
||||||
|
});
|
||||||
|
this._chart.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
active() {
|
||||||
|
return this._chartActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleYStart(startYAtZero) {
|
||||||
|
this._chart.options.scales.y.beginAtZero = startYAtZero;
|
||||||
|
this._chart.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
8
src/urlBuilder.js
Normal file
8
src/urlBuilder.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export default function urlBuilder(currentRegionSelection, currentTimeSelection, currentAggregateSelection) {
|
||||||
|
let url = "https://data.wowtoken.app/token/history/";
|
||||||
|
if (currentAggregateSelection !== 'none') {
|
||||||
|
url += `${currentAggregateSelection}/`
|
||||||
|
}
|
||||||
|
url += `${currentRegionSelection}/${currentTimeSelection}.json`
|
||||||
|
return url;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user