main.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Auto Hide Header
  2. //
  3. let lastScrollPosition = window.pageYOffset;
  4. let header = document.getElementById('site-header');
  5. const autoHideHeader = () => {
  6. let currentScrollPosition = window.pageYOffset;
  7. if (currentScrollPosition > lastScrollPosition) {
  8. header.classList.remove('slideInUp');
  9. header.classList.add('slideOutDown');
  10. }
  11. else {
  12. header.classList.remove('slideOutDown');
  13. header.classList.add('slideInUp');
  14. }
  15. lastScrollPosition = currentScrollPosition;
  16. }
  17. // Mobile Menu Toggle
  18. //
  19. let mobileMenu = document.getElementById('mobile-menu');
  20. if (haveHeader == true) {
  21. document.getElementById('menu-btn').addEventListener('click', () => {
  22. if (mobileMenu.style.display == 'none') {
  23. mobileMenu.style.display = 'block';
  24. } else {
  25. mobileMenu.classList.remove('bounceInRight');
  26. mobileMenu.classList.add('bounceOutRight');
  27. setTimeout(() => {
  28. mobileMenu.style.display = 'none';
  29. mobileMenu.classList.remove('bounceOutRight');
  30. mobileMenu.classList.add('bounceInRight');
  31. }, 750);
  32. }
  33. });
  34. }
  35. //Load Comments
  36. //
  37. let commentsLoaded = false;
  38. let comments = document.getElementById('comments');
  39. let commentsLoader = document.getElementById('comments-loader');
  40. const avJsUrl = '//cdn1.lncld.net/static/js/3.0.4/av-min.js';
  41. const valineJsUrl = '//unpkg.com/valine/dist/Valine.min.js';
  42. const loadScript = (source, beforeEl, async = true, defer = true) => {
  43. return new Promise((resolve, reject) => {
  44. let script = document.createElement('script');
  45. const prior = beforeEl || document.getElementsByTagName('script')[0];
  46. script.async = async;
  47. script.defer = defer;
  48. function onloadHander(_, isAbort) {
  49. if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
  50. script.onload = null;
  51. script.onreadystatechange = null;
  52. script = undefined;
  53. if (isAbort) { reject(); } else { resolve(); }
  54. }
  55. }
  56. script.onload = onloadHander;
  57. script.onreadystatechange = onloadHander;
  58. script.src = source;
  59. prior.parentNode.insertBefore(script, prior);
  60. });
  61. }
  62. const loadComments = () => {
  63. loadScript(avJsUrl).then(() => {
  64. console.log('av-min.js Loaded');
  65. loadScript(valineJsUrl).then(() => {
  66. console.log('Valine.min.js Loaded');
  67. new Valine({
  68. el: '#comments',
  69. appId: 'QfBLso0johYg7AXtV9ODU6FC-gzGzoHsz',
  70. appKey: 'J1tpEEsENa48aLVsPdvwMP14'
  71. });
  72. console.log('Comments Loaded');
  73. commentsLoader.style.display = 'none';
  74. }, () => {
  75. console.log('Fail to Load Valine.min.js');
  76. });
  77. }, () => {
  78. console.log('Fail to Load av-min.js');
  79. });
  80. }
  81. // Load comments if the window is not scrollable
  82. if ((haveComments == true) && (comments.offsetTop < window.innerHeight)) {
  83. console.log('Ready to Load Comments');
  84. commentsLoader.style.display = 'block';
  85. loadComments();
  86. commentsLoaded = true;
  87. }
  88. window.addEventListener('scroll', () => {
  89. if (haveHeader == true) {
  90. autoHideHeader();
  91. mobileMenu.style.display = 'none'; //Hide Mobile Menu When Scroll
  92. }
  93. if ((haveComments == true) && (commentsLoaded == false)) {
  94. if (window.pageYOffset + window.innerHeight > comments.offsetTop) {
  95. console.log('Ready to Load Comments');
  96. commentsLoader.style.display = 'block';
  97. loadComments();
  98. commentsLoaded = true;
  99. }
  100. }
  101. });