firestore.swig 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. {%- if theme.firestore.enable %}
  2. <script src="https://www.gstatic.com/firebasejs/6.3.3/firebase-app.js"></script>
  3. <script src="https://www.gstatic.com/firebasejs/6.3.3/firebase-firestore.js"></script>
  4. <script>
  5. firebase.initializeApp({
  6. apiKey : '{{ theme.firestore.apiKey }}',
  7. projectId: '{{ theme.firestore.projectId }}'
  8. });
  9. function getCount(doc, increaseCount) {
  10. // IncreaseCount will be false when not in article page
  11. return doc.get().then(d => {
  12. var count = 0;
  13. if (!d.exists) { // Has no data, initialize count
  14. if (increaseCount) {
  15. doc.set({
  16. count: 1
  17. });
  18. count = 1;
  19. }
  20. } else { // Has data
  21. count = d.data().count;
  22. if (increaseCount) {
  23. // If first view this article
  24. doc.set({ // Increase count
  25. count: count + 1
  26. });
  27. count++;
  28. }
  29. }
  30. return count;
  31. });
  32. }
  33. function appendCountTo(el) {
  34. return count => {
  35. el.innerText = count;
  36. }
  37. }
  38. </script>
  39. <script{{ pjax }}>
  40. (function() {
  41. var db = firebase.firestore();
  42. var articles = db.collection('{{ theme.firestore.collection }}');
  43. if (CONFIG.page.isPost) { // Is article page
  44. var title = document.querySelector('.post-title').innerText.trim();
  45. var doc = articles.doc(title);
  46. var increaseCount = CONFIG.hostname === location.hostname;
  47. if (localStorage.getItem(title)) {
  48. increaseCount = false;
  49. } else {
  50. // Mark as visited
  51. localStorage.setItem(title, true);
  52. }
  53. getCount(doc, increaseCount).then(appendCountTo(document.querySelector('.firestore-visitors-count')));
  54. } else if (CONFIG.page.isHome) { // Is index page
  55. var promises = [...document.querySelectorAll('.post-title')].map(element => {
  56. var title = element.innerText.trim();
  57. var doc = articles.doc(title);
  58. return getCount(doc);
  59. });
  60. Promise.all(promises).then(counts => {
  61. var metas = document.querySelectorAll('.firestore-visitors-count');
  62. counts.forEach((val, idx) => {
  63. appendCountTo(metas[idx])(val);
  64. });
  65. });
  66. }
  67. })();
  68. </script>
  69. {%- endif %}