Przeglądaj źródła

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

v1.1.7.4
wenliming 2 lat temu
rodzic
commit
30c9b5b4e6
45 zmienionych plików z 2551 dodań i 1391 usunięć
  1. 9 0
      src/assets/subject/004-back-head-top.svg
  2. 2 0
      src/assets/svg/icon-gold-box-close.svg
  3. 3 0
      src/assets/svg/icon-loading-gray2.svg
  4. 25 0
      src/denet/chrome/content.js
  5. 7 0
      src/denet/chrome/index.js
  6. 25 0
      src/denet/chrome/sw.js
  7. 94 0
      src/denet/content/doTask.js
  8. 30 0
      src/denet/content/dom.js
  9. 29 0
      src/denet/content/getData.js
  10. 9 0
      src/denet/content/index.js
  11. 9 0
      src/denet/index.js
  12. 103 80
      src/entry/background.js
  13. 129 73
      src/entry/content.js
  14. 2 0
      src/log-center/logEnum.js
  15. 17 16
      src/logic/background/twitter.js
  16. 8 8
      src/logic/content/ParseCard.js
  17. 155 0
      src/logic/content/help/doTask.js
  18. 33 0
      src/logic/content/help/getData.js
  19. 40 40
      src/logic/content/help/twitter.js
  20. 260 154
      src/logic/content/twitter.js
  21. 3 3
      src/manifest.json
  22. 0 6
      src/uilts/denet.js
  23. 9 1
      src/uilts/help.js
  24. 129 0
      src/uilts/messageCenter/chrome/index.js
  25. 13 0
      src/uilts/messageCenter/chrome/messageEnum.js
  26. 60 0
      src/uilts/messageCenter/content/index.js
  27. 0 3
      src/uilts/messageCenter/content/messageEnum.js
  28. 106 0
      src/uilts/messageCenter/iframe/index.js
  29. 34 0
      src/uilts/messageCenter/iframe/messageEnum.js
  30. 0 50
      src/uilts/messageCenter/index.js
  31. 0 39
      src/uilts/messageCenter/messageContent.js
  32. 39 0
      src/view/components/loading.vue
  33. 24 14
      src/view/iframe/publish/components/get-more.vue
  34. 62 78
      src/view/iframe/red-packet/luck-draw.vue
  35. 56 75
      src/view/iframe/red-packet/red-packet.vue
  36. 74 143
      src/view/iframe/treasure-hunt/all-receive-list.vue
  37. 8 8
      src/view/iframe/treasure-hunt/components/boxs.vue
  38. 17 4
      src/view/iframe/treasure-hunt/components/btn.vue
  39. 1 0
      src/view/iframe/treasure-hunt/components/carousel.vue
  40. 302 265
      src/view/iframe/treasure-hunt/components/invite-friends.vue
  41. 225 0
      src/view/iframe/treasure-hunt/components/receive-list.vue
  42. 144 142
      src/view/iframe/treasure-hunt/cover.vue
  43. 61 71
      src/view/iframe/treasure-hunt/index.vue
  44. 2 1
      src/view/iframe/treasure-hunt/invite.vue
  45. 193 117
      src/view/iframe/treasure-hunt/result.vue

+ 9 - 0
src/assets/subject/004-back-head-top.svg

@@ -0,0 +1,9 @@
+<svg width="375" height="150" viewBox="0 0 375 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 0H375V117.057C375 117.057 320.624 150 187.5 150C54.376 150 0 117.057 0 117.057V0Z" fill="url(#paint0_linear_27657_247702)"/>
+<defs>
+<linearGradient id="paint0_linear_27657_247702" x1="187" y1="-2.34963e-09" x2="187.045" y2="150" gradientUnits="userSpaceOnUse">
+<stop offset="0.367196" stop-color="#26180E"/>
+<stop offset="0.953767" stop-color="#51361D"/>
+</linearGradient>
+</defs>
+</svg>

Plik diff jest za duży
+ 2 - 0
src/assets/svg/icon-gold-box-close.svg


+ 3 - 0
src/assets/svg/icon-loading-gray2.svg

@@ -0,0 +1,3 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M19.9992 3.33203V7.49869C17.2553 7.49927 14.5878 8.40267 12.4083 10.0695C10.2287 11.7364 8.65819 14.0741 7.93892 16.722C7.21965 19.3699 7.39163 22.1809 8.42832 24.7214C9.46501 27.2619 11.3088 29.3907 13.6753 30.7795C16.0418 32.1682 18.7995 32.7397 21.5229 32.4058C24.2464 32.0719 26.7844 30.8511 28.7453 28.9318C30.7062 27.0125 31.9811 24.5014 32.3734 21.7857C32.7657 19.07 32.2535 16.3007 30.9158 13.9049L34.5533 11.8737C36.3369 15.0681 37.0198 18.7605 36.4967 22.3815C35.9737 26.0025 34.2737 29.3508 31.659 31.9098C29.0444 34.4688 25.6604 36.0964 22.029 36.5415C18.3976 36.9866 14.7206 36.2245 11.5653 34.3727C8.41006 32.5209 5.95175 29.6823 4.56965 26.2949C3.18755 22.9074 2.95846 19.1593 3.91772 15.6287C4.87698 12.0982 6.97129 8.98135 9.87757 6.75906C12.7839 4.53676 16.3406 3.3325 19.9992 3.33203Z" fill="#E2E2E2"/>
+</svg>

+ 25 - 0
src/denet/chrome/content.js

@@ -0,0 +1,25 @@
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+import MESSAGE_ENUM from '@/uilts/messageCenter/chrome/messageEnum'
+
+export default {
+    // ---- 获取推文文案 ---- 
+    test({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            chromeMessageCenter.sendToSW({
+                info: {
+                    actionType: MESSAGE_ENUM.CONTENT_TO_BACK_TEST,
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}

+ 7 - 0
src/denet/chrome/index.js

@@ -0,0 +1,7 @@
+import content from '@/denet/chrome/content'
+import sw from '@/denet/chrome/sw'
+
+export default {
+    content,
+    sw
+}

+ 25 - 0
src/denet/chrome/sw.js

@@ -0,0 +1,25 @@
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+import MESSAGE_ENUM from '@/uilts/messageCenter/chrome/messageEnum'
+
+export default {
+    // ---- 获取推文文案 ---- 
+    test({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            chromeMessageCenter.sendToContent({
+                info: {
+                    actionType: MESSAGE_ENUM.BACK_TO_CONTENT_TEST,
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}

+ 94 - 0
src/denet/content/doTask.js

@@ -0,0 +1,94 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
+import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+// 做任务
+const doTask = {
+    createTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_CREATE_TWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    like({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_LIKE,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId,
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    follows({ follow_name, twitterUserId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_FOLLOWS,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                  follow_name,
+                  twitterUserId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    reTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_RETWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default doTask
+
+// iframe > dom id 
+// iframe > createTweet  dom id 

+ 30 - 0
src/denet/content/dom.js

@@ -0,0 +1,30 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
+import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+const dom = {
+    // ---- 获取推文文案 ---- 
+    getTweetText({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DOM_GET_TWEET_TEXT,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default dom

+ 29 - 0
src/denet/content/getData.js

@@ -0,0 +1,29 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
+import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+const getData = {
+  getUserInfoByName({screen_name}, overTime) {
+    return new Promise((res, rej) => {
+      messageCenter.send({
+          info: {
+              actionType: MESSAGE_ENUM.IFRAME_GET_TWITTER_USER_INFO,
+              iframeId
+          },
+          data: {
+            screen_name
+          },
+          overTime,
+          callback: (data) => {
+              res(data);
+          },
+          failback: (e) => {
+              rej(e)
+          }
+      })
+    })
+  }
+}
+
+export default getData

+ 9 - 0
src/denet/content/index.js

@@ -0,0 +1,9 @@
+import doTask from '@/denet/content/doTask'
+import dom from '@/denet/content/dom'
+import getData from '@/denet/content/getData'
+
+export default {
+    doTask,
+    dom,
+    getData
+}

+ 9 - 0
src/denet/index.js

@@ -0,0 +1,9 @@
+import content from '@/denet/content'
+import chrome from '@/denet/chrome'
+
+const denet = {
+    content,
+    chrome
+}
+
+export default denet

+ 103 - 80
src/entry/background.js

@@ -35,6 +35,7 @@ import {
 import {
     closeAchPayNoticeHandler
 } from "@/logic/background/denet";
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
 
 try {
     chrome.runtime.onMessage.addListener(onMessageMethod);
@@ -144,10 +145,10 @@ chrome.tabs.onActivated.addListener(function (activeInfo) {
     setPopupConfig(activeInfo);
 })
 
-function thenInstalledMethod() {
+function thenInstalledMethod({ reason }) {
     try {
 
-        onInstalledCreateTab()
+        onInstalledCreateTab({ reason })
         onInstalledUserSet()
         // pingpang
         chrome.alarms.create('PingPong', {
@@ -185,7 +186,7 @@ function onInstalledMethod({ id, previousVersion, reason }) {
             if (!info || !info.appVersionCode) {
                 setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '1' }) })
                 setChromeStorage({ baseInfo: JSON.stringify({ appVersionCode }) })
-                thenInstalledMethod()
+                thenInstalledMethod({ reason })
 
                 // 版本更新了
             } else if (appVersionCode != info.appVersionCode) {
@@ -197,7 +198,7 @@ function onInstalledMethod({ id, previousVersion, reason }) {
                 })
             } else {
                 setChromeStorage({ onInstalledMethod: JSON.stringify({ onInstalledMethod: '3' }) })
-                thenInstalledMethod()
+                thenInstalledMethod({ reason })
             }
             console.log('1-appVersionCode', appVersionCode)
             console.log('1-info', info)
@@ -223,82 +224,15 @@ function onInstalledMethod({ id, previousVersion, reason }) {
 
 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();
-                        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_CLOSE_ACH_PAY_NOTICE':
-                    closeAchPayNoticeHandler();
-                    break;
-            }
+        if (!req) {
+            return
+        }
+        if (req.info) {
+            newRuntimeOnMessageMethod(req, sender, sendResponse)
+        } else if (req.actionType) {
+            oldRuntimeOnMessageMethod(req, sender, sendResponse)
         }
+        chromeMessageCenter.init(req)
     } catch (error) {
         Report.reportLog({
             objectType: Report.objectType.background_function_catch,
@@ -308,4 +242,93 @@ function onMessageMethod(req, sender, sendResponse) {
     }
 }
 //加载bg.js 执行
-setMessageCount();
+setMessageCount();
+
+const newRuntimeOnMessageMethod = (req, sender, sendResponse) => {
+    let { info = {}, data = {} } = req
+    switch (info.actionType) {
+        case 'CONTENT_TO_BACK_TEST':
+            chromeMessageCenter.sendToContent(sender, { info, data: '123' })
+            break;
+
+        default:
+            break;
+    }
+}
+
+const oldRuntimeOnMessageMethod = (req, sender, sendResponse) => {
+    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();
+                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_CLOSE_ACH_PAY_NOTICE':
+            closeAchPayNoticeHandler();
+            break;
+    }
+}

+ 129 - 73
src/entry/content.js

@@ -43,7 +43,7 @@ import {
     getExtensionStorgeDataForIframe,
     doTaskIframeTwitterAPI
 } from "@/logic/content/twitter.js";
-
+import denet from '@/denet'
 import { httpBackToContentCallBack } from '@/uilts/chromeExtension.js'
 import {
     hideNFTGroupList,
@@ -60,6 +60,10 @@ import {
     injectDenet
 } from "@/logic/content/denet.js";
 
+import doTask from '@/logic/content/help/doTask'
+import getData from '@/logic/content/help/getData'
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+
 chrome.storage.onChanged.addListener(changes => {
     initExecuteScript(changes)
 })
@@ -73,83 +77,110 @@ window.onload = () => {
         data: {}
     });
 };
-window.onmessage = (res) => {
-    if (res.data && res.data.actionType) {
-        switch (res.data.actionType) {
-            case "IFRAME_SHOW_IFREME":
-                showIframeHandler();
-                break;
-            case "IFRAME_HIDE_IFREME":
-                hideIframeHandler();
-                break;
-            case "IFRAME_SHOW_TWITTER_PUBLISH_DIALOG":
-                showTwitterPublishDialogHandler(res.data.publishRes);
-                break;
-            case "IFRAME_RED_PACKET_REPLY_CLICK":
-                replyHandle(res.data.data || {});
-                break;
-            case "IFRAME_RED_PACKET_SHOW_BIND_TWEET_NOTICE":
-                noticeBindTweet(res.data.data || {});
-                break;
-            case "IFRAME_CLOSE_BIND_TWEET":
-                hideNoticeBindTweet();
-                break;
-            case "IFRAME_RED_PACKET_GET_TWEET_AUTHOR":
-                getTweetAuthorByDom(res.data.data || {});
-                break;
-            case "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY":
-                facebookReplyTweet(res.data.data || {});
-                break;
-            case "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK":
-                onTweetReplyClick(res.data.data || {});
-                break;
-            // case 'IFRAME_TWITTER_API_DO_TASK':
-            //     doTaskTwitterAPI(res.data)
-            //     break
-            // 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;
-            case 'IFRAME_GET_EXTENSION_STORGE_DATA':
-                getExtensionStorgeDataForIframe(res.data.data);
-                break;
-            case 'IFRAME_DO_TASK_CREATE_TWEET':
-                // 做任务
-                // 接受数据,sendmessage
-                console.log('IFRAME_DO_TASK_CREATE_TWEET', res)
-                break
-            case 'IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS':
-                getTweetUserFollowStatus(res.data);
-                break;
-            case 'IFRAME_TWITTER_API_DO_TASK':
-                doTaskIframeTwitterAPI(res.data);
-                break;
-            case 'IFRAME_API_GET_TWEET_USER_INFO_START':
-                let data = JSON.parse(res.data.data);
 
-                TwitterApiUserByScreenName({
-                  iframeId: res.data.iframeId,
-                  ...data
-                })
-                break;
+const oldOnMessageMethod = (res) => {
+    switch (res.data.actionType) {
+        case "IFRAME_SHOW_IFREME":
+            showIframeHandler();
+            break;
+        case "IFRAME_HIDE_IFREME":
+            hideIframeHandler();
+            break;
+        case "IFRAME_SHOW_TWITTER_PUBLISH_DIALOG":
+            showTwitterPublishDialogHandler(res.data.publishRes);
+            break;
+        case "IFRAME_RED_PACKET_REPLY_CLICK":
+            replyHandle(res.data.data || {});
+            break;
+        case "IFRAME_RED_PACKET_SHOW_BIND_TWEET_NOTICE":
+            noticeBindTweet(res.data.data || {});
+            break;
+        case "IFRAME_CLOSE_BIND_TWEET":
+            hideNoticeBindTweet();
+            break;
+        case "IFRAME_RED_PACKET_GET_TWEET_AUTHOR":
+            getTweetAuthorByDom(res.data.data || {});
+            break;
+        case "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY":
+            facebookReplyTweet(res.data.data || {});
+            break;
+        case "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK":
+            onTweetReplyClick(res.data.data || {});
+            break;
+        // case 'IFRAME_TWITTER_API_DO_TASK':
+        //     doTaskTwitterAPI(res.data)
+        //     break
+        // 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;
+        case 'IFRAME_GET_EXTENSION_STORGE_DATA':
+            getExtensionStorgeDataForIframe(res.data.data);
+            break;
+
+        case 'IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS':
+            getTweetUserFollowStatus(res.data);
+            break;
+        case 'IFRAME_TWITTER_API_DO_TASK':
+            doTaskIframeTwitterAPI(res.data);
+            break;
+        case 'IFRAME_API_GET_TWEET_USER_INFO_START':
+            let data = JSON.parse(res.data.data);
+
+            TwitterApiUserByScreenName({
+                iframeId: res.data.iframeId,
+                ...data
+            })
+            break;
 
-            case 'GET_CONTENT_BY_TWITTER_ID':
-              sendContentByTwitterID(res.data)
-              break
-        }
+        case 'GET_CONTENT_BY_TWITTER_ID':
+            sendContentByTwitterID(res.data)
+            break
     }
-};
+}
 
+const newOnMessageMethod = (res) => {
+    let { info = {}, data = {} } = res.data
+    switch (info.actionType) {
+        case 'IFRAME_DO_TASK_CREATE_TWEET':
+            doTask.TwitterApiCreateTweet({ info, data })
+            break
+        case 'IFRAME_DO_TASK_LIKE':
+            doTask.TwitterLikeAPI({ info, data })
+            break
+        case 'IFRAME_DO_TASK_RETWEET':
+            doTask.TwitterRetweetAPI({ info, data })
+            break
+        case 'IFRAME_DO_TASK_FOLLOWS':
+            doTask.TwitterFollowAPI({ info, data })
+            break
+        case 'IFRAME_GET_TWITTER_USER_INFO':
+            getData.TwitterApiGetUserInfoByName({ info, data })
+            break
+    }
+}
 
-chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
+
+window.onmessage = (res) => {
+    if (!res.data) {
+        return
+    }
+    if (res.data.actionType) {
+        oldOnMessageMethod(res)
+    } else if (res.data.info) {
+        newOnMessageMethod(res)
+    }
+}
+
+const oldRuntimeOnMessageMethod = (req, sender, sendResponse) => {
     switch (req.actionType) {
         case 'BG_SHOW_PIN_TIPS':
             showPinTips()
@@ -258,6 +289,31 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
         case 'GET_CONTENT_BY_TWITTER_ID':
             sendContentByTwitterID(req.data.tweet_Id)
             break
+        case 'TEST':
+            console.log('TEST')
+            break
+    }
+}
+
+const newRuntimeOnMessageMethod = (req, sender, sendResponse) => {
+
+}
+chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
+    if (req.actionType) {
+        oldRuntimeOnMessageMethod(req, sender, sendResponse)
+    } else if (req.info) {
+        newRuntimeOnMessageMethod(req, sender, sendResponse)
+        chromeMessageCenter.init(req)
     }
     sendResponse && sendResponse('ok');
+
 })
+
+// --- test ---
+// async function funcTest() {
+//     let res = await denet.chrome.content.test({ tweetId: 22 })
+//     console.log('test sendmessage', res)
+// }
+// setTimeout(() => {
+//     funcTest()
+// }, 3000);

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

@@ -140,6 +140,8 @@ export const pageSource = {
     post_editor_guide_page_right: 'post-editor-guide-page-right',
     buy_posteditor_nft_dialog: 'buy-posteditor-nft-dialog',
 
+    // 夺宝模式 - 领取列表页
+    who_get_money_page: 'who-get-money-page'
 }
 
 export const extParams = {

+ 17 - 16
src/logic/background/twitter.js

@@ -228,7 +228,7 @@ export function onInstalledMid(cb) {
             // 没有cookie
             if (res_arr && res_arr.length) {
                 setChromeStorage({ mid: JSON.stringify(res_arr[0]) }, () => {
-                  cb && cb()
+                    cb && cb()
                 })
             } else {
                 let _params = {
@@ -236,7 +236,7 @@ export function onInstalledMid(cb) {
                 }
                 setChromeCookie(LANDING_PAGE, { 'mid': _params.mid })
                 setChromeStorage({ mid: JSON.stringify(_params) }, () => {
-                  cb && cb()
+                    cb && cb()
                 })
             }
         })
@@ -333,23 +333,24 @@ function sendActivetabMessage(message = {}) {
  * 安装后打开新标签页
  */
 
-export function onInstalledCreateTab() {
+export function onInstalledCreateTab({ reason }) {
     try {
         getChromeCookie(LANDING_PAGE_JUMP_INFO, (res = {}) => {
             onInstalledMid(() => {
-              setTimeout(() => {
-                  if (!res) {
-                      res = {}
-                  }
-                  // 安装成功埋点
-                  Report.reportLog({
-                      objectType: Report.objectType.chrome_extension_installed,
-                      funcName: 'onInstalledCreateTab',
-                      postId: res.postId || '',
-                      shareLinkId: res.shareLinkId || '',
-                      'channel-name': res.channelName
-                  })
-              }, 5000)
+                setTimeout(() => {
+                    if (!res) {
+                        res = {}
+                    }
+                    // 安装成功埋点
+                    Report.reportLog({
+                        objectType: Report.objectType.chrome_extension_installed,
+                        funcName: 'onInstalledCreateTab',
+                        postId: res.postId || '',
+                        shareLinkId: res.shareLinkId || '',
+                        'channel-name': res.channelName,
+                        reason
+                    })
+                }, 5000)
             });
 
             let url = 'https://twitter.com/search?q=%23denet'

+ 8 - 8
src/logic/content/ParseCard.js

@@ -1,5 +1,3 @@
-import { iframeHost } from '@/http/configAPI'
-import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 import ToolBox from '@/view/content/tool-box/index.vue'
 import { createApp } from 'vue'
 import { getStorage, setStorage, guid } from '@/uilts/help'
@@ -308,14 +306,16 @@ class ParseCard {
         return _iframe
     }
     createIframe({ post_Id = '', tweet_Id = '', tweet_author = '', page_type = '' }, if_center = false) {
+        let _iframeId = `denet-${guid()}`
         let _iframe = document.createElement('iframe')
         let _iframe_url = ''
         let tweet_str = ''
         if (tweet_Id) {
             tweet_str = `&tweetId=${tweet_Id}`
         }
-        _iframe.id = post_Id
-        _iframe_url = chromeExtensionUrl + ('iframe/red-packet.html') + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}`;
+        _iframe.id = _iframeId
+        _iframe.dataset.card = 'denet'
+        _iframe_url = chromeExtensionUrl + ('iframe/red-packet.html') + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}&iframeId=${_iframeId}`;
         // debugger mode
         if (window.location.href.includes('denet_debugger')) {
             _iframe_url = _iframe_url + '&denet_debugger=1'
@@ -344,11 +344,11 @@ class ParseCard {
         return _iframe
     }
     createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code, invite_channel }) {
+        let _iframeId = `denet-${guid()}`
         let _iframe = document.createElement('iframe')
-        console.log('post_Id',params.post_Id)
-        let rid = guid();
-        _iframe.id = rid;
-        _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${rid}`;
+        _iframe.id = _iframeId
+        _iframe.dataset.card = 'denet'
+        _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${_iframeId}`;
         _iframe.style.cssText = 'border:medium none; width:375px; min-height:580px; border: 1px solid #DCDCDC; border-radius: 20px;'
         return _iframe
     }

+ 155 - 0
src/logic/content/help/doTask.js

@@ -0,0 +1,155 @@
+import messageCenter from '@/uilts/messageCenter/content';
+import { getCookie, isMobileTwitter } from '@/uilts/help'
+import axios from 'axios';
+
+const TwitterApiCreateTweet = ({ info, data }) => {
+    let params = {
+        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": data.txt,
+            "media": {
+                "media_entities": [],
+                "possibly_sensitive": false
+            },
+            "withDownvotePerspective": true,
+            "withReactionsMetadata": false,
+            "withReactionsPerspective": false,
+            "withSuperFollowsTweetFields": true,
+            "withSuperFollowsUserFields": true,
+            "semantic_annotation_ids": [],
+            "dark_request": false
+        }
+    };
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/K9It0MijE2UOlX-8wLyPYA/CreateTweet" : "https://twitter.com/i/api/graphql/hC1nuE-2d1NX5LYBuuAvtQ/CreateTweet"
+    axios.post(url,
+        params, {
+        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) {
+        messageCenter.send({ info, data: response })
+    }).catch(function (err) {
+        messageCenter.send({ info, data: err })
+    });
+}
+
+const TwitterLikeAPI = ({ info, data }) => {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet" : "https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet"
+    fetch(url, {
+        "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"
+        },
+        "referrer": "https://twitter.com/home",
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": "{\"variables\":{\"tweet_id\":\"" + data.tweetId + "\"},\"queryId\":\"lI07N6Otwv1PhnEgXILM7A\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        // 返回信息
+        messageCenter.send({ info, data: { task_done: true } })
+    }).catch(() => {
+        messageCenter.send({ info, data: { task_done: false } })
+    })
+}
+
+const TwitterFollowAPI = ({ info, data }) => {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/1.1/friendships/create.json" : "https://twitter.com/i/api/1.1/friendships/create.json"
+    fetch(url, {
+        "headers": {
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/x-www-form-urlencoded",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"macOS\"",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "zh-cn"
+        },
+        "referrer": "https://twitter.com/home",
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": "include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&user_id=" + data.twitterUserId + "",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        messageCenter.send({ info, data: { task_done: true, follow_name: data.follow_name } })
+    }).catch(() => {
+        messageCenter.send({ info, data: { task_done: false, follow_name: data.follow_name } })
+    })
+}
+
+const TwitterRetweetAPI = ({ info, data }) => {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet" : "https://twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet"
+    fetch(url, {
+        "headers": {
+            "accept": "*/*",
+            "accept-language": "zh,en;q=0.9,zh-CN;q=0.8",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"macOS\"",
+            "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": "zh-cn"
+        },
+        "referrer": "https://twitter.com/home",
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": "{\"variables\":{\"tweet_id\":\"" + data.tweetId + "\",\"dark_request\":false},\"queryId\":\"ojPdsZsimiJrUGLR1sjUtA\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        messageCenter.send({ info, data: { task_done: true } })
+    }).catch(() => {
+        messageCenter.send({ info, data: { task_done: false } })
+    })
+}
+
+export default {
+    TwitterApiCreateTweet,
+    TwitterLikeAPI,
+    TwitterRetweetAPI,
+    TwitterFollowAPI
+}

+ 33 - 0
src/logic/content/help/getData.js

@@ -0,0 +1,33 @@
+import messageCenter from '@/uilts/messageCenter/content';
+import { getCookie, isMobileTwitter } from '@/uilts/help'
+import axios from 'axios';
+
+const TwitterApiGetUserInfoByName = ({info, data}) => {
+  let url = isMobileTwitter() ? `https://mobile.twitter.com/i/api/graphql/gr8Lk09afdgWo7NvzP89iQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${data.screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D` : `https://twitter.com/i/api/graphql/mCbpQvZAw6zu_4PvuAUVVQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${data.screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D`
+  axios.get(url, {
+      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(res => {
+    messageCenter.send({ info, data: res.data.data, })
+  }).catch(err => {
+    messageCenter.send({ info, data: {err} })
+  })
+}
+
+export default {
+  TwitterApiGetUserInfoByName
+}

+ 40 - 40
src/logic/content/help/twitter.js

@@ -3,45 +3,45 @@ import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 
 // 根据提示dom 跳转到推文详情页面
 export const jumpTwitterDetailByAlert = () => {
-    let num = 10
-    let timer = setInterval(() => {
-        if (num <= 0) {
-            clearInterval(timer)
-            return
-        }
-        let alert = document.querySelector('div[role=alert]')
-        if (alert) {
-            let a = alert.querySelector('a')
-            if (a) {
-                clearInterval(timer)
-                a.click()
-            }
-        }
-        num--
-    }, 500)
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let alert = document.querySelector('div[role=alert]')
+    if (alert) {
+      let a = alert.querySelector('a')
+      if (a) {
+        clearInterval(timer)
+        a.click()
+      }
+    }
+    num--
+  }, 500)
 }
 
 export const showEditTweet = (callback) => {
-    let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
-    if (bigBtn) {
-        bigBtn.click();
-    } else {
-        let smallBtn = document.querySelector('a[href="/compose/tweet"]')
-        smallBtn && smallBtn.click();
+  let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+  if (bigBtn) {
+    bigBtn.click();
+  } else {
+    let smallBtn = document.querySelector('a[href="/compose/tweet"]')
+    smallBtn && smallBtn.click();
+  }
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let inputEle = document.querySelector('div[contenteditable="true"]');
+    if (inputEle) {
+      clearInterval(timer)
+      callback && callback()
     }
-    let num = 10
-    let timer = setInterval(() => {
-        if(num <= 0){
-            clearInterval(timer)
-            return
-        }
-        let inputEle = document.querySelector('div[contenteditable="true"]');
-        if(inputEle){
-            clearInterval(timer)
-            callback && callback()
-        }
-        num--
-    }, 500);
+    num--
+  }, 500);
 }
 
 export const setDeviceInfo = async () => {
@@ -60,9 +60,9 @@ export const setDeviceInfo = async () => {
   }
 
   let storageDeviceInfo = getStorage(deviceStorageParams.name);
-  if(!storageDeviceInfo) {
+  if (!storageDeviceInfo) {
     let res = await getVisitorId();
-    let id =  res && res.visitorId || '';
+    let id = res && res.visitorId || '';
     setStorage(deviceStorageParams.name, id);
     deviceInfo.deviceId1 = id;
   } else {
@@ -70,7 +70,7 @@ export const setDeviceInfo = async () => {
   }
 
   let cookieDeviceInfo = getCookie(deviceCookieParams.name);
-  if(!cookieDeviceInfo) {
+  if (!cookieDeviceInfo) {
     let rid = guid();
     setCookie(deviceCookieParams.name, rid, 600);
     deviceInfo.deviceId2 = rid;
@@ -78,5 +78,5 @@ export const setDeviceInfo = async () => {
     deviceInfo.deviceId2 = cookieDeviceInfo;
   }
 
-  setChromeStorage({'deviceInfo': JSON.stringify(deviceInfo)});
-}
+  setChromeStorage({ 'deviceInfo': JSON.stringify(deviceInfo) });
+}

+ 260 - 154
src/logic/content/twitter.js

@@ -1,5 +1,5 @@
 import { getChromeStorage, setChromeStorage, chromeExtensionUrl } from '@/uilts/chromeExtension.js'
-import { throttle, getQueryString, getCookie, nextTick, getQueryStringByUrl, getStorage, setStorage, getInnerIframeURL } from '@/uilts/help'
+import { throttle, getQueryString, getCookie, nextTick, getQueryStringByUrl, getStorage, setStorage, getInnerIframeURL, isMobileTwitter } from '@/uilts/help'
 import { discordAuthRedirectUri, iframeHost } from '@/http/configAPI'
 import { reportSrcPublishEvent } from '@/http/publishApi'
 
@@ -10,7 +10,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';
+import messageCenter from '@/uilts/messageCenter/content';
 import { PlayType } from '@/types';
 import { reSetBindPostContent } from '@/http/help.js';
 import { setDeviceInfo } from '@/logic/content/help/twitter';
@@ -64,7 +64,7 @@ function getDiscordAuthCode() {
  * @param port
  */
 function renderDom() {
-    if (window.location.href.indexOf('https://twitter.com') > -1) {
+    if (window.location.href.indexOf('https://twitter.com') > -1 || window.location.href.indexOf('https://mobile.twitter.com') > -1 ) {
         _createBtnDom();
         onWindowResize();
         checkHasDeBtn();
@@ -679,11 +679,22 @@ function createTweetToolbarToolBox() {
 function addSliderNavDeBtn() {
     try {
         let isSmall = false;
+        let isFloating = false;
+        let floatingTweetBtn;
         let tweetBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
-        if (tweetBtn && tweetBtn.querySelector('svg')) {
-            isSmall = true;
+        if (tweetBtn) {
+            if (tweetBtn.querySelector('svg')) {
+                isSmall = true;
+            }
+        } else {
+            // 手机打开twitter 发推按钮
+            floatingTweetBtn = document.querySelector('div[data-testid="FloatingActionButtonBase"]');
+            if (floatingTweetBtn) {
+                isFloating = true;
+            }
         }
-        if (!isSmall) {
+
+        if (!isSmall && !isFloating) {
             let bigDom = document.querySelector('a[href="/compose/tweet"]').parentNode.parentNode;
             let deBtn = document.getElementById('de-btn');
             if (bigDom && !deBtn) {
@@ -695,15 +706,19 @@ function addSliderNavDeBtn() {
                 });
             }
         } else {
-            let smallDom = document.querySelector('a[href="/compose/tweet"]').parentNode.parentNode;
             let deBtn3 = document.getElementById('de-btn3');
-            if (smallDom && !deBtn3) {
-                dom && dom.deBtn3 && smallDom.appendChild(dom.deBtn3);
-                Report.reportLog({
-                    pageSource: Report.pageSource.mainPage,
-                    businessType: Report.businessType.buttonView,
-                    objectType: Report.objectType.buttonMain
-                });
+            if (isFloating && !deBtn3) {
+                floatingTweetBtn.appendChild(dom.deBtn3);
+            } else {
+                let smallDom = document.querySelector('a[href="/compose/tweet"]').parentNode.parentNode;
+                if (smallDom && !deBtn3) {
+                    dom && dom.deBtn3 && smallDom.appendChild(dom.deBtn3);
+                    Report.reportLog({
+                        pageSource: Report.pageSource.mainPage,
+                        businessType: Report.businessType.buttonView,
+                        objectType: Report.objectType.buttonMain
+                    });
+                }
             }
         }
     } catch (e) {
@@ -882,10 +897,10 @@ function setIframeCard(type = 'twitter') {
                             index = Number(i) + 1
                             if (arr[i] == 'invite' && arr.length >= index) {
                                 item.invite_code = arr[index];
-                                if(arr.length > index + 1) {
-                                  item.invite_channel = arr[index+1];
+                                if (arr.length > index + 1) {
+                                    item.invite_channel = arr[index + 1];
                                 } else {
-                                  item.invite_channel = '';
+                                    item.invite_channel = '';
                                 }
                                 break
                             }
@@ -1079,24 +1094,36 @@ export const getTweetUserFollowStatus = (params) => {
     Promise.allSettled(promiseList).then((res) => {
         let list = [];
         if (res && res.length) {
-          let resList = res.filter(item => item.status == 'fulfilled');
-          for (let i = 0; i < resList.length; i++) {
-              let item = resList[i];
-              if (item && item.value && item.value.data && item.value.data.data) {
-                  list.push(item.value.data.data)
-              }
-          }
-        }
-        messageCenter.send(params.iframeId, 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', {
-          list, tweetId, type, iframeId: params.iframeId, iframeGUId
+            let resList = res.filter(item => item.status == 'fulfilled');
+            for (let i = 0; i < resList.length; i++) {
+                let item = resList[i];
+                if (item && item.value && item.value.data && item.value.data.data) {
+                    list.push(item.value.data.data)
+                }
+            }
+        }
+        messageCenter.send({
+            info: {
+                iframeId: params.iframeId,
+                actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES'
+            },
+            data: {
+                list, tweetId, type, iframeId: params.iframeId, iframeGUId
+            }
         })
 
         // chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: list, tweetId, type: params.type, iframeId: params.iframeId }, () => { })
     }).catch(err => {
-      messageCenter.send(params.iframeId, 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', {
-        list: [], tweetId, type, iframeId: params.iframeId, iframeGUId
-      })
-      // chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: [], tweetId, type: params.type, iframeId: params.iframeId }, () => { })
+        messageCenter.send({
+            info: {
+                iframeId: params.iframeId,
+                actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES'
+            },
+            data: {
+                list: [], tweetId, type, iframeId: params.iframeId, iframeGUId
+            }
+        })
+        // chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: [], tweetId, type: params.type, iframeId: params.iframeId }, () => { })
     })
 }
 
@@ -1142,7 +1169,7 @@ export function facebookReplyTweet(params) {
 }
 
 export function replyHandle(params) {
-    let iframe = window.parent.document.getElementById(params.postId);
+    let iframe = window.parent.document.getElementById(params.iframeId);
     let replyBtn = iframe.parentNode.parentNode.querySelector('div[data-testid="reply"]') ||
         iframe.parentNode.parentNode.parentNode.querySelector('div[data-testid="reply"]');
     if (replyBtn) {
@@ -1165,8 +1192,8 @@ export function replyHandle(params) {
 
                 let eleList = tweetReply.parentNode.parentNode.parentNode.parentNode.parentNode.querySelectorAll('span[data-text="true"]');
                 reportReplyResult(eleList, params, () => {
-                    // iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: {} }, '*');
-                    chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data: { postId: params.postId } }, () => { })
+                    iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: { postId: params.postId } }, '*');
+                    // chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data: { postId: params.postId } }, () => { })
                 });
             })
         }
@@ -1174,7 +1201,7 @@ export function replyHandle(params) {
 }
 
 export function onTweetReplyClick(params) {
-    let iframe = window.parent.document.getElementById(params.postId);
+    let iframe = window.parent.document.getElementById(params.iframeId);
     let replyBtn = iframe.parentNode.parentNode.querySelector('div[data-testid="reply"]') ||
         iframe.parentNode.parentNode.parentNode.querySelector('div[data-testid="reply"]');
     if (replyBtn) {
@@ -1218,13 +1245,35 @@ function onReplyDialogOpen(params, iframe) {
                     businessType: Report.businessType.buttonClick,
                     objectType: Report.objectType.replyClickByTwitterList
                 });
+                let editDom = dialog.querySelector('div[contenteditable="true"]');
+                let eleList = []
+                if(editDom) {
+                  eleList = editDom.querySelectorAll('span[data-text="true"]');
+                } else {
+                  // mobile.twitter.com
+                  editDom = dialog.querySelector('textarea');
+                  if(editDom) {
+                    let value = editDom.value;
+                    if(value) {
+                      let strArr = value.split(' ');
+                      if(strArr && strArr.length) {
+                        for(let i = 0; i < strArr.length; i++) {
+                          eleList.push({
+                            innerText: strArr[i]
+                          })
+                        }
+                      }
+                    }
+                  }
+                }
 
-                let eleList = dialog.querySelector('div[contenteditable="true"]').querySelectorAll('span[data-text="true"]');
-                reportReplyResult(eleList, params, () => {
+                if(eleList.length) {
+                  reportReplyResult(eleList, params, () => {
                     // 上報完成
-                    // iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: {} }, '*');
-                    chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data: { postId: params.postId } }, () => { })
-                })
+                    iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: { postId: params.postId } }, '*');
+                    // chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data: { postId: params.postId } }, () => { })
+                  })
+                }
             });
         }
     }, 1000);
@@ -1462,32 +1511,32 @@ export function doTaskTwitterAPI({ task_data, task_type, tasks, iframeId }) {
 }
 
 export function doTaskIframeTwitterAPI(params) {
-  let {tweet_Id, tweet_text, task_type, tasks, iframeGUId} = JSON.parse(params.data);
-  if(task_type == 'tasks') {
-    tasks.forEach((item) => {
-        switch (String(item.type)) {
-            // 关注指定用户
-            case '1':
-                item.relatedUsers.forEach((item) => {
-                    if (item.name && item.twitterUserId) {
-                        TwitterFollowAPI(item, tweet_Id);
-                    }
-                })
-                break
-            // 点赞
-            case '2':
-                TwitterLikeAPI(tweet_Id)
-                break
-            // 推文发推
-            case '10':
-                // 发推
-                TwitterApiCreateTweet({ text: tweet_text, tweet_Id, iframeId: params.iframeId, iframeGUId, iframeMsg: true })
-                break
-        }
-    })
-  } else if(task_type == 'like') {
-    TwitterLikeAPI(tweet_Id)
-  }
+    let { tweet_Id, tweet_text, task_type, tasks, iframeGUId } = JSON.parse(params.data);
+    if (task_type == 'tasks') {
+        tasks.forEach((item) => {
+            switch (String(item.type)) {
+                // 关注指定用户
+                case '1':
+                    item.relatedUsers.forEach((item) => {
+                        if (item.name && item.twitterUserId) {
+                            TwitterFollowAPI(item, tweet_Id);
+                        }
+                    })
+                    break
+                // 点赞
+                case '2':
+                    TwitterLikeAPI(tweet_Id)
+                    break
+                // 推文发推
+                case '10':
+                    // 发推
+                    TwitterApiCreateTweet({ text: tweet_text, tweet_Id, iframeId: params.iframeId, iframeGUId, iframeMsg: true })
+                    break
+            }
+        })
+    } else if (task_type == 'like') {
+        TwitterLikeAPI(tweet_Id)
+    }
 }
 
 export function showJoinDialog(data) {
@@ -1498,49 +1547,51 @@ export function showJoinDialog(data) {
 }
 
 const TwitterFriendshipsUpdate = (params) => {
-  let {id = '', device = true, name} = params || {};
-  let data = {
-    include_profile_interstitial_type: 1,
-    include_blocking: 1,
-    include_blocked_by: 1,
-    include_followed_by: 1,
-    include_want_retweets: 1,
-    include_mute_edge: 1,
-    include_can_dm: 1,
-    include_can_media_tag: 1,
-    include_ext_has_nft_avatar: 1,
-    skip_status: 1,
-    cursor: -1,
-    id,
-    device
-  }
-  if(!id) {
-    return;
-  }
-  return fetch("https://twitter.com/i/api/1.1/friendships/update.json", {
-      "headers": {
-          "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
-          "content-type": "application/x-www-form-urlencoded",
-          "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
-          "sec-ch-ua-mobile": "?0",
-          "sec-ch-ua-platform": "\"macOS\"",
-          "x-csrf-token": getCookie('ct0'),
-          "x-twitter-active-user": "yes",
-          "x-twitter-auth-type": "OAuth2Session",
-          "x-twitter-client-language": "en",
-          "referer": `https://twitter.com/${name}`
-      },
-      "referrer": `https://twitter.com/${name}`,
-      "referrerPolicy": "strict-origin-when-cross-origin",
-      "body": `include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&cursor=-1&id=${id}&device=true`,
-      "method": "POST",
-      "mode": "cors",
-      "credentials": "include"
-  })
+    let { id = '', device = true, name } = params || {};
+    let data = {
+        include_profile_interstitial_type: 1,
+        include_blocking: 1,
+        include_blocked_by: 1,
+        include_followed_by: 1,
+        include_want_retweets: 1,
+        include_mute_edge: 1,
+        include_can_dm: 1,
+        include_can_media_tag: 1,
+        include_ext_has_nft_avatar: 1,
+        skip_status: 1,
+        cursor: -1,
+        id,
+        device
+    }
+    if (!id) {
+        return;
+    }
+    let url = isMobileTwitter() ? 'https://mobile.twitter.com/i/api/1.1/friendships/update.json' : "https://twitter.com/i/api/1.1/friendships/update.json";
+    return fetch(url, {
+        "headers": {
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/x-www-form-urlencoded",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"macOS\"",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en",
+            "referer": `https://twitter.com/${name}`
+        },
+        "referrer": `https://twitter.com/${name}`,
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": `include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&cursor=-1&id=${id}&device=true`,
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    })
 }
 
 const TwitterFollowAPI = (item, tweet_Id) => {
-    fetch("https://twitter.com/i/api/1.1/friendships/create.json", {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/1.1/friendships/create.json" : "https://twitter.com/i/api/1.1/friendships/create.json"
+    fetch(url, {
         "headers": {
             "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
             "content-type": "application/x-www-form-urlencoded",
@@ -1562,7 +1613,7 @@ const TwitterFollowAPI = (item, tweet_Id) => {
         let task_data = {
             follow_name: item.name
         }
-        TwitterFriendshipsUpdate({id: item.twitterUserId, name: item.name})
+        TwitterFriendshipsUpdate({ id: item.twitterUserId, name: item.name })
 
         chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: true }, () => { })
     }).catch(() => {
@@ -1573,7 +1624,8 @@ const TwitterFollowAPI = (item, tweet_Id) => {
 
 
 const TwitterRetweetAPI = (tweet_Id) => {
-    fetch("https://twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet", {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet" : "https://twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet"
+    fetch(url, {
         "headers": {
             "accept": "*/*",
             "accept-language": "zh,en;q=0.9,zh-CN;q=0.8",
@@ -1605,7 +1657,8 @@ const TwitterRetweetAPI = (tweet_Id) => {
 }
 
 const TwitterLikeAPI = (tweet_Id) => {
-    fetch("https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet", {
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet" : "https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet"
+    fetch(url, {
         "headers": {
             "accept": "*/*",
             "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
@@ -1637,7 +1690,7 @@ const TwitterLikeAPI = (tweet_Id) => {
 }
 
 const TwitterApiCreateTweet = ({ text, tweet_Id, iframeId,
-  iframeGUId, iframeMsg }) => {
+    iframeGUId, iframeMsg }) => {
     let data = {
         queryId: "hC1nuE-2d1NX5LYBuuAvtQ",
         features: {
@@ -1647,7 +1700,9 @@ const TwitterApiCreateTweet = ({ text, tweet_Id, iframeId,
             "vibe_api_enabled": true,
             "responsive_web_edit_tweet_api_enabled": false,
             "standardized_nudges_misinfo": true,
-            "responsive_web_enhance_cards_enabled": false
+            "responsive_web_enhance_cards_enabled": false,
+            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false,
+            "responsive_web_text_conversations_enabled": false
         },
         variables: {
             "tweet_text": text,
@@ -1664,7 +1719,8 @@ const TwitterApiCreateTweet = ({ text, tweet_Id, iframeId,
             "dark_request": false
         }
     };
-    axios.post(`https://twitter.com/i/api/graphql/hC1nuE-2d1NX5LYBuuAvtQ/CreateTweet`,
+    let url = isMobileTwitter() ? "https://mobile.twitter.com/i/api/graphql/K9It0MijE2UOlX-8wLyPYA/CreateTweet" : "https://twitter.com/i/api/graphql/hC1nuE-2d1NX5LYBuuAvtQ/CreateTweet"
+    axios.post(url,
         data, {
         headers: {
             "accept": "*/*",
@@ -1683,31 +1739,43 @@ const TwitterApiCreateTweet = ({ text, tweet_Id, iframeId,
             "x-twitter-client-language": "en"
         },
     }).then(function (response) {
-      console.log(response)
-      let data = response.data;
-      if(iframeMsg) {
-        messageCenter.send(iframeId, 'CONTENT_CREATE_TWEET_FINISH', {
-          tweet_Id, iframeId, iframeGUId, response: data, done: true
-        })
-      } else {
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet1', task_data: '', task_done: '是', response, iframeId })
-      }
+        console.log(response)
+        let data = response.data;
+        if (iframeMsg) {
+            messageCenter.send({
+                info: {
+                    iframeId,
+                    actionType: 'CONTENT_CREATE_TWEET_FINISH'
+                },
+                data: {
+                    tweet_Id, iframeId, iframeGUId, response: data, done: true
+                }
+            })
+        } else {
+            chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet1', task_data: '', task_done: '是', response, iframeId })
+        }
     }).catch(function (err) {
-      console.log('err --1', err)
-      if(iframeMsg) {
-        messageCenter.send(iframeId, 'CONTENT_CREATE_TWEET_FINISH', {
-          tweet_Id, iframeId, iframeGUId, done: false
-        })
-
-      } else {
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet1', task_data: '', task_done: '否', iframeId })
-      }
+        console.log('err --1', err)
+        if (iframeMsg) {
+            messageCenter.send({
+                info: {
+                    iframeId,
+                    actionType: 'CONTENT_CREATE_TWEET_FINISH'
+                },
+                data: {
+                    tweet_Id, iframeId, iframeGUId, done: false
+                }
+            })
+        } else {
+            chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet1', task_data: '', task_done: '否', iframeId })
+        }
     });
 }
 
 const TwitterApiUserByScreenNameReq = (params) => {
     let { screen_name } = params || {};
-    return 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`, {
+    let url = isMobileTwitter() ? `https://mobile.twitter.com/i/api/graphql/gr8Lk09afdgWo7NvzP89iQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D` : `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`
+    return axios.get(url, {
         headers: {
             "accept": "*/*",
             "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
@@ -1732,22 +1800,35 @@ export const TwitterApiUserByScreenName = (params, cb) => {
     let { screen_name, tweetId = '', objectType = '', iframeId = '', iframeMsg = false, iframeGUId } = params;
 
     TwitterApiUserByScreenNameReq({ screen_name }).then(function (response) {
-      if(iframeMsg) {
-        messageCenter.send(iframeId, 'CONTENT_API_GET_TWEET_USER_INFO_END', {
-          iframeGUId, response: response.data.data || {}, objectType
-        })
-      } else {
-        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}, tweetId, objectType, iframeId }, () => { })
-      }
+        if (iframeMsg) {
+            messageCenter.send({
+                info: {
+                    iframeId,
+                    actionType: 'CONTENT_API_GET_TWEET_USER_INFO_END'
+                },
+                data: {
+                    iframeGUId, response: response.data.data || {}, objectType
+                }
+            })
+        } else {
+            chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}, tweetId, objectType, iframeId }, () => { })
+        }
 
     }).catch(function (err) {
-      if(iframeMsg) {
-        messageCenter.send(iframeId, 'CONTENT_API_GET_TWEET_USER_INFO_END', {
-          iframeGUId, response: {}, objectType
-        })
-      } else {
-        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: {}, tweetId, objectType, iframeId }, () => { })
-      }
+        if (iframeMsg) {
+            messageCenter.send({
+                info: {
+                    iframeId,
+                    actionType: 'CONTENT_API_GET_TWEET_USER_INFO_END'
+                },
+                data: {
+                    iframeGUId, response: {}, objectType
+
+                }
+            })
+        } else {
+            chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: {}, tweetId, objectType, iframeId }, () => { })
+        }
     });
 }
 
@@ -2403,7 +2484,12 @@ const addPageScrollEvent = () => {
         contentHeight: contentDom.offsetHeight
     }
 
-    messageCenter.send('de-tab-group-content', 'CONTENT_GROUP_LIST_SCROLL', data)
+    messageCenter.send({
+        info: {
+            iframeId: 'de-tab-group-content', actionType: 'CONTENT_GROUP_LIST_SCROLL'
+        },
+        data
+    })
 
     // chrome.runtime.sendMessage({
     //     actionType: "CONTENT_GROUP_LIST_SCROLL",
@@ -2489,7 +2575,11 @@ const setGroupTabSelfStyle = (params = {}) => {
  * 切换到 Group tab时 刷新列表
  */
 export const refreshTabGroup = () => {
-    messageCenter.send('de-tab-group-content', 'CONTENT_REFRESH_TAB_GROUP_LIST', {})
+    messageCenter.send({
+        info: {
+            iframeId: 'de-tab-group-content', actionType: 'CONTENT_REFRESH_TAB_GROUP_LIST'
+        }
+    })
     //     chrome.runtime.sendMessage({
     //         actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
     //         data: {}
@@ -2570,7 +2660,7 @@ const addTabGroupContent = (cb) => {
     }
     let iframe = document.createElement('iframe');
     iframe.id = 'de-tab-group-content';
-    iframe.src = getInnerIframeURL(`${iframeHost}/tab-group` + `?params=${JSON.stringify(params)}&iframeID=${iframe.id}`);
+    iframe.src = getInnerIframeURL(`${iframeHost}/tab-group` + `?params=${JSON.stringify(params)}&iframeId=${iframe.id}`);
     iframe.style.cssText = `border: medium none; height: 500px;display: none`
 
     let iframeContent = getGroupTabContentNode();
@@ -2672,7 +2762,9 @@ export const getTweetProfileNavTop = (params) => {
     let top = document.querySelector('div[role="tablist"]').closest('nav').getBoundingClientRect().top;
 
     messageCenter.send({
-        actionType: "CONTENT_SEND_GROUP_NAV_TOP",
+        info: {
+            actionType: "CONTENT_SEND_GROUP_NAV_TOP"
+        },
         data: {
             top,
             scrollTop: params.scrollTop
@@ -2718,7 +2810,13 @@ export const setGroupInfo = (params = {}) => {
 
 export const getExtensionStorgeDataForIframe = (data) => {
     getChromeStorage(data.key).then((res) => {
-        messageCenter.send(data.iframeID, `IFRAME_GET_EXTENSION_STORGE_DATA-${data.messageID}`, res)
+        messageCenter.send({
+            info: {
+                iframeId: data.iframeId,
+                actionType: `IFRAME_GET_EXTENSION_STORGE_DATA-${data.messageId}`
+            },
+            data: res
+        })
     });
 }
 
@@ -2745,7 +2843,9 @@ const sysThemeChange = () => {
     setTimeout(() => {
         let bgColor = document.querySelector('body').style.backgroundColor;
         messageCenter.send({
-            actionType: "CONTENT_SYS_THEME_CHANGE",
+            info: {
+                actionType: "CONTENT_SYS_THEME_CHANGE"
+            },
             data: {
                 theme: systemInfo.theme,
                 twitterTheme: bgColor == 'rgb(0, 0, 0)' ? 'dark' : 'light'
@@ -2785,11 +2885,17 @@ export const showPublishDialog = () => {
 
 // 获取推文发送回去
 export const sendContentByTwitterID = (params) => {
-  let {tweet_Id, iframeGUId} = JSON.parse(params.data);
+    let { tweet_Id, iframeGUId } = JSON.parse(params.data);
     // 获取内容
     let txt = parseCard.getContentByTwitterId(tweet_Id);
-    messageCenter.send(params.iframeId, 'CONTENT_GET_TWEET_TXT', {
-      iframeGUId, tweet_Id, txt
+    messageCenter.send({
+      info: {
+          iframeId: params.iframeId,
+          actionType: 'CONTENT_GET_TWEET_TXT'
+      },
+      data: {
+          tweet_Id, txt, iframeGUId
+      }
     })
     // 发送
     // chrome.runtime.sendMessage({

+ 3 - 3
src/manifest.json

@@ -2,8 +2,8 @@
     "manifest_version": 3,
     "name": "DeNet",
     "description": "Growing more twitter followers with Denet",
-    "version": "1.1.7.3",
-    "denet_app_version_code": "23",
+    "version": "1.1.7.4",
+    "denet_app_version_code": "24",
     "background": {
         "service_worker": "/js/background.js"
     },
@@ -107,4 +107,4 @@
             ]
         }
     ]
-}
+}

+ 0 - 6
src/uilts/denet.js

@@ -1,6 +0,0 @@
-import Content from '@/uilts/messageCenter/messageContent'
-
-let denet = {}
-denet.content = Content
-
-export default denet

+ 9 - 1
src/uilts/help.js

@@ -320,4 +320,12 @@ export const getBeforeTimeFormat = (timestamp) => {
   }
   let _s = moment.duration(_d1.diff(_d2)).seconds()
   return plural(_s, 'sec')
-}
+}
+
+export function isMobileTwitter() {
+  let isMobile = false;
+  if(window.location.href.startsWith('https://mobile.twitter.com')) {
+    isMobile = true;
+  }
+  return isMobile;
+}

+ 129 - 0
src/uilts/messageCenter/chrome/index.js

@@ -0,0 +1,129 @@
+import { guid } from '@/uilts/help'
+//  iframe 通信中心
+class ChromeMessageCenter {
+    constructor() {
+        //  缓存事件队列
+        this.messageCallbackMap = new Map();
+        this.messageFailbackMap = new Map();
+        this.timer = null
+    }
+
+    sendToContent(sender, { info = {}, data = {}, callback, overTime, failback }) {
+        if (!info.messageId) {
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        try {
+            chrome.tabs.sendMessage(sender.tab.id, {
+                info,
+                data
+            })
+
+            if (info.messageId && callback) {
+                // 带回调callback 的message, 要求携带messageId,callback,failback等
+                this.listen(info.messageId, callback)
+            }
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+
+        } catch (error) {
+            failback({
+                error: 2,
+                msg: String(error)
+            })
+        }
+    }
+
+    sendToSW({ info = {}, data = {}, callback, overTime, failback }) {
+        if (!info.messageId) {
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        try {
+            chrome.runtime.sendMessage({
+                info,
+                data
+            })
+
+            if (info.messageId && callback) {
+                // 带回调callback 的message, 要求携带messageId,callback,failback等
+                this.listen(info.messageId, callback)
+            }
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+
+        } catch (error) {
+            failback({
+                error: 2,
+                msg: String(error)
+            })
+        }
+    }
+
+    listen(messageId, callback) {
+        // 序列添加失败回调
+        this.messageCallbackMap.set(messageId, { callback })
+    }
+
+    addFailback(messageId, overTime = 2000, failback) {
+        // 序列添加失败回调
+        this.messageFailbackMap.set(messageId, {
+            time: new Date().getTime(),
+            overTime,
+            failback
+        })
+        this.checkTimer()
+    }
+
+    init(req = {}) {
+        const { info, data } = req;
+        if (!info || !data) {
+            return
+        }
+        // 序列删除 失败回调
+        this.messageFailbackMap.delete(info.messageId);
+
+        // 执行成功回调
+        const _item = this.messageCallbackMap.get(info.messageId);
+        if (_item) {
+            const callback = _item.callback
+            callback(data)
+            // 序列删除 成功回调
+            this.messageCallbackMap.delete(info.messageId)
+        }
+        this.checkTimer()
+    }
+    checkTimer() {
+        if (this.timer) {
+            return
+        }
+        let key, value, now_time
+        this.timer = setInterval(() => {
+            if (this.messageFailbackMap.size == 0) {
+                clearInterval(this.timer)
+                this.timer = null
+            }
+
+            // 轮询查看有无超期的message信息
+            now_time = new Date().getTime();
+            for (let item of this.messageFailbackMap.entries()) {
+                key = item[0] || ''
+                value = item[1] || {}
+
+                if (now_time - value.time > value.overTime) {
+                    const callback = value.failback
+                    callback && callback({
+                        error: 1,
+                        msg: "message 超时错误"
+                    })
+                    this.messageFailbackMap.delete(key)
+                }
+            }
+        }, 1000)
+    }
+}
+
+// messageCenter在页面内实例化一次
+const chromeMessageCenter = new ChromeMessageCenter();
+
+export default chromeMessageCenter;

+ 13 - 0
src/uilts/messageCenter/chrome/messageEnum.js

@@ -0,0 +1,13 @@
+/** 向ServiceWorker发送的事件定义 */
+const CONTENT_TO_BACK_ENUM = {
+    CONTENT_TO_BACK_TEST: 'CONTENT_TO_BACK_TEST'
+}
+
+
+/** 接收ServiceWorker的事件定义 */
+const BACK_TO_CONTENT_ENUM = {
+    /** 切换到group tab */
+    BACK_TO_CONTENT_TEST: 'BACK_TO_CONTENT_TEST'
+}
+
+export default { ...CONTENT_TO_BACK_ENUM, ...BACK_TO_CONTENT_ENUM }

+ 60 - 0
src/uilts/messageCenter/content/index.js

@@ -0,0 +1,60 @@
+class ContentMessageCenter {
+    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({ info, data }) {
+        const target = this.findIframeById(info.iframeId);
+        target && target.contentWindow.postMessage({
+            info,
+            data
+        }, '*')
+    }
+
+    sendAll({ info, data }) {
+        const targets = document.querySelectorAll('iframe[data-card=denet]') || []
+        targets.forEach((item) => {
+            item.contentWindow.postMessage({
+                info,
+                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 contentMessageCenter = new ContentMessageCenter();
+
+export default contentMessageCenter;

+ 0 - 3
src/uilts/messageCenter/messageEnum.js → src/uilts/messageCenter/content/messageEnum.js

@@ -7,9 +7,6 @@ const SEND_MESSAGE_ENUM = {
     /** 获取content的localstorge数据 */
     IFRAME_GET_EXTENSION_STORGE_DATA: 'IFRAME_GET_EXTENSION_STORGE_DATA',
 
-    // ---- 做任务 ----
-    IFRAME_DO_TASK_CREATE_TWEET: 'IFRAME_DO_TASK_CREATE_TWEET'
-
 }
 
 /** 接收父窗口的事件定义 */

+ 106 - 0
src/uilts/messageCenter/iframe/index.js

@@ -0,0 +1,106 @@
+import { guid } from '@/uilts/help'
+//  iframe 通信中心
+class IframeMessageCenter {
+    constructor() {
+        //  缓存事件队列
+        this.messageCallbackMap = new Map();
+        this.messageFailbackMap = new Map();
+        this.timer = null
+        this.init()
+    }
+
+    send({ info = {}, data = {}, callback, overTime, failback }) {
+        if (callback) {
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        window.parent.postMessage({
+            info,
+            data
+        }, '*');
+        if (info.messageId && callback) {
+            // 带回调callback 的message, 要求携带messageId,callback,failback等
+            this.listen(info.messageId, callback)
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+        }
+    }
+
+    listen(key, callback) {
+        // 序列添加失败回调
+        this.messageCallbackMap.set(key, { callback })
+    }
+
+    addFailback(key, overTime = 2000, failback) {
+        // 序列添加失败回调
+        this.messageFailbackMap.set(key, {
+            time: new Date().getTime(),
+            overTime,
+            failback
+        })
+        this.checkTimer()
+    }
+
+    init() {
+        window.addEventListener('message', (e) => {
+            let { info = {}, data = {} } = e.data;
+            let key, item
+
+            // 如果有messageId && 是自己发送的
+            if (info.messageId) {
+                key = info.messageId
+                item = this.messageCallbackMap.get(key)
+            }
+
+            if (info.actionType && !item) {
+                key = info.actionType
+                item = this.messageCallbackMap.get(key)
+            }
+
+            // 执行成功回调
+            if (item) {
+                // 序列删除 失败回调      
+                this.messageFailbackMap.delete(key)
+                const callback = item.callback
+                callback(data)
+                // 序列删除 成功回调
+                this.messageCallbackMap.delete(key)
+            }
+        })
+
+        this.checkTimer()
+    }
+    checkTimer() {
+        if (this.timer) {
+            return
+        }
+        let key, value, now_time
+        this.timer = setInterval(() => {
+            if (this.messageFailbackMap.size == 0) {
+                clearInterval(this.timer)
+                this.timer = null
+            }
+
+            // 轮询查看有无超期的message信息
+            now_time = new Date().getTime();
+            for (let item of this.messageFailbackMap.entries()) {
+                key = item[0] || ''
+                value = item[1] || {}
+
+                if (now_time - value.time > value.overTime) {
+                    const callback = value.failback
+                    callback && callback({
+                        error: 1,
+                        msg: "message 超时错误"
+                    })
+                    this.messageFailbackMap.delete(key)
+                }
+            }
+        }, 1000)
+    }
+}
+
+// messageCenter在每个iframe内实例化一次
+const iframeMessageCenter = new IframeMessageCenter();
+
+export default iframeMessageCenter;

+ 34 - 0
src/uilts/messageCenter/iframe/messageEnum.js

@@ -0,0 +1,34 @@
+/** 向父窗口发送的事件定义 */
+const SEND_MESSAGE_ENUM = {
+    IFREME_TAB_GROUP_SET_IFRAME_HEIGHT: 'IFREME_TAB_GROUP_SET_IFRAME_HEIGHT',
+    /** group tab 内的列表项点击 */
+    IFRAME_PAGE_JUMP: 'IFRAME_PAGE_JUMP',
+    IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP: 'IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP',
+    /** 获取content的localstorge数据 */
+    IFRAME_GET_EXTENSION_STORGE_DATA: 'IFRAME_GET_EXTENSION_STORGE_DATA',
+    // ---- 做任务 ----
+    IFRAME_DO_TASK_CREATE_TWEET: 'IFRAME_DO_TASK_CREATE_TWEET',
+    IFRAME_DO_TASK_LIKE: 'IFRAME_DO_TASK_LIKE',
+    IFRAME_DO_TASK_FOLLOWS: 'IFRAME_DO_TASK_FOLLOWS',
+    IFRAME_DO_TASK_RETWEET: 'IFRAME_DO_TASK_RETWEET',
+
+    // ---- 获取推文内容 ----
+    IFRAME_DOM_GET_TWEET_TEXT: 'IFRAME_DOM_GET_TWEET_TEXT',
+
+    // ---- 获取twitter用户信息 ----
+    IFRAME_GET_TWITTER_USER_INFO: 'IFRAME_GET_TWITTER_USER_INFO',
+
+
+}
+
+/** 接收父窗口的事件定义 */
+const RECEIVE_MESSAGE_ENUM = {
+    /** 切换到group tab */
+    CONTENT_REFRESH_TAB_GROUP_LIST: 'CONTENT_REFRESH_TAB_GROUP_LIST',
+    /** group打开时,页面发生滚动 */
+    CONTENT_GROUP_LIST_SCROLL: 'CONTENT_GROUP_LIST_SCROLL',
+    CONTENT_SEND_GROUP_NAV_TOP: 'CONTENT_SEND_GROUP_NAV_TOP',
+    CONTENT_SYS_THEME_CHANGE: 'CONTENT_SYS_THEME_CHANGE'
+}
+
+export default { ...SEND_MESSAGE_ENUM, ...RECEIVE_MESSAGE_ENUM }

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

@@ -1,50 +0,0 @@
-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;

+ 0 - 39
src/uilts/messageCenter/messageContent.js

@@ -1,39 +0,0 @@
-// class message  
-import messageCenter from '@/uilts/messageCenter';
-import MESSAGE_ENUM from "@/uilts/messageCenter/messageEnum";
-import { guid, iframeID } from '@/uilts/help.js'
-
-// content.createTweets('iframe') 
-
-// 做任务
-class doTask {
-    createTweet({ txt = '' }) {
-        return new Promise((res, rej) => {
-            messageCenter.send({
-                actionType: MESSAGE_ENUM.IFRAME_DO_TASK_CREATE_TWEET,
-                data: {
-                    iframeID,//用于告诉父窗口会传消息给哪个iframe 
-                    messageID: guid()// 唯一的ID,用于标记回调函数
-                },
-                info: {
-                    txt
-                },
-                callback: (data) => {
-                    res(data)
-                },
-                failback: (e) => {
-                    rej(e)
-                }
-            })
-        })
-        // console.log(window.parent.window.atest)
-        // window.postMessage({actionType: 'iframe_test', data: key})
-    }
-}
-
-
-export default {
-    doTask() {
-        return new doTask()
-    }
-}

+ 39 - 0
src/view/components/loading.vue

@@ -0,0 +1,39 @@
+<template>
+    <img :src="icon" alt="" class="loading"
+        :style="{ 'width': `${width}px`, 'height': `${height}px`, 'margin-left': `-${width / 2}px`, 'margin-top': `-${height / 2}px` }" />
+</template>
+<script setup>
+import { defineProps } from "vue";
+const props = defineProps({
+    width: {
+        type: Number,
+        default: 40
+    },
+    height: {
+        type: Number,
+        default: 40
+    },
+    icon: {
+        type: String,
+        default: require('@/assets/svg/icon-loading-gray2.svg')
+    }
+})
+</script>
+<style lang="scss" scoped>
+.loading {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    animation: rotation 1s linear infinite;
+}
+
+@keyframes rotation {
+    from {
+        -webkit-transform: rotate(0deg);
+    }
+
+    to {
+        -webkit-transform: rotate(360deg);
+    }
+}
+</style>

+ 24 - 14
src/view/iframe/publish/components/get-more.vue

@@ -1,23 +1,26 @@
 <template>
-    <div class="get-more-btns"  v-if="props.style_type == 3">
+    <div class="get-more-btns" v-if="props.style_type == 3">
         <div class="get-more-btn" @click="jumpMore">
             <img width="22" :src="require('@/assets/svg/icon-wallet-success.svg')" />
-            <font>View wallet</font>
+            <span>View wallet</span>
         </div>
         <div class="get-more-btn" @click="jumpMore">
             <img width="22" :src="require('@/assets/svg/icon-big-give.svg')" />
-            <font>Get More Giveaway</font>
+            <span>Get More Giveaway</span>
         </div>
     </div>
     <div class="getMore" @click="jumpMore" v-if="props.style_type == 1">
         <img width="20" :src="require('@/assets/svg/icon-big-give.svg')" />
-        <font>Get More Giveaway</font>
+        <span>Get More Giveaway</span>
         <img height="20" :src="require('@/assets/svg/icon-cell-arrow-right.svg')" />
     </div>
     <div class="get_more" v-if="props.style_type == 2" @click="jumpMore">
         <img width="18" :src="require('@/assets/svg/icon-big-give.svg')" />
         <span>Get More Giveaway</span>
     </div>
+    <div v-if="style_type == 4" @click="jumpMore">
+        <slot></slot>
+    </div>
 </template>
 
 <script setup>
@@ -48,13 +51,16 @@ onBeforeMount(() => {
 })
 
 const jumpMore = () => {
-    Report.reportLog({
-      pageSource: props.reportData.pageSource,
-      businessType: Report.businessType.buttonClick,
-      objectType: Report.objectType.getMoreGiveaway,
-      postId: props.reportData.postId,
-      redPacketType: props.reportData.redPacketType
-    });
+    if (props.reportData) {
+        Report.reportLog({
+            pageSource: props.reportData.pageSource,
+            businessType: Report.businessType.buttonClick,
+            objectType: Report.objectType.getMoreGiveaway,
+            postId: props.reportData.postId,
+            redPacketType: props.reportData.redPacketType
+        });
+    }
+
     if (moreUrl.value) {
         window.open(moreUrl.value)
     }
@@ -76,7 +82,7 @@ const jumpMore = () => {
         margin: 0 5px;
     }
 
-    font {
+    span {
         color: #000;
         font-size: 15px;
         font-weight: 500;
@@ -100,7 +106,8 @@ const jumpMore = () => {
         margin-right: 8px;
     }
 }
-.get-more-btns  {
+
+.get-more-btns {
     display: flex;
     cursor: pointer;
     user-select: none;
@@ -109,6 +116,7 @@ const jumpMore = () => {
     padding: 13px 0;
     box-shadow: 0px -2px 10px rgba(0, 0, 0, 0.06);
     position: relative;
+
     .get-more-btn {
         flex: 1;
         display: flex;
@@ -118,6 +126,7 @@ const jumpMore = () => {
         align-items: center;
         justify-content: center;
         height: 44px;
+
         font {
             font-weight: 600;
             font-size: 14px;
@@ -127,6 +136,7 @@ const jumpMore = () => {
             color: #000000;
         }
     }
+
     &::after {
         content: "";
         width: 1px;
@@ -134,7 +144,7 @@ const jumpMore = () => {
         position: absolute;
         left: 50%;
         top: 13px;
-        background-color: rgba(0,0,0,.2);
+        background-color: rgba(0, 0, 0, .2);
         transform: scale(0.5);
         transform-origin: 0 0;
     }

+ 62 - 78
src/view/iframe/red-packet/luck-draw.vue

@@ -470,6 +470,7 @@ import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue';
 import customCardCover from '@/view/components/custom-card-cover.vue';
 import { RewardType, PlayType } from "@/types";
+import denet from '@/denet'
 
 var moment = require('moment');
 
@@ -579,13 +580,8 @@ async function clickLikeBtn() {
             break
         case '3':
             state.loading_show = true
-            chrome.tabs.getCurrent((tab) => {
-                chrome.tabs.sendMessage(tab.id, {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-                        tweet_Id: state.tweetId
-                    }, task_type: 'like'
-                }, (res) => { console.log(res) });
-            })
+            let likeRes = await denet.content.doTask.like({ tweetId: state.tweetId });
+            likeRes && doTaskReport({...likeRes, task_type: 'like', do_type: 'api'}, {tab: {}});
             break
         default:
             window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
@@ -696,13 +692,8 @@ async function clickRetweetBtn() {
             break
         case '3':
             state.loading_show = true
-            chrome.tabs.getCurrent((tab) => {
-                chrome.tabs.sendMessage(tab.id, {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-                        tweet_Id: state.tweetId
-                    }, task_type: 'retweet'
-                }, (res) => { console.log(res) });
-            })
+            let retweetRes = await denet.content.doTask.reTweet({ tweetId: state.tweetId });
+            retweetRes && doTaskReport({...retweetRes, task_type: 'retweet', do_type: 'api'}, {tab: {}});
             break
         default:
             window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
@@ -725,6 +716,7 @@ async function clickRetweetBtn() {
 function onTweetReplyClick(params) {
     let replyData = {
         postId: state.postId,
+        iframeId: state.iframeId,
         type: params.type,
         taskLuckdropId: state.detail.taskLuckdropId
     }
@@ -761,6 +753,7 @@ async function clickReply(params) {
 
     let replyData = {
         postId: state.postId,
+        iframeId: state.iframeId,
         type: params.type,
         taskLuckdropId: state.detail.taskLuckdropId
     }
@@ -850,7 +843,8 @@ function feacebookShareUrl(params = {}) {
     let { href = '', type = '', taskLuckdropId } = params;
     let cbParams = JSON.stringify({
         type,
-        taskLuckdropId
+        taskLuckdropId,
+        iframeId: state.iframeId
     })
     let shareUrl = `https://www.facebook.com/dialog/share?app_id=${facebookAppConfig.facebookAppId}&display=popup&href=${href}&redirect_uri=${facebookAppConfig.faceShareRedirectUrl}?params=${cbParams}`;
 
@@ -1012,16 +1006,20 @@ async function clickFollowAll(item, is_all) {
             arr_name.forEach((item) => {
                 follow_data.push(item)
             })
-            state.loading_show = true
-            chrome.tabs.getCurrent((tab) => {
-                chrome.tabs.sendMessage(tab.id, {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK",
-                    task_data: {
-                        tweet_Id: state.tweetId,
-                        follow_data: follow_data,
-                    },
-                    task_type: 'follow'
-                }, (res) => { console.log(res) });
+            state.loading_show = true;
+            let promiseList = [];
+            for (let i = 0; i < follow_data.length; i++) {
+                promiseList[i] = denet.content.doTask.follows({ follow_name: follow_data[i]['name'], twitterUserId: follow_data[i]['twitterUserId'] });
+            }
+
+            Promise.allSettled(promiseList).then((res) => {
+                if (res && res.length) {
+                    let resList = res.filter(item => item.status == 'fulfilled');
+                    for (let i = 0; i < resList.length; i++) {
+                      let item = resList[i].value;
+                      item && doTaskReport({...item, task_type: 'follow', task_data: {follow_name: item.follow_name}, do_type: 'api'}, {tab: {}});
+                    }
+                }
             })
 
             break
@@ -1072,16 +1070,38 @@ const reSetBindTwtterId = (_params) => {
     })
 }
 
-const reportBindTweetSuccess = (params) => {
+const reportBindTweetSuccess = async (params) => {
     let { discordTask, srcUserId } = params || {};
     discordTaskDetail = discordTask;
-    sendCurrentTabMessage({
-        actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
-        data: {
-            screen_name: srcUserId,
-            tweetId: state.tweetId
-        }
-    })
+
+    let {user = {}} = await denet.content.getData.getUserInfoByName({ screen_name: srcUserId });
+    if (user && user.result && user.result.legacy) {
+      let legacy = user.result.legacy;
+      reportParams.twitterFans = legacy ? legacy.followers_count : 0;
+
+      if (!discordTaskDetail) {
+          if (reportParams.hasReport) return;
+          reportParams.hasReport = true;
+          Report.reportLog({
+              objectType: Report.objectType.tweetPostBinded,
+              twitterFans: reportParams.twitterFans,
+              redPacketType: 1,
+              postId: state.postId
+          });
+      } else {
+          if (reportParams.discordFans !== '') {
+              if (reportParams.hasReport) return;
+              reportParams.hasReport = true;
+              Report.reportLog({
+                  objectType: Report.objectType.tweetPostBinded,
+                  twitterFans: reportParams.twitterFans,
+                  discordFans: reportParams.discordFans,
+                  redPacketType: 1,
+                  postId: state.postId
+              });
+          }
+      }
+    }
 
     if (discordTask) {
         getDiscordInfo({ inviteUrl: JSON.parse(discordTask.bizData).inviteUrl }, (res) => {
@@ -1455,7 +1475,7 @@ function initTaskDetail(cb) {
 let tab_index = 0
 const doTaskReport = (req, sender) => {
     state.loading_show = false
-    let follow_name = req.task_data.follow_name || ''
+    let follow_name = req.task_data ? req.task_data.follow_name : '';
     // 1 Twitter follow Twitter ScreenName
     // 2 Tweet like
     // 3 Retweet
@@ -1564,6 +1584,8 @@ onMounted(() => {
     state.process_mode = process.env.NODE_ENV
     state.postId = getQueryString('postId')
     state.window_origin = getQueryString('window_origin') || '';
+    state.iframeId = getQueryString('iframeId') || ''
+
     if (state.window_origin.indexOf('twitter.com') > -1) {
         state.tweetId = getQueryString('tweetId')
         state.tweet_author = getQueryString('tweet_author');
@@ -1964,12 +1986,14 @@ function handleErrorCode(res) {
 //   });
 // }
 function onWindowMessage() {
-    window.addEventListener("message", function (event) {
+    window.onmessage = function (event) {
         if (event.data) {
             switch (event.data.actionType) {
                 case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-                    state.done.reply = true;
-                    state.done.reply_red = false;
+                    if (event.data.data.postId == state.postId) {
+                        state.done.reply = true;
+                        state.done.reply_red = false;
+                    }
                     break;
                 case 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR':
                     fullName = event.data.data.fullName
@@ -1979,7 +2003,7 @@ function onWindowMessage() {
                     break;
             }
         }
-    });
+    }
 }
 
 function onPageVisbile() {
@@ -2008,42 +2032,6 @@ function onRuntimeMsg() {
                 state.loading_show = false
                 doTaskReport(req, sender);
                 break;
-            case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-                if (req.data && req.data.postId == state.postId) {
-                    state.done.reply = true;
-                    state.done.reply_red = false;
-                }
-                break;
-            case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
-                let { user } = req.data || {};
-                if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
-                    let legacy = user.result.legacy;
-                    reportParams.twitterFans = legacy ? legacy.followers_count : 0;
-
-                    if (!discordTaskDetail) {
-                        if (reportParams.hasReport) return;
-                        reportParams.hasReport = true;
-                        Report.reportLog({
-                            objectType: Report.objectType.tweetPostBinded,
-                            twitterFans: reportParams.twitterFans,
-                            redPacketType: 1,
-                            postId: state.postId
-                        });
-                    } else {
-                        if (reportParams.discordFans !== '') {
-                            if (reportParams.hasReport) return;
-                            reportParams.hasReport = true;
-                            Report.reportLog({
-                                objectType: Report.objectType.tweetPostBinded,
-                                twitterFans: reportParams.twitterFans,
-                                discordFans: reportParams.discordFans,
-                                redPacketType: 1,
-                                postId: state.postId
-                            });
-                        }
-                    }
-                }
-                break;
             case 'USER_SETTING':
                 setNotification(req.data)
                 break;
@@ -2171,10 +2159,6 @@ function discordAuth(actionState = 'default') {
                     type: 'normal',
                     url: authorizeUrl
                 }, function (window) {
-                    let windowId = window.id;
-                    callEventPageMethod("RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID", {
-                        windowId: windowId
-                    });
                 })
             }
         }

+ 56 - 75
src/view/iframe/red-packet/red-packet.vue

@@ -425,6 +425,7 @@ import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue'
 import customCardCover from '@/view/components/custom-card-cover.vue';
 import { RewardType, PlayType } from '@/types';
+import denet from '@/denet'
 
 var moment = require('moment');
 
@@ -529,13 +530,9 @@ async function clickLikeBtn() {
       break
     case '3':
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-            tweet_Id: state.tweetId
-          }, task_type: 'like'
-        }, (res) => { console.log(res) });
-      })
+      let likeRes = await denet.content.doTask.like({ tweetId: state.tweetId });
+      likeRes && doTaskReport({...likeRes, task_type: 'like', do_type: 'api'}, {tab: {}});
+
       break
     default:
       window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
@@ -644,13 +641,8 @@ async function clickRetweetBtn() {
       break
     case '3':
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-            tweet_Id: state.tweetId
-          }, task_type: 'retweet'
-        }, (res) => { console.log(res) });
-      })
+      let retweetRes = await denet.content.doTask.reTweet({ tweetId: state.tweetId });
+      retweetRes && doTaskReport({...retweetRes, task_type: 'retweet', do_type: 'api'}, {tab: {}});
       break
     default:
       window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
@@ -672,6 +664,7 @@ async function clickRetweetBtn() {
 function onTweetReplyClick(params) {
   let replyData = {
     postId: state.postId,
+    iframeId: state.iframeId,
     type: params.type,
     taskLuckdropId: state.detail.taskLuckdropId
   }
@@ -687,6 +680,7 @@ async function clickReply(params) {
 
   let replyData = {
     postId: state.postId,
+    iframeId: state.iframeId,
     type: params.type,
     taskLuckdropId: state.detail.taskLuckdropId
   }
@@ -895,17 +889,20 @@ async function clickFollowAll(item, is_all) {
         follow_data.push(item)
       })
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK",
-          task_data: {
-            tweet_Id: state.tweetId,
-            follow_data: follow_data,
-          },
-          task_type: 'follow'
-        }, (res) => { console.log(res) });
-      })
+      let promiseList = [];
+      for (let i = 0; i < follow_data.length; i++) {
+          promiseList[i] = denet.content.doTask.follows({ follow_name: follow_data[i]['name'], twitterUserId: follow_data[i]['twitterUserId'] });
+      }
 
+      Promise.allSettled(promiseList).then((res) => {
+        if (res && res.length) {
+            let resList = res.filter(item => item.status == 'fulfilled');
+            for (let i = 0; i < resList.length; i++) {
+              let item = resList[i].value;
+              item && doTaskReport({...item, task_type: 'follow', task_data: {follow_name: item.follow_name}, do_type: 'api'}, {tab: {}});
+            }
+        }
+      })
       break
     default:
       openFollowTabs(arr_name)
@@ -953,16 +950,37 @@ const reSetBindTwtterId = (_params) => {
   })
 }
 
-const reportBindTweetSuccess = (params) => {
+const reportBindTweetSuccess = async (params) => {
   let { discordTask, srcUserId } = params || {};
   discordTaskDetail = discordTask;
-  sendCurrentTabMessage({
-    actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
-    data: {
-      screen_name: srcUserId,
-      tweetId: state.tweetId
+  let {user = {}} = await denet.content.getData.getUserInfoByName({ screen_name: srcUserId });
+  if (user && user.result && user.result.legacy) {
+    let legacy = user.result.legacy;
+    reportParams.twitterFans = legacy ? legacy.followers_count : 0;
+
+    if (!discordTaskDetail) {
+        if (reportParams.hasReport) return;
+        reportParams.hasReport = true;
+        Report.reportLog({
+            objectType: Report.objectType.tweetPostBinded,
+            twitterFans: reportParams.twitterFans,
+            redPacketType: 1,
+            postId: state.postId
+        });
+    } else {
+        if (reportParams.discordFans !== '') {
+            if (reportParams.hasReport) return;
+            reportParams.hasReport = true;
+            Report.reportLog({
+                objectType: Report.objectType.tweetPostBinded,
+                twitterFans: reportParams.twitterFans,
+                discordFans: reportParams.discordFans,
+                redPacketType: 1,
+                postId: state.postId
+            });
+        }
     }
-  })
+  }
 
   if (discordTask) {
     getDiscordInfo({ inviteUrl: JSON.parse(discordTask.bizData).inviteUrl }, (res) => {
@@ -1291,7 +1309,8 @@ function initTaskDetail(cb) {
 let tab_index = 0
 const doTaskReport = (req, sender) => {
   state.loading_show = false
-  let follow_name = req.task_data.follow_name || ''
+  let follow_name = req.task_data ? req.task_data.follow_name : '';
+
   // 1 Twitter follow Twitter ScreenName
   // 2 Tweet like
   // 3 Retweet
@@ -1363,6 +1382,7 @@ const doTaskReport = (req, sender) => {
 onMounted(() => {
   state.process_mode = process.env.NODE_ENV
   state.postId = getQueryString('postId')
+  state.iframeId = getQueryString('iframeId') || ''
   state.window_origin = getQueryString('window_origin') || '';
   if (state.window_origin.indexOf('twitter.com') > -1) {
     state.tweetId = getQueryString('tweetId')
@@ -1763,8 +1783,10 @@ function onWindowMessage() {
     if (event.data) {
       switch (event.data.actionType) {
         case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-          state.done.reply = true;
-          state.done.reply_red = false;
+          if (event.data.data.postId == state.postId) {
+            state.done.reply = true;
+            state.done.reply_red = false;
+          }
           break;
         case 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR':
           fullName = event.data.data.fullName
@@ -1803,43 +1825,6 @@ function onRuntimeMsg() {
         state.loading_show = false
         doTaskReport(req, sender);
         break;
-      case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-        if (req.data && req.data.postId == state.postId) {
-          state.done.reply = true;
-          state.done.reply_red = false;
-        }
-        break;
-      case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
-        let { user } = req.data || {};
-        if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
-          let legacy = user.result.legacy;
-          reportParams.twitterFans = legacy ? legacy.followers_count : 0;
-
-          if (!discordTaskDetail) {
-            if (reportParams.hasReport) return;
-            reportParams.hasReport = true;
-            Report.reportLog({
-              objectType: Report.objectType.tweetPostBinded,
-              twitterFans: reportParams.twitterFans,
-              redPacketType: 0,
-              postId: state.postId
-            });
-          } else {
-            if (reportParams.discordFans !== '') {
-              if (reportParams.hasReport) return;
-              reportParams.hasReport = true;
-              Report.reportLog({
-                objectType: Report.objectType.tweetPostBinded,
-                twitterFans: reportParams.twitterFans,
-                discordFans: reportParams.discordFans,
-                redPacketType: 0,
-                postId: state.postId
-              });
-            }
-          }
-
-        }
-        break;
     }
     sendResponse && sendResponse();
   })
@@ -1964,10 +1949,6 @@ function discordAuth(actionState = 'default') {
           type: 'normal',
           url: authorizeUrl
         }, function (window) {
-          let windowId = window.id;
-          callEventPageMethod("RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID", {
-            windowId: windowId
-          });
         })
       }
     }

+ 74 - 143
src/view/iframe/treasure-hunt/all-receive-list.vue

@@ -2,139 +2,69 @@
     <div class="invite-list">
         <div class="head">
             <div class="left">
-              <img height="20" :src="require('@/assets/svg/icon-back-2.svg')" @click="clickBack" />
-              <span>{{ state.detail.receiveCountWithAmount }} People Get Money</span>
+                <img height="20" :src="require('@/assets/svg/icon-back-2.svg')" @click="clickBack" />
+                <span>{{ state.detail.receiveCountWithAmount }} People Get Money</span>
             </div>
             <div class="right">
-              <img @click="showOptionSheet = true" :src="sortTypeIcon" alt="">
+                <img @click="clickOption" :src="sortTypeIcon" alt="">
             </div>
         </div>
-        <div class="content">
-            <img v-show="state.receive.loading && state.receive.list.length == 0"
-                :src="require('@/assets/svg/icon-loading-gray.svg')" alt="" class="loading" />
-            <img v-if="state.receive.list.length == 0 && state.receive.end"
-                :src="require('@/assets/svg/icon-empty-list.svg')" alt="" class="empty" />
-            <div class="list" v-else @scroll="handleScroll($event)">
-                <div class="item" v-for="item in state.receive.list" :key="item.userInfo.uid">
-                    <div class="left">
-                        <img :src="item.userInfo.avatarUrl" alt="" @click="clickItem(item)" />
-                    </div>
-                    <div class="right">
-                        <div>
-                            <div class="name" @click="clickItem(item)">{{ item.userInfo.nickName }}</div>
-                            <div class="time">{{ getBeforeTimeFormat(item.timestamp) }}</div>
-                        </div>
-                        <div class="money">${{ item.amountUsdValue }}</div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="option-sheet" v-if="showOptionSheet">
-          <div class="item" v-for="(item, index) in optionList" :key="index" @click="clickOption(item)">
-            <img :src="item.icon" >
-            <div class="label">
-              {{item.label}}
-            </div>
-          </div>
-        </div>
-        <div class="option-mask" v-if="showOptionSheet" @click="showOptionSheet = false"></div>
+        <receive-list :sortType="sortType"></receive-list>
     </div>
 </template>
 <script setup>
-import { receiveListV2 } from '@/http/treasure'
-import { inject, onMounted, ref } from 'vue'
-import { getBeforeTimeFormat } from "@/uilts/help"
+import { inject, ref, onMounted } from 'vue'
+import ReceiveList from '@/view/iframe/treasure-hunt/components/receive-list.vue'
 import Report from "@/log-center/log"
-
 let amountIcon = require('@/assets/svg/icon-sort-amount.svg');
 let timeIcon = require('@/assets/svg/icon-sort-time.svg');
 
-
 let sortTypeIcon = ref(amountIcon);
 
 let state = inject('state')
-state.receive = {
-    end: false,
-    list: []
-}
 
 let optionList = ref([
-  {
-    icon: amountIcon,
-    label: 'Amount',
-    type: 2
-  },
-  {
-    icon: timeIcon,
-    label: 'Time',
-    type: 1
-  }
+    {
+        icon: amountIcon,
+        label: 'Amount',
+        type: 2
+    },
+    {
+        icon: timeIcon,
+        label: 'Time',
+        type: 1
+    }
 ])
+onMounted(() => {
+    // 埋点
+    Report.reportLog({
+        businessType: Report.businessType.pageView,
+        pageSource: Report.pageSource.who_get_money_page,
+        postId: state.postId,
+        shareLinkId: state.invite_code || '',
+    })
+})
 
 
-let page_num = 1
-let page_size = 10
-let sortType = 2;
-let list_end = false
+let sortType = ref(2);
 
-let showOptionSheet = ref(false);
 
 const clickBack = () => {
     state.page_show = ''
 }
 
-onMounted(() => {
-    list()
-})
 
-const clickItem = (item) => {
-    window.open(`https://twitter.com/${item.userInfo.nickName}`)
-}
 
-const clickOption = (params) => {
-  showOptionSheet.value = false;
-  sortTypeIcon.value = params.icon;
-  page_num = 1;
-  sortType = params.type;
-  list()
-}
-
-function handleScroll(e) {
-    if (list_end) {
-        return
-    }
-    e = e.target
-    if ((e.clientHeight + e.scrollTop) / e.scrollHeight > .8) {
-        if (page_num * page_size == state.receive.list.length) {
-            page_num++
-            list()
-        }
-        list_end = true
+const clickOption = () => {
+    if (sortType.value == 1) {
+        sortType.value = 2
+    } else if (sortType.value == 2) {
+        sortType.value = 1
     }
+    // 切换图标
+    sortTypeIcon.value = optionList.value.filter((item) => { return item.type == sortType.value })[0].icon;
 }
 
-const list = () => {
-    state.receive.loading = true
-    receiveListV2({
-        params: {
-            postId: state.postId,
-            pageNum: page_num,
-            pageSize: page_size,
-            sortType
-        }
-    }).then((res) => {
-        if (res.code == 0) {
-            state.receive.loading = false
-            if(page_num < 2) {
-              state.receive.list = res.data || [];
-            } else {
-              state.receive.list = state.receive.list.concat(res.data)
-            }
-            state.receive.end = true
-            list_end = false
-        }
-    })
-}
 </script>
 <style lang="scss" scoped>
 .invite-list {
@@ -154,8 +84,8 @@ const list = () => {
         box-shadow: inset 0px -1px 0px #F2F2F2;
 
         .left {
-          display: flex;
-          align-items: center;
+            display: flex;
+            align-items: center;
         }
 
         img {
@@ -254,49 +184,50 @@ const list = () => {
     }
 
     .option-mask {
-      width: 100%;
-      height: 100%;
-      position: absolute;
-      top: 0;
-      left: 0;
-      z-index: 800;
-    }
-    .option-sheet {
-      width: 200px;
-      background: #FFFFFF;
-      box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.2);
-      border-radius: 14px;
-      position: absolute;
-      top: 40px;
-      right: 8px;
-      z-index: 1000;
-      cursor: pointer;
-
-      .item {
         width: 100%;
-        height: 40px;
-        display: flex;
-        align-items: center;
+        height: 100%;
+        position: absolute;
+        top: 0;
+        left: 0;
+        z-index: 800;
+    }
 
-        img {
-          width: 24px;
-          margin: 0 12px;
-        }
+    .option-sheet {
+        width: 200px;
+        background: #FFFFFF;
+        box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.2);
+        border-radius: 14px;
+        position: absolute;
+        top: 40px;
+        right: 8px;
+        z-index: 1000;
+        cursor: pointer;
+
+        .item {
+            width: 100%;
+            height: 40px;
+            display: flex;
+            align-items: center;
+
+            img {
+                width: 24px;
+                margin: 0 12px;
+            }
 
-        .label {
-          font-weight: 500;
-          font-size: 15px;
-          width: calc(100% - 52px);
-          height: 100%;
-          display: flex;
-          align-items: center;
+            .label {
+                font-weight: 500;
+                font-size: 15px;
+                width: calc(100% - 52px);
+                height: 100%;
+                display: flex;
+                align-items: center;
+            }
         }
-      }
 
-       .item:first-child {
-          .label {
-            box-shadow: inset 0px -1px 0px #F2F2F2;
-          }
+        .item:first-child {
+            .label {
+                box-shadow: inset 0px -1px 0px #F2F2F2;
+            }
         }
     }
 }

+ 8 - 8
src/view/iframe/treasure-hunt/components/boxs.vue

@@ -2,8 +2,7 @@
     <div class="area-boxs">
         <!-- 箱子 -->
         <div class="box-process">
-            <div class="item" v-for="item, i in state.boxs"
-                :key="i"
+            <div class="item" v-for="item, i in state.boxs" :key="i"
                 :style="{ 'margin-left': item.icon_margin_left, 'z-index': 10 - i }">
                 <!--悬浮 -->
                 <!-- < hover - tip : txt=" item.txt" v-show="item.show || item.openStatus" :icon="item.hover_icon">
@@ -16,10 +15,11 @@
                 <!-- 宝箱 -->
                 <img :src="item.icon" alt="" @mouseenter="mouseItem(i)" @mouseleave="mouseLeaveItem(i)"
                     :style="{ 'width': item.icon_width, 'height': item.icon_width }" class="box"
-                    :class="{ 'active': i == 0 && item.openStatus == 0 ? true : item.openStatus == 0 && state.boxs[i-1]['openStatus'] == 1  }" @click="clickBox(item)" />
+                    :class="{ 'active': i == 0 && item.openStatus == 0 ? true : item.openStatus == 0 && state.boxs[i - 1]['openStatus'] == 1 }"
+                    @click="clickBox(item)" />
                 <!-- 发光 -->
                 <img :src="require('@/assets/img/icon-flash-active.png')" alt="" class="flash"
-                    v-if="i == 0 && item.openStatus == 0 ? true : item.openStatus == 0 && state.boxs[i-1]['openStatus'] == 1"
+                    v-if="i == 0 && item.openStatus == 0 ? true : item.openStatus == 0 && state.boxs[i - 1]['openStatus'] == 1"
                     :style="{ 'margin-left': item.flash_margin_top, 'margin-top': item.flash_margin_top, 'width': item.flash_width, 'height': item.flash_width }" />
 
                 <!-- 进度条 -->
@@ -30,8 +30,7 @@
         </div>
         <!-- 人数 -->
         <div class="people">
-            <div class="item" v-for="item, i in state.boxs"
-            :key="i"
+            <div class="item" v-for="item, i in state.boxs" :key="i"
                 :style="{ 'margin-left': item.icon_margin_left, 'width': item.icon_width }">
                 <img :src="require('@/assets/svg/icon-user1.svg')" alt="" />
                 <span>{{ item.inviteProgress }}</span>
@@ -179,10 +178,11 @@ const btnStatus = () => {
 }
 
 
-
 const mouseItem = (i) => {
     state.boxs[i].show = true
-    state.active_share_channel = true
+    if (state.boxs[i].openStatus == 0) {
+        state.active_share_channel = true
+    }
 }
 const mouseLeaveItem = (i) => {
     state.boxs[i].show = false

+ 17 - 4
src/view/iframe/treasure-hunt/components/btn.vue

@@ -1,6 +1,7 @@
 <template>
     <div :class="{ 'area-btn': disabled }">
-        <div class="btn-submit" @click="clickBtn" :class="{ 'no': loading, 'disabled': disabled }">
+        <div class="btn-submit" @click="clickBtn" :class="{ 'no': loading, 'disabled': disabled }"
+            @mouseenter="mouseItem" @mouseleave="mouseLeaveItem">
             <img :src="require('@/assets/svg/icon-iframe-loading.svg')" alt="" class="loading" v-if="loading && icon" />
             <img :src="require('@/assets/svg/icon-btn-box.svg')" alt="" v-if="!loading && icon" />
             <span :style="{ 'font-size': fontSize, 'color': txtCorlor, 'font-weight': fontWeight }">{{ txt }}</span>
@@ -44,7 +45,19 @@ let props = defineProps({
         type: String
     }
 })
-const emit = defineEmits(['on-click'])
+const emit = defineEmits(['on-click', 'on-mouseEnter', 'on-mouseLeave'])
+
+const mouseItem = () => {
+    if (props.disabled) {
+        emit('on-mouseEnter')
+    }
+}
+
+const mouseLeaveItem = () => {
+    if (props.disabled) {
+        emit('on-mouseLeave')
+    }
+}
 
 const clickBtn = () => {
     if (props.disabled == false && props.loading == false) {
@@ -121,8 +134,8 @@ const refresh = () => {
     }
 
     .disabled {
-        cursor: no-drop;
-        background: rgba(56, 154, 255, 0.2);
+        cursor: default;
+        background: rgba(56, 154, 255, 0.4);
         color: #FFFFFF;
         width: 305px;
         font-weight: 600;

+ 1 - 0
src/view/iframe/treasure-hunt/components/carousel.vue

@@ -48,6 +48,7 @@ const init = () => {
             postId: state.postId,
             pageNum: 1,
             pageSize: 1000,
+            sortType: 2
         }
     }).then((res) => {
         if (res.code == 0) {

+ 302 - 265
src/view/iframe/treasure-hunt/components/invite-friends.vue

@@ -1,48 +1,56 @@
 <template>
-    <div class="invite-friends">
-      <div class="invite-friends-content">
-        <div class="invite-friends-content-head">
-          <div class="title">Invite Friends to Open the Chest!</div>
-          <div class="info">Invitees Need to be Real New follower of {{followUserStr}} to receive rewards</div>
+  <div class="invite-friends">
+    <div class="invite-friends-content">
+      <div class="invite-friends-content-head">
+        <div class="title">Invite Friends to Open the Chest!</div>
+        <div class="info">Invitees Need to be <span>Real New follower</span> of {{ followUserStr }} to receive rewards
         </div>
-        <div class="invite-friends-content-body">
+      </div>
+      <div class="invite-friends-content-body">
+        <template v-if="state.share_list_end">
           <img class="tips" v-if="state.active_share_channel" :src="require('@/assets/svg/icon-channel-tips.svg')" />
 
-          <div class="share-list" :class="{'share-list-active': state.active_share_channel}">
+          <div class="share-list" :class="{ 'share-list-active': state.active_share_channel }">
             <div v-for="(item, index) in state.share_list" :key="index" :data-clipboard-text="item.inviteContent"
-                @click="clickShare(item)" class="share-item">
-              <img :src="item.iconPath"  />
+              @click="clickShare(item)" class="share-item">
+              <img :src="item.iconPath" />
               <div class="name">
-                {{item.name}}
+                {{ item.name }}
               </div>
             </div>
-            <div class="share-item copy-btn" @click="clickCopy" v-click-log="state.log_invite_copy_btn_click"
-                :data-clipboard-text="state.detail.inviteCopyUrl">
+            <div v-show="state.share_list_end" class="share-item copy-btn" @click="clickCopy"
+              v-click-log="state.log_invite_copy_btn_click" :data-clipboard-text="state.detail.inviteCopyUrl">
               <img :src="require('@/assets/svg/icon-copy-url-teasure.svg')" alt="">
               <div class="name">
                 Copy URL
               </div>
             </div>
-        </div>
-        </div>
-      </div>
-      <v-btn :txt="state.open_btn.txt" :font-size="'17px'" class="btn" :icon="false"
-            :disabled="state.open_btn.disabled" v-show-log="state.log_invite_btn_show" :loading="state.btn_loading"
-            v-click-log="state.log_invite_btn_click" @onClick="clickBtn" font-weight="600"></v-btn>
-      <div class="mask" v-show="showShareTips">
-        <div class="content">
-          <img class="icon-loading" :src="channelLoadingImg" />
-          <div class="text">
-            Link copied to clipboard
-             <br/>
-            Opening {{selectShareApp.name }}
           </div>
+        </template>
+        <template v-else>
+          <v-loading></v-loading>
+        </template>
+      </div>
+    </div>
+    <v-btn :txt="state.open_btn.txt" :font-size="'17px'" class="btn" :icon="false" :disabled="state.open_btn.disabled"
+      v-show-log="state.log_invite_btn_show" :loading="state.btn_loading" @onClick="clickBtn" font-weight="600"
+      @onMouseEnter="mouseItem" @onMouseLeave="mouseLeave"></v-btn>
+
+    <div class="mask" v-show="showShareTips">
+      <div class="content">
+        <img class="icon-loading" :src="channelLoadingImg" />
+        <div class="text">
+          Link copied to clipboard
+          <br />
+          Opening {{ selectShareApp.name }}
         </div>
       </div>
     </div>
+  </div>
 </template>
 <script setup>
 import VBtn from '@/view/iframe/treasure-hunt/components/btn.vue'
+import VLoading from '@/view/components/loading.vue'
 import { inviteChannel } from '@/http/treasure'
 import { inject, onMounted, ref } from 'vue'
 import Report from "@/log-center/log"
@@ -58,40 +66,40 @@ let channelLoadingImg = ref(loadingImg);
 let state = inject('state')
 
 state.log_invite_btn_show = {
-    businessType: Report.businessType.buttonView,
-    pageSource: Report.pageSource.inviteFriendsPage,
-    objectType: Report.objectType.openChestButton,
-    redPacketType: Report.redPacketType.treasure,
-    shareLinkId: state.invite_code,
-    myShareLinkId: state.detail.inviteCopyUrl,
-    currentInvitedNum: state.inviteCount,
-    postId: state.postId
+  businessType: Report.businessType.buttonView,
+  pageSource: Report.pageSource.inviteFriendsPage,
+  objectType: Report.objectType.openChestButton,
+  redPacketType: Report.redPacketType.treasure,
+  shareLinkId: state.invite_code,
+  myShareLinkId: state.detail.inviteCopyUrl,
+  currentInvitedNum: state.inviteCount,
+  postId: state.postId
 }
 
 state.log_invite_btn_click = {
-    businessType: Report.businessType.buttonClick,
-    pageSource: Report.pageSource.inviteFriendsPage,
-    objectType: Report.objectType.openChestButton,
-    redPacketType: Report.redPacketType.treasure,
-    shareLinkId: state.invite_code,
-    myShareLinkId: state.detail.inviteCopyUrl,
-    currentInvitedNum: state.inviteCount,
-    postId: state.postId
+  businessType: Report.businessType.buttonClick,
+  pageSource: Report.pageSource.inviteFriendsPage,
+  objectType: Report.objectType.openChestButton,
+  redPacketType: Report.redPacketType.treasure,
+  shareLinkId: state.invite_code,
+  myShareLinkId: state.detail.inviteCopyUrl,
+  currentInvitedNum: state.inviteCount,
+  postId: state.postId
 }
 state.log_invite_copy_btn_click = {
-    businessType: Report.businessType.buttonClick,
-    pageSource: Report.pageSource.inviteFriendsPage,
-    objectType: Report.objectType.copyButton,
-    redPacketType: Report.redPacketType.treasure,
-    shareLinkId: state.invite_code,
-    myShareLinkId: state.detail.inviteCopyUrl,
-    currentInvitedNum: state.inviteCount,
-    postId: state.postId
+  businessType: Report.businessType.buttonClick,
+  pageSource: Report.pageSource.inviteFriendsPage,
+  objectType: Report.objectType.copyButton,
+  redPacketType: Report.redPacketType.treasure,
+  shareLinkId: state.invite_code,
+  myShareLinkId: state.detail.inviteCopyUrl,
+  currentInvitedNum: state.inviteCount,
+  postId: state.postId
 }
 
 let facebookAppConfig = {
-    facebookAppId: "",
-    faceShareRedirectUrl
+  facebookAppId: "",
+  faceShareRedirectUrl
 };
 
 let selectShareApp = ref({});
@@ -99,287 +107,316 @@ let showShareTips = ref(false);
 let followUserStr = ref('');
 
 onMounted(() => {
-    state.btn_loading = false
-    setFrontConfig();
-    initInviteChannel();
-    getFollowUserStr();
+  state.btn_loading = false
+  setFrontConfig();
+  initInviteChannel();
+  getFollowUserStr();
 })
 
+const mouseItem = () => {
+  if (state.boxs.filter((item) => { return item.openStatus == 0 }).length) {
+    state.active_share_channel = true
+  }
+}
+
+const mouseLeave = () => {
+  state.active_share_channel = false
+}
+
 const getFollowUserStr = () => {
   let arr = [];
-  if(state.follows && state.follows.length) {
-    for(let i = 0; i < state.follows.length; i++) {
+  if (state.follows && state.follows.length) {
+    for (let i = 0; i < state.follows.length; i++) {
       let item = state.follows[i];
-      arr.push('@'+item.name);
+      arr.push('@' + item.name);
     }
   }
   followUserStr.value = arr.join(" or ");
 }
 
 chrome.management.onDisabled.addListener(() => {
-    initInviteChannel()
+  initInviteChannel()
 })
 chrome.management.onEnabled.addListener(() => {
-    initInviteChannel()
+  initInviteChannel()
 })
 
 chrome.management.onInstalled.addListener(() => {
-    initInviteChannel()
+  initInviteChannel()
 })
 chrome.management.onUninstalled.addListener(() => {
-    initInviteChannel()
+  initInviteChannel()
 })
 
 let linePluginInstalled
 const initInviteChannel = () => {
-    try {
-        chrome.management.get('ophjlpahpchlmihnnnihgmmeilfjmjjc', (res) => {
-            if ((res && linePluginInstalled == 1) || (!res && linePluginInstalled == 0)) {
-                return
-            }
-            if (res) {
-                linePluginInstalled = 1
-            } else {
-                linePluginInstalled = 0
-            }
-
-            inviteChannel({
-                params: {
-                    linePluginInstalled,
-                    postId: state.postId
-                }
-            }).then((res) => {
-                if (res.code == 0) {
-                    state.share_list = res.data
-                }
-            })
-        })
-    } catch (error) {
-        console.error(error)
-    }
+  try {
+    chrome.management.get('ophjlpahpchlmihnnnihgmmeilfjmjjc', (res) => {
+      if ((res && linePluginInstalled == 1) || (!res && linePluginInstalled == 0)) {
+        return
+      }
+      if (res) {
+        linePluginInstalled = 1
+      } else {
+        linePluginInstalled = 0
+      }
+
+      inviteChannel({
+        params: {
+          linePluginInstalled,
+          postId: state.postId
+        }
+      }).then((res) => {
+        if (res.code == 0) {
+          state.share_list = res.data
+          state.share_list_end = true
+        }
+      })
+    })
+  } catch (error) {
+    console.error(error)
+  }
 }
 
 async function clickBtn() {
-    let _userInfo = await state.checkIsLogin()
-    if (!_userInfo) {
-        return
-    }
-    state.btn_loading = true
-    state.treasureOpen()
+  let _userInfo = await state.checkIsLogin()
+  if (!_userInfo) {
+    return
+  }
+  state.btn_loading = true
+  state.treasureOpen()
+  // 埋点
+  Report.reportLog(state.log_invite_btn_click)
 }
 
 const clickShare = (item) => {
-    channelLoadingImg.value = loadingImg;
-    var clipboard = new ClipboardJS('.share-item');
-    clipboard.on('success', function (e) {
-        // state.toast.txt = 'Copy Successfully'
-        // state.toast.has_icon = true
-        // state.toast.show = true
-        // setTimeout(() => {
-        //     state.toast.show = false
-        // }, 2000)
-        e.clearSelection();
+  channelLoadingImg.value = loadingImg;
+  var clipboard = new ClipboardJS('.share-item');
+  clipboard.on('success', function (e) {
+    // state.toast.txt = 'Copy Successfully'
+    // state.toast.has_icon = true
+    // state.toast.show = true
+    // setTimeout(() => {
+    //     state.toast.show = false
+    // }, 2000)
+    e.clearSelection();
+  })
+  showShareTips.value = true;
+  selectShareApp.value = item;
+
+  if (item.name == 'facebook') {
+    setChromeStorage({
+      shareFacebookData: JSON.stringify({
+        contentStr: item.inviteContent
+      })
     })
-    showShareTips.value = true;
-    selectShareApp.value = item;
-
-    if (item.name == 'facebook') {
-        setChromeStorage({
-            shareFacebookData: JSON.stringify({
-                contentStr: item.inviteContent
-            })
-        })
-        let cbParams = {
-            bizType: 'TEASURE_INVITE'
-        }
-        let url = `https://www.facebook.com/dialog/share?app_id=${facebookAppConfig.facebookAppId}&display=popup&href=${item.treasureInviteUrl}&redirect_uri=${facebookAppConfig.faceShareRedirectUrl}?params=${JSON.stringify(cbParams)}`;
-
-        setTimeout(() => {
-          showShareTips.value = false;
-          chrome.windows.create({
-            width: 800,
-              type: 'normal',
-              url
-          }, function (window) {
-          })
-        }, 1000)
-
-    } else {
-        setTimeout(() => {
-          showShareTips.value = false;
-          channelLoadingImg.value = '';
-          chrome.tabs.create({
-              url: item.redirectPath
-          });
-        }, 1000)
+    let cbParams = {
+      bizType: 'TEASURE_INVITE'
     }
-    Report.reportLog({
-        businessType: Report.businessType.buttonClick,
-        pageSource: Report.pageSource.inviteFriendsPage,
-        objectType: Report.objectType.channelButton,
-        shareLinkId: state.invite_code,
-        myShareLinkId: state.detail.inviteCopyUrl,
-        currentInvitedNum: state.inviteCount,
-        postId: state.postId,
-        redPacketType: Report.redPacketType.treasure
-    }, {
-        'channel-name': item.name
-    });
+    let url = `https://www.facebook.com/dialog/share?app_id=${facebookAppConfig.facebookAppId}&display=popup&href=${item.treasureInviteUrl}&redirect_uri=${facebookAppConfig.faceShareRedirectUrl}?params=${JSON.stringify(cbParams)}`;
+
+    setTimeout(() => {
+      showShareTips.value = false;
+      chrome.windows.create({
+        width: 800,
+        type: 'normal',
+        url
+      }, function (window) {
+      })
+    }, 1000)
+
+  } else {
+    setTimeout(() => {
+      showShareTips.value = false;
+      channelLoadingImg.value = '';
+      chrome.tabs.create({
+        url: item.redirectPath
+      });
+    }, 1000)
+  }
+  Report.reportLog({
+    businessType: Report.businessType.buttonClick,
+    pageSource: Report.pageSource.inviteFriendsPage,
+    objectType: Report.objectType.channelButton,
+    shareLinkId: state.invite_code,
+    myShareLinkId: state.detail.inviteCopyUrl,
+    currentInvitedNum: state.inviteCount,
+    postId: state.postId,
+    redPacketType: Report.redPacketType.treasure
+  }, {
+    'channel-name': item.name
+  });
 }
 
 const setFrontConfig = () => {
-    getFrontConfig({
-        params: {},
-    }).then((res) => {
-        if (res.code == 0) {
-            facebookAppConfig.facebookAppId = res.data.fbClientId;
-        }
-    });
+  getFrontConfig({
+    params: {},
+  }).then((res) => {
+    if (res.code == 0) {
+      facebookAppConfig.facebookAppId = res.data.fbClientId;
+    }
+  });
 };
 
 
 
 const clickCopy = () => {
-    var clipboard = new ClipboardJS('.copy-btn');
-    clipboard.on('success', function (e) {
-        state.toast.txt = 'Copy Successfully'
-        state.toast.has_icon = true
-        state.toast.show = true
-        setTimeout(() => {
-            state.toast.show = false
-        }, 2000)
-        e.clearSelection();
-    })
-
-    clipboard.on('error', function (e) {
-        state.toast.txt = 'Copy Error'
-        state.toast.has_icon = false
-        state.toast.show = true
-        setTimeout(() => {
-            state.toast.show = false
-        }, 2000)
-    })
+  var clipboard = new ClipboardJS('.copy-btn');
+  clipboard.on('success', function (e) {
+    state.toast.txt = 'Copy Successfully'
+    state.toast.has_icon = true
+    state.toast.show = true
+    setTimeout(() => {
+      state.toast.show = false
+    }, 2000)
+    e.clearSelection();
+  })
+
+  clipboard.on('error', function (e) {
+    state.toast.txt = 'Copy Error'
+    state.toast.has_icon = false
+    state.toast.show = true
+    setTimeout(() => {
+      state.toast.show = false
+    }, 2000)
+  })
 }
 </script>
 <style lang="scss" scoped>
 .invite-friends {
-    padding: 9px 14px 14px 14px;
-    background: #fff;
+  padding: 9px 14px 14px 14px;
+  background: #fff;
+  box-sizing: border-box;
+
+  .invite-friends-content {
+    height: 238px;
+    overflow-y: hidden;
+    margin-bottom: 10px;
     box-sizing: border-box;
 
-    .invite-friends-content {
-      max-height: 242px;
-      overflow-y: auto;
-      margin-bottom: 10px;
+    .invite-friends-content-head {
+      margin-bottom: 14px;
+      padding: 0 6px;
       box-sizing: border-box;
 
-      .invite-friends-content-head {
-        margin-bottom: 16px;
-        padding: 0 6px;
-        box-sizing: border-box;
+      .title {
+        font-weight: 900;
+        font-size: 18px;
+        margin-bottom: 7px;
+      }
 
-        .title {
-          font-weight: 900;
-          font-size: 18px;
-          margin-bottom: 7px;
-        }
-        .info {
-          font-weight: 400;
+      .info {
+        font-weight: 400;
+        font-size: 12px;
+        color: #7A7A7A;
+        line-height: 15px;
+
+        span {
+          font-weight: 800;
           font-size: 12px;
-          color: #7A7A7A;
           line-height: 15px;
+          color: #000000;
         }
+      }
+
+    }
 
+    .invite-friends-content-body {
+      position: relative;
+      height: 159px;
+      overflow: hidden;
+
+      .tips {
+        position: absolute;
+        top: -42px;
+        left: 0;
+        width: 146px;
       }
 
-      .invite-friends-content-body {
-        position: relative;
+      .share-list-active {
+        background: rgba(29, 155, 240, 0.1);
+        border: 1.5px solid #1D9BF0 !important;
+        border-radius: 10px;
+      }
 
-        .tips {
-          position: absolute;
-          top: -42px;
-          left: 0;
-          width: 146px;
-        }
+      .share-list {
+        display: flex;
+        flex-wrap: wrap;
+        width: 100%;
+        box-sizing: border-box;
+        border: 1.5px solid #fff;
+        overflow: hidden;
 
-        .share-list-active {
-          background: rgba(29, 155, 240, 0.1);
-          border: 1.5px solid #1D9BF0 !important;
-          border-radius: 10px;
-        }
-        .share-list {
+        .share-item {
+          user-select: none;
+          width: 20%;
           display: flex;
-          flex-wrap: wrap;
-          width: 100%;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          padding: 8px 2px;
           box-sizing: border-box;
-          border: 1.5px solid #fff;
-
-          .share-item {
-            user-select: none;
-            width: 20%;
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            justify-content: center;
-            padding: 8px 2px;
-            box-sizing: border-box;
-            border-radius: 12px;
-
-
-            cursor: pointer;
-            img {
-                width: 40px;
-                height: 40px;
-                border-radius: 100px;
-                margin-bottom: 8px;
-            }
-            .name {
-              font-weight: 400;
-              font-size: 12px;
-              color: #898989;
-              width: 100%;
-              overflow: hidden;
-              text-overflow: ellipsis; //文本溢出显示省略号
-              white-space: nowrap;
-              text-align: center;
-            }
+          border-radius: 12px;
+
+
+          cursor: pointer;
+
+          img {
+            width: 40px;
+            height: 40px;
+            border-radius: 100px;
+            margin-bottom: 8px;
           }
 
-          .share-item:hover {
-            animation: fade-in-gray 0.25s linear forwards;
+          .name {
+            font-weight: 400;
+            font-size: 12px;
+            color: #898989;
+            width: 100%;
+            overflow: hidden;
+            text-overflow: ellipsis; //文本溢出显示省略号
+            white-space: nowrap;
+            text-align: center;
           }
+        }
 
+        .share-item:hover {
+          animation: fade-in-gray 0.25s linear forwards;
         }
+
       }
     }
-    .mask {
-      position: fixed;
-      top: 0;
-      left: 0;
-      width: 375px;
-      height: 100%;
-      background: rgba($color: #000000, $alpha: 0.9);
-      z-index: 1000;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      .content {
-        text-align: center;
-      }
+  }
 
-      .icon-loading {
-        width: 60px;
-        height: 60px;
-        margin-bottom: 30px;
-      }
+  .mask {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 375px;
+    height: 100%;
+    background: rgba($color: #000000, $alpha: 0.9);
+    z-index: 1000;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .content {
+      text-align: center;
+    }
 
-      .text {
-        font-weight: 600;
-        font-size: 17px;
-        color: #FFFFFF;
-      }
+    .icon-loading {
+      width: 60px;
+      height: 60px;
+      margin-bottom: 30px;
     }
+
+    .text {
+      font-weight: 600;
+      font-size: 17px;
+      color: #FFFFFF;
+    }
+  }
+
   @keyframes fade-in-gray {
     from {
       background: none;

+ 225 - 0
src/view/iframe/treasure-hunt/components/receive-list.vue

@@ -0,0 +1,225 @@
+<!-- 领取人列表组件 -->
+<template>
+    <div class="content">
+        <img v-show="receive.loading" :src="require('@/assets/svg/icon-loading-gray2.svg')" alt="" class="loading" />
+        <img v-if="receive.list.length == 0 && receive.end" :src="require('@/assets/svg/icon-empty-list.svg')" alt=""
+            class="empty" />
+        <div class="list" v-else @scroll="handleScroll($event)">
+            <div class="item" v-for="item in receive.list" :key="item.userInfo.uid">
+                <div class="left">
+                    <img :src="item.userInfo.avatarUrl" alt="" @click="clickItem(item)" />
+                </div>
+                <div class="right">
+                    <div>
+                        <div class="name" @click="clickItem(item)">{{ item.userInfo.nickName }}</div>
+                        <div class="time">{{ getBeforeTimeFormat(item.timestamp) }}</div>
+                    </div>
+                    <div>
+                        <div class="money">${{ item.amountUsdValue }}</div>
+                        <div class="count" :class="{ 'hide': Number(item.inviteNewFansCount) == 0 }">
+                            invited:{{ item.inviteNewFansCount }}</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script setup>
+import { receiveListV2 } from '@/http/treasure'
+import { onMounted, reactive, inject, defineProps, watch } from 'vue'
+import { getBeforeTimeFormat } from "@/uilts/help"
+let state = inject('state')
+let receive = reactive({
+    end: false,
+    list: []
+})
+let props = defineProps({
+    sortType: {
+        type: Number,
+        default: 2,
+    }
+})
+watch(props, () => {
+    sortType = props.sortType
+    page_num = 1
+    receive.loading = true
+    receive.list = []
+    receive.end = false
+    list()
+})
+let page_num = 1
+let page_size = 10
+let sortType = 2;
+let list_end = false
+onMounted(() => {
+    receive.loading = true
+    list()
+})
+
+const clickItem = (item) => {
+    window.open(`https://twitter.com/${item.userInfo.nickName}`)
+}
+
+function handleScroll(e) {
+    if (list_end) {
+        return
+    }
+    e = e.target
+    if ((e.clientHeight + e.scrollTop) / e.scrollHeight > .8) {
+        if (page_num * page_size == receive.list.length) {
+            page_num++
+            list()
+        }
+        list_end = true
+    }
+}
+
+const list = () => {
+    receiveListV2({
+        params: {
+            postId: state.postId,
+            pageNum: page_num,
+            pageSize: page_size,
+            sortType
+        }
+    }).then((res) => {
+        if (res.code == 0) {
+            receive.loading = false
+            if (page_num < 2) {
+                receive.list = res.data || [];
+            } else {
+                receive.list = receive.list.concat(res.data)
+            }
+            receive.end = true
+            list_end = false
+        }
+    })
+}
+</script>
+<style lang="scss" scoped>
+.content {
+    position: relative;
+    height: 100%;
+    overflow-y: auto;
+    background: #fff;
+
+    .footer {
+        background: #fff;
+        padding: 10px 16px 25px 16px;
+    }
+
+    .error {
+        height: 204px;
+        color: #BABABA;
+        background-color: #fff;
+        font-weight: 500;
+        font-size: 15px;
+        line-height: 204px;
+        text-align: center;
+
+    }
+
+    .list {
+        height: 100%;
+        background: #fff;
+        overflow-y: auto;
+
+        .item {
+            height: 60px;
+            display: flex;
+            align-items: center;
+
+            .left {
+                width: 58px;
+                text-align: center;
+
+                img {
+                    cursor: pointer;
+                    border-radius: 50px;
+                    width: 30px;
+                    height: 30px;
+                }
+            }
+
+            .right {
+                flex: 1;
+                box-shadow: inset 0px -1px 0px #F2F2F2;
+
+                display: flex;
+                align-items: center;
+                height: 100%;
+                justify-content: space-between;
+
+                .name {
+                    color: #000000;
+                    font-weight: 500;
+                    font-size: 15px;
+                    cursor: pointer;
+                    margin-bottom: 5px;
+                }
+
+                .time {
+                    color: #A6A6A6;
+                    font-weight: 400;
+                    font-size: 12px;
+                    margin-right: 17px;
+                }
+
+                .money {
+                    color: #FCB936;
+                    font-weight: 500;
+                    font-size: 13px;
+                    margin-right: 16px;
+                    text-align: right;
+
+                }
+
+                .count {
+                    margin-right: 16px;
+                    color: #A9A9A9;
+                    font-weight: 400;
+                    font-size: 12px;
+                    text-align: right;
+                    margin-top: 5px;
+                }
+
+                .hide {
+                    visibility: hidden;
+
+                }
+            }
+        }
+    }
+}
+
+.loading {
+    width: 100px;
+    height: 100px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    margin-left: -50px;
+    margin-top: -50px;
+    animation: rotation 1s linear infinite;
+}
+
+.empty {
+    width: 100px;
+    height: 100px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    margin-left: -50px;
+    margin-top: -50px;
+}
+
+@keyframes rotation {
+    from {
+        -webkit-transform: rotate(0deg);
+    }
+
+    to {
+        -webkit-transform: rotate(360deg);
+    }
+}
+</style>

+ 144 - 142
src/view/iframe/treasure-hunt/cover.vue

@@ -2,43 +2,36 @@
     <!-- 封面页 -->
     <div class="cover">
         <v-head :left-data="state.detail.postUserInfo || null"></v-head>
-        <div class="waring" v-if="state.cover_status == '奖励已被领光'">
-            <div>All treasures</div>
-            <div>are hunted</div>
-        </div>
         <!-- 邀请人 -->
-        <template v-else>
-            <div class="invite"
-                v-if="state.detail.inviteUserInfo && state.detail.inviteUserInfo.nickName != state.detail.postUserInfo.nickName">
-                <img :src="state.detail.inviteUserInfo.avatarUrl" alt="" />
-                <span>@{{ state.detail.inviteUserInfo.nickName }} invites you</span>
-            </div>
-            <div class="in-invite" v-else></div>
-            <div class="treasure">
-                <component-zoom width="335" fontSize="34" style="margin:0 auto;">
-                    <span>Treasure</span>
-                    <span>${{ toLast(state.detail.amountUsdValue, 2) }}</span>
-                </component-zoom>
-            </div>
-            <div class="gain" v-if="Number(state.detail.upGainAmountValue) > 0">
-                <component-zoom width="335" fontSize="34" style="margin:0 auto;">
-                    <span>Your Gain Up to</span>
-                    <span>$</span>
-                    <span>{{ toLast(state.detail.upGainAmountValue, 3) }}</span>
-                </component-zoom>
-            </div>
-            <div class="coin" v-if="state.detail.currencySymbol != 'USD'">
-                <img :src="state.detail.currencyIconPath" alt="" />
-                <span> {{ state.detail.currencySymbol }} equivalent (Crypto)</span>
-            </div>
-            <div class="coin" v-else></div>
-        </template>
+        <div class="invite"
+            v-if="state.detail.inviteUserInfo && state.detail.inviteUserInfo.nickName != state.detail.postUserInfo.nickName">
+            <img :src="state.detail.inviteUserInfo.avatarUrl" alt="" />
+            <span>@{{ state.detail.inviteUserInfo.nickName }} invites you</span>
+        </div>
+        <div class="in-invite" v-else></div>
+        <div class="treasure">
+            <component-zoom width="335" fontSize="34" style="margin:0 auto;">
+                <span>Treasure</span>
+                <span>${{ toLast(state.detail.amountUsdValue, 2) }}</span>
+            </component-zoom>
+        </div>
+        <div class="gain" v-if="Number(state.detail.upGainAmountValue) > 0">
+            <component-zoom width="335" fontSize="34" style="margin:0 auto;">
+                <span>Your Gain Up to</span>
+                <span>$</span>
+                <span>{{ toLast(state.detail.upGainAmountValue, 3) }}</span>
+            </component-zoom>
+        </div>
+        <div class="coin" v-if="state.detail.currencySymbol != 'USD'">
+            <img :src="state.detail.currencyIconPath" alt="" />
+            <span> {{ state.detail.currencySymbol }} equivalent (Crypto)</span>
+        </div>
+        <div class="coin" v-else></div>
 
         <div class="box">
-            <img :src="require('@/assets/img/icon-gold-close-box.png')" alt="" v-if="state.cover_status == '奖励已被领光'" />
-            <img :src="require('@/assets/img/icon-treasure-box.png')" alt="" v-else />
+            <img :src="require('@/assets/img/icon-treasure-box.png')" alt="" />
         </div>
-        <div class="mark" :style="{ 'opacity': state.cover_status == '奖励已被领光' ? '0' : '1' }">
+        <div class="mark">
             <img :src="require('@/assets/svg/icon-three-line.svg')" alt="" />
             <span>to Hunt Treasure</span>
         </div>
@@ -60,6 +53,7 @@ import { prepareStart, treasureStart } from '@/http/treasure.js'
 import { getChromeCookie, removeChromeCookie, getChromeStorage, sendCurrentTabMessage } from '@/uilts/chromeExtension.js'
 import { reSetBindRepost } from '@/http/help.js'
 import { guid } from '@/uilts/help.js'
+import { TaskType } from '@/types';
 
 let state = inject('state')
 let global_userInfo
@@ -297,14 +291,14 @@ const logPreRepost = () => {
     }
 
     window.parent.postMessage({
-      actionType: "IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS",
-      data: JSON.stringify({
-        userList: names,
-        tweetId: state.tweetId,
-        iframeGUId: state.iframeId,
-        type: 'pre_repost',
-      }),
-      iframeId: state.iframeId
+        actionType: "IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS",
+        data: JSON.stringify({
+            userList: names,
+            tweetId: state.tweetId,
+            iframeGUId: state.iframeId,
+            type: 'pre_repost',
+        }),
+        iframeId: state.iframeId
     }, "*");
 
     // sendCurrentTabMessage({
@@ -334,20 +328,6 @@ async function clickBtn() {
     if (!global_userInfo || !global_userInfo.uid) {
         return
     }
-    if (state.cover_status == '奖励已被领光') {
-        Report.reportLog({
-            pageSource: Report.pageSource.expiredPage,
-            businessType: Report.businessType.buttonClick,
-            objectType: Report.objectType.getMoreGiveaway,
-            postId: state.postId,
-            shareLinkId: state.invite_code,
-            currentInvitedNum: state.inviteCount,
-            redPacketType: Report.redPacketType.treasure
-        });
-
-        window.open('https://twitter.com/search?q=%23denet');
-        return
-    }
     state.btn_loading = true
 
     Report.reportLog({
@@ -405,105 +385,127 @@ const getUsersFollowStatus = () => {
 
     if (userList && userList.length) {
         window.parent.postMessage({
-          actionType: "IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS",
-          data: JSON.stringify({
-            userList: userList,
-            tweetId: state.tweetId,
-            iframeGUId: state.iframeId
-          }),
-          iframeId: state.iframeId
+            actionType: "IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS",
+            data: JSON.stringify({
+                userList: userList,
+                tweetId: state.tweetId,
+                iframeGUId: state.iframeId
+            }),
+            iframeId: state.iframeId
         }, "*");
     }
 }
 
 const onWindowMessage = () => {
-  window.onmessage = (res) => {
-    console.log('onWindowMessage', res);
-    if(res && res.data && res.data.actionType) {
-      let msgData = res.data.data;
-      if(msgData.iframeGUId == state.iframeId) {
-        switch (res.data.actionType) {
-          case "CONTENT_API_GET_TWEET_USER_INFO_END":
-            let twitterFans = 0;
-            let { user } = msgData.response || {};
-            if (user && user.result && user.result.legacy) {
-                let legacy = user.result.legacy;
-                twitterFans = legacy ? legacy.followers_count : 0;
-            }
-            if (msgData.objectType == Report.objectType.repostSuccess) {
-                Report.reportLog({
-                    objectType: Report.objectType.repostSuccess,
-                    twitterFans: twitterFans,
-                    redPacketType: Report.redPacketType.treasure,
-                    postId: state.postId,
-                    shareLinkId: state.invite_code,
-                });
-            };
-            break;
-          case "CONTENT_CREATE_TWEET_FINISH":
-            if(!msgData.done) {
-              state.toast.txt = 'Seems something went wrong, please try again'
-              state.toast.show = true
-              state.toast.has_icon = false
-              setTimeout(() => {
-                  state.toast.show = false
-              }, 2000)
-            } else {
-              toStart(msgData);
-                getChromeStorage('userInfo', (_userInfo) => {
-                  if (_userInfo) {
-                    window.parent.postMessage({
-                      actionType: "IFRAME_API_GET_TWEET_USER_INFO_START",
-                      data: JSON.stringify({
-                        screen_name: _userInfo.nickName,
-                        tweetId: state.tweetId,
-                        objectType: Report.objectType.repostSuccess,
-                        iframeGUId: state.iframeId,
-                        iframeMsg: true
-                      }),
-                      iframeId: state.iframeId
-                    }, "*");
-                  }
-                })
+    window.onmessage = (res) => {
+        console.log('onWindowMessage', res);
+        let { info, data } = res.data
+        if (res && res.data && info) {
+            let msgData = data;
+            if (msgData.iframeGUId == state.iframeId) {
+                switch (info.actionType) {
+                    case "CONTENT_API_GET_TWEET_USER_INFO_END":
+                        let twitterFans = 0;
+                        let { user } = msgData.response || {};
+                        if (user && user.result && user.result.legacy) {
+                            let legacy = user.result.legacy;
+                            twitterFans = legacy ? legacy.followers_count : 0;
+                        }
+                        if (msgData.objectType == Report.objectType.repostSuccess) {
+                            Report.reportLog({
+                                objectType: Report.objectType.repostSuccess,
+                                twitterFans: twitterFans,
+                                redPacketType: Report.redPacketType.treasure,
+                                postId: state.postId,
+                                shareLinkId: state.invite_code,
+                            });
+                        };
+                        break;
+                    case "CONTENT_CREATE_TWEET_FINISH":
+                        if (!msgData.done) {
+                            state.toast.txt = 'Seems something went wrong, please try again'
+                            state.toast.show = true
+                            state.toast.has_icon = false
+                            setTimeout(() => {
+                                state.toast.show = false
+                            }, 2000)
+                        } else {
+                            toStart(msgData);
+                            getChromeStorage('userInfo', (_userInfo) => {
+                                if (_userInfo) {
+                                    window.parent.postMessage({
+                                        actionType: "IFRAME_API_GET_TWEET_USER_INFO_START",
+                                        data: JSON.stringify({
+                                            screen_name: _userInfo.nickName,
+                                            tweetId: state.tweetId,
+                                            objectType: Report.objectType.repostSuccess,
+                                            iframeGUId: state.iframeId,
+                                            iframeMsg: true
+                                        }),
+                                        iframeId: state.iframeId
+                                    }, "*");
+                                }
+                            })
+                        }
+
+                        break;
+                    case "CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES":
+                        state.usersFollowStatusList = getFollowStatus(msgData.list);
+                        // 上报埋点
+                        // 做任务
+                        // 一键三连
+                        let taskList = tasksDataHandler();
+                        window.parent.postMessage({
+                            actionType: "IFRAME_TWITTER_API_DO_TASK",
+                            data: JSON.stringify({
+                                tweet_Id: state.tweetId,
+                                tweet_text: state.rePostTweetContent,
+                                task_type: 'tasks',
+                                tasks: taskList,
+                                iframeGUId: state.iframeId
+                            }),
+                            iframeId: state.iframeId
+                        }, "*");
+
+                        // double like
+                        window.parent.postMessage({
+                            actionType: "IFRAME_TWITTER_API_DO_TASK",
+                            data: JSON.stringify({
+                                tweet_Id: state.detail.srcContentId,
+                                task_type: 'like',
+                                iframeGUId: state.iframeId
+                            }),
+                            iframeId: state.iframeId
+                        }, "*");
+                        break;
+                }
             }
-
-            break;
-          case "CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES":
-              state.usersFollowStatusList = getFollowStatus(msgData.list);
-              // 上报埋点
-              // 做任务
-              // 一键三连
-              window.parent.postMessage({
-                actionType: "IFRAME_TWITTER_API_DO_TASK",
-                data: JSON.stringify({
-                  tweet_Id: state.tweetId,
-                  tweet_text: state.rePostTweetContent,
-                  task_type: 'tasks',
-                  tasks: state.tasks,
-                  iframeGUId: state.iframeId
-                }),
-                iframeId: state.iframeId
-              }, "*");
-
-              // double like
-              window.parent.postMessage({
-                actionType: "IFRAME_TWITTER_API_DO_TASK",
-                data: JSON.stringify({
-                  tweet_Id: state.detail.srcContentId,
-                  task_type: 'like',
-                  iframeGUId: state.iframeId
-                }),
-                iframeId: state.iframeId
-              }, "*");
-            break;
         }
-      }
+    }
+}
+
+const tasksDataHandler = () => {
+  let data = state.tasks;
+  for(let i = 0; i < data.length; i++) {
+    if(data[i]['type'] == TaskType.twitterFollow) {
+      data[i]['relatedUsers'] = data[i]['relatedUsers'].filter(item => item.name != global_userInfo.nickName);
+      break;
     }
   }
+  return data;
 }
 
 onMounted(() => {
-  onWindowMessage();
+    onWindowMessage()
+    // 埋点
+    Report.reportLog({
+        pageSource: Report.pageSource.pending_page,
+        businessType: Report.businessType.pageView,
+        postId: state.postId,
+        shareLinkId: state.invite_code,
+        currentInvitedNum: state.inviteCount,
+        redPacketType: Report.redPacketType.treasure
+    });
 })
 
 </script>

+ 61 - 71
src/view/iframe/treasure-hunt/index.vue

@@ -1,7 +1,7 @@
 <template>
     <v-cover v-if="state.page == '封面页'"></v-cover>
     <v-invite v-if="state.page == '邀请页'"></v-invite>
-    <v-result v-if="state.page == '开奖页'"></v-result>
+    <v-result v-if="state.page == '结果页'"></v-result>
 
     <open-box v-show="state.open_box.show"></open-box>
     <v-toast :show="state.toast.show" :txt="state.toast.txt" :has_icon="state.toast.has_icon"></v-toast>
@@ -22,6 +22,7 @@ import { getChromeStorage, sendCurrentTabMessage } from '@/uilts/chromeExtension
 import VToast from '@/view/iframe/treasure-hunt/components/toast.vue'
 import OpenBox from '@/view/iframe/treasure-hunt/components/open-box.vue'
 import Report from "@/log-center/log"
+import denet from '@/denet'
 
 let state = reactive({
     loading_redbag: true,
@@ -65,43 +66,54 @@ onMounted(() => {
     // onRuntimeMsg();
     onWindowMessage();
 })
+// denet
+// chrome
+
+async function doLike() {
+    let task = await denet.content.doTask.like({ tweetId: '1564877034756534272' })
+    console.log('task', task)
+    if (tgas) {
+
+    }
+}
 
 const onWindowMessage = () => {
-  window.onmessage = (res) => {
-    console.log('onWindowMessage', res);
-    if(res && res.data && res.data.actionType) {
-      let msgData = res.data.data;
-      if(msgData.iframeGUId == state.iframeId) {
-        switch (res.data.actionType) {
-          case "CONTENT_GET_TWEET_TXT":
-            if (msgData.tweet_Id == state.tweetId && !state.detail.postSrcContent) {
-              state.detail.postSrcContent = msgData.txt
-              reSetBindPostContent({
-                  postId: state.postId || '',
-                  postSrcContent: msgData.txt,
-              })
-            }
-            break;
-          case "CONTENT_API_GET_TWEET_USER_INFO_END":
-            let twitterFans = 0;
-            let { user } = msgData.response || {};
-            if (user && user.result && user.result.legacy) {
-                let legacy = user.result.legacy;
-                twitterFans = legacy ? legacy.followers_count : 0;
-            }
-            if (msgData.objectType == Report.objectType.tweetPostBinded) {
-                Report.reportLog({
-                  objectType: Report.objectType.tweetPostBinded,
-                  twitterFans: twitterFans,
-                  redPacketType: Report.redPacketType.treasure,
-                  postId: state.postId
-                });
+    window.onmessage = (res) => {
+        console.log('onWindowMessage', res);
+        let { info, data } = res.data
+        if (res && res.data && info) {
+            let msgData = data;
+            if (msgData.iframeGUId == state.iframeId) {
+                switch (info.actionType) {
+                    case "CONTENT_GET_TWEET_TXT":
+                        if (msgData.tweet_Id == state.tweetId && !state.detail.postSrcContent) {
+                            state.detail.postSrcContent = msgData.txt
+                            reSetBindPostContent({
+                                postId: state.postId || '',
+                                postSrcContent: msgData.txt,
+                            })
+                        }
+                        break;
+                    case "CONTENT_API_GET_TWEET_USER_INFO_END":
+                        let twitterFans = 0;
+                        let { user } = msgData.response || {};
+                        if (user && user.result && user.result.legacy) {
+                            let legacy = user.result.legacy;
+                            twitterFans = legacy ? legacy.followers_count : 0;
+                        }
+                        if (msgData.objectType == Report.objectType.tweetPostBinded) {
+                            Report.reportLog({
+                                objectType: Report.objectType.tweetPostBinded,
+                                twitterFans: twitterFans,
+                                redPacketType: Report.redPacketType.treasure,
+                                postId: state.postId
+                            });
+                        }
+                        break;
+                }
             }
-            break;
         }
-      }
     }
-  }
 }
 state.checkIsLogin = () => {
     return new Promise((resolve) => {
@@ -155,12 +167,12 @@ state.init = (callback) => {
                 if (!res.data.postSrcContent) {
 
                     window.parent.postMessage({
-                      actionType: "GET_CONTENT_BY_TWITTER_ID",
-                      data: JSON.stringify({
-                        tweet_Id: state.tweetId,
-                        iframeGUId: state.iframeId,
-                      }),
-                      iframeId: state.iframeId
+                        actionType: "GET_CONTENT_BY_TWITTER_ID",
+                        data: JSON.stringify({
+                            tweet_Id: state.tweetId,
+                            iframeGUId: state.iframeId,
+                        }),
+                        iframeId: state.iframeId
                     }, "*");
                     // sendCurrentTabMessage({
                     //     actionType: "GET_CONTENT_BY_TWITTER_ID",
@@ -222,15 +234,15 @@ const handleCommon = (res, callback) => {
             tweetId: state.tweetId || ''
         }, () => {
             window.parent.postMessage({
-              actionType: "IFRAME_API_GET_TWEET_USER_INFO_START",
-              data: JSON.stringify({
-                screen_name: state.detail.postUserInfo.nickName,
-                tweetId: state.tweetId,
-                objectType: Report.objectType.tweetPostBinded,
-                iframeGUId: state.iframeId,
-                iframeMsg: true
-              }),
-              iframeId: state.iframeId
+                actionType: "IFRAME_API_GET_TWEET_USER_INFO_START",
+                data: JSON.stringify({
+                    screen_name: state.detail.postUserInfo.nickName,
+                    tweetId: state.tweetId,
+                    objectType: Report.objectType.tweetPostBinded,
+                    iframeGUId: state.iframeId,
+                    iframeMsg: true
+                }),
+                iframeId: state.iframeId
             }, "*");
             state.init()
         })
@@ -330,19 +342,7 @@ const handleStatus = (callback) => {
         if (joinStatus == 0) {
             // 显示封面页
             state.page = '封面页'
-            state.cover_status = '有邀请人'
             state.open_btn.txt = 'Start'
-            // state.cover_status = '无邀请人'
-            // state.cover_status = '奖励已被领光'
-
-            Report.reportLog({
-              pageSource: Report.pageSource.pending_page,
-              businessType: Report.businessType.pageView,
-              postId: state.postId,
-              shareLinkId: state.invite_code,
-              currentInvitedNum: state.inviteCount,
-              redPacketType: Report.redPacketType.treasure
-            });
         }
         // 如果 夺宝参与状态 = 已参与夺宝
         else if (joinStatus == 1) {
@@ -354,18 +354,8 @@ const handleStatus = (callback) => {
     // 如果 夺宝状态 = 已结束
     else {
         state.open_btn.txt = 'Look for more treasures'
-        state.page = '封面页'
-        state.cover_status = '奖励已被领光'
+        state.page = '结果页'
         state.btn_loading = false
-        Report.reportLog({
-          pageSource: Report.pageSource.expiredPage,
-          businessType: Report.businessType.pageView,
-          postId: state.postId,
-          shareLinkId: state.invite_code,
-          myShareLinkId: state.detail.inviteCopyUrl,
-          currentInvitedNum: state.inviteCount,
-          redPacketType: Report.redPacketType.treasure
-        });
         return
     }
     callback && callback()

+ 2 - 1
src/view/iframe/treasure-hunt/invite.vue

@@ -3,7 +3,7 @@
     <all-receive-list v-if="state.page_show == '总邀请者页'"></all-receive-list>
     <div v-show="state.page_show != '总邀请者页'">
         <!-- 邀请页 -->
-        <div class="area-process" v-show-log="state.log_invite_show">
+        <div class="area-process">
             <div class="area1">
                 <v-head :left-data="state.detail.postUserInfo || null" :rightData="state.detail.remainAmountUsdValue">
                 </v-head>
@@ -57,6 +57,7 @@ state.tabs = [{
 }]
 
 onMounted(() => {
+    Report.reportLog(state.log_invite_show)
     if (state.timer) {
         return
     }

+ 193 - 117
src/view/iframe/treasure-hunt/result.vue

@@ -1,168 +1,244 @@
 <template>
-    <!-- 开奖页 -->
-    <div class="content" v-show-log="state.log_result_show">
-        <img :src="require('@/assets/img/icon-silver-open-box-big.png')" alt="" />
-        <div class="mark">
-
-            <!-- 新粉 -->
-            <template v-if="Number(state.start_task.amountValue) > 0">
-                <p>You are now following
-                    <template v-for="item, i in state.follows">
-                        <span v-if="i == 0">@{{ item.name }}</span>
-                        <span v-else>, @{{ item.name }}</span>
-                    </template>
-                </p>
-                <p>You Win</p>
-                <component-zoom width="335" fontSize="34" style="margin:0 auto;">
-                    <div class="money">${{ state.start_task.usdAmountValue }}</div>
-                </component-zoom>
-                <div class="mark2">
-                    <img :src="state.start_task.currencyIcon" alt="" />
-                    <div>{{ state.start_task.amountValue }} {{ state.start_task.currencySymbol }} stored in your DeNet
-                        account</div>
+    <div class="content">
+        <!-- 结果页 -->
+        <div class="header">
+            <img :src="require('@/assets/subject/004-back-head-top.svg')" alt class="back" />
+            <!-- 领到钱了 -->
+            <template v-if="Number(state.detail.receiveAmountUsdValue) > 0">
+                <div class="tip1">This Giveaway Expired on {{ moment(state.detail.endTimestamp).format('MM-DD') }}</div>
+                <div class="tip2">🎉 Awesome! You are the Winner!</div>
+                <div class="tip3">+${{ state.detail.receiveAmountUsdValue }}</div>
+                <div class="tip3-back"></div>
+            </template>
+            <!-- 没有领到钱 -->
+            <template v-else>
+                <div class="rabbit">
+                    <img :src="require('@/assets/subject/001-icon-rabbit.svg')" alt />
+                    <p>Sorry, you missed this treasure</p>
+                </div>
+            </template>
+
+        </div>
+        <div class="list">
+            <receive-list></receive-list>
+        </div>
+        <div class="footer">
+            <!-- 领取到钱了 -->
+            <template v-if="Number(state.detail.receiveAmountUsdValue) > 0">
+                <div class="btn btn1" @click="clickDone">
+                    <img :src="require('@/assets/svg/icon-wallet-success.svg')" alt />
+                    <span>Wallet</span>
                 </div>
+                <get-more :style_type="4"
+                    :reportData="{ pageSource: Report.pageSource.received_success_page, postId: state.postId, redPacketType: Report.redPacketType.treasure }">
+                    <div class="btn btn2">
+                        <img :src="require('@/assets/svg/icon-gold-box-close.svg')" alt />
+                        <span>Get More</span>
+                    </div>
+                </get-more>
             </template>
-            <!-- 老粉不给钱 -->
+            <!-- 没有领到钱 -->
             <template v-else>
-                <p>You already followed
-                    <template v-for="item, i in state.follows">
-                        <span v-if="i == 0">@{{ item.name }}</span>
-                        <span v-else>, @{{ item.name }}</span>
-                    </template>
-                </p>
-                <p>Only new followers open silver chest</p>
-                <p class="txt">Invite people to</p>
-                <p class="txt">open golden chest!</p>
+                <div class="btn btn2 btn3" @click="clickBtn">
+                    <img :src="require('@/assets/svg/icon-gold-box-close.svg')" alt />
+                    <span>Look for more treasures</span>
+                </div>
             </template>
         </div>
-        <v-btn :txt="'Invite friends for more treasures'" :font-size="'16px'" class="btn"
-            v-if="Number(state.start_task.amountValue) > 0" v-click-log="state.log_result_click" @onClick="clickBtn"
-            :disabled="false"></v-btn>
-        <v-btn :txt="'Invite'" :font-size="'16px'" class="btn" v-else @onClick="clickBtn" :disabled="false"
-            v-click-log="state.log_result_click"></v-btn>
     </div>
 </template>
 <script setup>
 import { inject, onMounted } from 'vue'
-import VBtn from '@/view/iframe/treasure-hunt/components/btn.vue'
+import ReceiveList from '@/view/iframe/treasure-hunt/components/receive-list.vue'
+import { chromeExtensionUrl } from '@/uilts/chromeExtension.js'
+import GetMore from '@/view/iframe/publish/components/get-more.vue'
 import Report from "@/log-center/log"
 
 let state = inject('state')
-
-state.log_result_show = {
-    businessType: Report.businessType.pageView,
-    pageSource: Report.pageSource.newFansRewardPage,
-    redPacketType: Report.redPacketType.treasure,
-    shareLinkId: state.invite_code,
-    postId: state.postId,
-    extParams: {
-        isNewFans: Number(state.start_task.amountValue) > 0 ? true : false
+var moment = require('moment')
+
+onMounted(() => {
+    // 埋点
+    logFunc()
+})
+
+const logFunc = (log = {}) => {
+    log = Object.assign({
+        pageSource: Report.pageSource.expiredPage,
+        businessType: Report.businessType.pageView,
+        myShareLinkId: state.detail.inviteCopyUrl,
+        currentInvitedNum: state.inviteCount,
+        redPacketType: Report.redPacketType.treasure,
+        shareLinkId: state.invite_code || '',
+        postId: state.postId
+    }, log)
+
+    if (Number(state.detail.receiveAmountUsdValue) > 0) {
+        log.pageSource = Report.pageSource.received_success_page
     }
+    Report.reportLog(log)
 }
 
-state.log_result_click = {
-    businessType: Report.businessType.buttonClick,
-    pageSource: Report.pageSource.newFansRewardPage,
-    objectType: Report.objectType.nextButton,
-    redPacketType: Report.redPacketType.treasure,
-    shareLinkId: state.invite_code,
-    postId: state.postId,
-    extParams: {
-        isNewFans: Number(state.start_task.amountValue) > 0 ? true : false
-    }
-}
+function clickDone() {
+    window.open(`${chromeExtensionUrl + ('iframe/home.html')}`)
 
-async function clickBtn() {
-    let _userInfo = await state.checkIsLogin()
-    if (!_userInfo) {
-        return
-    }
-    state.init(() => {
-        state.page = '邀请页'
+    // 埋点
+    logFunc({
+        businessType: Report.businessType.buttonClick,
+        objectType: Report.objectType.wallet_button
     })
 }
-JSON.parse('[{\"type\":2},{\"type\":10},{\"relatedUsers\":[{\"name\":\"Ice17619765\",\"twitterUserId\":\"1502254505236525056\"},{\"name\":\"IanDuddyUK\",\"twitterUserId\":\"556285604\"},{\"name\":\"ffvc\",\"twitterUserId\":\"285917234\"}],\"type\":1}]')
 
+const clickBtn = () => {
+    logFunc({
+        businessType: Report.businessType.buttonClick,
+        objectType: Report.objectType.getMoreGiveaway,
+        currentInvitedNum: state.inviteCount,
+    })
+    window.open('https://twitter.com/search?q=%23denet');
+}
 </script>
 <style lang="scss" scoped>
 .content {
     width: 375px;
-    height: 500px;
-    background: linear-gradient(179.96deg, #876635 20.15%, #31251A 44.61%, #24180C 78.18%);
-    text-align: center;
-    position: relative;
-
-    img {
-        margin-top: 15px;
-        width: 250px;
-        height: 250px;
-    }
+    background: #fff;
 
-    .mark {
-        position: absolute;
-        top: 246px;
-        width: 375px;
-
-        p {
-            margin: 0;
-            padding: 0 16px;
-            text-align: center;
+    .header {
+        width: 100%;
+        min-height: 150px;
+        position: relative;
 
+        .back {
+            position: absolute;
+            top: 0;
+            left: 0;
         }
 
-        p:nth-child(1) {
-            color: #A9A49F;
-            font-weight: 400;
-            font-size: 12px;
-            margin-bottom: 10px;
+        .tip1 {
+            color: #FFFFFF;
+            opacity: 0.5;
+            text-align: center;
+            padding-top: 16px;
+            font-weight: 700;
+            font-size: 13px;
+            width: 100%;
+            z-index: 12;
+            width: 100%;
         }
 
-        p:nth-child(2) {
-            margin-bottom: 10px;
+        .tip2 {
             color: #FFFFFF;
+            text-align: center;
             font-weight: 800;
-            font-size: 18px;
-        }
+            width: 100%;
+            position: absolute;
+            font-size: 16px;
+            margin-top: 11px;
 
-        .txt {
-            color: #FFC83A;
-            font-weight: 800;
-            font-size: 24px;
+        }
 
+        .tip3-back {
+            width: 100%;
+            height: 43px;
+            position: absolute;
+            top: 74px;
+            left: 0;
+            background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.826667) 26.4%, #FFFFFF 71.47%, rgba(255, 255, 255, 0) 100%);
+            opacity: 0.15;
+            z-index: 1;
         }
 
-        .money {
-            color: #FFC83A;
+        .tip3 {
+            position: absolute;
+            top: 74px;
+            z-index: 2;
+            left: 0;
+            width: 100%;
+            line-height: 43px;
+            height: 43px;
+            color: #F5C03F;
+            text-align: center;
+            font-size: 26px;
             font-weight: 800;
-            font-size: 34px;
         }
 
-        .mark2 {
-            margin-top: 10px;
-            display: flex;
-            justify-content: center;
-            align-items: center;
+
+        .rabbit {
+            width: 100%;
+            height: 100%;
+            text-align: center;
+            position: absolute;
+            z-index: 11;
 
             img {
-                width: 17px;
-                height: 17px;
-                margin: 0;
-                margin-right: 5px;
+                width: 150px;
+                height: 80px;
+                margin-top: 14px;
+                margin-bottom: 4px;
             }
 
-            div {
-                color: #A9A49F;
-                font-weight: 400;
-                font-size: 12px;
+            .flower {
+                width: 62px;
+                height: 62px;
+            }
 
+            p {
+                width: 100%;
+                margin: 0;
+                padding: 0;
+                font-weight: 800;
+                font-size: 16px;
+                color: #fff;
+                text-align: center;
+                letter-spacing: 0.3px;
             }
         }
     }
 
-    .btn {
-        position: absolute;
-        bottom: 25px;
-        left: 15px;
+    .list {
+        height: 336px;
+        margin-top: 10px;
+    }
+
+    .footer {
+        height: 84px;
+        display: flex;
+        padding: 16px;
+        justify-content: space-between;
+
+        .btn {
+            width: 166.5px;
+            height: 52px;
+            border-radius: 100px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-weight: 800;
+            font-size: 18px;
+            user-select: none;
+            cursor: pointer;
+
+            img {
+                width: 24px;
+                height: 24px;
+                margin-right: 7px;
+            }
+        }
+
+        .btn1 {
+            background: #FFFFFF;
+            border: 1px solid #DEDEDE;
+            color: #585858;
+        }
+
+        .btn2 {
+            color: #FFFFFF;
+            background: #1D9BF0;
+        }
+
+        .btn3 {
+            width: 100%;
+        }
     }
 }
 </style>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików