web/assets/js/_utils/pageviews.js

227 lines
5.1 KiB
JavaScript
Raw Normal View History

2019-09-30 15:38:41 +03:00
/**
* Count pageviews form GA or local cache file.
*
* Dependences:
* - jQuery
2020-04-01 15:33:49 +03:00
* - countUp.js <https://github.com/inorganik/countUp.js>
2019-09-30 15:38:41 +03:00
*
2020-01-02 16:17:49 +03:00
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
2019-09-30 15:38:41 +03:00
* © 2018-2019 Cotes Chung
* MIT License
*/
2020-03-19 13:56:54 +03:00
function countUp(min, max, destId) {
2019-09-30 15:38:41 +03:00
if (min < max) {
2020-03-19 13:56:54 +03:00
var numAnim = new CountUp(destId, min, max);
2019-09-30 15:38:41 +03:00
if (!numAnim.error) {
numAnim.start();
} else {
console.error(numAnim.error);
}
}
}
2020-03-19 13:56:54 +03:00
2019-09-30 15:38:41 +03:00
function countPV(path, rows) {
var count = 0;
2020-07-24 15:45:19 +03:00
if (rows !== undefined ) {
for (var i = 0; i < rows.length; ++i) {
var gaPath = rows[i][0];
if (gaPath == path) { /* path format see: site.permalink */
count += parseInt(rows[i][1]);
break;
}
2019-09-30 15:38:41 +03:00
}
}
return count;
}
2020-03-19 13:56:54 +03:00
function tacklePV(rows, path, elem, hasInit) {
var count = countPV(path, rows);
count = (count == 0 ? 1 : count);
if (!hasInit) {
elem.text(new Intl.NumberFormat().format(count));
} else {
var initCount = parseInt(elem.text().replace(/,/g, ''));
if (count > initCount) {
countUp(initCount, count, elem.attr('id'));
}
}
}
function displayPageviews(data) {
if (data === undefined) {
2019-09-30 15:38:41 +03:00
return;
}
var hasInit = getInitStatus();
2020-07-24 15:45:19 +03:00
var rows = data.rows; /* could be undefined */
if ($("#post-list").length > 0) { /* the Home page */
2019-09-30 15:38:41 +03:00
$(".post-preview").each(function() {
2020-06-06 07:45:33 +03:00
var path = $(this).children("div").children("h1").children("a").attr("href");
2020-03-19 13:56:54 +03:00
tacklePV(rows, path, $(this).find('.pageviews'), hasInit);
2019-09-30 15:38:41 +03:00
});
} else if ($(".post").length > 0) { /* the post */
2019-09-30 15:38:41 +03:00
var path = window.location.pathname;
2020-03-19 13:56:54 +03:00
tacklePV(rows, path, $('#pv'), hasInit);
2019-09-30 15:38:41 +03:00
}
}
var getInitStatus = (function() {
var hasInit = false;
return function() {
2020-04-01 15:33:49 +03:00
let ret = hasInit;
if (!hasInit) {
hasInit = true;
}
2020-04-01 15:33:49 +03:00
return ret;
}
})();
2020-04-01 15:33:49 +03:00
var PvCache = (function() {
const KEY_PV = "pv";
const KEY_CREATION = "pv_created_date";
const KEY_PV_SRC = "pv_source";
2020-04-01 15:33:49 +03:00
var Source = {
2020-04-01 15:33:49 +03:00
ORIGIN: "origin",
PROXY: "proxy"
};
function get(key) {
return localStorage.getItem(key);
}
function set(key, val) {
localStorage.setItem(key, val);
}
return {
getData: function() {
return JSON.parse(localStorage.getItem(KEY_PV) );
},
saveOriginCache: function(pv) {
set(KEY_PV, pv);
set(KEY_PV_SRC, Source.ORIGIN );
2020-04-01 15:33:49 +03:00
set(KEY_CREATION, new Date().toJSON() );
},
saveProxyCache: function(pv) {
set(KEY_PV, pv);
set(KEY_PV_SRC, Source.PROXY );
2020-04-01 15:33:49 +03:00
set(KEY_CREATION, new Date().toJSON() );
},
isFromOrigin: function() {
return get(KEY_PV_SRC) == Source.ORIGIN;
2020-04-01 15:33:49 +03:00
},
isFromProxy: function() {
return get(KEY_PV_SRC) == Source.PROXY;
2020-04-01 15:33:49 +03:00
},
isExpired: function() {
if (PvCache.isFromOrigin() ) {
2020-04-01 15:33:49 +03:00
let date = new Date(get(KEY_CREATION));
date.setDate(date.getDate() + 1); /* update origin records every day */
2020-04-01 15:33:49 +03:00
return Date.now() >= date.getTime();
} else if (PvCache.isFromProxy() ) {
2020-04-01 15:33:49 +03:00
let date = new Date(get(KEY_CREATION) );
date.setHours(date.getHours() + 1); /* update proxy records per hour */
2020-04-01 15:33:49 +03:00
return Date.now() >= date.getTime();
}
return false;
},
getAllPagevies: function() {
return PvCache.getData().totalsForAllResults["ga:pageviews"];
},
newerThan: function(pv) {
return PvCache.getAllPagevies() > pv.totalsForAllResults["ga:pageviews"];
},
inspectKeys: function() {
if (localStorage.getItem(KEY_PV) == null
|| localStorage.getItem(KEY_PV_SRC) == null
|| localStorage.getItem(KEY_CREATION) == null) {
localStorage.clear();
}
2020-04-01 15:33:49 +03:00
}
};
})(); /* PvCache */
2020-04-01 15:33:49 +03:00
function fetchPageviews(fetchOrigin = true, filterOrigin = false) {
/* pvCacheEnabled see: /assets/js/_pv-config.js */
if (pvCacheEnabled && fetchOrigin) {
fetch('/assets/js/data/pageviews.json')
.then(response => response.json())
.then(data => {
if (filterOrigin) {
if (PvCache.newerThan(data)) {
return;
}
}
displayPageviews(data);
PvCache.saveOriginCache(JSON.stringify(data));
})
.then(() => fetchProxyPageviews());
} else {
fetchProxyPageviews();
2020-04-01 15:33:49 +03:00
}
2020-04-01 15:33:49 +03:00
}
function fetchProxyPageviews() {
$.ajax({
type: 'GET',
url: proxyEndpoint, /* see: /assets/js/_pv-config.js */
2020-04-01 15:33:49 +03:00
dataType: 'jsonp',
jsonpCallback: "displayPageviews",
success: function(data, textStatus, jqXHR) {
PvCache.saveProxyCache(JSON.stringify(data));
},
error: function(jqXHR, textStatus, errorThrown) {
console.log("Failed to load pageviews from proxy server: " + errorThrown);
}
});
}
2019-09-30 15:38:41 +03:00
$(function() {
2020-04-01 15:33:49 +03:00
2019-09-30 15:38:41 +03:00
if ($('.pageviews').length > 0) {
PvCache.inspectKeys();
2020-04-01 15:33:49 +03:00
let cache = PvCache.getData();
if (cache) {
displayPageviews(cache);
2020-04-01 15:33:49 +03:00
if (PvCache.isExpired()) {
fetchPageviews(true, PvCache.isFromProxy());
2019-09-30 15:38:41 +03:00
} else {
2020-04-01 15:33:49 +03:00
if (PvCache.isFromOrigin()) {
fetchPageviews(false);
2020-04-01 15:33:49 +03:00
}
}
} else {
fetchPageviews();
2020-04-01 15:33:49 +03:00
}
}
2019-09-30 15:38:41 +03:00
2020-03-19 13:56:54 +03:00
});