main.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. socket.emit('clientSyncAction', {
  106. type: 'addCard',
  107. data: this.getAttribute('data-id')
  108. })
  109. // wx.miniProgram.navigateTo({
  110. // url: '/pages/goods/goods?id=' + this.getAttribute('data-id') + '&oper=addCard' ,
  111. // })
  112. hideCommodity()
  113. })
  114. $item.querySelector('.buy-goods').addEventListener('click', function (ev) {
  115. ev.stopPropagation()
  116. socket.emit('clientSyncAction', {
  117. type: 'buyGoods',
  118. data: this.getAttribute('data-id')
  119. })
  120. // wx.miniProgram.navigateTo({
  121. // url: '/pages/goods/goods?id=' + this.getAttribute('data-id') + '&oper=buyGoods' ,
  122. // })
  123. hideCommodity()
  124. })
  125. })
  126. }
  127. function updateSocket(options) {
  128. if (socket) {
  129. socket.close()
  130. }
  131. console.log('更新ROOM', options.roomId)
  132. socket = io(data.socket.socketHost, {
  133. path: data.socket.path,
  134. query: {
  135. ...options,
  136. isClient: true
  137. }
  138. })
  139. socket.on('clientSyncAction', data => {
  140. if (data.type === 'hashChange') {
  141. console.log(data.data)
  142. this.init(data.data)
  143. } else if (data.type === 'newRoom' && data.data && data.data.roomId) {
  144. console.log('新建房间', data.data)
  145. updateSocket(data.data)
  146. }
  147. })
  148. socket.emit('clientSyncAction', {
  149. sender: 'h5',
  150. type: 'loadWeb'
  151. })
  152. }
  153. function init(adata) {
  154. if (adata.code !== data.code) {
  155. setTimeout(() => getHeader())
  156. }
  157. if (!data.socket || data.socket.options.roomId !== adata.socket.options.roomId) {
  158. $iframe.contentWindow.postMessage({type: 'newRoom', value: adata.socket.options.roomId }, '*')
  159. }
  160. data = adata
  161. if (data.reload) {
  162. $iframe.setAttribute('src', '')
  163. setTimeout(() => {
  164. // alert(data.url)
  165. $iframe.setAttribute('src', data.url)
  166. }, 100)
  167. updateSocket(data.socket.options)
  168. }
  169. $iframe.contentWindow.postMessage({ type: 'video', action: data.pauseVideo ? 'pause' : 'play'}, '*')
  170. // document.querySelector('.commodity-view').style.display = 'flex'
  171. // data.open = true
  172. document.querySelector('.commodity-view').style.display = data.open ? 'flex' : 'none'
  173. document.querySelector('.bgd').style.display = data.open ? 'block' : 'none'
  174. document.querySelector('.commodity-view').addEventListener('click', ev => ev.stopPropagation());
  175. document.querySelector('.layer').style.bottom = data.bottom + 'px';
  176. }
  177. const hideCommodity = ev => {
  178. socket.emit('clientSyncAction', {
  179. sender: 'h5',
  180. type: 'hideComodity'
  181. })
  182. }
  183. document.querySelector('#close-commodity').addEventListener('click', hideCommodity);
  184. document.querySelector('.bgd').addEventListener('click', hideCommodity);
  185. (function load() {
  186. init(JSON.parse(unescape(location.hash.substr(1))))
  187. })();
  188. window.addEventListener("message", e => {
  189. if (e.data.cmd) {
  190. if (e.data.cmd == "socket") {
  191. socket.emit("clientSyncAction", {
  192. sender: "h5",
  193. type: e.data.type,
  194. data: e.data.data
  195. })
  196. }
  197. }
  198. })