diff --git a/css/dashboard.css b/css/dashboard.css index 8f12c4c..9a26383 100644 --- a/css/dashboard.css +++ b/css/dashboard.css @@ -422,6 +422,7 @@ input[type=range]::-moz-range-thumb { .icon.alert:before { content: "\F0026"; } .icon.alpha_b:before { content: "\F0AEF"; } .icon.alpha_b_box:before { content: "\F0B09"; } +.icon.apple:before { content: "\F0035"; } .icon.arrow_down:before { content: "\F0045"; } .icon.arrow_expand_horizontal:before { content: "\F084E"; } .icon.arrow_expand_vertical:before { content: "\F084F"; } diff --git a/index.php b/index.php index 06e5f8d..9902c38 100644 --- a/index.php +++ b/index.php @@ -38,8 +38,12 @@ - - + is_demo() === false) { + echo ''; + echo ''; + } + ?> get('commit') . '">'; diff --git a/js/beestat/platform.js b/js/beestat/platform.js index 42eec92..04895ba 100644 --- a/js/beestat/platform.js +++ b/js/beestat/platform.js @@ -1,4 +1,18 @@ +/** + * Determine what platform the app is being accessed from. Defaults to + * "desktop" if "android" or "ios" are not specified in the browser query + * string. + * + * @return {string} The platform. + */ beestat.platform = function() { - const url_parameters = new URLSearchParams(window.location.search); - return url_parameters.get('platform'); + const platform = new URLSearchParams(window.location.search).get('platform'); + + switch (platform) { + case 'android': + case 'ios': + return platform; + } + + return 'browser'; }; diff --git a/js/component/card/rate_app_reminder.js b/js/component/card/rate_app_reminder.js new file mode 100644 index 0000000..bd492fd --- /dev/null +++ b/js/component/card/rate_app_reminder.js @@ -0,0 +1,116 @@ +/** + * Banner asking people to rate and review the app. + */ +beestat.component.card.rate_app_reminder = function() { + const self = this; + + beestat.dispatcher.addEventListener( + 'setting.ui.rate_app_reminder_hide_until', + function() { + self.rerender(); + } + ); + + beestat.component.card.apply(this, arguments); +}; +beestat.extend(beestat.component.card.rate_app_reminder, beestat.component.card); + +/** + * Decorate + * + * @param {rocket.Elements} parent + */ +beestat.component.card.rate_app_reminder.prototype.decorate_contents_ = function(parent) { + const self = this; + + // Don't render anything if the user dismissed this card. + if (beestat.component.card.rate_app_reminder.should_show() === false) { + window.setTimeout(function() { + self.dispose(); + }, 0); + return; + } + + parent.style('background', beestat.style.color.bluegray.base); + + let icon; + let store_name; + let store_url; + + if (beestat.platform() === 'ios') { + icon = 'apple'; + store_name = 'the App Store'; + store_url = 'https://apps.apple.com/us/app/beestat/id6469190206?platform=ipad'; + } else if (beestat.platform() === 'android') { + icon = 'google_play'; + store_name = 'Google Play'; + store_url = 'https://play.google.com/store/apps/details?id=io.beestat'; + } else { + throw new Error('Unsupported platform.'); + } + + new beestat.component.tile() + .set_icon(icon) + .set_size('large') + .set_text( + 'Rate now on ' + store_name + ) + .set_background_color(beestat.style.color.green.dark) + .set_background_hover_color(beestat.style.color.green.light) + .addEventListener('click', function() { + window.open(store_url); + }) + .render(parent); +}; + +/** + * Get the title of the card. + * + * @return {string} The title. + */ +beestat.component.card.rate_app_reminder.prototype.get_title_ = function() { + return 'Like the app? Leave a rating or review!'; +}; + +/** + * Decorate the close button. + * + * @param {rocket.Elements} parent + */ +beestat.component.card.rate_app_reminder.prototype.decorate_top_right_ = function(parent) { + new beestat.component.tile() + .set_type('pill') + .set_shadow(false) + .set_icon('close') + .set_text_color('#fff') + .set_background_hover_color(beestat.style.color.bluegray.light) + .addEventListener('click', function() { + beestat.setting( + 'ui.rate_app_reminder_hide_until', + moment().utc() + .add(1000, 'year') + .format('YYYY-MM-DD HH:mm:ss') + ); + }) + .render(parent); +}; + +/** + * Determine whether or not this card should be shown. + * + * @return {boolean} Whether or not to show the card. + */ +beestat.component.card.rate_app_reminder.should_show = function() { + return ( + beestat.user.get().user_id === 1 && + ( + beestat.platform() === 'android' || + beestat.platform() === 'ios' + ) && + beestat.setting('meta.opens.' + beestat.platform()) > 10 && + ( + beestat.setting('ui.rate_app_reminder_hide_until') === undefined || + moment.utc(beestat.setting('ui.rate_app_reminder_hide_until')).isBefore(moment.utc()) + ) + ); +}; diff --git a/js/js.php b/js/js.php index 4407c01..97c5e34 100755 --- a/js/js.php +++ b/js/js.php @@ -95,6 +95,7 @@ if($setting->get('environment') === 'dev' || $setting->get('environment') === 'd echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL; + echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL; echo '' . PHP_EOL; diff --git a/js/layer/detail.js b/js/layer/detail.js index 6cca0dd..2340d14 100644 --- a/js/layer/detail.js +++ b/js/layer/detail.js @@ -55,6 +55,13 @@ beestat.layer.detail.prototype.decorate_ = function(parent) { 'size': 12 } ]); + } else if (beestat.component.card.rate_app_reminder.should_show() === true) { + cards.push([ + { + 'card': new beestat.component.card.rate_app_reminder(), + 'size': 12 + } + ]); } cards.push([ diff --git a/js/layer/load.js b/js/layer/load.js index d04ee05..a171ca9 100644 --- a/js/layer/load.js +++ b/js/layer/load.js @@ -162,6 +162,14 @@ beestat.layer.load.prototype.decorate_ = function(parent) { ); } + // Increment the number of opens if under the threshold. + const setting_key = 'meta.opens.' + beestat.platform(); + if (beestat.setting(setting_key) === undefined) { + beestat.setting(setting_key, 1); + } else { + beestat.setting(setting_key, beestat.setting(setting_key) + 1); + } + // Change the active thermostat_id if the one you have is no longer valid. if (response.thermostat[beestat.setting('thermostat_id')] === undefined) { beestat.setting('thermostat_id', Object.keys(response.thermostat)[0]); diff --git a/manifest.json b/manifest.json index d8aca92..97c63d2 100644 --- a/manifest.json +++ b/manifest.json @@ -10,5 +10,12 @@ "start_url": "/", "display": "standalone", "background_color": "#263238", - "theme_color": "#263238" + "theme_color": "#263238", + "prefer_related_applications": true, + "related_applications": [ + { + "platform": "play", + "id": "io.beestat" + } + ] }