ソースを参照

Merge branch 'dev_1.1.7' of DeNet/de-net into master

合并 v1.1.7
wenliming 2 年 前
コミット
98fd7dd27a
100 ファイル変更1981 行追加629 行削除
  1. 2 1
      .env.development
  2. 2 1
      .env.pre
  3. 2 1
      .env.production
  4. 2 0
      .env.test
  5. 2 1
      package.json
  6. BIN
      src/assets/img/icon-card-cover-treasure-big.png
  7. BIN
      src/assets/img/icon-flash-active.png
  8. BIN
      src/assets/img/icon-gold-close-box.png
  9. BIN
      src/assets/img/icon-gold-open-box-big.png
  10. BIN
      src/assets/img/icon-gold-open-box.png
  11. BIN
      src/assets/img/icon-silver-close-box.png
  12. BIN
      src/assets/img/icon-silver-open-box-big.png
  13. BIN
      src/assets/img/icon-silver-open-box.png
  14. BIN
      src/assets/img/icon-treasure-box.png
  15. BIN
      src/assets/img/img-preview-treasure-link-bg.png
  16. 2 0
      src/assets/svg/icon-big-treasure.svg
  17. 2 0
      src/assets/svg/icon-btn-box.svg
  18. 2 0
      src/assets/svg/icon-card-cover-treasure-small.svg
  19. 1 0
      src/assets/svg/icon-card-cover-treasure-tasks.svg
  20. 3 0
      src/assets/svg/icon-custom-cover-btn.svg
  21. 3 0
      src/assets/svg/icon-form-amount.svg
  22. 4 0
      src/assets/svg/icon-form-cost.svg
  23. 3 0
      src/assets/svg/icon-form-custom-cover.svg
  24. 1 0
      src/assets/svg/icon-form-follow.svg
  25. 3 0
      src/assets/svg/icon-form-task.svg
  26. 8 0
      src/assets/svg/icon-form-time.svg
  27. 1 0
      src/assets/svg/icon-form-winners.svg
  28. 4 0
      src/assets/svg/icon-green-yes.svg
  29. 3 0
      src/assets/svg/icon-invite-list.svg
  30. 1 0
      src/assets/svg/icon-invite.svg
  31. 3 0
      src/assets/svg/icon-post-edit-luck.svg
  32. 3 0
      src/assets/svg/icon-post-edit-open.svg
  33. 4 0
      src/assets/svg/icon-post-lock.svg
  34. 3 0
      src/assets/svg/icon-refresh-treasure.svg
  35. 5 0
      src/assets/svg/icon-silver-open-box.svg
  36. 1 0
      src/assets/svg/icon-small-treasure.svg
  37. 1 0
      src/assets/svg/icon-three-line.svg
  38. 3 0
      src/assets/svg/icon-tip-arrow.svg
  39. 4 0
      src/assets/svg/icon-treasure-return.svg
  40. 3 0
      src/assets/svg/icon-while-user.svg
  41. 3 0
      src/assets/svg/icon-while-yes.svg
  42. 0 19
      src/assets/svg/img-A0.svg
  43. 0 19
      src/assets/svg/img-A1.svg
  44. 0 44
      src/assets/svg/img-B0.svg
  45. 0 44
      src/assets/svg/img-B1.svg
  46. 3 0
      src/assets/svg/img-LT0.svg
  47. 3 0
      src/assets/svg/img-LT1.svg
  48. 3 0
      src/assets/svg/img-P1.svg
  49. 3 0
      src/assets/svg/img-P2.svg
  50. 3 0
      src/assets/svg/img-P3.svg
  51. 2 0
      src/assets/svg/img-T0.svg
  52. 2 0
      src/assets/svg/img-T1.svg
  53. 11 0
      src/assets/svg/img-preview-treasure-01-bg.svg
  54. 224 153
      src/entry/background.js
  55. 24 11
      src/entry/content.js
  56. 45 42
      src/entry/content_help.js
  57. 7 5
      src/http/configAPI.js
  58. 3 2
      src/http/fetch.js
  59. 21 4
      src/http/help.js
  60. 3 3
      src/http/logApi.js
  61. 8 0
      src/http/nft.js
  62. 17 1
      src/http/toolBoxApi.js
  63. 77 0
      src/http/treasure.js
  64. 9 0
      src/http/treasureApi.js
  65. 5 1
      src/iframe/nft-card.js
  66. 3 1
      src/iframe/publish.js
  67. 8 0
      src/iframe/tool-box-buy-nft.js
  68. 1 2
      src/iframe/tool-box.js
  69. 6 0
      src/iframe/treasure-hunt.js
  70. 2 2
      src/log-center/autoLog/show.js
  71. 64 2
      src/log-center/logEnum.js
  72. 30 3
      src/log-center/logger.js
  73. 6 4
      src/logic/background/facebook.js
  74. 1 1
      src/logic/background/help.js
  75. 27 4
      src/logic/background/twitter.js
  76. 36 6
      src/logic/content/ParseCard.js
  77. 23 0
      src/logic/content/ToolBox.js
  78. 1 1
      src/logic/content/denet.js
  79. 1 3
      src/logic/content/facebook.js
  80. 17 0
      src/logic/content/nft.js
  81. 245 87
      src/logic/content/twitter.js
  82. 6 3
      src/manifest.json
  83. 7 2
      src/types/global.js
  84. 34 18
      src/uilts/chromeExtension.js
  85. 50 0
      src/uilts/messageCenter/index.js
  86. 25 8
      src/view/components/component-zoom.vue
  87. 0 1
      src/view/components/currency-list.vue
  88. 192 29
      src/view/components/custom-card-cover.vue
  89. 115 31
      src/view/components/custom-card-horizontal-cover.vue
  90. 83 0
      src/view/components/payment-info-usd.vue
  91. 31 12
      src/view/components/popup-transactions.vue
  92. 0 1
      src/view/content/message/index.vue
  93. 87 6
      src/view/iframe/buy-nft/buy/home.vue
  94. 12 0
      src/view/iframe/buy-nft/buy/open-box.vue
  95. 268 40
      src/view/iframe/buy-nft/buy/pay.vue
  96. 3 1
      src/view/iframe/buy-nft/index.vue
  97. 1 0
      src/view/iframe/group-card/card.vue
  98. 23 3
      src/view/iframe/nft/card.vue
  99. 1 0
      src/view/iframe/nft/group-card.vue
  100. 15 6
      src/view/iframe/publish/components/follow-input.vue

+ 2 - 1
.env.development

@@ -1 +1,2 @@
-NODE_ENV='development'
+NODE_ENV='development'
+VUE_APP_IFRAME_HOST='https://localhost:3000'

+ 2 - 1
.env.pre

@@ -1 +1,2 @@
-NODE_ENV='pre'
+NODE_ENV='pre'
+VUE_APP_IFRAME_HOST='https://iframe-pre.denet.me'

+ 2 - 1
.env.production

@@ -1 +1,2 @@
-NODE_ENV='production'
+NODE_ENV='production'
+VUE_APP_IFRAME_HOST='https://iframe.denet.me'

+ 2 - 0
.env.test

@@ -0,0 +1,2 @@
+NODE_ENV='development'
+VUE_APP_IFRAME_HOST='https://iframe-test.denet.me'

+ 2 - 1
package.json

@@ -4,7 +4,7 @@
   "private": true,
   "scripts": {
     "serve": "vue-cli-service serve",
-    "build-test": "vue-cli-service build --mode development",
+    "build-test": "vue-cli-service build --mode test",
     "build-local": "sh buildTestApp.sh",
     "build-pre": "vue-cli-service build --mode pre",
     "build-prod": "vue-cli-service build --mode production",
@@ -23,6 +23,7 @@
     "eslint-plugin-vue": "^8.7.0",
     "mathjs": "^10.5.0",
     "moment": "^2.29.1",
+    "node-polyfill-webpack-plugin": "^2.0.1",
     "node-sass": "^7.0.1",
     "postcss-import": "^14.0.2",
     "postcss-url": "^10.1.3",

BIN
src/assets/img/icon-card-cover-treasure-big.png


BIN
src/assets/img/icon-flash-active.png


BIN
src/assets/img/icon-gold-close-box.png


BIN
src/assets/img/icon-gold-open-box-big.png


BIN
src/assets/img/icon-gold-open-box.png


BIN
src/assets/img/icon-silver-close-box.png


BIN
src/assets/img/icon-silver-open-box-big.png


BIN
src/assets/img/icon-silver-open-box.png


BIN
src/assets/img/icon-treasure-box.png


BIN
src/assets/img/img-preview-treasure-link-bg.png


ファイルの差分が大きいため隠しています
+ 2 - 0
src/assets/svg/icon-big-treasure.svg


ファイルの差分が大きいため隠しています
+ 2 - 0
src/assets/svg/icon-btn-box.svg


ファイルの差分が大きいため隠しています
+ 2 - 0
src/assets/svg/icon-card-cover-treasure-small.svg


ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-card-cover-treasure-tasks.svg


+ 3 - 0
src/assets/svg/icon-custom-cover-btn.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.8749 11.7838L17.1198 12.5169L15.6097 11.0508L16.3648 10.3177C16.4403 10.2444 16.5158 10.1711 16.6668 10.1711C16.7423 10.1711 16.8933 10.2444 16.9688 10.3177L17.9504 11.2707C18.0259 11.4173 18.0259 11.6372 17.8749 11.7838ZM10.5507 15.8891V17.4286H12.1364L16.7423 12.9568L15.2321 11.4906L10.5507 15.8891ZM16.5913 4.96617C16.5913 4.15977 15.9117 3.5 15.0811 3.5H4.51014C3.67956 3.5 3 4.15977 3 4.96617V15.2293C3 16.0357 3.67956 16.6955 4.51014 16.6955H9.04057V15.3026L9.87115 14.4962H4.51014L7.15289 11.1974L9.04057 13.3966L11.6833 10.0977L12.8914 11.6372L16.5913 7.9718V4.96617Z" fill="#2F2F2F"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-form-amount.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4 12.0058V13.5734C4 14.8694 6.6875 15.9231 10 15.9231C13.3125 15.9231 16 14.8694 16 13.5734V12.0058C14.7094 13.0741 12.35 13.5734 10 13.5734C7.65 13.5734 5.29062 13.0741 4 12.0058ZM4 8.15454V10.049C4 11.3449 6.6875 12.3986 10 12.3986C13.3125 12.3986 16 11.3449 16 10.049V8.15454C14.7094 9.4028 12.3469 10.049 10 10.049C7.65313 10.049 5.29062 9.4028 4 8.15454ZM10 3C6.6875 3 4 4.31434 4 5.93706C4 7.55979 6.6875 8.87413 10 8.87413C13.3125 8.87413 16 7.55979 16 5.93706C16 4.31434 13.3125 3 10 3Z" fill="#2F2F2F"/>
+</svg>

+ 4 - 0
src/assets/svg/icon-form-cost.svg

@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11 13.575V14.5455C11 15.3477 12.5677 16 14.5 16C16.4323 16 18 15.3477 18 14.5455V13.575C17.2471 14.2364 15.8708 14.5455 14.5 14.5455C13.1292 14.5455 11.7529 14.2364 11 13.575ZM11 11.1909V12.3636C11 13.1659 12.5677 13.8182 14.5 13.8182C16.4323 13.8182 18 13.1659 18 12.3636V11.1909C17.2471 11.9636 15.869 12.3636 14.5 12.3636C13.131 12.3636 11.7529 11.9636 11 11.1909ZM14.5 8C12.5677 8 11 8.81364 11 9.81818C11 10.8227 12.5677 11.6364 14.5 11.6364C16.4323 11.6364 18 10.8227 18 9.81818C18 8.81364 16.4323 8 14.5 8Z" fill="#2F2F2F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.42061 15.1282H5.4046C5.36893 15.2284 5.31128 15.3204 5.23468 15.397C5.09904 15.5326 4.91508 15.6088 4.72326 15.6088C4.53144 15.6088 4.34747 15.5326 4.21184 15.397C4.0762 15.2614 4 15.0774 4 14.8856C4 14.8202 4.01049 14.7614 4.02325 14.7114C4.33797 12.5974 5.72065 10.833 7.60544 9.98625C6.73631 9.26192 6.18262 8.1708 6.18262 6.95024C6.18262 4.76854 7.95117 3 10.1329 3C11.9921 3 13.5513 4.28442 13.9716 6.01437C13.5574 6.03701 13.1526 6.08619 12.7643 6.16045C12.6313 5.7191 12.3901 5.32421 12.0716 5.00682C12.3898 5.32432 12.6308 5.71925 12.7636 6.16059C12.6833 6.17595 12.6037 6.19239 12.5248 6.20988C12.2083 5.18971 11.2556 4.44651 10.1329 4.44651C8.75252 4.44651 7.62914 5.5699 7.62914 6.95024C7.62914 7.92308 8.18723 8.76842 9 9.18266V11.0304C7.15844 11.4847 5.73735 13.02 5.45165 14.9216L5.42061 15.1282ZM4.24375 14.8867C4.24375 15.0139 4.29418 15.1359 4.38397 15.226L4.38341 15.2254C4.29328 15.1353 4.24264 15.013 4.24264 14.8856C4.24264 14.842 4.25033 14.8004 4.26132 14.7602C4.56633 12.6796 5.9484 10.9491 7.82382 10.1557C7.91323 10.1179 8.00376 10.0822 8.09535 10.0487L8.09682 10.0497C6.08391 10.7858 4.582 12.5814 4.26243 14.7613C4.25144 14.8016 4.24375 14.8432 4.24375 14.8867Z" fill="#2F2F2F"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-form-custom-cover.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.8749 11.7838L17.1198 12.5169L15.6097 11.0508L16.3648 10.3177C16.4403 10.2444 16.5158 10.1711 16.6668 10.1711C16.7423 10.1711 16.8933 10.2444 16.9688 10.3177L17.9504 11.2707C18.0259 11.4173 18.0259 11.6372 17.8749 11.7838ZM10.5507 15.8891V17.4286H12.1364L16.7423 12.9568L15.2321 11.4906L10.5507 15.8891ZM16.5913 4.96617C16.5913 4.15977 15.9117 3.5 15.0811 3.5H4.51014C3.67956 3.5 3 4.15977 3 4.96617V15.2293C3 16.0357 3.67956 16.6955 4.51014 16.6955H9.04057V15.3026L9.87115 14.4962H4.51014L7.15289 11.1974L9.04057 13.3966L11.6833 10.0977L12.8914 11.6372L16.5913 7.9718V4.96617Z" fill="#2F2F2F"/>
+</svg>

ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-form-follow.svg


+ 3 - 0
src/assets/svg/icon-form-task.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.267 4.82609L4.27273 15.7875L15.7324 15.7826L15.7273 4.82122L13.8182 4.82609V5.4287C13.819 5.75195 13.6858 6.06233 13.4476 6.29171C13.2095 6.52109 12.886 6.65072 12.548 6.65217H7.452C6.75136 6.65217 6.18182 6.10313 6.18182 5.4287V4.82609H4.267ZM12.548 5.43478L12.5455 4.22348L7.452 4.21739L7.45455 4.22348V5.4287L12.548 5.43478ZM13.64 3.6087H15.7241C16.0613 3.60789 16.3851 3.73512 16.6243 3.96246C16.8635 4.1898 16.9987 4.49866 17 4.82122V15.7875C16.9995 16.1089 16.8658 16.417 16.6282 16.6443C16.3905 16.8716 16.0684 16.9995 15.7324 17H4.26764C3.56891 17 3 16.4558 3 15.7875V4.82122C3.00017 4.49979 3.13369 4.19157 3.37124 3.96423C3.6088 3.73689 3.93096 3.60902 4.267 3.6087H6.36C6.58082 3.24591 6.98491 3 7.452 3H12.548C13.0151 3 13.4198 3.24652 13.64 3.6087ZM9.17585 11.4432L11.9743 8.20321C12.0799 8.08088 12.2271 8.00801 12.3835 8.00062C12.5399 7.99324 12.6926 8.05195 12.8081 8.16383C12.9236 8.27572 12.9924 8.43162 12.9994 8.59723C13.0064 8.76285 12.951 8.92461 12.8453 9.04694L9.60606 12.7969C9.49393 12.9263 9.33577 13 9.17054 13H9.167C9.08447 12.9995 9.00296 12.9806 8.92774 12.9447C8.85252 12.9087 8.78526 12.8565 8.7303 12.7913L7.14992 10.9163C7.04568 10.7926 6.99209 10.6302 7.00095 10.4647C7.0098 10.2992 7.08037 10.1442 7.19713 10.0338C7.31389 9.92341 7.46727 9.86665 7.62354 9.87603C7.77981 9.88541 7.92616 9.96014 8.0304 10.0838L9.17585 11.4432Z" fill="#2F2F2F"/>
+</svg>

+ 8 - 0
src/assets/svg/icon-form-time.svg

@@ -0,0 +1,8 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="path-1-outside-1_24371_182246" maskUnits="userSpaceOnUse" x="2" y="2" width="16" height="16" fill="black">
+<rect fill="white" x="2" y="2" width="16" height="16"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3 10C3 6.14 6.14 3 10 3C13.86 3 17 6.14 17 10C17 13.86 13.86 17 10 17C6.14 17 3 13.86 3 10ZM4.0045 10C4.0045 13.3055 6.694 15.9955 10 15.9955C13.3055 15.9955 15.9955 13.3055 15.9955 10C15.9955 6.694 13.3055 4.0045 10 4.0045C6.694 4.0045 4.0045 6.694 4.0045 10ZM10.001 9.99788H12.5005C12.778 9.99788 13.0025 10.2204 13.0025 10.4979C13.0025 10.7754 12.778 10.9979 12.5005 10.9979H9.50104C9.22404 10.9979 9.00104 10.7754 9.00104 10.4979V6.49887C9.00104 6.22187 9.22354 5.99688 9.50104 5.99688C9.77854 5.99688 10.001 6.22137 10.001 6.49887V9.99788Z"/>
+</mask>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3 10C3 6.14 6.14 3 10 3C13.86 3 17 6.14 17 10C17 13.86 13.86 17 10 17C6.14 17 3 13.86 3 10ZM4.0045 10C4.0045 13.3055 6.694 15.9955 10 15.9955C13.3055 15.9955 15.9955 13.3055 15.9955 10C15.9955 6.694 13.3055 4.0045 10 4.0045C6.694 4.0045 4.0045 6.694 4.0045 10ZM10.001 9.99788H12.5005C12.778 9.99788 13.0025 10.2204 13.0025 10.4979C13.0025 10.7754 12.778 10.9979 12.5005 10.9979H9.50104C9.22404 10.9979 9.00104 10.7754 9.00104 10.4979V6.49887C9.00104 6.22187 9.22354 5.99688 9.50104 5.99688C9.77854 5.99688 10.001 6.22137 10.001 6.49887V9.99788Z" fill="#2F2F2F"/>
+<path d="M10.001 9.99788H9.80104V10.1979H10.001V9.99788ZM10 2.8C6.02954 2.8 2.8 6.02954 2.8 10H3.2C3.2 6.25046 6.25046 3.2 10 3.2V2.8ZM17.2 10C17.2 6.02954 13.9705 2.8 10 2.8V3.2C13.7495 3.2 16.8 6.25046 16.8 10H17.2ZM10 17.2C13.9705 17.2 17.2 13.9705 17.2 10H16.8C16.8 13.7495 13.7495 16.8 10 16.8V17.2ZM2.8 10C2.8 13.9705 6.02954 17.2 10 17.2V16.8C6.25046 16.8 3.2 13.7495 3.2 10H2.8ZM10 15.7955C6.80447 15.7955 4.2045 13.1951 4.2045 10H3.8045C3.8045 13.4159 6.58353 16.1955 10 16.1955V15.7955ZM15.7955 10C15.7955 13.195 13.195 15.7955 10 15.7955V16.1955C13.416 16.1955 16.1955 13.416 16.1955 10H15.7955ZM10 4.2045C13.1951 4.2045 15.7955 6.80447 15.7955 10H16.1955C16.1955 6.58353 13.4159 3.8045 10 3.8045V4.2045ZM4.2045 10C4.2045 6.80446 6.80446 4.2045 10 4.2045V3.8045C6.58354 3.8045 3.8045 6.58354 3.8045 10H4.2045ZM12.5005 9.79788H10.001V10.1979H12.5005V9.79788ZM13.2025 10.4979C13.2025 10.1089 12.8875 9.79788 12.5005 9.79788V10.1979C12.6686 10.1979 12.8025 10.3319 12.8025 10.4979H13.2025ZM12.5005 11.1979C12.8875 11.1979 13.2025 10.8869 13.2025 10.4979H12.8025C12.8025 10.6639 12.6686 10.7979 12.5005 10.7979V11.1979ZM9.50104 11.1979H12.5005V10.7979H9.50104V11.1979ZM8.80104 10.4979C8.80104 10.886 9.11372 11.1979 9.50104 11.1979V10.7979C9.33437 10.7979 9.20104 10.6648 9.20104 10.4979H8.80104ZM8.80104 6.49887V10.4979H9.20104V6.49887H8.80104ZM9.50104 5.79688C9.11192 5.79688 8.80104 6.11259 8.80104 6.49887H9.20104C9.20104 6.33116 9.33517 6.19688 9.50104 6.19688V5.79688ZM10.201 6.49887C10.201 6.11196 9.89004 5.79688 9.50104 5.79688V6.19688C9.66705 6.19688 9.80104 6.33079 9.80104 6.49887H10.201ZM10.201 9.99788V6.49887H9.80104V9.99788H10.201Z" fill="#2F2F2F" mask="url(#path-1-outside-1_24371_182246)"/>
+</svg>

ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-form-winners.svg


+ 4 - 0
src/assets/svg/icon-green-yes.svg

@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="6" cy="6" r="6" fill="#08B706"/>
+<path d="M3.6875 6L5.4783 7.79096L8.71773 3.34812" stroke="white" stroke-width="1.2"/>
+</svg>

ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/icon-invite-list.svg


ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-invite.svg


+ 3 - 0
src/assets/svg/icon-post-edit-luck.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.05497 9.83636V7.82727C5.05497 6.12727 6.29133 4.89091 7.99133 4.89091H9.2277C10.7732 4.89091 12.1641 6.12727 12.1641 7.82727V9.83636H13.555V7.82727C13.555 5.35455 11.5459 3.5 9.2277 3.5H7.99133C5.51861 3.5 3.66406 5.50909 3.66406 7.82727V9.83636H5.05497ZM14.3273 20.5003H2.89091C2.11818 20.5003 1.5 19.8821 1.5 19.1094V12.0003C1.5 11.2276 2.27273 10.6094 2.89091 10.6094H14.1727C15.1 10.6094 15.5636 11.2276 15.5636 12.0003V19.1094C15.7182 19.8821 15.1 20.5003 14.3273 20.5003ZM20.1177 20.5458L21.8908 18.7097L21.7607 11.2568C22.0825 11.0797 22.381 10.8534 22.6513 10.5734C23.3567 9.84292 23.743 8.86219 23.7253 7.84692C23.7076 6.83165 23.2873 5.865 22.5569 5.15962C21.8264 4.45425 20.8457 4.06793 19.8304 4.08565C18.8151 4.10337 17.8485 4.52368 17.1431 5.25412C16.4377 5.98455 16.0514 6.96528 16.0691 7.98056C16.0869 8.99583 16.5072 9.96248 17.2376 10.6679C17.5176 10.9382 17.8237 11.154 18.1516 11.3198L18.1871 13.359L19.5642 14.6888L18.2344 16.0658L19.6115 17.3957L18.2816 18.7727L20.1177 20.5458ZM19.8592 5.73542C20.1976 5.72951 20.5245 5.85828 20.768 6.09341C21.0115 6.32853 21.1516 6.65075 21.1575 6.98917C21.1634 7.3276 21.0346 7.65451 20.7995 7.89799C20.5644 8.14147 20.2422 8.28157 19.9038 8.28748C19.5653 8.29339 19.2384 8.16461 18.9949 7.92949C18.7515 7.69436 18.6114 7.37215 18.6055 7.03372C18.5995 6.6953 18.7283 6.36839 18.9634 6.12491C19.1986 5.88143 19.5208 5.74132 19.8592 5.73542Z" fill="#424B51"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-post-edit-open.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.5957 5.58382C12.4466 5.58382 13.2627 5.92184 13.8643 6.52352C14.466 7.1252 14.804 7.94125 14.804 8.79215C14.804 9.64306 14.466 10.4591 13.8643 11.0608C13.2627 11.6625 12.4466 12.0005 11.5957 12.0005C10.7448 12.0005 9.92875 11.6625 9.32707 11.0608C8.72539 10.4591 8.38737 9.64306 8.38737 8.79215C8.38737 7.94125 8.72539 7.1252 9.32707 6.52352C9.92875 5.92184 10.7448 5.58382 11.5957 5.58382ZM5.17904 8.00049C5.69237 8.00049 6.16904 8.13799 6.58154 8.38549C6.44404 9.69632 6.82904 10.998 7.61737 12.0155C7.15904 12.8955 6.24237 13.5005 5.17904 13.5005C4.44969 13.5005 3.75022 13.2108 3.23449 12.695C2.71877 12.1793 2.42904 11.4798 2.42904 10.7505C2.42904 10.0211 2.71877 9.32167 3.23449 8.80594C3.75022 8.29022 4.44969 8.00049 5.17904 8.00049ZM18.0124 7.85352C18.7417 7.85352 19.4412 8.14325 19.9569 8.65897C20.4726 9.1747 20.7624 9.87417 20.7624 10.6035C20.7624 11.3329 20.4726 12.0323 19.9569 12.5481C19.4412 13.0638 18.7417 13.3535 18.0124 13.3535C16.949 13.3535 16.0324 12.7485 15.574 11.8685C16.3624 10.851 16.7474 9.54935 16.6099 8.23852C17.0224 7.99102 17.499 7.85352 18.0124 7.85352ZM5.63737 16.791C5.63737 14.8935 8.30487 13.3535 11.5957 13.3535C14.8865 13.3535 17.554 14.8935 17.554 16.791V18.3952H5.63737V16.791ZM0.595703 18.3952V17.0202C0.595703 15.746 2.3282 14.6735 4.67487 14.3619C4.13404 14.9852 3.80404 15.8468 3.80404 16.791V18.3952H0.595703ZM22.5957 18.3952H19.3874V16.791C19.3874 15.8468 19.0574 14.9852 18.5165 14.3619C20.8632 14.6735 22.5957 15.746 22.5957 17.0202V18.3952Z" fill="#424B51"/>
+</svg>

+ 4 - 0
src/assets/svg/icon-post-lock.svg

@@ -0,0 +1,4 @@
+<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M72.0799 86.2749H27.4304C24.4135 86.2749 22 83.6649 22 80.4025V50.388C22 47.1256 25.0169 44.5156 27.4304 44.5156H71.4766C75.0968 44.5156 76.9069 47.1256 76.9069 50.388V80.4025C77.5103 83.6649 75.0968 86.2749 72.0799 86.2749Z" fill="#F3B14D"/>
+<path d="M35.1867 40.4444V33.8186C35.1867 26.8184 40.1651 21.7274 47.0105 21.7274H51.989C58.212 21.7274 63.8128 26.8184 63.8128 33.8186V40.4444H69.4135V33.8186C69.4135 23.6366 61.3236 16 51.989 16H47.0105C37.0536 16 29.5859 24.2729 29.5859 33.8186V40.4444H35.1867Z" fill="#AEB9C2"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-refresh-treasure.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.65 6.35C16.2 4.9 14.21 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20C15.73 20 18.84 17.45 19.73 14H17.65C16.83 16.33 14.61 18 12 18C10.4087 18 8.88258 17.3679 7.75736 16.2426C6.63214 15.1174 6 13.5913 6 12C6 10.4087 6.63214 8.88258 7.75736 7.75736C8.88258 6.63214 10.4087 6 12 6C13.66 6 15.14 6.69 16.22 7.78L13 11H20V4L17.65 6.35Z" fill="#636363"/>
+</svg>

ファイルの差分が大きいため隠しています
+ 5 - 0
src/assets/svg/icon-silver-open-box.svg


ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-small-treasure.svg


ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/svg/icon-three-line.svg


+ 3 - 0
src/assets/svg/icon-tip-arrow.svg

@@ -0,0 +1,3 @@
+<svg width="10" height="5" viewBox="0 0 10 5" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.5 0H9.5L4.5 5L0.5 0Z" fill="black" fill-opacity="0.6"/>
+</svg>

+ 4 - 0
src/assets/svg/icon-treasure-return.svg

@@ -0,0 +1,4 @@
+<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 17C0 7.61116 7.61116 0 17 0C26.3888 0 34 7.61116 34 17C34 26.3888 26.3888 34 17 34C7.61116 34 0 26.3888 0 17Z" fill="#FFB443"/>
+<path d="M14.7368 11.8V7L7 15.4L14.7368 23.8V18.88C20.2632 18.88 24.1316 20.8 26.8947 25C25.7895 19 22.4737 13 14.7368 11.8Z" fill="white"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-while-user.svg

@@ -0,0 +1,3 @@
+<svg width="9" height="8" viewBox="0 0 9 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.5 4C5.60514 4 6.5 3.10514 6.5 2C6.5 0.894857 5.60514 8.16868e-08 4.5 8.16868e-08C4.23734 -7.49976e-05 3.97723 0.0516053 3.73454 0.152088C3.49186 0.252571 3.27135 0.399887 3.08562 0.585619C2.89989 0.771351 2.75257 0.991859 2.65209 1.23454C2.55161 1.47723 2.49992 1.73734 2.5 2C2.5 3.10514 3.39486 4 4.5 4ZM4.5 4.57143C3.16514 4.57143 0.5 5.33714 0.5 6.85714V8H8.5V6.85714C8.5 5.33714 5.83486 4.57143 4.5 4.57143Z" fill="white"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-while-yes.svg

@@ -0,0 +1,3 @@
+<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15C11.6421 15 15 11.6421 15 7.5C15 3.35786 11.6421 0 7.5 0C3.35786 0 0 3.35786 0 7.5C0 11.6421 3.35786 15 7.5 15ZM3.96965 8.83499L6.50193 11.3675L7.1218 11.9874L7.6383 11.2791L12.219 4.99666L11.007 4.11293L6.94276 9.68696L5.03035 7.77438L3.96965 8.83499Z" fill="white"/>
+</svg>

ファイルの差分が大きいため隠しています
+ 0 - 19
src/assets/svg/img-A0.svg


ファイルの差分が大きいため隠しています
+ 0 - 19
src/assets/svg/img-A1.svg


ファイルの差分が大きいため隠しています
+ 0 - 44
src/assets/svg/img-B0.svg


ファイルの差分が大きいため隠しています
+ 0 - 44
src/assets/svg/img-B1.svg


ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/img-LT0.svg


ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/img-LT1.svg


ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/img-P1.svg


ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/img-P2.svg


ファイルの差分が大きいため隠しています
+ 3 - 0
src/assets/svg/img-P3.svg


ファイルの差分が大きいため隠しています
+ 2 - 0
src/assets/svg/img-T0.svg


ファイルの差分が大きいため隠しています
+ 2 - 0
src/assets/svg/img-T1.svg


+ 11 - 0
src/assets/svg/img-preview-treasure-01-bg.svg

@@ -0,0 +1,11 @@
+<svg width="375" height="500" viewBox="0 0 375 500" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="375" height="500" fill="url(#paint0_linear_24395_274606)"/>
+<defs>
+<linearGradient id="paint0_linear_24395_274606" x1="187" y1="-7.83211e-09" x2="187.5" y2="500" gradientUnits="userSpaceOnUse">
+<stop offset="0.388068" stop-color="#25180D"/>
+<stop offset="0.554041" stop-color="#5E4025"/>
+<stop offset="0.616047" stop-color="#876635"/>
+<stop offset="0.716041" stop-color="#24180C"/>
+</linearGradient>
+</defs>
+</svg>

+ 224 - 153
src/entry/background.js

@@ -35,18 +35,58 @@ import {
 import {
     closeAchPayNoticeHandler
 } from "@/logic/background/denet";
+
+try {
+    chrome.runtime.onMessage.addListener(onMessageMethod);
+} catch (error) {
+    console.log('error when background onMessage addListener', error);
+    Report.reportLog({
+        objectType: Report.objectType.background_function_catch,
+        funcName: 'onMessage addListener',
+        errMsg: error.message
+    });
+}
+
 try {
-    //加载bg.js 执行
-    setMessageCount();
+    chrome.runtime.onInstalled.addListener(onInstalledMethod);
+} catch (error) {
+    console.log('error when background onInstalled addListener', error);
+    Report.reportLog({
+        objectType: Report.objectType.background_function_catch,
+        funcName: 'onInstalled addListener',
+        errMsg: error.message
+    });
+}
+
+
+
 
-    // 消息通讯
+
+
+// chrome.runtime.setUninstallURL('https://denet.me', (e) => { 
+//     console.log('e', e)
+// })
+
+// 消息通讯
+try {
     chrome.runtime.onConnect.addListener(function (port) {
         port.onDisconnect.addListener(function () {
             onDisconnectHandler(port);
         });
     });
+} catch (error) {
+    console.log('error when background onConnect addListener', error);
+    Report.reportLog({
+        objectType: Report.objectType.background_function_catch,
+        funcName: 'onDisconnect addListener',
+        errMsg: error.message
+    });
+
+}
+
 
-    // 当有可用更新时触发
+// 当有可用更新时触发
+try {
     chrome.runtime.onUpdateAvailable.addListener(() => {
         try {
             setChromeStorage({ onUpdateAvailable: JSON.stringify({ onUpdateAvailable: '1' }) }, () => {
@@ -60,12 +100,18 @@ try {
             });
         }
     })
+} catch (error) {
+    console.log('error when background onUpdateAvailable addListener', error);
+    Report.reportLog({
+        objectType: Report.objectType.background_function_catch,
+        funcName: 'onUpdateAvailable addListener',
+        errMsg: error.message
+    });
+}
 
-    chrome.runtime.onInstalled.addListener(onInstalledMethod);
-
-    chrome.runtime.onMessage.addListener(onMessageMethod);
 
-    // 定时器
+// 定时器
+try {
     chrome.alarms.onAlarm.addListener(function (alarm) {
         // console.log("onAlarm-", alarm);
         switch (alarm.name) {
@@ -80,162 +126,187 @@ try {
                 break
         }
     });
-
-    chrome.action.onClicked.addListener(function (tab) {
-        injectExtensionPopup(tab);
+} catch (error) {
+    console.log('error when background onAlarm addListener', error);
+    Report.reportLog({
+        objectType: Report.objectType.background_function_catch,
+        funcName: 'onAlarm addListener',
+        errMsg: error.message
     });
+}
 
-    chrome.tabs.onActivated.addListener(function (activeInfo) {
-        setPopupConfig(activeInfo);
-    })
 
-    function thenInstalledMethod() {
-        try {
+chrome.action.onClicked.addListener(function (tab) {
+    injectExtensionPopup(tab);
+});
 
-            onInstalledCreateTab()
-            onInstalledMid()
-            onInstalledUserSet()
-            // pingpang
-            chrome.alarms.create('PingPong', {
-                //1分鐘之後開始(該值不能小於1) 
-                delayInMinutes: 2,
-                //開始後每一分鐘執行一次(該值不能小于1) 
-                periodInMinutes: 4
-            });
-            chrome.alarms.create('LuckMessage', {
-                //1分鐘之後開始(該值不能小於1) 
-                delayInMinutes: 1,
-                //開始後每一分鐘執行一次(該值不能小于1) 
-                periodInMinutes: 1
-            });
-        } catch (error) {
-            Report.reportLog({
-                objectType: Report.objectType.background_function_catch,
-                funcName: 'thenInstalledMethod',
-                errMsg: error.message
-            });
-        }
+chrome.tabs.onActivated.addListener(function (activeInfo) {
+    setPopupConfig(activeInfo);
+})
+
+function thenInstalledMethod() {
+    try {
+
+        onInstalledCreateTab()
+        onInstalledMid()
+        onInstalledUserSet()
+        // pingpang
+        chrome.alarms.create('PingPong', {
+            //1分鐘之後開始(該值不能小於1) 
+            delayInMinutes: 2,
+            //開始後每一分鐘執行一次(該值不能小于1) 
+            periodInMinutes: 4
+        });
+        chrome.alarms.create('LuckMessage', {
+            //1分鐘之後開始(該值不能小於1) 
+            delayInMinutes: 1,
+            //開始後每一分鐘執行一次(該值不能小于1) 
+            periodInMinutes: 1
+        });
+    } catch (error) {
+        Report.reportLog({
+            objectType: Report.objectType.background_function_catch,
+            funcName: 'thenInstalledMethod',
+            errMsg: error.message
+        });
     }
-    function onInstalledMethod() {
-        try {
-            // 3.onInstalledMethod 执行了那个
-            // 版本更新判断
-            getChromeStorage('baseInfo', (info) => {
-                if (!info || !info.appVersionCode) {
-                    setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '1' }) })
-                    setChromeStorage({ baseInfo: JSON.stringify({ appVersionCode }) })
-                    thenInstalledMethod()
-                } else if (appVersionCode != info.appVersionCode) {
-                    setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '2' }) }, () => {
-                        setChromeStorage({ baseInfo: JSON.stringify({ appVersionCode }) }, () => {
-                            chrome.runtime.reload()
-                        })
-                    })
-                } else {
-                    setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '3' }) })
-                    thenInstalledMethod()
-                }
-            })
+}
+function onInstalledMethod({ id, previousVersion, reason }) {
+    try {
+        Report.reportLog({
+            id,
+            previousVersion,
+            reason,
+            funcName: 'onInstalledMethodCallback'
+        })
+        // 3.onInstalledMethod 执行了那个
+        // 版本更新判断
+        getChromeStorage('baseInfo', (info) => {
+            // 第一次安装
+            if (!info || !info.appVersionCode) {
+                setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '1' }) })
+                setChromeStorage({ baseInfo: JSON.stringify({ appVersionCode }) })
+                thenInstalledMethod()
 
-            // 1.onUpdateAvailable 存储到本地,再上报
-            getChromeStorage('onUpdateAvailable', (res) => {
-                if (res && res.onUpdateAvailable) {
-                    Report.reportLog({
-                        objectType: Report.objectType.background_function_try,
-                        funcName: 'onUpdateAvailable',
+                // 版本更新了
+            } else if (appVersionCode != info.appVersionCode) {
+                setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '2' }) }, () => {
+                    setChromeStorage({ baseInfo: JSON.stringify({ appVersionCode }) }, () => {
+                        // chrome.runtime.reload()
+                        onInstalledUserSet()
                     })
-                }
-            })
-        } catch (error) {
-            Report.reportLog({
-                objectType: Report.objectType.background_function_catch,
-                funcName: 'onInstalledMethod',
-                errMsg: error.message
-            })
-        }
+                })
+            } else {
+                setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '3' }) })
+                thenInstalledMethod()
+            }
+            console.log('1-appVersionCode', appVersionCode)
+            console.log('1-info', info)
+        })
+        console.log('2-appVersionCode', appVersionCode)
+        // 1.onUpdateAvailable 存储到本地,再上报
+        getChromeStorage('onUpdateAvailable', (res) => {
+            if (res && res.onUpdateAvailable) {
+                Report.reportLog({
+                    objectType: Report.objectType.background_function_try,
+                    funcName: 'onUpdateAvailable',
+                })
+            }
+        })
+    } catch (error) {
+        Report.reportLog({
+            objectType: Report.objectType.background_function_catch,
+            funcName: 'onInstalledMethod',
+            errMsg: error.message
+        })
     }
+}
 
-    function onMessageMethod(req, sender, sendResponse) {
-        try {
-            if (req) {
-                switch (req.actionType) {
-                    case "POPUP_LOGIN":
+function onMessageMethod(req, sender, sendResponse) {
+    try {
+        if (req) {
+            switch (req.actionType) {
+                case "POPUP_LOGIN":
+                    twitterPinLoginToken();
+                    sendResponse('ok');
+                    break;
+                case "POPUP_PUBLISH_TWITTER_RED_PACK":
+                    popupRePublish(req);
+                    sendResponse('ok');
+                    break;
+                case "POPUP_SHOW_DENET_PUBLISH_DIALOG":
+                    checkShowPublishDialog();
+                    break;
+                case 'CONTENT_GET_PINED':
+                    checkPined();
+                    break;
+                case 'CONTENT_SET_BADGE':
+                    setBadgeInfo(req);
+                    break;
+                case 'CONTENT_HIDE_BADGE':
+                    hideBadge();
+                    break
+                case 'CONTENT_SEND_CODE':
+                    twitterPinLoginCode(sender, req.code);
+                    break;
+                case 'CONTENT_TWITTER_LOGIN':
+                    if (req.data) {
                         twitterPinLoginToken();
-                        break;
-                    case "POPUP_PUBLISH_TWITTER_RED_PACK":
-                        popupRePublish(req);
-                        break;
-                    case "POPUP_SHOW_DENET_PUBLISH_DIALOG":
-                        checkShowPublishDialog();
-                        break;
-                    case 'CONTENT_GET_PINED':
-                        checkPined();
-                        break;
-                    case 'CONTENT_SET_BADGE':
-                        setBadgeInfo(req);
-                        break;
-                    case 'CONTENT_HIDE_BADGE':
-                        hideBadge();
-                        break
-                    case 'CONTENT_SEND_CODE':
-                        twitterPinLoginCode(sender, req.code);
-                        break;
-                    case 'CONTENT_TWITTER_LOGIN':
-                        if (req.data) {
-                            twitterPinLoginToken()
+                        sendResponse('ok');
+                    }
+                    break
+                case "CONTENT_SEND_DISCORD_AUTH_CODE":
+                    discordLoginCode(req, sender);
+                    break
+                case 'RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID':
+                    saveDiscordAuthWindowId(req);
+                    sendResponse('ok');
+                    break;
+                case 'CONTENT_FACEBOOK_SHARE_SUCCESS':
+                    facebookShareSuccess(req, sender);
+                    break;
+                case 'CONTENT_PONG':
+                    sendResponse('CONTENT_PONG');
+                    break
+                case 'CONTENT_WINDOW_LOADED_SET_POPUP_PAGE':
+                    // windwoLoadSetPopupPage(req, sender);
+                    break;
+                case 'CONTENT_SET_POPUP_CONFIG':
+                    setActionPopup(req, sender);
+                    break;
+                case 'CONTENT_GET_TWITTER_NFT_POST_PRE':
+                    getTwitterNftPostPre(req.data, sender)
+                    break
+                case 'CONTENT_NFT_TXT_PUBLISH':
+                    nftTxtPublish(req.data, sender)
+                    break
+                case 'CONTENT_HTTP_NET_WORK':
+                    httpNetWork(req.funcName, req.data, sender)
+                    break
+                case 'HTTP_CONTENT_TO_BACK':
+                    httpContentToBack(req, sender)
+                    sendResponse('ok')
+                    break
+                case 'CONTENT_TWITTER_SHORT_LINK':
+                    sendResponse('ok')
+                    req.arr_url.forEach(item => {
+                        if (item) {
+                            twitterShortUrl(sender, item)
                         }
-                        break
-                    case "CONTENT_SEND_DISCORD_AUTH_CODE":
-                        discordLoginCode(req, sender);
-                        break
-                    case 'RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID':
-                        saveDiscordAuthWindowId(req);
-                        break;
-                    case 'CONTENT_FACEBOOK_SHARE_SUCCESS':
-                        facebookShareSuccess(req, sender);
-                        break;
-                    case 'CONTENT_PONG':
-                        console.log('CONTENT_PONG')
-                        break
-                    case 'CONTENT_WINDOW_LOADED_SET_POPUP_PAGE':
-                        // windwoLoadSetPopupPage(req, sender);
-                        break;
-                    case 'CONTENT_SET_POPUP_CONFIG':
-                        setActionPopup(req, sender);
-                        break;
-                    case 'CONTENT_GET_TWITTER_NFT_POST_PRE':
-                        getTwitterNftPostPre(req.data, sender)
-                        break
-                    case 'CONTENT_NFT_TXT_PUBLISH':
-                        nftTxtPublish(req.data, sender)
-                        break
-                    case 'CONTENT_HTTP_NET_WORK':
-                        httpNetWork(req.funcName, req.data, sender)
-                        break
-                    case 'HTTP_CONTENT_TO_BACK':
-                        httpContentToBack(req, sender)
-                        break
-                    case 'CONTENT_TWITTER_SHORT_LINK':
-                        sendResponse('ok')
-                        req.arr_url.forEach(item => {
-                            if (item) {
-                                twitterShortUrl(sender, item)
-                            }
-                        });
-                        break
-                    case 'CONTENT_CLOSE_ACH_PAY_NOTICE':
-                        closeAchPayNoticeHandler();
-                        break;
-                }
+                    });
+                    break
+                case 'CONTENT_CLOSE_ACH_PAY_NOTICE':
+                    closeAchPayNoticeHandler();
+                    break;
             }
-        } catch (error) {
-            Report.reportLog({
-                objectType: Report.objectType.background_function_catch,
-                funcName: 'onMessageMethod',
-                errMsg: error.message
-            });
         }
+    } catch (error) {
+        Report.reportLog({
+            objectType: Report.objectType.background_function_catch,
+            funcName: 'onMessageMethod',
+            errMsg: error.message
+        });
     }
-} catch (error) {
-    console.log('error', error)
-}
+}
+//加载bg.js 执行
+setMessageCount();

+ 24 - 11
src/entry/content.js

@@ -67,7 +67,7 @@ window.onload = () => {
     chrome.runtime.sendMessage({
         actionType: "CONTENT_WINDOW_LOADED_SET_POPUP_PAGE",
         data: {}
-    }, () => { });
+    });
 };
 window.onmessage = (res) => {
     if (res.data && res.data.actionType) {
@@ -105,6 +105,15 @@ window.onmessage = (res) => {
             // case "IFRAME_DO_TASK":
             //     findTweetByIdDoTask(res.data.task_data, res.data.task_type)
             //     break
+            case 'IFREME_TAB_GROUP_SET_IFRAME_HEIGHT':
+                setTabGroupIframeStyle(res.data.data);
+                break
+            case 'IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP':
+                getTweetProfileNavTop(res.data.data);
+                break;
+            case 'IFRAME_PAGE_JUMP':
+                pageJumpHandler(res.data.data);
+                break;
         }
     }
 };
@@ -149,13 +158,12 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
         case 'BG_SET_POPUP_CONFIG':
             setPopupConfByPopupPage();
             break
-        case 'IFREME_TAB_GROUP_SET_IFRAME_HEIGHT':
-            setTabGroupIframeStyle(req.data);
-            break
-        case 'IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP':
-            getTweetProfileNavTop(req.data);
+        // case 'IFREME_TAB_GROUP_SET_IFRAME_HEIGHT':
+        //     setTabGroupIframeStyle(req.data);
+        //     break
+        // case 'IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP':
+        //     getTweetProfileNavTop(req.data);
         case 'IFRAME_PAGE_JUMP':
-
             pageJumpHandler(req.data);
             break;
         case 'BG_LOGIN_SET_USERINFO_CB':
@@ -178,9 +186,8 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             setTwitterTextarea(req.data)
             break
         case 'SWITCH_GROUP_STATUS':
-            sendResponse('ok')
             groupTipsSelectGroupTab(req.data);
-            break
+            return sendResponse('ok')
         case 'IFRAME_GROUP_BANNER_GROUP_INFO':
 
             setGroupInfo(req.data)
@@ -205,10 +212,16 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             showPublishDialog();
             break;
         case 'Get_ToolBox_Fixed_TweetId':
-            sendResponse(toolbox_fixed_tweetId)
-            break
+            return sendResponse(toolbox_fixed_tweetId)
         case 'Set_ToolBox_Fixed':
             toolBox.switchStatus(req)
             break
+        case 'Set_ToolBox_By_Nft':
+            toolBox.buyNft(req)
+            break;
+        case 'Hide_ToolBox_By_Nft':
+            toolBox.hideBuyNft(req)
+            break;
     }
+    sendResponse && sendResponse('ok');
 })

+ 45 - 42
src/entry/content_help.js

@@ -5,49 +5,52 @@ import {
 import { createApp } from 'vue'
 import ViewMessage from '@/view/content/message/index.vue'
 import CoutomSentry from "@/uilts/sentry.js"
-
-const addDomMessage = (element) => {
-    const div = document.createElement('div')
-    div.id = 'denet_message'
-    document.body.appendChild(div)
-    let app = createApp(element)
-    app.mount('#denet_message')
-    CoutomSentry.initVue(app)
-}
-
-let timer = setInterval(() => {
-    if (document.body) {
-        init()
-        clearInterval(timer)
+try {
+    const addDomMessage = (element) => {
+        const div = document.createElement('div')
+        div.id = 'denet_message'
+        document.body.appendChild(div)
+        let app = createApp(element)
+        app.mount('#denet_message')
+        CoutomSentry.initVue(app)
     }
-}, 1000)
-
-const init = () => {
-    // appendPopupPage();
-    addDomMessage(ViewMessage)
-
-    chrome.runtime.sendMessage({
-        actionType: "CONTENT_WINDOW_LOADED_SET_POPUP_PAGE",
-        data: {}
-    }, () => { });
-}
 
-
-chrome.runtime.sendMessage({
-    actionType: "CONTENT_SET_POPUP_CONFIG",
-    data: {
-        popup: 'popup.html'
+    let timer = setInterval(() => {
+        if (document.body) {
+            init()
+            clearInterval(timer)
+        }
+    }, 1000)
+
+    const init = () => {
+        // appendPopupPage();
+        addDomMessage(ViewMessage)
+
+        chrome.runtime.sendMessage({
+            actionType: "CONTENT_WINDOW_LOADED_SET_POPUP_PAGE",
+            data: {}
+        });
     }
-}, () => { });
-
-chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
 
-    switch (req.actionType) {
-        case 'BACK_PING':
-            chrome.runtime.sendMessage({ actionType: "CONTENT_PONG", data: '1' }, (res) => { console.log(res) })
-            break
-        case 'BG_INJECT_EXTENSION_POPUP':
-            tiggerInjectPopupPage();
-            break
-    }
-})
+    chrome.runtime.sendMessage({
+        actionType: "CONTENT_SET_POPUP_CONFIG",
+        data: {
+            popup: 'popup.html'
+        }
+    });
+
+    chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
+
+        switch (req.actionType) {
+            case 'BACK_PING':
+                chrome.runtime.sendMessage({ actionType: "CONTENT_PONG", data: '1' }, (res) => { console.log(res) })
+                break
+            case 'BG_INJECT_EXTENSION_POPUP':
+                tiggerInjectPopupPage();
+                break
+        }
+        sendResponse && sendResponse()
+    })
+} catch (error) {
+    console.log('catch', error)
+}

+ 7 - 5
src/http/configAPI.js

@@ -9,9 +9,9 @@ const api = {
 }
 
 const logApi = {
-	production: 'https://log.weiqumeta.com',
-	pre: 'https://prelog.weiqumeta.com',
-	development: 'https://testlog.weiqumeta.com'
+	production: 'https://log.denetme.net',
+	pre: 'https://prelog.denetme.net',
+	development: 'https://testlog.denetme.net'
 }
 
 const page = {
@@ -28,7 +28,7 @@ const website = {
 
 export const baseAPIUrl = api[process.env.NODE_ENV] + '/denet'
 
-export const logAPIUrl = logApi[process.env.NODE_ENV] + '/log-center'
+export const logAPIUrl = logApi[process.env.NODE_ENV] + '/denet/log'
 
 export const pageUrl = page[process.env.NODE_ENV]
 
@@ -38,4 +38,6 @@ export const discordAuthRedirectUri = `${pageUrl}/auth/discordCallback`;
 
 export const faceShareRedirectUrl = `${pageUrl}/facebook/shareCallback`;
 
-export const payAchNoticeUrl = `${pageUrl}/ach_pay/pay_notice`;
+export const payAchNoticeUrl = `${pageUrl}/ach_pay/pay_notice`;
+
+export const iframeHost = process.env.VUE_APP_IFRAME_HOST;

+ 3 - 2
src/http/fetch.js

@@ -3,10 +3,11 @@ import { getChromeStorage } from '@/uilts/chromeExtension.js'
 
 export async function commonFetch({ url = '', method = 'POST', params = {}, baseInfo = {} }) {
     try {
-        let storage_mid = await getChromeStorage('mid') || ''
+
+        let storage_mid = await getChromeStorage('mid').catch((error) => {console.log(error) }) || ''
         const { mid } = storage_mid || {}
         if (!baseInfo.token || !baseInfo.uid) {
-            const { accessToken: token = '', uid = '' } = await getChromeStorage('userInfo') || {}
+            const { accessToken: token = '', uid = '' } = await getChromeStorage('userInfo').catch((error) => {console.log(error) }) || {}
             baseInfo.token = token
             baseInfo.uid = uid
         }

+ 21 - 4
src/http/help.js

@@ -1,14 +1,14 @@
 import { getChromeStorage } from '@/uilts/chromeExtension.js'
 import { srcPublishSuccess } from '@/http/publishApi'
+import { bindRepost } from '@/http/treasure'
 
 // 重新绑定推文id
 export const reSetBindTwtterId = ({
     postId = '',
     tweetId = ''
 }, callback) => {
-    getChromeStorage('userInfo', (_userInfo = {}) => {
-        // if (_userInfo && _userInfo.uid == _params.uid) {
-        if (_userInfo.uid) {
+    getChromeStorage('userInfo', (_userInfo) => {
+        if (_userInfo && _userInfo.uid) {
             srcPublishSuccess({
                 params: {
                     postId,
@@ -21,4 +21,21 @@ export const reSetBindTwtterId = ({
             })
         }
     })
-}
+}
+
+
+// 重新绑定推文id
+export const reSetBindRepost = (params, callback) => {
+    getChromeStorage('userInfo', (_userInfo) => {
+        if (_userInfo && _userInfo.uid) {
+            bindRepost({
+                params
+            }).then((res) => {
+                if (res.code == 0 || res.code == 3003) {
+                    callback && callback()
+                }
+            })
+        }
+    })
+}
+

+ 3 - 3
src/http/logApi.js

@@ -4,7 +4,7 @@ import { commonFetch } from '@/http/fetch'
 
 // export function logApi(params) {
 //     return service({
-//         url: `${logAPIUrl}/statistics/uploadLogFromFrontend
+//         url: `${logAPIUrl}/uploadLogFromFrontend`,
 //         `,
 //         method: 'post',
 //         data: params
@@ -13,7 +13,7 @@ import { commonFetch } from '@/http/fetch'
 
 export function logApi(params = {}) {
     return commonFetch({
-        url: `${logAPIUrl}/statistics/uploadLogFromFrontend`,
+        url: `${logAPIUrl}/uploadLogFromFrontend`,
         baseInfo: {
             pageSource: params.params.pageSource || ''
         },
@@ -26,4 +26,4 @@ export function reportFrontLogApi(params = {}) {
         url: `/log/reportFrontLog`,
         params: params
     })
-}
+}

+ 8 - 0
src/http/nft.js

@@ -87,4 +87,12 @@ export function redeemNft(params) {
         method: 'post',
         data: params
     })
+}
+
+export function listPossessNftProject(params) {
+    return service({
+        url: `/nft/possess/listPossessNftProject`,
+        method: 'post',
+        data: params
+    })
 }

+ 17 - 1
src/http/toolBoxApi.js

@@ -30,4 +30,20 @@ export function checkInputUrlInBlacklist(params) {
         method: 'post',
         data: params
     })
-}
+}
+
+export function getPostEditorNftCertInfo(params) {
+    return service({
+        url: `/post/editor/getPostEditorNftCertInfo`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function unlockNftCert(params) {
+    return service({
+        url: `/post/editor/unlockNftCert`,
+        method: 'post',
+        data: params
+    })
+}

+ 77 - 0
src/http/treasure.js

@@ -0,0 +1,77 @@
+import { service } from "./request";
+
+export function treasureDetail(params) {
+    return service({
+        url: `/post/treasure/detail`,
+        method: "post",
+        data: params,
+    });
+}
+
+
+export function inviteChannel(params) {
+    return service({
+        url: `/post/treasure/invite/channel`,
+        method: "post",
+        data: params,
+    });
+}
+
+export function inviteDetail(params) {
+    return service({
+        url: `/post/treasure/invite/detail`,
+        method: "post",
+        data: params,
+    });
+}
+
+export function inviteList(params) {
+    return service({
+        url: `/post/treasure/invite/list`,
+        method: "post",
+        data: params,
+    });
+}
+
+export function treasureOpen(params) {
+    return service({
+        url: `/post/treasure/open`,
+        method: "post",
+        data: params,
+    });
+}
+
+export function prepareStart(params) {
+    return service({
+        url: `/post/treasure/prepareStart`,
+        method: "post",
+        data: params,
+    });
+}
+
+
+export function receiveList(params) {
+    return service({
+        url: `/post/treasure/receive/list`,
+        method: "post",
+        data: params,
+    });
+}
+
+
+export function treasureStart(params) {
+    return service({
+        url: `/post/treasure/start`,
+        method: "post",
+        data: params,
+    });
+}
+
+
+export function bindRepost(params) {
+    return service({
+        url: `/post/treasure/invite/bindRepost`,
+        method: "post",
+        data: params,
+    });
+}

+ 9 - 0
src/http/treasureApi.js

@@ -0,0 +1,9 @@
+import { service } from "./request";
+
+export function upGainCalculate(params) {
+    return service({
+        url: `/post/treasure/upGainCalculate`,
+        method: 'post',
+        data: params
+    })
+}

+ 5 - 1
src/iframe/nft-card.js

@@ -1,7 +1,11 @@
 import { createApp } from 'vue'
 import App from '@/view/iframe/nft/card.vue'
+import CoutomSentry from "@/uilts/sentry.js"
+import AutoLog from '@/log-center/autoLog';
 
 const app = createApp(App);
-import CoutomSentry from "@/uilts/sentry.js"
+
 CoutomSentry.initVue(app)
+
+app.use(AutoLog);
 app.mount('#app');

+ 3 - 1
src/iframe/publish.js

@@ -3,7 +3,7 @@ import App from '@/view/iframe/publish/publish.vue'
 
 import "ant-design-vue/dist/antd.css"; // or 'ant-design-vue/dist/antd.less'
 
-import { Button, message, Tooltip, Switch } from "ant-design-vue";
+import { Button, message, Tooltip, Switch, Radio, RadioGroup } from "ant-design-vue";
 
 import AutoLog from '@/log-center/autoLog';
 
@@ -20,6 +20,8 @@ app.use(Tooltip);
 app.use(message);
 app.use(Switch);
 app.use(AutoLog);
+app.use(Radio);
+app.use(RadioGroup);
 
 
 import CoutomSentry from "@/uilts/sentry.js"

+ 8 - 0
src/iframe/tool-box-buy-nft.js

@@ -0,0 +1,8 @@
+import { createApp } from 'vue'
+import App from '@/view/iframe/tool-box/buy-nft.vue'
+import AutoLog from '@/log-center/autoLog';
+
+const app = createApp(App);
+
+app.use(AutoLog);
+app.mount('#app');

+ 1 - 2
src/iframe/tool-box.js

@@ -1,5 +1,4 @@
 import { createApp } from 'vue'
 import App from '@/view/iframe/tool-box/index.vue'
-
 const app = createApp(App);
-app.mount('#app');
+app.mount('#app');

+ 6 - 0
src/iframe/treasure-hunt.js

@@ -0,0 +1,6 @@
+import { createApp } from 'vue'
+import App from '@/view/iframe/test/index.vue'
+import AutoLog from '@/log-center/autoLog';
+const app = createApp(App);
+app.use(AutoLog)
+app.mount('#app');

+ 2 - 2
src/log-center/autoLog/show.js

@@ -13,10 +13,10 @@ class ShowLogObserver {
     init() {
         this._observe = new IntersectionObserver((entries, observer) => {
             entries.forEach((entry) => {
-                if (entry.isIntersecting) {
+                if (entry.intersectionRatio > 0.5) {
                     this.report(entry);
                     // show-log-once  ===  '1' &&  曝光之后取消观察
-                    if (entry?.target?.getAttribute('show-log-once') === '1') { 
+                    if (entry?.target?.getAttribute('show-log-once') === '1') {
                         this.remove(entry.target);
                     }
                 }

+ 64 - 2
src/log-center/logEnum.js

@@ -1,7 +1,16 @@
+import { PlayType } from '@/types';
+
 export const logType = {
     'denet': '150',//denet-event-log
 }
 
+export const redPacketType = {
+    nftSale: 2,
+    nftGroupSale: 3,
+    treasure: 4,
+    postEditor: 5,
+}
+
 export const businessType = {
     buttonView: "buttonView",
     buttonClick: "buttonClick",
@@ -18,7 +27,15 @@ export const objectType = {
     withdrawButton: "withdraw-button",
     topupButton: "topup-button",
 
-    //discord 
+
+    getMoreGiveaway: "get-more-giveaway",
+    nextButton: "next-button",
+    openChestButton: "open-chest-button",
+    copyButton: "copy-button",
+    repostSuccess: "repostSuccess",
+    channelButton: 'channel-button',
+
+    //discord
     getDiscordGuildNoData: 'get-discord-guild-no-data',
     getDiscordGuildCatch: 'get-discord-guild-catch',
     getDiscordGuildOpenApiNoData: 'get-discord-guild-openapi-no-data',
@@ -56,6 +73,15 @@ export const objectType = {
     create_nfts_button: 'create-nfts-button',
     confirm_transfer_button: 'confirm-transfer-button',
     redeem_button: 'redeem-button',
+    buy_button: 'buy-button',
+    buy_nft_button: 'buy-nft-button',
+    custom_link_button: 'custom-link-button',
+    history_button: 'history-button',
+    app_button: 'app-button',
+    enter_url_button: 'enter-url-button',
+    top_right_button: 'top-right-button',
+    fullscreen_button: 'fullscreen-button',
+    encrypte_nft_button: 'encrypte-nft-button',
 }
 
 export const pageSource = {
@@ -73,7 +99,18 @@ export const pageSource = {
     denetMorePage: "denet-more-page",
     denetSelector: "denet-selector",
     nftShopPage: "nft-shop-page",
+    nftPreviewPage: "nft-preview-page",
     denetNftTransferPage: "denet-nft-transfer-page",
+
+
+    newFansRewardPage: "new-fans-reward-page",
+    inviteFriendsPage: "invite-friends-page",
+    openTreasurePage: "open-treasure-page",
+    beenInvitedPage: "been-invited-page",
+    waitingLotteryPage: "waiting-lottery-page",
+    missingLotteryPage: "missing-lottery-page",
+    expiredPage: "expired-page",
+
     // 待开红包页
     pending_page: 'pending-page',
     // 已领取任务页
@@ -89,10 +126,35 @@ export const pageSource = {
     // 成功领取到钱包
     received_success_page: 'received-success-page',
     received_empty_rewards_page: 'received-empty-rewards-page',
+    pe_loading_page: 'pe-loading-page',
+    pe_display_page: 'pe-display-page',
+    nft_sales_window: 'nft-sales-window',
+    nft_post_page: 'nft-post-page',
+    main_page_dashboard: 'main-page-dashboard',
+    post_editor_guide_page_left: 'post-editor-guide-page-left',
+    post_editor_guide_page_right: 'post-editor-guide-page-right',
+    buy_posteditor_nft_dialog: 'buy-posteditor-nft-dialog',
 
 }
 
 export const extParams = {
     success: 'success',
     failure: 'failure'
-}
+}
+
+export const bizType = {
+    Treasure: 0,
+    Lottery: 1,
+    RedPacket: 2,
+    ToolBox: 3,
+}
+
+export const getCurrentBizType = (type) => {
+  let obj = {};
+  obj[PlayType.common] = bizType.RedPacket;
+  obj[PlayType.lottery] = bizType.Lottery;
+  obj[PlayType.treasure] = bizType.Treasure;
+  obj[PlayType.postEditor] = bizType.ToolBox;
+
+  return obj[type];
+}

+ 30 - 3
src/log-center/logger.js

@@ -9,13 +9,20 @@ let mid = '';
  * @extParams 最终上报到阿里云以json字符串存储的参数,如果extparams传入的不是obj会转换成obj
  */
 export async function reportLog(eventData = {}, extParams = {}) {
+    // 过滤空值
+    let dataKey = Object.keys(eventData);
+    dataKey.forEach(key => {
+        if (eventData[key] === '') {
+            delete eventData[key]
+        }
+    })
     // 2.reportLog 异常 存储到本地,再上报
     try {
         if (!userInfo) {
-            userInfo = await getChromeStorage('userInfo') || null;
+            userInfo = await getChromeStorage('userInfo').catch((error) => {console.log(error) }) || null;
         }
         if (!mid) {
-            mid = await getChromeStorage('mid') || '';
+            mid = await getChromeStorage('mid').catch((error) => {console.log(error) }) || '';
         }
         let isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
         let platform = isMobile ? `mobile` : `pc`;
@@ -90,4 +97,24 @@ function wrapObject(extParams) {
  */
 function typeDecide(o, type) {
     return Object.prototype.toString.call(o) === `[object ${type}]`;
-}
+}
+
+export async function getReportCommonParams () {
+  let commonParams = {};
+  if (!userInfo) {
+      userInfo = await getChromeStorage('userInfo') || null;
+  }
+  let isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
+  let platform = isMobile ? `mobile` : `pc`;
+
+  if (chrome && chrome.tabs) {
+      let tab = await chrome.tabs.getCurrent();
+      commonParams = {
+          url: tab && tab.url ? tab.url : '',
+          platform,
+          browser: getBrowser(),
+          twitterId: userInfo && userInfo.nickName || '',
+      }
+  }
+  return commonParams;
+}

+ 6 - 4
src/logic/background/facebook.js

@@ -5,9 +5,9 @@ import Report from "@/log-center/log"
  * facebook分享成功逻辑
  */
 export function facebookShareSuccess(params, sender) {
-    try{
-        let {data} = params;
-        let {id} = sender.tab || {};
+    try {
+        let { data } = params;
+        let { id } = sender.tab || {};
         chrome.tabs.remove(id);
 
         fetchAddFinishEvent({
@@ -22,6 +22,8 @@ export function facebookShareSuccess(params, sender) {
                     });
                 })
             }
+        }).catch((error) => {
+            console.log('catch', error)
         })
     } catch (error) {
         Report.reportLog({
@@ -34,7 +36,7 @@ export function facebookShareSuccess(params, sender) {
 
 
 function sendActivetabMessage(message = {}) {
-    try{
+    try {
         chrome.tabs.query({
             active: true,
             currentWindow: true

+ 1 - 1
src/logic/background/help.js

@@ -8,7 +8,7 @@ export function PingPong() {
             if (tabs.length) {
                 let tab = tabs.filter((item) => { return item.active == true })
                 if (tab.length) {
-                    chrome.tabs.sendMessage(tab[0].id, { actionType: 'BACK_PING' }, () => { });
+                    chrome.tabs.sendMessage(tab[0].id, { actionType: 'BACK_PING' });
                 }
             }
         })

+ 27 - 4
src/logic/background/twitter.js

@@ -111,6 +111,8 @@ export function twitterPinLoginCode(sender, code) {
                     setMessageCount()
                     chrome.cookies.remove(LANDING_PAGE)
                 }
+            }).catch((error) => {
+                console.log('catch', error)
             })
         })
     } catch (error) {
@@ -146,6 +148,8 @@ export function discordLoginCode({ code }, sender) {
                     });
                 })
             }
+        }).catch((error) => {
+            console.log('catch', error)
         })
     } catch (error) {
         Report.reportLog({
@@ -204,6 +208,8 @@ export function twitterShortUrl(sender, url) {
                 //     state: "BACK_TWITTER_SHORT_URL"
                 // });
             })
+        }).catch((error) => {
+            console.log('catch', error)
         })
     } catch (error) {
         Report.reportLog({
@@ -264,6 +270,8 @@ export function onInstalledUserSet() {
                     }
                 }
             })
+        }).catch((error) => {
+            console.log('catch', error)
         })
     } catch (error) {
         Report.reportLog({
@@ -302,10 +310,8 @@ function sendActivetabMessage(message = {}) {
             active: true,
             currentWindow: true
         }, (tabs) => {
-            if(tabs && tabs.length) {
-                chrome.tabs.sendMessage(tabs[0].id, message, res => {
-                    console.log(res)
-                })
+            if (tabs && tabs.length) {
+                chrome.tabs.sendMessage(tabs[0].id, message)
             }
         })
     } catch (error) {
@@ -405,6 +411,15 @@ export function onInstalledCreateTab() {
                         });
                     }
                     break
+                case 'treasure_info':
+                    if (res && res.postNickName && res.srcContentId) {
+                        created_detail = true
+                        url = `https://twitter.com/${res.postNickName}/status/${res.srcContentId}`
+                        chrome.tabs.create({
+                            url
+                        });
+                    }
+                    break;
             }
 
             if (created_detail == false) {
@@ -525,6 +540,8 @@ export function getMessageInfo() {
                     hideBadge();
                 }
             }
+        }).catch((error) => {
+            console.log('catch', error)
         })
     } catch (error) {
         Report.reportLog({
@@ -620,6 +637,8 @@ export const getSysMessage = () => {
             .then((res) => {
                 // 向选中的content发送消息
                 setContentMessage({ actionType: 'BACK_UNREAD_MESSAGE', data: res })
+            }).catch((error) => {
+                console.log('catch', error)
             })
     } catch (error) {
         Report.reportLog({
@@ -679,6 +698,8 @@ export const getTwitterNftPostPre = (params, sender) => {
         if (res.code == 0) {
             chrome.tabs.sendMessage(sender.tab.id, { actionType: 'BACK_TWITTER_NFT_POST_PRE', data: res.data }, (res) => { console.log(res) });
         }
+    }).catch((error) => {
+        console.log('catch', error)
     })
 }
 
@@ -688,6 +709,8 @@ export const nftTxtPublish = (params, sender) => {
         if (res.code == 0) {
             chrome.tabs.sendMessage(sender.tab.id, { actionType: 'BACK_NFT_PUBLISH_DONE', data: res.data }, (res) => { console.log(res) });
         }
+    }).catch((error) => {
+        console.log('catch', error)
     })
 }
 

+ 36 - 6
src/logic/content/ParseCard.js

@@ -263,18 +263,18 @@ class ParseCard {
             _iframe_url = _iframe_url + '&denet_debugger=1'
         }
         _iframe.src = _iframe_url
-        _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px;'
+        _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; border: 1px solid #DCDCDC; border-radius: 20px;'
         if (if_center) {
-            _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; display:block; margin:auto;'
+            _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; display:block; margin:auto; border: 1px solid #DCDCDC; border-radius: 20px;'
         }
         return _iframe
     }
-    createNftIframe({ project_Id }) {
+    createNftIframe({ project_Id, tweet_Id }) {
         let project_arr = project_Id.split('/');
         let projectId = project_arr[0]
         let _iframe = document.createElement('iframe')
         _iframe.id = project_Id
-        _iframe.src = chrome.runtime.getURL('/iframe/nft-card.html') + `?projectId=${projectId}&twitterAccount=${project_arr[1]}`;
+        _iframe.src = chrome.runtime.getURL('/iframe/nft-card.html') + `?projectId=${projectId}&tweetId=${tweet_Id}&twitterAccount=${project_arr[1]}`;
         _iframe.style.cssText = 'border:medium none; width:375px; min-height:300px;'
         return _iframe
     }
@@ -285,6 +285,13 @@ class ParseCard {
         _iframe.style.cssText = 'border:medium none; width:505px; min-height:180px;'
         return _iframe
     }
+    createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code }) {
+        let _iframe = document.createElement('iframe')
+        _iframe.id = params.post_Id
+        _iframe.src = chrome.runtime.getURL('/iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}`;
+        _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; border: 1px solid #DCDCDC; border-radius: 20px;'
+        return _iframe
+    }
     isHasIframeByArticle(dom_card) {
         if (!dom_card || !dom_card.parentElement) {
             return
@@ -473,6 +480,29 @@ class ParseCard {
             dom.appendChild(this.createIframe({ post_Id, tweet_Id, page_type }))
         }
     }
+    replaceDOMTreasureCard({ invite_code, dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
+        if (!dom_card || !dom_card.parentElement) {
+            return
+        }
+        let type
+        let dom = dom_card.querySelector('div[aria-labelledby]')
+        if (dom) {
+            type = 'card'
+            for (let i = 0; i < dom.childNodes.length; i++) {
+                if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
+                    dom.children[i].style.display = 'none'
+                }
+            }
+        } else {
+            type = 'txt'
+            dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
+        }
+
+        dom.style = 'min-height:500px'
+        if (dom) {
+            dom.appendChild(this.createTreasureIframe({ post_Id, tweet_Id, page_type, invite_code }))
+        }
+    }
     replaceNftDomRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
         if (!dom_card || !dom_card.parentElement) {
             return
@@ -491,7 +521,7 @@ class ParseCard {
         dom.style = 'min-height:300px'
         if (dom) {
             let project_Id = post_Id.replace('nft/', '');
-            dom.appendChild(this.createNftIframe({ project_Id }))
+            dom.appendChild(this.createNftIframe({ project_Id, tweet_Id }))
         }
     }
     replaceFacebookPacket({ dom_card, tweet_Id, short_url, tweet_author }) {
@@ -516,7 +546,7 @@ class ParseCard {
             if (post_Id.indexOf('luckdraw/') >= 0) {
                 post_Id = post_Id.replace('luckdraw/', '');
                 dom.appendChild(this.createIframe({ post_Id, tweet_author, page_type: '抽奖' }, true))
-            } else {
+            } else if (!post_Id.includes('/')) {
                 dom.appendChild(this.createIframe({ post_Id, tweet_author }, true))
             }
         }

+ 23 - 0
src/logic/content/ToolBox.js

@@ -56,4 +56,27 @@ export const toolBox = new class ToolBox {
                 break
         }
     }
+    // 购买NFT
+    buyNft(req) {
+        let iframe = document.createElement('iframe')
+            iframe.src = chrome.runtime.getURL('/iframe/tool-box-buy-nft.html') + `?postId=${req.data.postId}`;
+        let ifAppend = document.querySelector('#denet-tool-box-buy-nft')
+        if (ifAppend) return;
+        let div = document.createElement(`div`);
+            div.id = 'denet-tool-box-buy-nft';
+            div.innerHTML = `
+                ${iframe.outerHTML}
+                <div class="mask_bg"></div>
+                <style>
+                    #denet-tool-box-buy-nft { position:fixed; width:100%; height:100%; top:0; left:0; }
+                    #denet-tool-box-buy-nft iframe { position:absolute; z-index:33; top:0; left:0; width:100%; height:100%; border:medium none; }
+                    #denet-tool-box-buy-nft .mask_bg{  position:absolute; z-index:32; width:100%; height:100%; top:0; left:0; background-color:rgba(0,0,0,.5); }
+                </style>
+            `
+        document.body.append(div)
+    }
+    hideBuyNft() {
+        let node = document.querySelector('#denet-tool-box-buy-nft')
+        node && node.remove()
+    }
 }

+ 1 - 1
src/logic/content/denet.js

@@ -10,6 +10,6 @@ const closeAchPayNotice = () => {
         chrome.runtime.sendMessage({
             actionType: "CONTENT_CLOSE_ACH_PAY_NOTICE",
             data: {}
-        }, () => { });
+        });
     }
 }

+ 1 - 3
src/logic/content/facebook.js

@@ -63,9 +63,7 @@ function shareCallback() {
         let params = JSON.parse(urlParams.get('params'));
         if (params) {
             chrome.storage.local.remove("shareFacebookData");
-            chrome.runtime.sendMessage({ actionType: "CONTENT_FACEBOOK_SHARE_SUCCESS", data: params }, () => { 
-
-            })
+            chrome.runtime.sendMessage({ actionType: "CONTENT_FACEBOOK_SHARE_SUCCESS", data: params })
         }
     }
 }

+ 17 - 0
src/logic/content/nft.js

@@ -3,6 +3,7 @@ import { listJoinNftGroup } from '@/http/nft';
 import { getChromeStorage } from '@/uilts/chromeExtension.js'
 import { _setPublishContent, publishNFTTweetPost, bindTwitterArt, bindTwitterArtMethod } from './twitter';
 import { jumpTwitterDetailByAlert } from '@/logic/content/help/twitter.js'
+import Report from "@/log-center/log"
 
 var ifShowNftGroup = false;
 var tempNftGroupPost = null;
@@ -31,8 +32,24 @@ export const showNFTGroupIcon = () => {
             oDiv.addEventListener('click', (e) => {
                 showNFTGroupList(e);
                 e.stopPropagation();
+                // report
+                Report.reportLog({
+                    pageSource: Report.pageSource.mainPage,
+                    businessType: Report.businessType.buttonClick,
+                    objectType: Report.objectType.buttonSecond
+                }, {
+                    type: 2
+                });
             })
         toolElem.firstChild.appendChild(oDiv)
+        // report
+        Report.reportLog({
+            pageSource: Report.pageSource.mainPage,
+            businessType: Report.businessType.buttonView,
+            objectType: Report.objectType.buttonSecond
+        }, {
+            type: 2
+        });
     }
 }
 

+ 245 - 87
src/logic/content/twitter.js

@@ -1,6 +1,6 @@
 import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 import { throttle, getQueryString, getCookie, nextTick, getQueryStringByUrl } from '@/uilts/help'
-import { discordAuthRedirectUri } from '@/http/configAPI'
+import { discordAuthRedirectUri, iframeHost } from '@/http/configAPI'
 import { reportSrcPublishEvent } from '@/http/publishApi'
 import Report from "@/log-center/log"
 import { fetchAddFinishEvent } from '@/logic/background/fetch/facebook';
@@ -9,6 +9,7 @@ import { jumpTwitterDetailByAlert, showEditTweet } from '@/logic/content/help/tw
 import { clearPostContent, setGroupIconStatus } from '@/logic/content/nft.js'
 import { toolBox } from '@/logic/content/ToolBox'
 import axios from 'axios';
+import messageCenter from '@/uilts/messageCenter';
 
 let dom = {};
 
@@ -35,7 +36,7 @@ function twitterPinLogin() {
 
         if (code) {
             pin_login = true
-            chrome.runtime.sendMessage({ actionType: "CONTENT_SEND_CODE", code: code.innerText }, () => { })
+            chrome.runtime.sendMessage({ actionType: "CONTENT_SEND_CODE", code: code.innerText })
             // port.postMessage({ state: 'CONTENT_SEND_CODE', code: code.innerText })
         }
     }
@@ -46,7 +47,7 @@ function getDiscordAuthCode() {
         const urlParams = new URLSearchParams(window.location.search);
         const code = urlParams.get('code');
         if (code) {
-            chrome.runtime.sendMessage({ actionType: "CONTENT_SEND_DISCORD_AUTH_CODE", code }, () => { })
+            chrome.runtime.sendMessage({ actionType: "CONTENT_SEND_DISCORD_AUTH_CODE", code })
         }
     }
 };
@@ -276,47 +277,63 @@ function checkIsShowReSend(dom, params) {
  * @private
  */
 function _addDeNetEditBtn(params = {}) {
-    setTimeout(() => {
-        let toolElem = document.querySelector('div[data-testid="toolBar"]');
-        if (toolElem) {
+    let toolElem = document.querySelector('div[data-testid="toolBar"]');
+    if (toolElem) {
+        let innerDeIcon = toolElem.querySelector('#de-btn1');
+        if (!innerDeIcon) {
+            toolElem.firstChild.appendChild(createTweetToolbarDenet());
+            popupShowGiveawayDialog();
             Report.reportLog({
                 pageSource: Report.pageSource.mainPage,
                 businessType: Report.businessType.buttonView,
                 objectType: Report.objectType.buttonSecond
+            }, {
+                type: 0
             });
-            let innerDeIcon = document.getElementById('de-btn1');
-            if (!innerDeIcon) {
-                toolElem.firstChild.appendChild(createTweetToolbarDenet());
-                popupShowGiveawayDialog();
-            }
+        }
 
-            let innerToolBoxIcon = document.getElementById('de-tool-box-btn-01');
-            if (!innerToolBoxIcon) {
-                toolElem.firstChild.appendChild(createTweetToolbarToolBox())
-            }
-        } else {
-            setTimeout(() => {
-                let toolElem = document.querySelector('div[data-testid="toolBar"]');
-                if (toolElem) {
+        let innerToolBoxIcon = toolElem.querySelector('#de-tool-box-btn-01');
+        if (!innerToolBoxIcon) {
+            toolElem.firstChild.appendChild(createTweetToolbarToolBox())
+            Report.reportLog({
+                pageSource: Report.pageSource.mainPage,
+                businessType: Report.businessType.buttonView,
+                objectType: Report.objectType.buttonSecond
+            }, {
+                type: 1
+            });
+        }
+    } else {
+        setTimeout(() => {
+            let toolElem = document.querySelector('div[data-testid="toolBar"]');
+            if (toolElem) {
+                let innerDeIcon = toolElem.querySelector('#de-btn1');
+                if (!innerDeIcon) {
+                    toolElem.firstChild.appendChild(createTweetToolbarDenet());
+                    popupShowGiveawayDialog();
                     Report.reportLog({
                         pageSource: Report.pageSource.mainPage,
                         businessType: Report.businessType.buttonView,
                         objectType: Report.objectType.buttonSecond
+                    }, {
+                        type: 0
                     });
-                    let innerDeIcon = document.getElementById('de-btn1');
-                    if (!innerDeIcon) {
-                        toolElem.firstChild.appendChild(createTweetToolbarDenet());
-                        popupShowGiveawayDialog();
-                    }
+                }
 
-                    let innerToolBoxIcon = document.getElementById('de-tool-box-btn-01');
-                    if (!innerToolBoxIcon) {
-                        toolElem.firstChild.appendChild(createTweetToolbarToolBox())
-                    }
+                let innerToolBoxIcon = toolElem.querySelector('#de-tool-box-btn-01');
+                if (!innerToolBoxIcon) {
+                    toolElem.firstChild.appendChild(createTweetToolbarToolBox())
+                    Report.reportLog({
+                        pageSource: Report.pageSource.mainPage,
+                        businessType: Report.businessType.buttonView,
+                        objectType: Report.objectType.buttonSecond
+                    }, {
+                        type: 1
+                    });
                 }
-            }, 1000)
-        }
-    })
+            }
+        }, 1000)
+    }
 }
 
 const popupShowGiveawayDialog = async () => {
@@ -383,7 +400,7 @@ function _addIframe() {
     let iframe = document.createElement('iframe');
     iframe.src = chrome.runtime.getURL('/iframe/publish.html')
     iframe.id = 'iframe-content'
-    iframe.style.cssText = 'position:fixed;top:0px;right:0;display:block; width:100%;height:100%;z-index:10000; border: medium none;display:none';
+    iframe.style.cssText = 'position:fixed;top:0px;right:0;display:block; width:100%;height:100%;z-index:10000; border: medium none;display:none;background: rgba(255,255,255,0);';
     // shadowRoot.appendChild(iframe);
     // document.body.appendChild(span)
     dom.iframe = iframe;
@@ -583,7 +600,7 @@ function _createBtnDom() {
 
 function createTweetToolbarDenet() {
     let src = require("@/assets/img/icon-gift-pack.png");
-    const smallDeBtnStyle = 'width:20px;height: 20px;cursor: pointer;padding: 0px 8px';
+    const smallDeBtnStyle = 'width:20px;height: 20px;cursor: pointer;margin: 0px 8px';
 
     const deBtn1 = document.createElement('img');
     deBtn1.id = 'de-btn1';
@@ -595,6 +612,8 @@ function createTweetToolbarDenet() {
             pageSource: Report.pageSource.mainPage,
             businessType: Report.businessType.buttonClick,
             objectType: Report.objectType.buttonSecond
+        }, {
+            type: 0
         });
         _deNetBtnClick();
     })
@@ -604,7 +623,7 @@ function createTweetToolbarDenet() {
 
 function createTweetToolbarToolBox() {
     let src = require("@/assets/img/icon-tool-box-01.png");
-    const smallDeBtnStyle = 'width:20px;height: 20px;cursor: pointer;padding: 0px 8px';
+    const smallDeBtnStyle = 'width:20px;height: 20px;cursor: pointer;margin: 0px 8px';
 
     const deToolBoxBtn = document.createElement('img');
     deToolBoxBtn.id = 'de-tool-box-btn-01';
@@ -615,12 +634,25 @@ function createTweetToolbarToolBox() {
         _deNetBtnClick({
             type: 'TOOL_BOX'
         })
+        // report
+        Report.reportLog({
+            pageSource: Report.pageSource.mainPage,
+            businessType: Report.businessType.buttonClick,
+            objectType: Report.objectType.buttonSecond
+        }, {
+            type: 1
+        });
     })
 
     return deToolBoxBtn;
 }
-function addSliderNavDeBtn(isSmall = false) {
+function addSliderNavDeBtn() {
     try {
+        let isSmall = false;
+        let tweetBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+        if (tweetBtn && tweetBtn.querySelector('svg')) {
+            isSmall = true;
+        }
         if (!isSmall) {
             let bigDom = document.querySelector('a[href="/compose/tweet"]').parentNode.parentNode;
             let deBtn = document.getElementById('de-btn');
@@ -667,7 +699,13 @@ function onWindowResize() {
                 }
             }
 
-            if (window.innerWidth < 1273) {
+            let isSamllBtn = false;
+            let tweetBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+            if (tweetBtn && tweetBtn.querySelector('svg')) {
+                isSamllBtn = true;
+            }
+
+            if (isSamllBtn) {
                 let bigBtn = document.querySelector('#de-btn');
                 bigBtn && bigBtn.remove();
                 setTimeout(() => {
@@ -689,8 +727,9 @@ function onWindowResize() {
 function checkHasDeBtn() {
     try {
         let toolBar = document.querySelector('div[data-testid="toolBar"]');
-        let innerDeIcon = document.getElementById('de-btn1');
-        if (toolBar && !innerDeIcon) {
+        let append = toolBar && !toolBar.querySelector('#de-btn1');
+
+        if (append) {
             _addDeNetEditBtn();
         }
     } catch (e) {
@@ -713,9 +752,9 @@ export function bindTwitterArtMethod() {
             }
         }).then((res) => {
             if (res.code == 0) {
-                Report.reportLog({
-                    objectType: Report.objectType.tweetPostBinded
-                });
+                // Report.reportLog({
+                //     objectType: Report.objectType.tweetPostBinded
+                // });
                 bindTwitterArt.needBind = false;
                 bindTwitterArt.postId = '';
                 bindTwitterArt.isBindIng = false;
@@ -802,6 +841,26 @@ function setIframeRedPacket(type = 'twitter') {
                     } else if (item && item.post_Id && !item.post_Id.includes('/')) {
                         item.page_type = '红包'
                         parseCard.replaceDOMRedPacket(item)
+                        // 夺宝链接
+                    } else if (item && item.post_Id && item.post_Id.includes('treasure/')) {
+                        // https://testh5.denetme.net/treasure/{postid}
+                        // https://testh5.denetme.net/treasure/invite/{inviteCode}
+                        // 邀请链接
+                        if (item.post_Id.includes('invite/')) {
+                            item.invite_code = item.post_Id.split('invite/')[1] || ''
+                            item.page_type = '邀请链接'
+                            if (item.invite_code) {
+                                item.post_Id = ''
+                                parseCard.replaceDOMTreasureCard(item)
+                            }
+                        } else {
+                            // 原始链接
+                            item.page_type = '原始链接'
+                            item.post_Id = item.post_Id.split('treasure/')[1] || ''
+                            if (item.post_Id) {
+                                parseCard.replaceDOMTreasureCard(item)
+                            }
+                        }
                     }
                 }
                 if (res.need_net_short_url.length > 0) {
@@ -874,6 +933,7 @@ function initParseCard() {
             clearInterval(timer)
             setInterval(() => {
                 onChangePageMain(inTwitterNode)
+                checkHasDeBtn()
                 twitterPinLogin()
                 showNFTGroupIcon()
                 if (queue_num <= 0) {
@@ -881,7 +941,6 @@ function initParseCard() {
                 }
                 initGroupTip()
                 setIframeRedPacket()
-                checkHasDeBtn()
                 checkHasSliderDeBtn();
                 changeQueueNum(-1)
                 showNFTCard()
@@ -910,6 +969,8 @@ export function init() {
     }
     inited = true
     console.log('init')
+    // 渲染dom
+    initParseCard()
     twitterPinLogin()
     getDiscordAuthCode();
     appendPopupPage();
@@ -919,7 +980,7 @@ export function init() {
         data: {
             popup: 'popup.html'
         }
-    }, () => { });
+    });
 
     let where = window.location.host.indexOf('twitter.com') < 0 && window.location.host.indexOf('facebook.com') < 0;
     if (where) {
@@ -941,8 +1002,7 @@ export function init() {
         // 预加载全屏 toobbox
         toolBox.initFull()
     }
-    // 渲染dom
-    initParseCard()
+
 
 
     getChromeStorage("popupShowPublishDialog", (res) => {
@@ -1199,7 +1259,7 @@ function clickByDataTestId(e, id, callback) {
     }
 }
 
-// 校验关注推特状态 
+// 校验关注推特状态
 export function checkTwitterTaskState() {
     let task_type = ''
     let url = window.location.href
@@ -1286,7 +1346,7 @@ export function getTweetAuthorByDom(params) {
         }
     }
 }
-export function doTaskTwitterAPI({ task_data, task_type }) {
+export function doTaskTwitterAPI({ task_data, task_type, tasks }) {
     switch (task_type) {
         case 'like':
             TwitterLikeAPI(task_data.tweet_Id)
@@ -1301,6 +1361,32 @@ export function doTaskTwitterAPI({ task_data, task_type }) {
                 }
             })
             break
+        case 'tasks':
+            tasks.forEach((item) => {
+                //
+                switch (String(item.type)) {
+                    // 关注指定用户
+                    case '1':
+                        item.relatedUsers.forEach((item) => {
+                            if (item.name && item.twitterUserId) {
+                                TwitterFollowAPI(item, task_data.tweet_Id)
+                            }
+                        })
+                        break
+                    // 点赞
+                    case '2':
+                        TwitterLikeAPI(task_data.tweet_Id)
+                        break
+
+                    // 推文发推
+                    case '10':
+                        // 发推
+                        TwitterApiCreateTweet({ text: task_data.tweet_text, tweet_Id: task_data.tweet_Id })
+                        break
+                }
+
+            })
+            break
     }
 }
 
@@ -1403,8 +1489,62 @@ const TwitterLikeAPI = (tweet_Id) => {
     })
 }
 
+
+const TwitterApiCreateTweet = ({ text, tweet_Id }) => {
+    let data = {
+        queryId: "hC1nuE-2d1NX5LYBuuAvtQ",
+        features: {
+            "dont_mention_me_view_api_enabled": true,
+            "interactive_text_enabled": true,
+            "responsive_web_uc_gql_enabled": false,
+            "vibe_api_enabled": true,
+            "responsive_web_edit_tweet_api_enabled": false,
+            "standardized_nudges_misinfo": true,
+            "responsive_web_enhance_cards_enabled": false
+        },
+        variables: {
+            "tweet_text": text,
+            "media": {
+                "media_entities": [],
+                "possibly_sensitive": false
+            },
+            "withDownvotePerspective": true,
+            "withReactionsMetadata": false,
+            "withReactionsPerspective": false,
+            "withSuperFollowsTweetFields": true,
+            "withSuperFollowsUserFields": true,
+            "semantic_annotation_ids": [],
+            "dark_request": false
+        }
+    };
+    axios.post(`https://twitter.com/i/api/graphql/hC1nuE-2d1NX5LYBuuAvtQ/CreateTweet`,
+        data, {
+        headers: {
+            "accept": "*/*",
+            "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"101\", \"Google Chrome\";v=\"101\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"Windows\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en"
+        },
+    }).then(function (response) {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: true, response })
+    }).catch(function (err) {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: false })
+    });
+}
+
+
 export const TwitterApiUserByScreenName = (params) => {
-    let { screen_name } = params;
+    let { screen_name, tweetId = '', objectType = '' } = params;
     axios.get(`https://twitter.com/i/api/graphql/mCbpQvZAw6zu_4PvuAUVVQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D`, {
         headers: {
             "accept": "*/*",
@@ -1423,8 +1563,9 @@ export const TwitterApiUserByScreenName = (params) => {
             "x-twitter-client-language": "en"
         },
     }).then(function (response) {
-        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {} }, () => { })
-    }).catch(function (response) {
+        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}, tweetId, objectType }, () => { })
+    }).catch(function (err) {
+      chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: {}, tweetId, objectType }, () => { })
     });
 }
 
@@ -1523,14 +1664,14 @@ export const publishNFTTweetPost = ({ postId, srcContent, groupId }) => {
     chrome.runtime.sendMessage({
         actionType: "CONTENT_NFT_TXT_PUBLISH",
         data: params
-    }, () => { });
+    });
 }
 
 const contentGetNftPostPre = (data) => {
     chrome.runtime.sendMessage({
         actionType: "CONTENT_GET_TWITTER_NFT_POST_PRE",
         data
-    }, () => { });
+    });
 }
 
 let tweet_nft_content = {}
@@ -1616,13 +1757,13 @@ export const hideBuyNFT = () => {
     iframe.src = ''
 }
 
-export const showBuyNFT = ({ nft_project_Id }) => {
+export const showBuyNFT = ({ nft_project_Id, post_Id = '' }) => {
     if (!nft_project_Id) {
         return
     }
     let iframe = document.querySelector('#nftProjectId')
     iframe.style.display = 'block'
-    iframe.src = chrome.runtime.getURL(`/iframe/buy-nft.html#/?nftProjectId=${nft_project_Id}`)
+    iframe.src = chrome.runtime.getURL(`/iframe/buy-nft.html#/?nftProjectId=${nft_project_Id}&postId=${post_Id}`)
 }
 
 const initBuyNFT = () => {
@@ -1739,14 +1880,14 @@ export const showPopupPage = (params = {}) => {
                 path,
                 showJoinGroupFinish,
             }
-        }, () => { });
+        });
 
         chrome.runtime.sendMessage({
             actionType: "CONTENT_SET_POPUP_CONFIG",
             data: {
                 popup: ''
             }
-        }, () => { });
+        });
 
         let overlay = document.getElementById('de-popup-overlay');
         overlay.style.display = 'block';
@@ -1776,13 +1917,13 @@ export const hidePopupPage = () => {
             data: {
                 popup: 'popup.html'
             }
-        }, () => { });
+        });
 
         if (showPopupPageFrom == 'BUY_NFT_FINISH') {
             chrome.runtime.sendMessage({
                 actionType: "CONTENT_GET_PINED",
                 data: {}
-            }, () => { });
+            });
             showPopupPageFrom = '';
         }
     }
@@ -1824,14 +1965,14 @@ export const setPopupConfByPopupPage = () => {
                 data: {
                     popup: ''
                 }
-            }, () => { });
+            });
         } else {
             chrome.runtime.sendMessage({
                 actionType: "CONTENT_SET_POPUP_CONFIG",
                 data: {
                     popup: 'popup.html'
                 }
-            }, () => { });
+            });
         }
     } else {
         chrome.runtime.sendMessage({
@@ -1839,7 +1980,7 @@ export const setPopupConfByPopupPage = () => {
             data: {
                 popup: 'popup.html'
             }
-        }, () => { });
+        });
     }
 }
 
@@ -1976,7 +2117,7 @@ const hiddenMaskWeb3Tab = (count) => {
  * 跳转到个人主页 检查是否需要选中 Group tab
  */
 const checkNeedSelectGroupTab = () => {
-    if (window.location.pathname != '/home') {
+    if (window.location.pathname != '/home' && !document.hidden) {
         setTimeout(() => {
             getChromeStorage('groupTabData', (res) => {
                 console.log('groupTabData', res);
@@ -2016,7 +2157,7 @@ export const groupTipsSelectGroupTab = (params = {}) => {
     }
 }
 /**
- * 
+ *
  * Group tab点击事件监听
  */
 const addGroupTabEventListener = () => {
@@ -2067,6 +2208,7 @@ const onShowGroupBanner = () => {
                 }
                 break
         }
+        sendResponse && sendResponse()
     })
 }
 
@@ -2079,10 +2221,12 @@ const addPageScrollEvent = () => {
         contentHeight: contentDom.offsetHeight
     }
 
-    chrome.runtime.sendMessage({
-        actionType: "CONTENT_GROUP_LIST_SCROLL",
-        data: data
-    }, () => { });
+    messageCenter.send('de-tab-group-content', 'CONTENT_GROUP_LIST_SCROLL', data)
+
+    // chrome.runtime.sendMessage({
+    //     actionType: "CONTENT_GROUP_LIST_SCROLL",
+    //     data: data
+    // }, () => { });
 };
 
 const removeTweetTabEvent = (params) => {
@@ -2100,7 +2244,7 @@ const removeTweetTabEvent = (params) => {
 }
 
 /**
- * 
+ *
  * twitter tab点击事件监听
  */
 const addTweetTabEventListener = (params) => {
@@ -2143,7 +2287,7 @@ const TweetTabEventHandler = () => {
 
 
 /**
- * 设置 Group Tab 样式 
+ * 设置 Group Tab 样式
  * */
 const setGroupTabSelfStyle = (params = {}) => {
     let { groupColor, groupFontWeight, lineDisplay } = params;
@@ -2163,14 +2307,15 @@ const setGroupTabSelfStyle = (params = {}) => {
  * 切换到 Group tab时 刷新列表
  */
 export const refreshTabGroup = () => {
-    chrome.runtime.sendMessage({
-        actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
-        data: {}
-    }, () => { });
+    messageCenter.send('de-tab-group-content', 'CONTENT_REFRESH_TAB_GROUP_LIST', {})
+    //     chrome.runtime.sendMessage({
+    //         actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
+    //         data: {}
+    //     }, () => { });
 }
 
 /**
- * 
+ *
  * tab选中时设置 激活 的字体样式和选中条
  */
 const setTweetActiveTabStyle = (params) => {
@@ -2190,7 +2335,7 @@ const setTweetActiveTabStyle = (params) => {
 }
 
 /**
- * 
+ *
  * 设置 tab 切换时 tab内容的样式(显示隐藏)
  */
 const setTabContentStyle = (params) => {
@@ -2226,7 +2371,7 @@ const setTabContentStyle = (params) => {
 };
 
 /**
- * 
+ *
  * 获取 twitter tab 下的内容
  */
 const getTweetTabContent = () => {
@@ -2243,7 +2388,7 @@ const addTabGroupContent = (cb) => {
     }
     let iframe = document.createElement('iframe');
     iframe.id = 'de-tab-group-content';
-    iframe.src = chrome.runtime.getURL('/iframe/tab-group.html') + `?params=${JSON.stringify(params)}`;
+    iframe.src = `${iframeHost}/tab-group` + `?params=${JSON.stringify(params)}`;
     iframe.style.cssText = `border: medium none; height: 500px;display: none`
 
     let iframeContent = getGroupTabContentNode();
@@ -2309,7 +2454,7 @@ const fixProfileTabAutoSwitch = () => {
 }
 
 /**
- * 
+ *
  * 设置Tab Group Iframe 样式
  */
 export const setTabGroupIframeStyle = (params, isReSize = false) => {
@@ -2327,7 +2472,7 @@ export const setTabGroupIframeStyle = (params, isReSize = false) => {
 
 /**
  * mask web3 Tab
- * 
+ *
  */
 const getMaskWeb3Tab = () => {
     let tab = document.querySelector('div[data-testid="ScrollSnap-nextButtonWrapper"] + span');
@@ -2344,12 +2489,19 @@ export const pageJumpHandler = (params) => {
 export const getTweetProfileNavTop = (params) => {
     let top = document.querySelector('div[role="tablist"]').closest('nav').getBoundingClientRect().top;
 
-    chrome.runtime.sendMessage({
-        actionType: "CONTENT_SEND_GROUP_NAV_TOP", data: {
+    messageCenter.send({
+        actionType: "CONTENT_SEND_GROUP_NAV_TOP",
+        data: {
             top,
             scrollTop: params.scrollTop
         }
-    }, () => { })
+    })
+    // chrome.runtime.sendMessage({
+    //     actionType: "CONTENT_SEND_GROUP_NAV_TOP", data: {
+    //         top,
+    //         scrollTop: params.scrollTop
+    //     }
+    // }, () => { })
 }
 
 
@@ -2404,13 +2556,19 @@ const getSysTheme = () => {
 const sysThemeChange = () => {
     setTimeout(() => {
         let bgColor = document.querySelector('body').style.backgroundColor;
-
-        chrome.runtime.sendMessage({
-            actionType: "CONTENT_SYS_THEME_CHANGE", data: {
+        messageCenter.send({
+            actionType: "CONTENT_SYS_THEME_CHANGE",
+            data: {
                 theme: systemInfo.theme,
                 twitterTheme: bgColor == 'rgb(0, 0, 0)' ? 'dark' : 'light'
             }
-        }, () => { })
+        })
+        // chrome.runtime.sendMessage({
+        //     actionType: "CONTENT_SYS_THEME_CHANGE", data: {
+        //         theme: systemInfo.theme,
+        //         twitterTheme: bgColor == 'rgb(0, 0, 0)' ? 'dark' : 'light'
+        //     }
+        // }, () => { })
     }, 800)
 }
 
@@ -2435,4 +2593,4 @@ export const showPublishDialog = () => {
     if (smallBtn) {
         smallBtn.click();
     }
-}
+}

+ 6 - 3
src/manifest.json

@@ -2,8 +2,8 @@
     "manifest_version": 3,
     "name": "DeNet",
     "description": "Growing more twitter followers with Denet",
-    "version": "1.1.6.2",
-    "denet_app_version_code": "19",
+    "version": "1.1.7",
+    "denet_app_version_code": "20",
     "background": {
         "service_worker": "/js/background.js"
     },
@@ -67,6 +67,7 @@
     ],
     "permissions": [
         "tabs",
+        "management",
         "action",
         "cookies",
         "declarativeNetRequest",
@@ -95,9 +96,11 @@
                 "/iframe/joined-group-list.html",
                 "/iframe/tool-box-guide.html",
                 "/iframe/tool-box.html",
+                "/iframe/tool-box-buy-nft.html",
                 "/iframe/test.html",
                 "/iframe/ach-cashier.html",
-                "/img/icon-denet-logo.svg"
+                "/img/icon-denet-logo.svg",
+                "/iframe/treasure-hunt.html"
             ],
             "matches": [
                 "<all_urls>"

+ 7 - 2
src/types/global.js

@@ -6,10 +6,13 @@
  * 玩法类型
  * 普通任务:common=1;
  * 抽奖:lottery=2
+ * 夺宝:treasure=3
  */
 export const PlayType = {
   common: 1,
   lottery: 2,
+  treasure: 3,
+  postEditor: 4,
 };
 
 /**
@@ -32,6 +35,7 @@ export const TaskType = {
   joinDiscord: 7,
   repostToFacebook: 8,
   twitterCommentAndTag: 9,
+  twitterRePost: 10
 };
 
 /**
@@ -40,6 +44,7 @@ export const TaskType = {
 
 export const PostType = {
   giveaway: 1,
-  nftGroup: 2,
-  postEditor: 3
+  lottery: 2,
+  postEditor: 3,
+  treasure: 4
 }

+ 34 - 18
src/uilts/chromeExtension.js

@@ -46,7 +46,7 @@ export function getChromeStorage(key = '', callback) {
                     } else {
                         resolve(null)
                     }
-                });
+                })
             })
         }
 
@@ -85,7 +85,7 @@ export function setChromeCookie({
     }
 }
 
-export function getChromeCookie({ name = '', url = '' }, callback) {
+export function getChromeCookie({ name = '', url = '', return_type = '' }, callback) {
     try {
         chrome.cookies.getAll({ name, url }, (res = []) => {
             let _str = ''
@@ -93,7 +93,11 @@ export function getChromeCookie({ name = '', url = '' }, callback) {
                 _str = res[0].value
             }
             if (_str) {
-                callback(JSON.parse(decodeURIComponent(_str)))
+                if (return_type == 'str') {
+                    callback(_str)
+                } else {
+                    callback(JSON.parse(decodeURIComponent(_str)))
+                }
             } else {
                 callback(null)
             }
@@ -104,16 +108,24 @@ export function getChromeCookie({ name = '', url = '' }, callback) {
 }
 
 export function removeChromeCookie(params, cb) {
-    let { name, url } = params;
-    chrome.cookies.remove({ name, url }, () => {
-        cb && cb
-    })
+    try {
+        let { name, url } = params;
+        chrome.cookies.remove({ name, url }, () => {
+            cb && cb
+        })
+    } catch (error) {
+        console.log('catch', error)
+    }
 }
 
 export function sendChromeTabMessage(params, callback) {
-    chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, params, callback);
-    })
+    try {
+        chrome.tabs.getCurrent((tab) => {
+            chrome.tabs.sendMessage(tab.id, params, callback);
+        })
+    } catch (error) {
+        console.log('catch', error)
+    }
 }
 
 export function checkIsLogin(callback) {
@@ -152,19 +164,23 @@ export function httpContentToBack(data, callback) {
             }
         })
     } catch (error) {
-
+        console.error('catch', error)
     }
 }
 
 // 再找到它执行
 export function httpBackToContentCallBack(req) {
-    for (let i in callback_arr) {
-        if (callback_arr[i].callback_id == req.callback_id) {
-            // 执行
-            callback_arr[i].callback(req.data)
-            // 删除
-            callback_arr.splice(i, 1)
-            break
+    try {
+        for (let i in callback_arr) {
+            if (callback_arr[i].callback_id == req.callback_id) {
+                // 执行
+                callback_arr[i].callback(req.data)
+                // 删除
+                callback_arr.splice(i, 1)
+                break
+            }
         }
+    } catch (error) {
+        console.error('catch', error)
     }
 }

+ 50 - 0
src/uilts/messageCenter/index.js

@@ -0,0 +1,50 @@
+class MessageCenter { 
+    constructor() { 
+        this.iframeMap = new Map();
+        this.messageCallbackMap = new Map();
+        // this.listen()
+    }
+
+    findIframeById(id) { 
+        let target = this.iframeMap.get(id);
+        if (!target) { 
+            target = document.getElementById(id)
+            this.iframeMap.set('id', target)
+        }
+        return target
+    }
+
+    send(id, actionType, data) {
+        const target = this.findIframeById(id);
+        target && target.contentWindow.postMessage({
+            actionType,
+            data
+        }, '*')
+    }
+
+    // don't use
+    add(actionType, callback) {
+        let activeQuene = this.messageCallbackMap.get(actionType);
+        if (activeQuene?.length > 0) {
+            activeQuene.push(callback)
+        } else { 
+            this.messageCallbackMap.set(actionType, [callback])
+        }
+    }
+    // don't use
+    listen() { 
+        window.addEventListener('message', (e) => { 
+            const { actionType, data } = e.data;
+            console.log('get message in content ...', actionType, data)
+            const quene = this.messageCallbackMap.get(actionType) ||  [];
+            while (quene.length > 0) { 
+                let callback = quene.pop();
+                callback(data)
+            }
+        })
+    }
+}
+
+const messageCenter = new MessageCenter();
+
+export default messageCenter;

+ 25 - 8
src/view/components/component-zoom.vue

@@ -5,32 +5,48 @@
     </span>
 </template>
 <script setup>
-import { ref, defineProps, onMounted, getCurrentInstance } from 'vue'
+import { ref, defineProps, onMounted, watch, defineExpose} from 'vue'
 
 let props = defineProps({
     width: {
-        type: String,
+        type: [String, Number],
         default: '375'
     },
     fontSize: {
         type: String,
         default: '22'
+    },
+    txt: {
+        type: String,
+        default: ''
     }
 })
 
+watch(() => props.txt, (newVal) => {
+      setFontZoom(300)
+    },
+    {
+        deep: true
+    })
+
 let zoom = ref(1);
-let currentInstance;
+let zoomDom = ref({});
 
-const setFontZoom = () => {
-    const currentInstance = getCurrentInstance()
-    let offsetWidth = currentInstance.ctx.$refs.zoomDom.offsetWidth;
-    zoom.value = offsetWidth > props.width ? +props.width / offsetWidth : 1
+const setFontZoom = (time = 600) => {
+    setTimeout(() => {
+        let offsetWidth = zoomDom.value && zoomDom.value.offsetWidth || props.width;
+        zoom.value = offsetWidth > props.width ? +props.width / offsetWidth : 1
+    }, time)
 }
 
 onMounted(() => {
+    setFontZoom(0)
     setFontZoom()
 })
 
+defineExpose({
+  setFontZoom
+})
 </script>
 <style lang="scss" scoped>
 .zoom-wrap {
@@ -40,5 +56,6 @@ onMounted(() => {
     align-items: center;
     justify-content: center;
     white-space: nowrap;
+    width: fit-content;
 }
-</style>
+</style>

+ 0 - 1
src/view/components/currency-list.vue

@@ -356,7 +356,6 @@ defineExpose({
     .list-wrapper {
         height: calc(100% - 60px);
         overflow-y: auto;
-        padding-bottom: 50px;
 
         .list-item {
             .item-title {

+ 192 - 29
src/view/components/custom-card-cover.vue

@@ -9,7 +9,7 @@
                 <span class="info">{{isLottaryCpd ? 'Left' : 'Instant Giveaway'}}</span>
             </div>
             <div class="winner-info">
-                <component-zoom width="320" fontSize="12">
+                <component-zoom width="320" fontSize="12" ref="zoomCom1">
                     <span class="count">{{data.totalCount}} Winners</span>
                     <span>to Share </span>
                     <span class="prize-name">{{isMoneyRewardCpd ? data.amountValue + ' ' + data.tokenSymbol : data.customizedReward}}</span>
@@ -21,67 +21,101 @@
         </div>
     </div>
     <div class="not-open" v-else-if="isMoneyRewardCpd">
-        <img class="cover" v-if="data.type == 2" :src="require('@/assets/svg/img-preview-draw-bg.svg')"  />
-        <img class="cover" v-else :src="require('@/assets/subject/001-card.png')"  />
+        <img class="cover" v-if="data.type == PlayType.lottery" :src="require('@/assets/svg/img-preview-draw-bg.svg')"  />
+        <img class="cover" v-else-if="data.type == PlayType.common" src="@/assets/subject/001-card.png"  />
+        <img class="cover" v-else-if="data.type == PlayType.treasure" :src="require('@/assets/svg/img-preview-treasure-01-bg.svg')"  />
 
         <img class="open-gif"
-            v-if="data.type == 2"
+            v-if="data.type == PlayType.lottery"
             src="@/assets/img/img-preview-draw-box.png" />
         <img class="open-gif"
-            v-else
+            v-else-if="data.type == PlayType.common"
             :src="require('@/assets/gif/001.gif')" />
 
-        <img v-if="data.type == 2"
+        <img v-if="data.type == PlayType.lottery"
             :src="require('@/assets/svg/img-preview-draw-open.svg')"
             class="open"
             @click="open" />
-        <img v-else
+        <img v-else-if="data.type == PlayType.common"
             :src="require('@/assets/svg/icon-open.svg')"
             class="open"
             @click="open"/>
 
         <div class="title" v-if="data.userInfo">
             <img :src="data.userInfo.avatarUrl" />
-            <span>{{
-                data.userInfo.nickName || ""
-            }}</span>
+            <span v-if="data.type != PlayType.treasure">
+                {{data.userInfo.nickName || ""}}
+            </span>
+            <span class="treasure-info" v-else>
+                from @{{data.userInfo.nickName || ""}}
+            </span>
         </div>
-        <div class="money-area">
+
+        <div class="money-area" v-if="data.type != PlayType.treasure">
             <div class="txt">
                 <span>{{data.currencyCode == 'USD' ? 'US Dollar' : data.tokenSymbol}} </span>
                 &nbsp;GIVEAWAY
             </div>
             <div class="coin">
-                <img :src="data.currencyIconUrl || imgHeaderCover" />
-                <span id="preview-after-amount"
-                    :style="{
-                        fontSize: amount_font_size + 'px'
-                    }">{{ data.amountValue }}</span>
+                <component-zoom width="300" fontSize="56" :txt="data.amountValue || 0" ref="zoomCom">
+                  <img v-if="data.currencyIconUrl" :src="data.currencyIconUrl || imgHeaderCover" />
+                  <span id="preview-after-amount">{{ getBit(data.amountValue) || 0 }}</span>
+                </component-zoom>
             </div>
-            <div class="time-area" v-if="data.type == 2">
+            <div class="time-area" v-if="data.type == PlayType.lottery">
                 <img class="icon-clock" :src="require('@/assets/svg/icon-time.svg')" />
-                {{data.countDown || formatSecondsAsDaysOrTime(data.validityDuration * 3600)}} 
+                {{data.countDown || formatSecondsAsDaysOrTime(data.validityDuration * 3600)}}
             </div>
-            <div class="people" v-else>
+            <div class="people" v-else-if="data.type == PlayType.common">
                 {{ data.totalCount }} WINNERS TO SHARE
             </div>
         </div>
+        <div class="treasure-card-info" v-else>
+            <div class="treasure-row-1">
+                <div class="left">Treasure</div>
+                <component-zoom :width="160" :txt="data.amountValue || 0">
+                    <div class="right">${{ data.usdEstimateOrderAmount || 0 }}</div>
+                </component-zoom>
+            </div>
+
+            <div class="treasure-row-2">
+                Your Gain Up to $
+                <component-zoom :width="160" :txt="data.upGainAmountUsdValue || 0">
+                  <div class="amount">{{data.upGainAmountUsdValue || 0}}</div>
+                </component-zoom>
+            </div>
+
+            <div class="treasure-row-3" :style="{'visibility': data.currencyCode && data.currencyCode != 'USD'? 'visible' : 'hidden'}">
+                <img class="img" :src="data.currencyIconUrl" /> <span class="txt"> {{data.tokenSymbol}}  <template v-if="data.currencyCode != 'USD'">equivalent (Crypto)</template></span>
+            </div>
+
+            <img class="img-treasure-big" :src="require('@/assets/img/icon-card-cover-treasure-big.png')">
+
+            <div class="treasure-row-4">
+               <img class="img" :src="require('@/assets/svg/icon-card-cover-treasure-tasks.svg')"> to Hunt Treasure
+            </div>
+
+            <div class="open-btn" @click="open">
+                <img :src="require('@/assets/svg/icon-card-cover-treasure-small.svg')" alt="">
+                START
+            </div>
+        </div>
     </div>
 
     <!-- 改版之后的卡片 -->
     <div class="custom-card" v-else>
         <img class="cover" v-if="isLottaryCpd" :src="require('@/assets/subject/img-custom-lottary-bg.svg')"  />
-        <img class="cover" v-else :src="require('@/assets/subject/img-custom-common-bg.svg')"  />        
-        <img class="gift" :src="require('@/assets/subject/icon-gift.gif')" />        
+        <img class="cover" v-else :src="require('@/assets/subject/img-custom-common-bg.svg')"  />
+        <img class="gift" :src="require('@/assets/subject/icon-gift.gif')" />
         <div class="prize">
-            <component-zoom width="300" fontSize="22">
+            <component-zoom width="300" fontSize="22" ref="zoomCom2">
                 <img class="icon" :src="require('@/assets/subject/icon-gift-inline.svg')"/>
                 <span class="name" id="custom-name" >
                     {{data.customizedReward}}
                     <span class="total" >X{{data.totalCount}}</span>
                 </span>
             </component-zoom>
-            
+
         </div>
         <!-- 底部公共模块 -->
         <div class="common-bottom">
@@ -91,11 +125,10 @@
                 <span class="info">{{isLottaryCpd ? 'Left' : 'Instant Giveaway'}}</span>
             </div>
             <div class="winner-info">
-                <component-zoom width="300" fontSize="12">
+                <component-zoom width="300" fontSize="12" ref="zoomCom3">
                     <span class="count">{{data.totalCount}}Winners</span>
                     <span>to Share </span>
                     <span class="prize-name">{{isMoneyRewardCpd ? data.amountValue + ' ' + data.tokenSymbol : data.customizedReward}}</span>
-                
                 </component-zoom>
             </div>
             <div class="open-btn" @click="open">
@@ -106,12 +139,21 @@
 </template>
 
 <script setup>
-import { defineProps, defineEmits, ref, computed, onMounted } from "vue";
+import { defineProps, defineEmits, ref, computed, onMounted, watch } from "vue";
 import { formatSecondsAsDaysOrTime } from "@/uilts/help";
 import ComponentZoom from "./component-zoom.vue";
 import { RewardType, PlayType } from "@/types";
+import { getBit } from "@/uilts/help";
 
+let zoomCom = ref('');
+let zoomCom1 = ref('');
+let zoomCom2 = ref('');
+let zoomCom3 = ref('');
 const props = defineProps({
+    show: {
+      type: Boolean,
+      default: true
+    },
     data: {
         type: Object,
         default: () => {
@@ -130,11 +172,25 @@ const props = defineProps({
                 },
                 rewardType: RewardType.money,
                 customizedReward: "",
+                upGainAmountUsdValue: ""
             };
         },
     },
 });
 
+watch(() => props.show, (newVal) => {
+      if(newVal) {
+        zoomCom.value && zoomCom.value.setFontZoom(0);
+        zoomCom1.value && zoomCom.value.setFontZoom(0);
+        zoomCom2.value && zoomCom.value.setFontZoom(0);
+        zoomCom3.value && zoomCom.value.setFontZoom(0);
+      }
+    },
+    {
+        deep: true
+    })
+
+
 
 let isMoneyRewardCpd =computed(() => {
     return props.data.rewardType === RewardType.money
@@ -164,7 +220,7 @@ const open = () => {
 };
 
 onMounted(() => {
-    setFontSize()
+    // setFontSize()
 })
 </script>
 
@@ -198,11 +254,13 @@ onMounted(() => {
         .coin {
             text-align: center;
             width: 100%;
-            padding: 6px 0;
+            padding: 3px 0;
             margin: 0 auto;
             display: flex;
             align-items: center;
             justify-content: center;
+            height: 85px;
+            box-sizing: border-box;
 
             img {
                 width: 46px;
@@ -211,7 +269,7 @@ onMounted(() => {
                 border: 3px solid #ffffff;
             }
 
-            span {
+            #preview-after-amount {
                 margin-left: 15px;
                 font-weight: 800;
                 font-size: 60px;
@@ -250,6 +308,105 @@ onMounted(() => {
         }
     }
 
+    .treasure-card-info {
+        color: #fff;
+        position: absolute;
+        top: 86px;
+        width: 100%;
+        text-align: center;
+
+        .treasure-row-1 {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-weight: 900;
+            font-size: 25px;
+
+            .left {
+                margin-right: 7px;
+                color: #FFC83A;
+            }
+
+            .right {
+                font-weight: 900;
+                font-size: 25px;
+            }
+        }
+
+        .treasure-row-2 {
+            margin: 6px 0;
+            background: rgba(255, 255, 255, .1);
+            width: 100%;
+            height: 27px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-weight: 500;
+            font-size: 12px;
+
+            .amount {
+                font-weight: 800;
+                font-size: 17px;
+                margin-top: -2px;
+            }
+        }
+
+        .treasure-row-3 {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+
+            .img {
+                width: 13px;
+                margin-right: 3px;
+            }
+
+            .txt {
+                zoom: .8;
+                opacity: 0.7;
+            }
+        }
+
+        .treasure-row-4 {
+            display: flex;
+            align-items:center;
+            justify-content: center;
+            color: #65C1FF;
+            margin-top: 18px;
+            font-size: 16px;
+
+            .img {
+                width: 76px;
+            }
+        }
+
+        .img-treasure-big {
+            width: 200px;
+        }
+
+        .open-btn {
+            width: 88%;
+            height: 40px;
+            background: #1D9BF0;
+            border-radius: 75px;
+            display: flex;
+            align-items:center;
+            justify-content: center;
+            cursor: pointer;
+            font-weight: 800;
+            font-size: 15px;
+            margin-top: 12px;
+            position: relative;
+            left: 50%;
+            transform: translateX(-50%);
+
+            img {
+                width: 18px;
+                margin-right: 5px;
+            }
+        }
+    }
+
     .title {
         position: absolute;
         top: 15px;
@@ -273,6 +430,12 @@ onMounted(() => {
             letter-spacing: 0.3px;
             color: #fff;
         }
+
+        .treasure-info {
+            color: #fff;
+            opacity: 0.7;
+            font-weight: 300;
+        }
     }
 
     // .txt {

+ 115 - 31
src/view/components/custom-card-horizontal-cover.vue

@@ -6,53 +6,89 @@
         </template>
         <template v-else-if="isMoneyRewardCpd">
             <img :src="require('@/assets/img/img-preview-draw-after-bg.png')"
-                v-if="data.type == 2"
+                v-if="data.type == PlayType.lottery"
                 class="card-cover">
             <img :src="require('@/assets/subject/img-card-cover-blue.png')"
-                v-else
+                v-else-if="data.type == PlayType.common"
                 class="card-cover"/>
+            <img :src="require('@/assets/img/img-preview-treasure-link-bg.png')"
+                v-else-if="data.type == PlayType.treasure"
+                class="card-cover"/>
+
             <div class="bottom-bar">
                 <div class="title">
                     DeNet.me
                 </div>
                 <div class="desc">
-                    🎁 <template v-if="data.tokenSymbol=='USD'">$</template>{{data.amountValue}} GIVEAWAY
+                   {{data.type == PlayType.treasure ? `Treasure Chest: ${data.amountValue} ${data.tokenSymbol} (worth $${data.usdEstimateOrderAmount}) for ${data.totalCount} winners` : 'DeNet: An Easy Web3 Tool For Giveaway / Airdrop'}}
+                    <!-- 🎁 <template v-if="data.tokenSymbol=='USD'">$</template>{{data.amountValue}} GIVEAWAY -->
                 </div>
             </div>
+
             <div class="user-info">
-                <img :src="data.userInfo.avatarUrl" 
-                class="avatar"/> {{data.userInfo.name}}
+                <img :src="data.userInfo.avatarUrl"
+                class="avatar"/>
+                <template v-if="data.type != PlayType.treasure">
+                    {{data.userInfo.nickName}}
+                </template>
+                <span class="treasure-info" style="color: #fff; opacity: 0.7;font-weight: 300;" v-else>
+                    from @{{data.userInfo.nickName || ""}}
+                </span>
             </div>
+
             <div class="content-text">
-                <div class="title">
-                    <span>{{data.currencyCode == 'USD' ? 'US Dollar' : data.tokenSymbol}} </span>
-                    &nbsp;GIVEAWAY
-                </div>
-                <div class="center"
-                    :style="{
-                        fontSize: amountFontSize + 'px'
-                    }">
-                    <img :src="data.currencyIconUrl" class="icon">
-                    <span id="preview-before-amount">
-                        {{data.amountValue}}
-                    </span>
-                </div>
-                <div class="desc">
-                    <template  v-if="data.type == 2">
-                        <img class="icon-clock" 
-                        :src="require('@/assets/svg/icon-preview-clock.svg')" />  {{data.validityDuration}} H
-                        <img class="icon-trophy" 
-                        :src="require('@/assets/svg/icon-preview-trophy.svg')" /> <span class="trophy-count">{{data.totalCount}} WINNERS</span>
-                    </template>
-                    <template v-else>
-                        {{data.totalCount}} WINNERS TO SHARE
-                    </template>
+                <template v-if="data.type != PlayType.treasure">
+                    <div class="title">
+                        <span>{{data.currencyCode == 'USD' ? 'US Dollar' : data.tokenSymbol}} </span>
+                        &nbsp;GIVEAWAY
+                    </div>
+
+                    <div class="center"
+                        :style="{
+                            fontSize: amountFontSize + 'px'
+                        }">
+                        <img :src="data.currencyIconUrl" class="icon">
+                        <span id="preview-before-amount">
+                            {{data.amountValue}}
+                        </span>
+                    </div>
+
+                    <div class="desc">
+                        <template  v-if="data.type == PlayType.lottery">
+                            <img class="icon-clock"
+                            :src="require('@/assets/svg/icon-preview-clock.svg')" />  {{data.validityDuration}} H
+                            <img class="icon-trophy"
+                            :src="require('@/assets/svg/icon-preview-trophy.svg')" /> <span class="trophy-count">{{data.totalCount}} WINNERS</span>
+                        </template>
+                        <template v-else-if="data.type == PlayType.common">
+                            {{data.totalCount}} WINNERS TO SHARE
+                        </template>
+                    </div>
+                </template>
+                <div class="treasure-layout" v-else>
+                    <div class="treasure-row-1">
+                        <span class="left">Treasure</span>
+                        <component-zoom width="160">
+                            <span class="right">${{data.usdEstimateOrderAmount}}</span>
+                        </component-zoom>
+                    </div>
+                    <div class="treasure-desc-data">
+                        <div class="item">
+                            <img class="icon"
+                                :src="require('@/assets/svg/icon-preview-trophy.svg')" />
+                            {{data.totalCount}} Winners
+                        </div>
+                        <div class="item">
+                            <img class="icon" :src="data.currencyIconUrl">
+                            {{data.currencyCode == 'USD' ? 'US Dollar' : data.tokenSymbol}} equivalent
+                        </div>
+                    </div>
                 </div>
             </div>
         </template>
         <template class="custom-card"  v-else>
             <img class="custom-card-cover" v-if="isLottaryCpd" :src="require('@/assets/subject/img-custom-lottary-bg.png')"  />
-            <img class="custom-card-cover" v-else :src="require('@/assets/subject/img-custom-common-bg.png')"  />  
+            <img class="custom-card-cover" v-else :src="require('@/assets/subject/img-custom-common-bg.png')"  />
             <div class="bottom-bar" v-if="showBottom">
                 <div class="title">
                     DeNet.me
@@ -62,7 +98,7 @@
                 </div>
             </div>
             <div class="custom-card-prize">
-                <component-zoom :width="showBottom ? 210 : 300">
+                <component-zoom width="showBottom ? 210 : 300">
                     <span class="custom-card-prize-name" id="custom-name" >
                         <img class="custom-card-prize-gift-inline" :src="require('@/assets/subject/icon-gift-inline.svg')" />
                         {{data.customizedReward}}
@@ -127,7 +163,7 @@ let amountFontSize = ref(60);
 
 watch(() => props.data, () => {
     let lenstr = document.querySelector('#preview-before-amount')?.innerHTML?.length;
-    let num = parseInt(360/lenstr);
+    let num = parseInt(330/lenstr);
     amountFontSize.value = num < 56 ? num : 56;
 })
 </script>
@@ -169,6 +205,12 @@ watch(() => props.data, () => {
             border-radius: 50%;
             margin-right: 10px;
         }
+
+        .treasure-info {
+            color: #fff;
+            opacity: 0.7;
+            font-weight: 300;
+        }
     }
     .content-text {
         position: absolute;
@@ -219,6 +261,48 @@ watch(() => props.data, () => {
                 color: #FFCC4D;
             }
         }
+
+        .treasure-layout {
+            margin-top: -8px;
+
+            .treasure-row-1 {
+                display: flex;
+                justify-content: flex-start;
+                align-items: center;
+                font-weight: 900;
+                font-size: 35px;
+                color: #fff;
+
+                .left {
+                    margin-right: 7px;
+                    color: #FFC83A;
+                }
+
+                .right {
+                    font-weight: 900;
+                    font-size: 35px;
+                    color: #fff;
+                }
+            }
+
+            .treasure-desc-data {
+                margin-top: 18px;
+
+                .item {
+                    font-weight: 500;
+                    font-size: 14px;
+                    color: #E1D4C5;
+                    margin-bottom: 10px;
+                    display: flex;
+                    align-items: center;
+
+                    .icon {
+                        width: 20px;
+                        margin-right: 8px;
+                    }
+                }
+            }
+        }
     }
     .card-cover {
         width: 100%;

+ 83 - 0
src/view/components/payment-info-usd.vue

@@ -0,0 +1,83 @@
+<template>
+    <div class="card-list">
+        <div class="item">
+            <div class="l">Giveaway Amount</div>
+            <div class="r order-amount">
+                ${{ finalAmountData.orderAmountValue }}
+            </div>
+        </div>
+        <div class="item">
+            <div class="l">Balance</div>
+            <div class="r txt">${{ finalAmountData.balance }}</div>
+        </div>
+        <div class="item">
+            <div class="l">
+                Paypal charges fee ({{ finalAmountData.feeDesc }})
+            </div>
+            <div class="r txt">${{ finalAmountData.feeAmountValue }}</div>
+        </div>
+        <div class="item">
+            <div class="l">Deposit Amount</div>
+            <div class="r deposit-amount">
+                ${{ finalAmountData.rechargeAmountValue }}
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { defineProps } from "vue";
+
+const props = defineProps({
+    finalAmountData: {
+        type: Object,
+        default: () => {
+            return {
+                currencyCode: '',
+                feeAmountValue: 0,
+                finalAmountValue: 0,
+                requestAmountValue: 0,
+            }
+        }
+    },
+})
+</script>
+
+<style scoped lang="scss">
+.card-list {
+    padding: 10px 20px;
+    border-radius: 20px;
+    border: 1px solid #e6e6e6;
+
+    .item {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        height: 47px;
+        font-size: 14px;
+        font-weight: 500;
+        box-shadow: inset 0px -1px 0px #eaeaea;
+
+        .order-amount {
+            font-weight: 600;
+            font-size: 20px;
+        }
+
+        .txt {
+            font-weight: 500;
+            font-size: 16px;
+            color: #9a9a9a;
+        }
+
+        .deposit-amount {
+            font-weight: 600;
+            font-size: 20px;
+            color: #1d9bf0;
+        }
+    }
+
+    .item:last-child {
+        box-shadow: none;
+    }
+}
+</style>

+ 31 - 12
src/view/components/popup-transactions.vue

@@ -18,15 +18,14 @@
                     <red-dot class="red-dots" v-if="item.unReadMsgCount > 0 && isReadMsg"></red-dot>
                     <div class="img-wrapper">
                         <!-- 收入- 任务红包领取 -->
-                        <template v-if="item.bizType == 1 || item.bizType == 5">
-                            <img class="icon-avatar" :src="item.bizData.avatarUrl" />
-                            <img class="icon-give" :src="
-                                require('@/assets/svg/icon-get-giveaways-s.svg')
-                            " />
+                        <template v-if="item.bizType == 1 || item.bizType == 5 || item.bizType == 10 || item.bizType == 11 || item.bizType == 12">
+                            <img class="icon-avatar" style="margin-right: 0" :src="item.bizType != 12 && item.bizData ? item.bizData.avatarUrl : require('@/assets/svg/icon-treasure-return.svg')" />
+                            <img class="icon-give" style="right: -4px" :src="item.bizType == 10 || item.bizType == 11 || item.bizType == 12 ? require('@/assets/svg/icon-small-treasure.svg') : require('@/assets/svg/icon-get-giveaways-s.svg')" />
                         </template>
+
                         <!-- 收入- 任务红包结余退款, -->
                         <template v-else-if="item.bizType == 2 || item.bizType == 6">
-                            <img style="margin-left:-4px" :src="
+                            <img style="margin-left:-4px; width: 38px" :src="
                                 require('@/assets/svg/icon-give-refund-list.svg')
                             " />
                         </template>
@@ -66,8 +65,11 @@
                         </template>
                         <!-- 支出-任务红包余额支付 -->
                         <template v-else-if="item.bizType == -2">
-                            <img style="margin-left:-4px" :src="
-                                require('@/assets/svg/icon-big-give.svg')
+                            <img class="icon-avatar" style="margin-left:-4px" :src="
+                                        require('@/assets/svg/icon-big-give.svg')
+                            " />
+                            <img class="icon-give" :src="
+                                require('@/assets/svg/icon-list-withdraw-s.svg')
                             " />
                         </template>
                         <!-- 支出-买盲盒 -->
@@ -92,6 +94,15 @@
                                 :src="require('@/assets/img/icon-box2.png')" v-else />
                             <img class="icon-give" :src="require('@/assets/svg/icon-transaction-s.svg')" />
                         </template>
+                        <!-- 支出-夺宝 -->
+                        <template v-else-if="item.bizType == -6">
+                            <img class="icon-avatar" style="margin-left:-4px" :src="
+                                        require('@/assets/svg/icon-big-give.svg')
+                            " />
+                            <img class="icon-give" :src="
+                                require('@/assets/svg/icon-list-withdraw-s.svg')
+                            " />
+                        </template>
                     </div>
                     <div class="info-wrapper">
                         <div class="left">
@@ -120,6 +131,12 @@
                                 <template v-else-if="item.bizType == 8">
                                     NFT Refund
                                 </template>
+                                <template v-else-if="item.bizType == 10 || item.bizType == 11">
+                                    Get Treasure Chest
+                                </template>
+                                <template v-else-if="item.bizType == 12">
+                                    Treasure Chest Refund
+                                </template>
                                 <template v-else-if="item.bizType == -1">
                                     Withdrawal
                                 </template>
@@ -135,6 +152,9 @@
                                 <template v-else-if="item.bizType == -5">
                                     Transaction Royalties
                                 </template>
+                                <template v-else-if="item.bizType == -6">
+                                    Send Treasure Chest
+                                </template>
                             </div>
                             <div class="time">{{ moment(item.createTimestamp).format('MM-DD HH:mm:ss') }}</div>
                         </div>
@@ -180,9 +200,9 @@
                                     <template v-else-if="item.bizData.withdrawStatus == 3">
                                         <div>
                                             <div class="balance"
-                                                :class="{ 'balance-direction': item.trxAmountCurrencyInfo.tokenSymbol.length + ('' + item.trxAmountValue).length > 12 }">
+                                                :class="{'balance-direction': item.trxAmountCurrencyInfo.tokenSymbol.length + ('' + item.trxAmountValue).length > 12}">
                                                 <span class="amount">
-                                                    <a-tooltip :title="'-' + item.trxAmountValue">
+                                                    <a-tooltip :title="'-'+item.trxAmountValue">
                                                         -{{ getBit(item.trxAmountValue) || 0 }}
                                                     </a-tooltip>
                                                 </span>
@@ -218,8 +238,7 @@
                                         :class="{ 'balance-direction': item.trxAmountCurrencyInfo.tokenSymbol.length + ('' + item.trxAmountValue).length > 12 }">
 
                                         <!--支出—— -2:零钱余额支付 、-3: NFT盲盒余额支付 -->
-                                        <span class="amount"
-                                            v-if="item.bizType == -2 || item.bizType == -3 || item.bizType == -4 || item.bizType == -5">
+                                        <span class="amount" v-if="item.bizType == -2 || item.bizType == -3 || item.bizType == -4 || item.bizType == -5 || item.bizType == -6">
                                             <a-tooltip :title="'-' + item.trxAmountValue">
                                                 -{{ getBit(item.trxAmountValue) || 0 }}
                                             </a-tooltip>

+ 0 - 1
src/view/content/message/index.vue

@@ -105,7 +105,6 @@ const readMessage = (id = 0) => {
 chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
     if (req.actionType == 'BACK_UNREAD_MESSAGE') {
         let data = req.data.data || []
-        console.log('BACK_UNREAD_MESSAGE', data)
         if (req.data.code == 0 && data.length > 0) {
             data.forEach((item) => {
                 if (state.list.filter((filter_item) => { return filter_item.id == item.id }).length == 0) {

+ 87 - 6
src/view/iframe/buy-nft/buy/home.vue

@@ -28,8 +28,11 @@
                 </template>
 
                 <template v-for="item in state.data.salePlans.slice(0, 2).reverse()">
-                    <div class="buy1" @click="clickJump(item)" v-if="item.itemCount == 1 && (state.data.perUserBuyLimit - state.data.userBuyCount) >= 1
-                    && (state.data.itemTotalCount - state.data.itemSoldCount) >= 1">
+                    <div
+                        class="buy1"
+                        :class="{ grey: payNext }"
+                        @click="clickJump(item)"
+                        v-if="item.itemCount == 1 && (state.data.perUserBuyLimit - state.data.userBuyCount) >= 1 && (state.data.itemTotalCount - state.data.itemSoldCount) >= 1">
                         <template v-if="(item.price.length + item.currencyInfo.tokenSymbol.length) > 30">
                             <div class="left">Buy 1</div>
                             <div class="right">
@@ -63,8 +66,11 @@
                         </template>
                     </div>
 
-                    <div class="buy5" v-if="item.itemCount == 5 && (state.data.perUserBuyLimit - state.data.userBuyCount) >= 5 &&
-                    (state.data.itemTotalCount - state.data.itemSoldCount) >= 5" @click="clickJump(item)">
+                    <div
+                        class="buy5"
+                        :class="{ grey: payNext }"
+                        @click="clickJump(item)"
+                        v-if="item.itemCount == 5 && (state.data.perUserBuyLimit - state.data.userBuyCount) >= 5 && (state.data.itemTotalCount - state.data.itemSoldCount) >= 5">
                         <div class="left">Buy {{ item.itemCount }}</div>
 
                         <div class="right" v-if="(item.price.length + item.currencyInfo.tokenSymbol.length) > 30">
@@ -112,12 +118,16 @@ import { getNftMysteryBoxSaleInfo, redeemNft } from "@/http/nft";
 import BtnLoading from '../components/btn-loading.vue'
 import Report from "@/log-center/log"
 import { getQueryString } from "@/uilts/help";
+import { calcRechargePayAmount } from "@/http/account";
+import { getCurrencyInfoByCode } from "@/http/publishApi";
 import { sendChromeTabMessage } from '@/uilts/chromeExtension.js';
+let postId = inject('post_Id');
 let pay_info = inject('pay_info');
 let router = useRouter()
 let showDesc = ref(true)
 let showRedeem = ref(false)
 let redeemNext = ref(false)
+let payNext = ref(false)
 let redeemStr = ref('')
 let refInput = ref('')
 let groupId = ref('')
@@ -153,8 +163,67 @@ const clickClose = () => {
     })
 }
 const clickJump = (item) => {
+    // 防止重复点击
+    if (payNext.value) return;
+
     pay_info.home.sale_plan = item
-    router.push({ path: '/pay' });
+    payNext.value = true;
+    // post
+    const p1 = calcRechargePayAmount({
+        params: {
+            currencyCode: item.currencyCode,
+            orderAmountValue: item.price,
+            payChannel: 'ach'
+        }
+    });
+    const p2 = getCurrencyInfoByCode({
+        params: {
+            currencyCode: item.currencyCode,
+        }
+    });
+
+    if (item.currencyCode === 'USD') {
+        Promise.all([p1, p2]).then(([res1, res2]) => {
+            if (res1.code == 0 && res2.code == 0) {
+                router.push({
+                    path: '/pay',
+                    query: {
+                        finalAmount: JSON.stringify(res1.data),
+                        currentCurrencyInfo: JSON.stringify(res2.data),
+                    }
+                });
+            } else {
+                router.push({ path: '/pay' });
+            }
+        }).finally(() => {
+            payNext.value = false;
+        })
+    } else {
+        Promise.all([p2]).then(([res2]) => {
+            if (res2.code == 0) {
+                router.push({
+                    path: '/pay',
+                    query: {
+                        currentCurrencyInfo: JSON.stringify(res2.data),
+                    }
+                });
+            } else {
+                router.push({ path: '/pay' });
+            }
+        }).finally(() => {
+            payNext.value = false;
+        })
+    }
+    // report
+    Report.reportLog({
+        pageSource: Report.pageSource.nftShopPage,
+        businessType: Report.businessType.buttonClick,
+        objectType: Report.objectType.buy_button,
+        nftProjectId: projectId.value,
+        postEditorPostId: postId.value,
+    }, {
+        'buy-number': item.itemCount
+    })
 }
 
 const setDialogStyle = () => {
@@ -192,6 +261,7 @@ const redeemPost = () => {
                 businessType: Report.businessType.buttonClick,
                 objectType: Report.objectType.redeem_button,
                 nftProjectId: projectId.value,
+                postEditorPostId: postId.value,
             }, {
                 result: 'success'
             })
@@ -233,6 +303,7 @@ const redeemPost = () => {
                 businessType: Report.businessType.buttonClick,
                 objectType: Report.objectType.redeem_button,
                 nftProjectId: projectId.value,
+                postEditorPostId: postId.value,
             }, {
                 result: 'fail'
             })
@@ -257,6 +328,7 @@ const showRedeemLayer = () => {
         businessType: Report.businessType.buttonClick,
         objectType: Report.objectType.redeem_button,
         nftProjectId: projectId.value,
+        postEditorPostId: postId.value,
     })
 }
 
@@ -280,6 +352,7 @@ onMounted(() => {
 
     let nft_project_Id = router.currentRoute.value.query.nftProjectId
     let nft_group_Id = router.currentRoute.value.query.nft_group_Id
+    let post_id = router.currentRoute.value.query.postId
     if(nft_group_Id){
         pay_info.nft_group_Id = nft_group_Id
     }
@@ -290,6 +363,7 @@ onMounted(() => {
     // 作用域外用
     groupId.value = nft_group_Id
     projectId.value = nft_project_Id
+    postId.value = post_id
 
     getNftMysteryBoxSaleInfo({
         params: {
@@ -315,7 +389,8 @@ onMounted(() => {
     Report.reportLog({
         pageSource: Report.pageSource.nftShopPage,
         businessType: Report.businessType.pageView,
-        nftProjectId: nft_project_Id
+        nftProjectId: nft_project_Id,
+        postEditorPostId: postId.value,
     })
 })
 </script>
@@ -479,6 +554,11 @@ onMounted(() => {
             .grey {
                 background: #CDCDCD;
                 cursor: not-allowed;
+                border: unset;
+                color: #FFFFFF;
+                .usdt {
+                    color: #FFFFFF!important;
+                }
             }
 
             .redeem {
@@ -487,6 +567,7 @@ onMounted(() => {
                 border-radius: 100px;
                 color: #1D9BF0;
                 min-width: 110px;
+                min-height: 50px;
                 display: flex;
                 justify-content: center;
                 align-items: center;

+ 12 - 0
src/view/iframe/buy-nft/buy/open-box.vue

@@ -25,6 +25,7 @@
 import { reactive, onMounted, inject } from 'vue'
 import nftCard from "@/view/components/nft-card.vue"
 import router from "@/router/buy-nft.js";
+let postId = inject('post_Id')
 let pay_info = inject('pay_info');
 let state = reactive({
     box: {
@@ -68,6 +69,17 @@ const showNFTs = () => {
                         showJoinGroupFinish: state.showJoinGroupFinish
                     }
                 }, (res) => { });
+                // postId
+                if (postId.value) {
+                    chrome.tabs.getCurrent((tab) => {
+                        chrome.tabs.sendMessage(tab.id, {
+                            actionType: "FINISH_ToolBox_By_Nft",
+                            data: {
+                                post_Id: postId.value,
+                            }
+                        }, (res) => { });
+                    })
+                }
                 router.replace('/')
             })
         }

+ 268 - 40
src/view/iframe/buy-nft/buy/pay.vue

@@ -7,7 +7,9 @@
         </div>
         <!-- 内容 -->
         <div class="area-content">
-            <div class="left">
+            <div
+                class="left"
+                :class="{ auto: tempCurrentCurrencyInfo.currencyCode === 'USD' && Number(finalAmountData.rechargeAmountValue) <= 0 }">
                 <img :src="require('@/assets/img/img-box5.png')" v-show="pay_info.home.sale_plan.itemCount == 5"
                     alt="" />
                 <img :src="require('@/assets/img/img-box1.png')" v-show="pay_info.home.sale_plan.itemCount == 1"
@@ -20,9 +22,11 @@
                     </div>
                 </div>
             </div>
-            <div class="right">
-                <div class="card-content">
-                    <template v-if="tempCurrentCurrencyInfo.currencyCode">
+            <div
+                class="right"
+                :class="{ none: tempCurrentCurrencyInfo.currencyCode === 'USD' && Number(finalAmountData.rechargeAmountValue) <= 0 }">
+                <div class="card-content" v-if="tempCurrentCurrencyInfo.currencyCode">
+                    <template v-if="tempCurrentCurrencyInfo.currencyCode !== 'USD'">
                         <div class="card-title">
                             <img class="img" :src="require('@/assets/subject/top-01.svg')" />
                             <div class="font">Deposit to Send Giveaway</div>
@@ -40,64 +44,114 @@
                             :tokenSymbol="tempCurrentCurrencyInfo.tokenSymbol" @updateData="updateData">
                         </preview-balance>
                     </template>
+                    <template v-else>
+                        <div class="card-title">
+                            <img class="img" :src="require('@/assets/subject/top-01.svg')" />
+                            <div class="font">Deposit to Send Giveaway</div>
+                        </div>
+                        <payment-info-usd
+                            :finalAmountData="finalAmountData">
+                        </payment-info-usd>
+                    </template>
                 </div>
             </div>
         </div>
 
         <!-- 底部 -->
-        <div class="footer">
-            <div class="buy1" @click="clickPlay" v-if="state.is_btn_grey == false">
-                <btn-loading :color="'while'" v-if="state.loading.show"></btn-loading>
-                <template
-                    v-else-if="(pay_info.home.sale_plan.price.length + pay_info.home.sale_plan.currencyInfo.tokenSymbol.length) > 30">
-                    <div class="left">Pay</div>
-                    <div class="right">
-                        <p>{{ pay_info.home.sale_plan.price }}</p>
-                        <p>{{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}</p>
-                    </div>
-                </template>
-                <template v-else>
-                    <div class="left">Pay</div>
-                    <div class="right">
-                        {{ pay_info.home.sale_plan.price }}
-                        {{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}
-                    </div>
-                </template>
-            </div>
-            <div class="buy1 grey" v-else>
-                <template
-                    v-if="(pay_info.home.sale_plan.price.length + pay_info.home.sale_plan.currencyInfo.tokenSymbol.length) > 30">
-                    <div class="left">Pay</div>
-                    <div class="right">
-                        <p>{{ pay_info.home.sale_plan.price }}</p>
-                        <p>{{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}</p>
+        <div class="footer" v-if="tempCurrentCurrencyInfo.currencyCode">
+            <template v-if="tempCurrentCurrencyInfo.currencyCode !== 'USD'">
+                <div class="buy1" @click="clickPlay" v-if="state.is_btn_grey == false">
+                    <btn-loading :color="'while'" v-if="state.loading.show"></btn-loading>
+                    <template
+                        v-else-if="(pay_info.home.sale_plan.price.length + pay_info.home.sale_plan.currencyInfo.tokenSymbol.length) > 30">
+                        <div class="left">Pay</div>
+                        <div class="right">
+                            <p>{{ pay_info.home.sale_plan.price }}</p>
+                            <p>{{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}</p>
+                        </div>
+                    </template>
+                    <template v-else>
+                        <div class="left">Pay</div>
+                        <div class="right">
+                            {{ pay_info.home.sale_plan.price }}
+                            {{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}
+                        </div>
+                    </template>
+                </div>
+                <div class="buy1 grey" v-else>
+                    <template
+                        v-if="(pay_info.home.sale_plan.price.length + pay_info.home.sale_plan.currencyInfo.tokenSymbol.length) > 30">
+                        <div class="left">Pay</div>
+                        <div class="right">
+                            <p>{{ pay_info.home.sale_plan.price }}</p>
+                            <p>{{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}</p>
+                        </div>
+                    </template>
+                    <template v-else>
+                        <div class="left">Pay</div>
+                        <div class="right">
+                            {{ pay_info.home.sale_plan.price }}
+                            {{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}
+                        </div>
+                    </template>
+                </div>
+            </template>
+            <template v-else>
+                <!-- Balance -->
+                <div class="balance">
+                    <img class="icon" src="@/assets/subject/icon-balance.png" />
+                    <div class="con">
+                        <div class="desc">Balance</div>
+                        <div class="price">
+                            $
+                            {{tempCurrentCurrencyInfo.balance}}
+                        </div>
                     </div>
-                </template>
-                <template v-else>
+                    <img class="refresh"
+                        :class="{ 'icon-refresh-rotate': refreshRotate }"
+                        :src=" require('@/assets/svg/icon-form-refresh.svg')"
+                        @click="updateCurrencyBanlce"/>
+                </div>
+                <!-- Play -->
+                <div class="buy1 usd" @click="clickPayUSD">
                     <div class="left">Pay</div>
                     <div class="right">
-                        {{ pay_info.home.sale_plan.price }}
+                        {{ finalAmountData.rechargeAmountValue > 0 ? finalAmountData.rechargeAmountValue : finalAmountData.orderAmountValue }}
                         {{ pay_info.home.sale_plan.currencyInfo.tokenSymbol }}
                     </div>
-                </template>
-            </div>
+                </div>
+            </template>
         </div>
     </div>
+
+    <!-- 预览页充值 -->
+    <message-box
+        :dialogVisible="showDepositMessageBox"
+        title="Is the Deposit Completed?"
+        @cancel="depositAchCancel"
+        @confirm="depositAchConfirm">
+    </message-box>
 </template>
 <script setup >
+import Report from "@/log-center/log"
 import router from "@/router/buy-nft.js";
-import { ref, onMounted, inject, reactive } from 'vue'
+import { ref, onMounted, onUnmounted, inject, reactive } from 'vue'
 import topUp2 from "@/view/iframe/publish/components/top-up2.vue";
 import { getCurrencyInfoByCode } from "@/http/publishApi";
 import PreviewBalance from "@/view/components/preview-balance.vue";
+import paymentInfoUsd from '@/view/components/payment-info-usd.vue';
+import payButton from "@/view/iframe/publish/components/pay-button";
+import messageBox from "@/view/components/message-box.vue";
 import BtnLoading from '../components/btn-loading.vue'
 import { payNftMysteryBoxWithBalance } from "@/http/pay";
-import { getChromeStorage } from "@/uilts/chromeExtension"
+import { calcRechargePayAmount } from "@/http/account";
+import { getChromeStorage, setChromeStorage } from "@/uilts/chromeExtension"
 import { ElMessage } from 'element-plus'
 import "element-plus/es/components/message/style/css";
 import { sendChromeTabMessage } from '@/uilts/chromeExtension.js';
 
 let pay_info = inject('pay_info');
+let postId = inject('post_Id');
 let state = reactive({
     loading: {
         show: false
@@ -111,10 +165,40 @@ let currentCurrencyInfo = reactive({
     balance: "",
 });
 
+// 真实支付金额数据
+let finalAmountData = ref({
+    currencyCode: '',
+    feeAmountValue: 0,
+    finalAmountValue: 0,
+    requestAmountValue: 0,
+});
+
+let showDepositMessageBox = ref(false);
+let amountTimer = ref(0);
 let dialogStyle = reactive({
     height: '800'
 })
 
+const calcRechPayAmount = async (params) => {
+    let res = await calcRechargePayAmount({
+        params : params
+    })
+
+    if (res.code == 0) {
+        finalAmountData.value = res.data;
+    }
+    return res.data;
+}
+
+const depositAchCancel = async () => {
+    showDepositMessageBox.value = false;
+    getCurrencyInfo()
+}
+const depositAchConfirm = async () => {
+    showDepositMessageBox.value = false;
+    getCurrencyInfo()
+}
+
 const updateData = (obj_data) => {
     if (Number(obj_data.balance) >= Number(pay_info.home.sale_plan.price)) {
         state.is_btn_grey = false
@@ -138,6 +222,16 @@ const clickPlay = () => {
             pay_info.buy_items = res.data.buyItems
             sendChromeTabMessage({ actionType: "FINISH_GROUP_BANNNER" }, () => { })
             router.push({ path: '/open_box' });
+            Report.reportLog({
+                pageSource: Report.pageSource.nftShopPage,
+                businessType: Report.businessType.buttonClick,
+                objectType: Report.objectType.buy_button,
+                nftProjectId: pay_info.home.nftProjectId,
+                postEditorPostId: postId.value,
+            }, {
+                'buy-number': pay_info.home?.sale_plan?.itemCount,
+                result: 'success'
+            })
         } else {
             let msg = ''
             switch (res.code.toString()) {
@@ -166,11 +260,52 @@ const clickPlay = () => {
                 offset: -16,
                 appendTo: document.body
             })
+            Report.reportLog({
+                pageSource: Report.pageSource.nftShopPage,
+                businessType: Report.businessType.buttonClick,
+                objectType: Report.objectType.buy_button,
+                nftProjectId: pay_info.home.nftProjectId,
+                postEditorPostId: postId.value,
+            }, {
+                'buy-number': pay_info.home?.sale_plan?.itemCount,
+                result: 'fail'
+            })
         }
     }).catch(() => {
         state.loading.show = false
     })
+    // report
+    Report.reportLog({
+        pageSource: Report.pageSource.nftPreviewPage,
+        businessType: Report.businessType.buttonClick,
+        objectType: Report.objectType.confirmButton,
+        nftProjectId: pay_info.home.nftProjectId,
+        postEditorPostId: postId.value,
+    })
+}
+
+const clickPayUSD = () => {
+    if(Number(finalAmountData.value.rechargeAmountValue) > 0) {
+        setTimeout(() => {
+            showDepositMessageBox.value = true;
+        }, 1000)
+        chrome.tabs.getCurrent(tab =>{
+            let achPayInfo = {
+                amountValue: finalAmountData.value.rechargeAmountValue,
+                tab: tab
+            };
+            let guideUrl = chrome.runtime.getURL('/iframe/ach-cashier.html');
+            setChromeStorage({ achPayInfo : JSON.stringify(achPayInfo)});
+
+            chrome.tabs.create({
+                url: guideUrl
+            });
+        })
+    } else {
+        clickPlay()
+    }
 }
+
 // 余额是否同步中
 let asyncIng = ref(false);
 
@@ -178,7 +313,16 @@ let asyncIng = ref(false);
 //临时货币信息
 let tempCurrentCurrencyInfo = ref({});
 
-
+const refreshRotate = ref(false);
+const updateCurrencyBanlce = () => {
+    if(!refreshRotate.value) {
+        refreshRotate.value = true;
+        getCurrencyInfo()
+        setTimeout(() => {
+            refreshRotate.value = false;
+        }, 1000)
+    }
+}
 const getLocalCurrencyInfoByCode = () => {
     if (currentCurrencyInfo.currencyCode) {
         getCurrencyInfo();
@@ -197,9 +341,25 @@ const getCurrencyInfo = async () => {
                 tempCurrentCurrencyInfo.value = res.data;
             }
         });
+        // 处理USD支付
+        if (currentCurrencyInfo?.currencyCode === 'USD') {
+            calcRechPayAmount({
+                currencyCode: currentCurrencyInfo.currencyCode,
+                orderAmountValue: pay_info.home.sale_plan.price,
+                payChannel: 'ach'
+            })
+            amountInterval()
+        }
     }
 }
 
+const amountInterval = () => {
+    clearTimeout(amountTimer.value);
+    amountTimer.value = setTimeout(() => {
+        getCurrencyInfo()
+    }, 10000)
+}
+
 const setDialogStyle = () => {
     let clientHeight = window.innerHeight;
     if(clientHeight >= 840) {
@@ -211,10 +371,33 @@ const setDialogStyle = () => {
 
 onMounted(() => {
     currentCurrencyInfo.currencyCode = pay_info.home.sale_plan.currencyCode
-    getLocalCurrencyInfoByCode();
+    let timer = currentCurrencyInfo.currencyCode === 'USD' ? 10000 : 0;
+    setTimeout(() => {
+        getLocalCurrencyInfoByCode();
+    }, timer);
     setDialogStyle()
+
+    // setParams
+    if (router.currentRoute.value?.query?.finalAmount) {
+        finalAmountData.value = JSON.parse(router.currentRoute.value.query.finalAmount);
+    }
+
+    if (router.currentRoute.value?.query?.currentCurrencyInfo) {
+        tempCurrentCurrencyInfo.value = JSON.parse(router.currentRoute.value.query.currentCurrencyInfo);
+    }
+
+    // report
+    Report.reportLog({
+        pageSource: Report.pageSource.nftPreviewPage,
+        businessType: Report.businessType.pageView,
+        nftProjectId: pay_info.home.nftProjectId,
+        postEditorPostId: postId.value,
+    })
 })
 
+onUnmounted(() => {
+    clearTimeout(amountTimer.value);
+})
 
 </script>
 <style lang="scss" scoped>
@@ -222,7 +405,7 @@ onMounted(() => {
     background: #fff;
     border-radius: 25px;
     max-width: 1000px;
-    min-width: 800px;
+    min-width: 1000px;
     max-height: 90%;
     z-index: 23;
     display: flex;
@@ -259,6 +442,10 @@ onMounted(() => {
             width: 400px;
             margin: 40px 56px 0 56px;
 
+            &.auto {
+                margin: 40px auto 0 auto;
+            }
+
             img {
                 max-width: 400px;
                 max-height: 400px;
@@ -291,7 +478,12 @@ onMounted(() => {
         }
 
         .right {
+            width: 400px;
             margin: 30px 56px 0px 30px;
+            
+            &.none {
+                display: none;
+            }
 
             .card-content {
                 float: right;
@@ -441,6 +633,10 @@ onMounted(() => {
                 }
             }
 
+            &.usd {
+                min-width: auto;
+            }
+
         }
 
         .grey {
@@ -449,4 +645,36 @@ onMounted(() => {
         }
     }
 }
+
+.balance {
+    display: flex;
+    margin-right: 20px;
+    .icon {
+        width: 40px;
+        height: 40px;
+    }
+    .con {
+        padding: 0 5px;
+        .desc {
+            color: rgba($color: #000000, $alpha: 0.5);
+            font-size: 12px;
+            margin-bottom: 4px;
+        }
+        .price {
+            font-size: 14px;
+            font-weight: bold;
+            word-break: break-all;
+        }
+    }
+    .refresh {
+        width: 40px;
+        cursor: pointer;
+        margin-left: -5px;
+    }
+}
+
+.icon-refresh-rotate {
+    transform: rotate(360deg);
+    transition-duration: 1s;
+}
 </style>

+ 3 - 1
src/view/iframe/buy-nft/index.vue

@@ -4,9 +4,11 @@
     </div>
 </template>
 <script setup>
-import { reactive, provide } from 'vue'
+import { ref, reactive, provide } from 'vue'
 let pay_info = reactive({})
+let post_Id = ref('')
 provide('pay_info', pay_info)
+provide('post_Id', post_Id)
 let state = reactive({
     // 
     show: 'dialog-home'

+ 1 - 0
src/view/iframe/group-card/card.vue

@@ -144,6 +144,7 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             }
             break
     }
+    sendResponse && sendResponse()
 })
 
 chrome.storage.onChanged.addListener(changes => {

+ 23 - 3
src/view/iframe/nft/card.vue

@@ -11,7 +11,14 @@
                     <img :src=" require('@/assets/img/icon-ntf-share.png') " />
                 </div>
             </div>
-            <div class="content">
+            <div
+                class="content"
+                v-show-log="{
+                    pageSource: isShare ? Report.pageSource.nft_post_page : Report.pageSource.nft_sales_window,
+                    nftProjectId: nftProjectId,
+                    redPacketType: Report.redPacketType.nftSale,
+                    srcContentId: isShare ? tweetId : ''
+                }">
                 <img :src="saleData.windowImagePath" />
             </div>
             <div
@@ -23,7 +30,14 @@
             <div
                 v-else
                 class="buy"
-                @click="buy">
+                @click="buy"
+                v-click-log="{
+                    pageSource: isShare ? Report.pageSource.nft_post_page : Report.pageSource.nft_sales_window,
+                    objectType: Report.objectType.buy_nft_button,
+                    nftProjectId: nftProjectId,
+                    redPacketType: Report.redPacketType.nftSale,
+                    srcContentId: isShare ? tweetId : ''
+                }">
                 <img class="guide" v-if="isShowGuide" :src=" require('@/assets/img/icon-arrow.png') " />
                 <button>Buy NFT</button>
             </div>
@@ -32,6 +46,7 @@
 </template>
 
 <script setup>
+import Report from "@/log-center/log"
 import { onBeforeMount, ref, onMounted, onBeforeUnmount } from 'vue'
 import { getTwitterSaleNftProjectInfo, getNftProjectInfo } from '@/http/nft'
 import { pageUrl } from "@/http/configAPI.js"
@@ -40,6 +55,8 @@ const saleData = ref({});
 const isShare = ref(false);
 const isLoading = ref(true);
 const isShowGuide = ref(false);
+const nftProjectId = ref('');
+let tweetId = ref('');
 
 const getSaleInfo = () => {
     chrome.tabs.getCurrent((tab) => {
@@ -144,14 +161,16 @@ const loginSuccessHandler = async () => {
         chrome.storage.local.remove("buyNFTCardData");
         buy();
     }
-} 
+}
 
 onBeforeMount(() => {
     let urlParams = new URL(window.location.href);
     let searchParmas = new URLSearchParams(urlParams.search);
     let projectId = searchParmas.get('projectId') || '';
+    tweetId.value = searchParmas.get('tweetId') || '';
     if (projectId) {
         isShare.value = true;
+        nftProjectId.value = projectId;
         getSaleData(projectId)
     } else {
         getSaleInfo()
@@ -169,6 +188,7 @@ const msgListener = (req, sender, sendResponse) => {
             loginSuccessHandler();
             break;
     }
+    sendResponse && sendResponse();
 }
 
 onMounted(() => {

+ 1 - 0
src/view/iframe/nft/group-card.vue

@@ -113,6 +113,7 @@ onMounted(() => {
                 getDetail();
                 break;
         }
+        sendResponse && sendResponse();
     })
 })
 </script>

+ 15 - 6
src/view/iframe/publish/components/follow-input.vue

@@ -1,14 +1,16 @@
 <template>
 <!-- 发布器-@关注人 输入组件 -->
     <div class="follow-input-wrapper">
-        <div class="at-user-item" v-for="(item, index) in pageAtUserList" :key="index">
+        <div class="at-user-item" :style="{'padding': padding}" v-for="(item, index) in pageAtUserList" :key="index">
             <img :src="require('@/assets/svg/icon-del-follows-user.svg')" 
                 class="icon-del"
+                v-if="!isRequire || isRequire && index > 0"
                 @click="delUser(item, index)">
             <pre :id='"pre" + index' class="at-user-input-placeholder">{{item.name}}</pre>
             @<input class="at-user-input" 
                     :id='"input" + index' 
                     v-model="item.name" 
+                    :readonly="index == 0 && isRequire"
                     @change="onIptChange(item, index)"
                     @input="onInput(item, index)"
                     @keydown="onKeydown(item, index)"
@@ -72,6 +74,13 @@ const props = defineProps({
     isAddSelf: {
         type: Boolean,
         default: true
+    },
+    isRequire: {
+        type: Boolean,
+        default: false
+    },
+    padding: {
+        type: String,
     }
 })
 
@@ -186,9 +195,10 @@ const setIptWidth = (index) => {
     }  else {
         setTimeout(() => {
             let iptDom = document.getElementById('input'+index);
-            iptDom.style.width = document.getElementById('pre'+index).offsetWidth + 'px'
-                console.log('iptDom1',iptDom,document.getElementById('pre'+index).offsetWidth);
-        }, 500)
+            if(iptDom){
+              iptDom.style.width = document.getElementById('pre'+index).offsetWidth + 'px'
+            }
+        }, 600)
     }
 }
 
@@ -273,7 +283,6 @@ const onUserMouseLeave = (params, index) => {
             color: #1D9BF0;
             font-weight: 500;
             font-size: 15px;
-            padding: 4px 12px;
             position: relative;
             margin-right: 10px;
             background-color: #fff;
@@ -308,7 +317,7 @@ const onUserMouseLeave = (params, index) => {
                 overflow-y: auto;
                 background-color: #fff; 
                 top: 30px;
-                left: -150px;
+                left: 0px;
                 z-index: 1000;
                 border-radius: 10px;
 

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません