app.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. var BASE_URL = 'http://192.168.1.127/api/';
  2. function http(url, params) {
  3. return new Promise(function(resolve, reject) {
  4. httpRequest = new XMLHttpRequest();
  5. httpRequest.onreadystatechange = function() {
  6. if (httpRequest.readyState == XMLHttpRequest.DONE) {
  7. if (httpRequest.status == 200) {
  8. resolve(JSON.parse(httpRequest.responseText));
  9. } else {
  10. reject("pls fix later");
  11. }
  12. }
  13. };
  14. httpRequest.open('GET', url, true);
  15. httpRequest.setRequestHeader('lang', 'ES')
  16. var x = params ? params : null;
  17. httpRequest.send(null);
  18. });
  19. }
  20. http('http://192.168.1.127/api/products/listcategories').then(function(data) {
  21. }, function(err) {
  22. console.log("err", err);
  23. });
  24. function logError(err) {
  25. console.log('Error: ', err);
  26. }
  27. var sections = [{
  28. name: 'empresa',
  29. view: true
  30. }, {
  31. name: 'productos',
  32. view: false
  33. }];
  34. function fetchProducts(category) {
  35. return new Promise(function(resolve, reject) {
  36. var products = [];
  37. if (R.isNil(data.allProducts[category]) || R.isEmpty(data.allProducts[category])) {
  38. http(BASE_URL + 'products/category/' + category).then(function(xs) {
  39. resolve(xs)
  40. }, function(err) {
  41. reject(err);
  42. })
  43. } else {
  44. resolve(data.allProducts[category]);
  45. }
  46. })
  47. }
  48. function getProducts(category) {
  49. fetchProducts(category).then(function(xs) {
  50. data.allProducts[category] = xs;
  51. data.products = xs;
  52. })
  53. }
  54. var selectedSection_ = {
  55. empresa: true,
  56. productos: false
  57. };
  58. var selectedCategory_ = 'proteccion intensiva';
  59. rivets.configure({
  60. executeFunctions: true
  61. })
  62. function getCategories() {
  63. if (productCategories_.length === 0) {
  64. http(BASE_URL + 'products/listcategories').then(function(data) {
  65. data.forEach(function(category) {
  66. productCategories_.push(category)
  67. })
  68. }, logError)
  69. }
  70. }
  71. var productCategories_ = [];
  72. var productListEl = document.getElementsByClassName('product-list')[0];
  73. var categoryNavEl = document.getElementById('product-category-nav');
  74. var app = document.getElementById('app');
  75. var data = {
  76. allProducts: {},
  77. products: [],
  78. selectedCategory: '',
  79. productDescription: {},
  80. productView: {
  81. list: true,
  82. description: false
  83. },
  84. getSectionData: {
  85. productos: getCategories,
  86. empresa: function() {}
  87. }
  88. }
  89. function getElement(selector) {
  90. return window.document.querySelectorAll(selector);
  91. }
  92. function chooseSection(section) {
  93. var navbarList = getElement('ul.navbar-list > li > a');
  94. sections.forEach(function (s) {
  95. var isSelected = s.name === section;
  96. s.view = isSelected;
  97. selectedSection_[s.name] = isSelected;
  98. })
  99. data.getSectionData[section]();
  100. }
  101. var elements = [];
  102. function addSelectedClass(elemList, x) {
  103. elemList.forEach(function(el) {
  104. var isSelected = el.text === x;
  105. el.className = isSelected ? 'selected' : '';
  106. })
  107. }
  108. window.onscroll = function() {
  109. elements = elements.reduce(function(acc, e) {
  110. if (isInViewport(e)) {
  111. e.className = 'discover-li'
  112. return acc;
  113. } else {
  114. acc.push(e);
  115. return acc;
  116. }
  117. }, [])
  118. if (elements.length === 0) {
  119. window.onscroll = function() {};
  120. }
  121. };
  122. function isInViewport(element) {
  123. var rect = element.getBoundingClientRect();
  124. var html = document.documentElement;
  125. return (rect.top >= 0 &&
  126. rect.left >= 0 &&
  127. rect.bottom <= (window.innerHeight || html.clientHeight) &&
  128. rect.right <= (window.innerWidth || html.clientWidth))
  129. }
  130. window.onload = function() {
  131. var section = window.location.hash.substr(1)
  132. if (section !== '') {
  133. chooseSection(section, selectedSection_);
  134. }
  135. var view = rivets.bind(app, {
  136. sections: sections,
  137. selectedSection: selectedSection_,
  138. productCategories: productCategories_,
  139. data: data,
  140. selectedCategory: selectedCategory_,
  141. selectSection: function(event, scope) {
  142. var newValue = event.target.text;
  143. window.history.pushState({}, newValue, '#' + newValue)
  144. chooseSection(newValue, selectedSection_);
  145. event.target.className = 'selected';
  146. },
  147. selectCategory: function(event, scope) {
  148. data.productView.list = true;
  149. data.productView.description = false;
  150. var category = productCategories_.find(R.propEq('name', event.target.text));
  151. var categoryList = getElement('ul#product-category-nav > li > a')
  152. data.selectedCategory = category;
  153. getProducts(category._id);
  154. addSelectedClass(categoryList, category.name);
  155. },
  156. seeProduct: function(event, scope) {
  157. data.productView.list = false;
  158. data.productView.description = true;
  159. data.productDescription = data.products.find(R.propEq('name', event.target.text));
  160. }
  161. });
  162. }