app.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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.products = [];
  51. data.allProducts[category] = xs;
  52. xs.forEach(function (x) {
  53. data.products.push(x);
  54. })
  55. })
  56. }
  57. var selectedSection_ = {
  58. empresa: true,
  59. productos: false
  60. };
  61. var selectedCategory_ = 'proteccion intensiva';
  62. rivets.configure({
  63. executeFunctions: true
  64. })
  65. function getCategories() {
  66. if (productCategories_.length === 0) {
  67. http(BASE_URL + 'products/listcategories').then(function(data) {
  68. data.forEach(function(category) {
  69. productCategories_.push(category)
  70. })
  71. }, logError)
  72. }
  73. }
  74. var productCategories_ = [];
  75. var productListEl = document.getElementsByClassName('product-list')[0];
  76. var categoryNavEl = document.getElementById('product-category-nav');
  77. var app = document.getElementById('app');
  78. var data = {
  79. allProducts: {},
  80. products: [],
  81. selectedCategory: '',
  82. productDescription: {},
  83. productView: {
  84. list: true,
  85. description: false
  86. },
  87. getSectionData: {
  88. productos: getCategories,
  89. empresa: function() {}
  90. }
  91. }
  92. function getElement(selector) {
  93. return window.document.querySelectorAll(selector);
  94. }
  95. function chooseSection(section) {
  96. var navbarList = getElement('ul.navbar-list > li > a');
  97. sections.forEach(function (s) {
  98. var isSelected = s.name === section;
  99. s.view = isSelected;
  100. selectedSection_[s.name] = isSelected;
  101. })
  102. data.getSectionData[section]();
  103. }
  104. var elements = [];
  105. function addSelectedClass(elemList, x) {
  106. elemList.forEach(function(el) {
  107. var isSelected = el.text === x;
  108. el.className = isSelected ? 'selected' : '';
  109. })
  110. }
  111. window.onscroll = function() {
  112. elements = elements.reduce(function(acc, e) {
  113. if (isInViewport(e)) {
  114. e.className = 'discover-li'
  115. return acc;
  116. } else {
  117. acc.push(e);
  118. return acc;
  119. }
  120. }, [])
  121. if (elements.length === 0) {
  122. window.onscroll = function() {};
  123. }
  124. };
  125. function isInViewport(element) {
  126. var rect = element.getBoundingClientRect();
  127. var html = document.documentElement;
  128. return (rect.top >= 0 &&
  129. rect.left >= 0 &&
  130. rect.bottom <= (window.innerHeight || html.clientHeight) &&
  131. rect.right <= (window.innerWidth || html.clientWidth))
  132. }
  133. window.onload = function() {
  134. var section = window.location.hash.substr(1)
  135. if (section !== '') {
  136. chooseSection(section, selectedSection_);
  137. }
  138. var view = rivets.bind(app, {
  139. sections: sections,
  140. selectedSection: selectedSection_,
  141. productCategories: productCategories_,
  142. data: data,
  143. selectedCategory: selectedCategory_,
  144. selectSection: function(event, scope) {
  145. var newValue = event.target.text;
  146. window.history.pushState({}, newValue, '#' + newValue)
  147. chooseSection(newValue, selectedSection_);
  148. event.target.className = 'selected';
  149. },
  150. selectCategory: function(event, scope) {
  151. data.productView.list = true;
  152. data.productView.description = false;
  153. var category = productCategories_.find(R.propEq('name', event.target.text));
  154. var categoryList = getElement('ul#product-category-nav > li > a')
  155. data.selectedCategory = category;
  156. getProducts(category._id);
  157. addSelectedClass(categoryList, category.name);
  158. },
  159. seeProduct: function(event, scope) {
  160. data.productView.list = false;
  161. data.productView.description = true;
  162. data.productDescription = data.products.find(R.propEq('name', event.target.text));
  163. }
  164. });
  165. }