goto.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // $('.sec05-moblie-container').slick({
  2. // arrows: false,
  3. // slidesToShow: 1,
  4. // slidesToScroll: 1,
  5. // infinite: false,
  6. // centerMode: true,
  7. // });
  8. $(".sendbox").hide();
  9. $(document).on("click", ".collectcontent", function (event) {
  10. $(".sendbox").show(500);
  11. $(this).addClass("select");
  12. $(".select").siblings().removeClass('select');
  13. });
  14. $(document).on("click", ".close", function (event) {
  15. // $(this).siblings('.collectcard').removeClass('select');
  16. $(".sendbox").hide(500);
  17. $(".collectcontent").removeClass("select");
  18. });
  19. let userId;
  20. // 收藏頁面
  21. function collection(collectuserid='') {
  22. console.log('Call collection(' + collectuserid + ')'); // test
  23. userId = collectuserid;
  24. var collectcontent = '';
  25. $.ajax({
  26. method: "GET",
  27. url: "https://api.ptt.cx:8750/api/v1/line/collection/" + collectuserid + "",
  28. dataType: "json",
  29. })
  30. .done(function (msg) {
  31. if (msg == "error: user don't have any nft") { // 沒NFT
  32. collectcontent += '<p>您可以到我們的「NFT商店」頁面,去購買您喜愛的NFT收藏品哦!</p>';
  33. } else { // 有NFT
  34. console.log(msg)
  35. let len = Object.keys(msg).length;
  36. let arr = []
  37. for(let i = 0; i < len; i++) {
  38. arr.push(msg[i]);
  39. }
  40. arr = arr.filter((item, i) => {
  41. return item !== undefined;
  42. })
  43. console.log(arr);
  44. for(let i = 0; i < arr.length; i++) {
  45. collectcontent += '\
  46. <div class="collectcontent col">\
  47. <input style="display: none;" type="radio" data-amount="'+ arr[i].amount +'" value="'+ arr[i].uid + '" name="nftid" id="' + arr[i].uid + '">\
  48. <label for="'+ arr[i].uid + '">\
  49. <div class="collectcard card h-100">\
  50. <a target="_blank">\
  51. <img src="'+ arr[i].imgurl + '"class="card-img-top" alt="...">\
  52. </a>\
  53. <div class="card-body p-2">\
  54. <a target="_blank">\
  55. <h5 class="card-title pt-3">'+ arr[i].title + '</h5>\
  56. <p class="card-text text-mute">'+ arr[i].context + '</p>\
  57. <p class="card-text">數量:'+ arr[i].amount + '</p>\
  58. </a>\
  59. </div>\
  60. </div>\
  61. </label>\
  62. </div>';
  63. }
  64. }
  65. $('.sec05-moblie-container').html(collectcontent);
  66. });
  67. }
  68. // 購買頁面
  69. function shop(collectuserid='') {
  70. console.log('Call shop(' + collectuserid + ')'); // test
  71. userId = collectuserid;
  72. $.ajax({
  73. method: "GET",
  74. url: "https://api.ptt.cx:8750/api/v1/line/shop/" + collectuserid + "",
  75. dataType: "json",
  76. })
  77. .done(function (msg) {
  78. console.log(msg);
  79. // console.log(Object.keys(msg).length);
  80. let msgLen = Object.keys(msg).length;
  81. console.log(msgLen);
  82. var nftmall = '';
  83. var buybox = "";
  84. for (var i = 0; i < msgLen; i++) {
  85. nftmall += '\
  86. <div class="nftmall col">\
  87. <input style="display:none" type="radio" data-amount="'+msg[i].amount+'" value="'+ msg[i].id + '" name="nftid" class="nftname" id="' + msg[i].id + '" >\
  88. <label for="'+ msg[i].id + '" data-amount="'+msg[i].amount+'">\
  89. <div class="collectcard card h-100">\
  90. <a target="_blank">\
  91. <img src="'+ msg[i].imgurl + '"class="card-img-top" alt="...">\
  92. </a>\
  93. <div class="card-body p-2">\
  94. <a target="_blank">\
  95. <h5 class="card-title pt-3">'+ msg[i].title + '</h5>\
  96. <p class="card-text text-mute">'+ msg[i].context + '</p>\
  97. <p class="card-text">數量:'+ msg[i].amount + '</p>\
  98. <p class="card-text card-price text-end">$'+ msg[i].price + '</p>\
  99. </a>\
  100. </div>\
  101. </div>\
  102. </label>\
  103. </div>';
  104. }
  105. buybox += '\
  106. <div class="p-2">\
  107. <input id="userid" style="border-radius: 10px; border:none; display: none;" class="p-2 w-100 mb-3" type="text" name="userid" value="' + collectuserid + '" placeholder="請輸入您的userid" required>\
  108. <input type="number" name="amount" id="number" placeholder="請輸入數量" class="p-2 w-100 mb-3" style="border-radius: 10px; border:none;" required>\
  109. <p class="text-error text-white mb-2"></p>\
  110. <div class="text-end px-2">\
  111. <p class="text-start text-white mb-2">※一次只能購買一則NFT收藏品</p>\
  112. <button type="button" style="border:1px solid #fff; border-radius: 30px;" class="close btn text-white px-3">取消</button>\
  113. <span style="border-radius: 30px; background:#fff; border: none;" class="send-btn px-3 ms-1 py-2 btn span">購買</span>\
  114. </div>\
  115. </div>\
  116. </div>';
  117. $('.sec06-nft-mall').html(nftmall);
  118. $('.buybox').html(buybox);
  119. $('.span').click(function(){
  120. var nftid = $("input[name='nftid']:checked").val();
  121. var amount = $("input[name='amount']").val();
  122. if(amount > $("input[name='nftid']:checked").data('amount') || !amount) {
  123. console.log('over');
  124. $('.text-error').text('請輸入合適購買數量');
  125. return
  126. } else {
  127. $('.text-error').text('');
  128. }
  129. // var data = `{"nftid":"` + nftid +`","userid":"` + userid +`"}`;
  130. console.log(amount); // test
  131. var url = `https://api.ptt.cx:8750/api/v1/linepay/request?line_id=${userId}&nft_id=${nftid}&amount=${amount}`;
  132. console.log(url);
  133. var xhr = new XMLHttpRequest();
  134. xhr.open("POST", url, false);
  135. xhr.setRequestHeader("accept", "application/json");
  136. xhr.setRequestHeader("Content-Type", "application/json");
  137. xhr.onreadystatechange = function () {
  138. if (xhr.readyState === 4) {
  139. console.log(xhr.status);
  140. const res = JSON.parse(xhr.responseText);
  141. if(device == 'desktop'){
  142. location.replace(res.web);
  143. } else {
  144. location.replace(res.app);
  145. }
  146. // alert("購買成功");
  147. }
  148. };
  149. xhr.send();
  150. })
  151. });
  152. }
  153. // Qrcode頁面
  154. function get_data(collectuserid='') {
  155. console.log('Call get_data(' + collectuserid + ')'); // test
  156. $.ajax({
  157. method: "GET",
  158. url: "https://api.ptt.cx:8750/api/v1/line/receive/" + collectuserid + "",
  159. dataType: "json",
  160. })
  161. .done(function (msg) {
  162. console.log(msg);
  163. var Qrcodeimg = '';
  164. var useraddress = '';
  165. Qrcodeimg += '\
  166. <img class="img-fluid" src="./qrcode/'+ collectuserid + '.png" alt="">\
  167. ';
  168. useraddress += '\
  169. '+ msg.useraddress + '\
  170. ';
  171. $('#Qrcode').html(Qrcodeimg);
  172. $('#copy').html(useraddress);
  173. });
  174. }
  175. $(".buybox").hide();
  176. $(document).on("click", ".nftmall", function (event) {
  177. $(".buybox").show(500);
  178. $(this).addClass("select");
  179. $(".select").siblings().removeClass('select');
  180. });
  181. $(document).on("click", ".close", function (event) {
  182. // $(this).siblings('.collectcard').removeClass('select');
  183. $(".buybox").hide(500);
  184. $(".nftmall").removeClass("select");
  185. $(".nftname").prop("checked", false);
  186. });
  187. $.fn.serializeObject = function () {
  188. var o = {};
  189. var a = this.serializeArray();
  190. $.each(a, function () {
  191. if (o[this.name]) {
  192. console.log(o[this.name], o[this.value]); // test
  193. if (!o[this.name].push) {
  194. o[this.name] = [o[this.name]];
  195. }
  196. o[this.name].push(this.value || '');
  197. } else {
  198. o[this.name] = this.value || '';
  199. }
  200. });
  201. return o;
  202. };
  203. // 確定發送按鈕處理
  204. $(".collect-send").submit(function (e) {
  205. var nftuid = $("input[name='nftid']:checked").val();
  206. var amount = $("input[name='amount']").val();
  207. if(amount > $("input[name='nftid']:checked").data('amount') || !amount) {
  208. console.log('over');
  209. $('.text-error').text('請輸入合適購買數量');
  210. return
  211. } else {
  212. $('.text-error').text('');
  213. }
  214. var address = $('#address').val();
  215. console.log(amount);
  216. var data = `{"nftuid": ${nftuid}, "to": "${address}", "userid": "${userId}", "amount": ${amount}}`;
  217. var headers = {'accept': 'application/json'}
  218. console.log(data); // test
  219. var url = `https://api.ptt.cx:8750/api/v1/line/send/${userId}?to=${address}&nftuid=${nftuid}&amount=${amount}`;
  220. axios({
  221. method: 'get',
  222. url: url,
  223. headers,
  224. data: ''
  225. }).then(res => {
  226. console.log(res);
  227. window.location.href = './collect.html';
  228. }).catch(err => {
  229. console.log(err);
  230. })
  231. });
  232. const getDeviceType = () => {
  233. const ua = navigator.userAgent;
  234. if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {
  235. return "tablet";
  236. }
  237. if (
  238. /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(
  239. ua
  240. )
  241. ) {
  242. return "mobile";
  243. }
  244. return "desktop";
  245. };
  246. const device = getDeviceType();
  247. function copyEvent(id) {
  248. var str = document.getElementById(id);
  249. window.getSelection().selectAllChildren(str);
  250. document.execCommand("Copy")
  251. toastr.options = {
  252. // 參數設定[註1]
  253. "closeButton": false, // 顯示關閉按鈕
  254. "debug": false, // 除錯
  255. "newestOnTop": false, // 最新一筆顯示在最上面
  256. "progressBar": false, // 顯示隱藏時間進度條
  257. "positionClass": "toast-top-center", // 位置的類別
  258. "preventDuplicates": false, // 隱藏重覆訊息
  259. "onclick": null, // 當點選提示訊息時,則執行此函式
  260. "showDuration": "300", // 顯示時間(單位: 毫秒)
  261. "hideDuration": "1000", // 隱藏時間(單位: 毫秒)
  262. "timeOut": "1000", // 當超過此設定時間時,則隱藏提示訊息(單位: 毫秒)
  263. "extendedTimeOut": "1000", // 當使用者觸碰到提示訊息時,離開後超過此設定時間則隱藏提示訊息(單位: 毫秒)
  264. "showEasing": "swing", // 顯示動畫時間曲線
  265. "hideEasing": "linear", // 隱藏動畫時間曲線
  266. "showMethod": "fadeIn", // 顯示動畫效果
  267. "hideMethod": "fadeOut" // 隱藏動畫效果
  268. }
  269. toastr.success("複製成功");
  270. }