main.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. // Show Featured Image
  36. //
  37. const showFeaturedImg = () => {
  38. console.log('show Img')
  39. document.getElementById('bg-img').classList.add('show-bg-img');
  40. }
  41. const showContent = () => {
  42. console.log('show Content')
  43. document.getElementById('bg-img').classList.remove('show-bg-img');
  44. }
  45. //Load Comments
  46. //
  47. let commentsLoaded = false;
  48. let comments = document.getElementById('comments');
  49. let commentsLoader = document.getElementById('comments-loader');
  50. const avJsUrl = '//cdn1.lncld.net/static/js/3.0.4/av-min.js';
  51. const valineJsUrl = '//unpkg.com/valine/dist/Valine.min.js';
  52. const loadScript = (source, beforeEl, async = true, defer = true) => {
  53. return new Promise((resolve, reject) => {
  54. let script = document.createElement('script');
  55. const prior = beforeEl || document.getElementsByTagName('script')[0];
  56. script.async = async;
  57. script.defer = defer;
  58. function onloadHander(_, isAbort) {
  59. if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
  60. script.onload = null;
  61. script.onreadystatechange = null;
  62. script = undefined;
  63. if (isAbort) { reject(); } else { resolve(); }
  64. }
  65. }
  66. script.onload = onloadHander;
  67. script.onreadystatechange = onloadHander;
  68. script.src = source;
  69. prior.parentNode.insertBefore(script, prior);
  70. });
  71. }
  72. const loadComments = () => {
  73. loadScript(avJsUrl).then(() => {
  74. console.log('av-min.js Loaded');
  75. loadScript(valineJsUrl).then(() => {
  76. console.log('Valine.min.js Loaded');
  77. new Valine({
  78. el: '#comments',
  79. appId: 'QfBLso0johYg7AXtV9ODU6FC-gzGzoHsz',
  80. appKey: 'J1tpEEsENa48aLVsPdvwMP14'
  81. });
  82. console.log('Comments Loaded');
  83. commentsLoader.style.display = 'none';
  84. }, () => {
  85. console.log('Fail to Load Valine.min.js');
  86. });
  87. }, () => {
  88. console.log('Fail to Load av-min.js');
  89. });
  90. }
  91. // Load comments if the window is not scrollable
  92. if ((haveComments == true) && (comments.offsetTop < window.innerHeight)) {
  93. console.log('Ready to Load Comments');
  94. commentsLoader.style.display = 'block';
  95. loadComments();
  96. commentsLoaded = true;
  97. }
  98. window.addEventListener('scroll', () => {
  99. if (haveHeader == true) {
  100. autoHideHeader();
  101. mobileMenu.style.display = 'none'; //Hide Mobile Menu When Scroll
  102. }
  103. if ((haveComments == true) && (commentsLoaded == false)) {
  104. if (window.pageYOffset + window.innerHeight > comments.offsetTop) {
  105. console.log('Ready to Load Comments');
  106. commentsLoader.style.display = 'block';
  107. loadComments();
  108. commentsLoaded = true;
  109. }
  110. }
  111. });