main.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. // wx.miniProgram.postMessage({ data: 'foo' })
  2. // wx.miniProgram.navigateTo({url: '/path/to/page'})
  3. const $iframe = document.querySelector('#container')
  4. let socket
  5. let run
  6. let data = {}
  7. async function getHeader() {
  8. if (!data.code) return;
  9. let res = await axios({
  10. url: data.API_BASE_URL + '/goods/getCategoryByScene?sceneNum=' + data.code,
  11. headers: {
  12. "content-type": "application/x-www-form-urlencoded",
  13. "X-Nideshop-Token": data.token
  14. }
  15. })
  16. let headers = res.data.list
  17. let $headers = document.querySelector('#headers')
  18. let headHTML = headers.map(item => `
  19. <div class="text" bindtap="selectType" data-id="${item.category_id}">
  20. ${item.name}<span>${'('+item.num+')'}</span>
  21. <div></div>
  22. </div>
  23. `).join('')
  24. $headers.innerHTML = headHTML
  25. selectType(headers[0].category_id)
  26. $headers.querySelectorAll('.text').forEach($dom => {
  27. $dom.addEventListener('click', () => selectType($dom.getAttribute('data-id')))
  28. })
  29. }
  30. function selectType(category_id) {
  31. let $headers = document.querySelector('#headers')
  32. Array.from($headers.querySelectorAll('.text')).forEach($dom => {
  33. let id = $dom.getAttribute('data-id')
  34. if (Number(id) === Number(category_id)) {
  35. $dom.classList.add('active')
  36. } else {
  37. $dom.classList.remove('active')
  38. }
  39. })
  40. getContent(category_id)
  41. }
  42. const iconHTML = [1,2,3].map(item => `
  43. <div class="brick brick-${item} enter">
  44. <div class="brick-top face"></div>
  45. <div class="brick-bottom face"></div>
  46. <div class="brick-left face"></div>
  47. <div class="brick-right face"></div>
  48. <div class="brick-front face"></div>
  49. <div class="brick-back face"></div>
  50. </div>
  51. `).join('')
  52. async function getContent(categoryId) {
  53. let formData = new FormData()
  54. formData.append('brandId', data.brandId)
  55. formData.append('categoryId', categoryId)
  56. formData.append('page', 1)
  57. formData.append('size', 1000)
  58. let res = await axios({
  59. url: data.API_BASE_URL + '/goods/list',
  60. method: 'POST',
  61. headers: {
  62. "content-type": "application/x-www-form-urlencoded",
  63. "X-Nideshop-Token": data.token
  64. },
  65. data: formData
  66. })
  67. let list = res.data.data.goodsList
  68. let $content = document.querySelector('#content')
  69. // <img class="scene-icon" src="./images/img_shop_scene@2x.png" />
  70. let contentHTML = list.map(item => `
  71. <div class="commodity-item" bindtap="gotoGoods" data-id="${item.hotIdList && item.hotIdList[0]}">
  72. <img class="cover" src="${item.list_pic_url}" />
  73. <div class="scene-icon">
  74. ${iconHTML}
  75. </div>
  76. <div class="item-content">
  77. <div class="desc">${item.name}</div>
  78. <div class="item-info">
  79. <div class="money">
  80. <div class="text">¥</div>
  81. <div class="text">${item.retail_price}</div>
  82. </div>
  83. <div class="oper">
  84. <div class="oper-btn add-card" catchtap="addCard" data-id="${item.id}">加入购物车</div>
  85. <div class="oper-btn buy-goods" catchtap="buyGoods" data-id="${item.id}">立即购买</div>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. `).join('')
  91. $content.innerHTML = contentHTML
  92. Array.from($content.querySelectorAll('.commodity-item')).forEach($item => {
  93. $item.addEventListener('click', function() {
  94. socket.emit('clientSyncAction', {
  95. type: 'gotoGoodsSocket',
  96. data: this.getAttribute('data-id')
  97. })
  98. // socket.emit('clientSyncAction', {
  99. // type: 'openTag',
  100. // data: Number(this.getAttribute('data-id'))
  101. // })
  102. })
  103. $item.querySelector('.add-card').addEventListener('click', function(ev) {
  104. ev.stopPropagation()
  105. wx.miniProgram.navigateTo({
  106. url: '/pages/goods/goods?id=' + this.getAttribute('data-id') + '&oper=addCard' ,
  107. })
  108. hideCommodity()
  109. })
  110. $item.querySelector('.buy-goods').addEventListener('click', function(ev) {
  111. ev.stopPropagation()
  112. wx.miniProgram.navigateTo({
  113. url: '/pages/goods/goods?id=' + this.getAttribute('data-id') + '&oper=buyGoods' ,
  114. })
  115. hideCommodity()
  116. })
  117. })
  118. }
  119. function updateSocket(options) {
  120. if (socket) {
  121. socket.close()
  122. }
  123. console.log('更新ROOM', options.roomId)
  124. socket = io(data.socket.socketHost, {
  125. path: data.socket.path,
  126. query: {
  127. ...options,
  128. isClient: true
  129. }
  130. })
  131. socket.on('clientSyncAction', data => {
  132. if (data.type === 'hashChange') {
  133. console.log(data.data)
  134. this.init(data.data)
  135. } else if (data.type === 'newRoom' && data.data && data.data.roomId) {
  136. console.log('新建房间', data.data)
  137. debugger
  138. updateSocket(data.data)
  139. }
  140. })
  141. socket.emit('clientSyncAction', {
  142. sender: 'h5',
  143. type: 'loadWeb'
  144. })
  145. }
  146. function init(adata) {
  147. if (adata.code !== data.code) {
  148. setTimeout(() => getHeader())
  149. }
  150. data = adata
  151. if (data.reload) {
  152. $iframe.setAttribute('src', '')
  153. setTimeout(() => {
  154. // alert(data.url)
  155. $iframe.setAttribute('src', data.url)
  156. }, 100)
  157. updateSocket(data.socket.options)
  158. }
  159. console.log('postMessage ' + (data.pauseVideo ? 'pauseVideo' : 'playVideo'))
  160. $iframe.contentWindow.postMessage(data.pauseVideo ? 'pauseVideo' : 'playVideo', '*')
  161. // document.querySelector('.commodity-view').style.display = 'flex'
  162. document.querySelector('.commodity-view').style.display = data.open ? 'flex' : 'none'
  163. document.querySelector('.bgd').style.display = data.open ? 'block' : 'none'
  164. document.querySelector('.commodity-view').addEventListener('click', ev => ev.stopPropagation());
  165. document.querySelector('.layer').style.bottom = data.bottom + 'px';
  166. }
  167. const hideCommodity = ev => {
  168. socket.emit('clientSyncAction', {
  169. sender: 'h5',
  170. type: 'hideComodity'
  171. })
  172. }
  173. document.querySelector('#close-commodity').addEventListener('click', hideCommodity);
  174. document.querySelector('.bgd').addEventListener('click', hideCommodity);
  175. (function load() {
  176. init(JSON.parse(unescape(location.hash.substr(1))))
  177. })();