1
0
mirror of https://github.com/beestat/app.git synced 2025-06-03 13:46:54 -04:00
beestat/js/component/modal/patreon_status.js

266 lines
6.3 KiB
JavaScript

/**
* Patreon Status.
*/
beestat.component.modal.patreon_status = function() {
var self = this;
beestat.dispatcher.addEventListener(
'cache.user',
function() {
self.rerender();
}
);
beestat.component.modal.apply(this, arguments);
};
beestat.extend(beestat.component.modal.patreon_status, beestat.component.modal);
beestat.component.modal.patreon_status.prototype.decorate_contents_ = function(parent) {
var user = beestat.user.get();
if (user.patreon_status === null) {
this.decorate_wait_(parent);
} else {
this.decorate_status_(parent);
}
};
/**
* Do some wait logic and get an updated user every 5 seconds.
*
* @param {rocket.Elements} parent
*/
beestat.component.modal.patreon_status.prototype.decorate_wait_ = function(parent) {
parent.appendChild(
$.createElement('div')
.style({
'margin-top': beestat.style.size.gutter
})
.innerText('Waiting for Patreon to connect...')
);
var api = new beestat.api();
api.add_call('user', 'read_id');
api.set_callback(function(response) {
beestat.cache.set('user', response);
});
window.setTimeout(function() {
api.send();
}, 5000);
};
/**
* Decorate the patreon details if they exist.
*
* @param {rocket.Elements} parent
*/
beestat.component.modal.patreon_status.prototype.decorate_status_ = function(parent) {
var user = beestat.user.get();
// Create our number formatter.
var formatter = new Intl.NumberFormat(
'en-US',
{
'style': 'currency',
'currency': 'USD'
}
);
var container = $.createElement('div')
.style({
'display': 'grid',
'grid-template-columns': 'repeat(auto-fill, minmax(150px, 1fr))',
'margin': '0 0 16px -16px'
});
parent.appendChild(container);
let patron_status;
switch (user.patreon_status.patron_status) {
case 'active_patron':
patron_status = 'Active Patron';
break;
case 'declined_patron':
patron_status = 'Declined Patron';
break;
case 'former_patron':
patron_status = 'Former Patron';
break;
case 'not_patron':
patron_status = 'Not Patron';
break;
default:
patron_status = 'Unknown';
break;
}
let last_charged;
switch (user.patreon_status.last_charge_date) {
case undefined:
last_charged = 'Unknown';
break;
case null:
last_charged = 'Never';
break;
default:
last_charged = moment.utc(user.patreon_status.last_charge_date).local()
.format('MMM Do, YYYY');
break;
}
let current_pledge;
switch (user.patreon_status.will_pay_amount_cents) {
case undefined:
current_pledge = 'Unknown';
break;
case null:
current_pledge = formatter.format(0);
break;
default:
current_pledge = formatter.format(user.patreon_status.will_pay_amount_cents / 100);
break;
}
let lifetime_support;
switch (user.patreon_status.lifetime_support_cents) {
case undefined:
lifetime_support = 'Unknown';
break;
case null:
lifetime_support = formatter.format(0);
break;
default:
lifetime_support = formatter.format(user.patreon_status.lifetime_support_cents / 100);
break;
}
var fields = [
{
'name': 'Status',
'value': patron_status
},
{
'name': 'Last Charged',
'value': last_charged
},
{
'name': 'Current Pledge',
'value': current_pledge
},
{
'name': 'Lifetime Support',
'value': lifetime_support
}
];
fields.forEach(function(field) {
var div = $.createElement('div')
.style({
'padding': '16px 0 0 16px'
});
container.appendChild(div);
div.appendChild($.createElement('div')
.style({
'font-weight': beestat.style.font_weight.bold,
'margin-bottom': (beestat.style.size.gutter / 4)
})
.innerText(field.name));
div.appendChild($.createElement('div').innerText(field.value));
});
if (beestat.user.patreon_is_connected() === true) {
const last_update = moment.utc(beestat.user.get().sync_status.patreon)
.local()
.fromNow();
parent.appendChild(
$.createElement('div')
.innerText('Patreon status is automatically updated every 24 hours. Your last update was ' + last_update + '.')
);
}
};
/**
* Get the modal title.
*
* @return {string} The modal title.
*/
beestat.component.modal.patreon_status.prototype.get_title_ = function() {
return 'Patreon Status';
};
/**
* Get the buttons on the modal.
*
* @return {[beestat.component.button]} The buttons.
*/
beestat.component.modal.patreon_status.prototype.get_buttons_ = function() {
const self = this;
if (beestat.user.patreon_is_connected() === true) {
const unlink = new beestat.component.tile()
.set_text('Unlink')
.set_icon('link_off')
.set_shadow(false)
.set_background_color('#fff')
.set_text_color(beestat.style.color.gray.base)
.set_text_hover_color(beestat.style.color.red.base)
.addEventListener('click', function() {
this
.removeEventListener('click');
new beestat.api()
.add_call(
'user',
'unlink_patreon_account',
{},
'unlink_patreon_account'
)
.add_call('user', 'read_id', {}, 'user')
.set_callback(function(response) {
// Update the cache.
self.dispose();
beestat.cache.set('user', response.user);
})
.send();
});
const refresh = new beestat.component.tile()
.set_text('Refresh Status')
.set_icon('refresh')
.set_background_color(beestat.style.color.green.base)
.set_background_hover_color(beestat.style.color.green.light)
.set_text_color('#fff')
.addEventListener('click', function() {
this
.set_background_color(beestat.style.color.gray.base)
.set_background_hover_color()
.removeEventListener('click');
new beestat.api()
.add_call(
'user',
'sync_patreon_status',
{},
'sync_patreon_status'
)
.add_call('user', 'read_id', {}, 'user')
.set_callback(function(response) {
// Update the cache.
beestat.cache.set('user', response.user);
})
.send();
});
return [
unlink,
refresh
];
}
return [];
};