Bläddra i källkod

Merge branch 'feature_220622_publish' into dev_1.1.2

wenliming 2 år sedan
förälder
incheckning
503f97cce3

+ 6 - 2
src/entry/content.js

@@ -36,7 +36,8 @@ import {
     selectGroupTab,
     setGroupInfo,
     refreshTabGroup,
-    groupTipsSelectGroupTab
+    groupTipsSelectGroupTab,
+    TwitterApiUserByScreenName
 } from "@/logic/content/twitter.js";
 
 import { 
@@ -180,7 +181,10 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             break
         case 'BACK_NFT_PUBLISH_DONE':
             refreshTabGroup()
-            break
+            break 
+        case 'IFRAME_API_GET_TWEET_USER_INFO_REQ':
+            TwitterApiUserByScreenName(req.data)
+            break;
     }
 })
 

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

@@ -32,6 +32,10 @@ export const objectType = {
     follow: 'follow',
     retweet: 'retweet',
     like: 'like',
+    comment_and_tag: 'comment-and-tag',
+    join_discord: 'discord',
+    share_facebook: 'share-facebook',
+
     // 查看已领取红包列表
     received_list: 'received-list',
     // 点击检测任务

+ 12 - 2
src/log-center/logger.js

@@ -1,13 +1,22 @@
 import {logApi} from '@/http/logApi'
 import { getBrowser } from '@/uilts/help.js';
 import { logType } from './logEnum.js';
+import {getChromeStorage} from '@/uilts/chromeExtension'
 
-
+let userInfo = null;
+let mid = '';
 /**
  * @eventData 以键值对存储,会在最终上报里解开的参数
  * @extParams 最终上报到阿里云以json字符串存储的参数,如果extparams传入的不是obj会转换成obj
  */
-export function reportLog(eventData = {}, extParams = {}) {
+export async function reportLog(eventData = {}, extParams = {}) {
+    if(!userInfo) {
+        userInfo = await getChromeStorage('userInfo') || null;
+    }
+    if (!mid) {
+        mid = await getChromeStorage('mid') || '';
+    }
+
     if (chrome && chrome.tabs) {
         chrome.tabs.getCurrent((tab) => {
             let isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
@@ -18,6 +27,7 @@ export function reportLog(eventData = {}, extParams = {}) {
                 url,
                 platform,
                 browser,
+                twitterId: userInfo.nickName,
                 ...eventData,
             }
             paramsPretreatmentAndRequest(logType.denet, extData, extParams)

+ 25 - 1
src/logic/content/twitter.js

@@ -8,6 +8,7 @@ import { showNFTGroupIcon, hideNFTGroupList, checkUserJoinGroup, elemAddEventLis
 import { getTwitterNftGroupInfo } from '@/http/nft'
 import { jumpTwitterDetailByAlert, showEditTweet } from '@/logic/content/help/twitter.js'
 import { clearPostContent } from '@/logic/content/nft.js'
+import axios from 'axios';
 
 let dom = {};
 
@@ -1312,7 +1313,30 @@ const TwitterLikeAPI = (tweet_Id) => {
     })
 }
 
-
+export const TwitterApiUserByScreenName = (params) => {
+    let {screen_name} = params;
+    axios.get(`https://twitter.com/i/api/graphql/mCbpQvZAw6zu_4PvuAUVVQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D`, {
+        headers: {
+            "accept": "*/*",
+            "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"101\", \"Google Chrome\";v=\"101\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"Windows\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en"
+        },
+    }).then(function(response){
+        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}  }, () => { })
+    }).catch(function (response){
+    });
+}
 
 let click_old_time = new Date().getTime()
 export const showTwitterPost = (data) => {

+ 49 - 8
src/view/components/custom-card-cover.vue

@@ -1,14 +1,25 @@
 <!-- 自定义卡片红包封面 -->
 <template>
     <div class="not-open">
-        <img class="cover" :src="require('@/assets/subject/001-card.png')"  />
-        <img class="open-gif" :src="require('@/assets/gif/001.gif')" />
-
-        <img
+        <img class="cover" v-if="data.type == 2" :src="require('@/assets/svg/img-preview-draw-bg.svg')"  />
+        <img class="cover" v-else :src="require('@/assets/subject/001-card.png')"  />
+
+        <img class="open-gif"
+            v-if="data.type == 2"
+            src="@/assets/img/img-preview-draw-box.png" />
+        <img class="open-gif"
+            v-else
+            :src="require('@/assets/gif/001.gif')" />
+
+        <img v-if="data.type == 2"
+            :src="require('@/assets/svg/img-preview-draw-open.svg')"
+            class="open"
+            @click="open" />
+        <img v-else
             :src="require('@/assets/svg/icon-open.svg')"
             class="open"
-            @click="open"
-        />
+            @click="open"/>
+
         <div class="title" v-if="data.userInfo">
             <img :src="data.userInfo.avatarUrl" />
             <span>{{
@@ -25,7 +36,15 @@
                     }">{{ data.amountValue }}</span>
             </div>
             <div class="people">
-                {{ data.totalCount }} WINNERS TO SHARE
+                <template  v-if="data.type == 2">
+                    <img class="icon-clock" 
+                    :src="require('@/assets/svg/icon-preview-clock.svg')" />  {{data.validityDuration}} H
+                    <img class="icon-trophy" 
+                    :src="require('@/assets/svg/icon-preview-trophy.svg')" /> <span class="trophy-count">{{data.totalCount}} WINNERS</span>
+                </template>
+                <template v-else>
+                    {{ data.totalCount }} WINNERS TO SHARE
+                </template>
             </div>
         </div>
     </div>
@@ -42,6 +61,8 @@ const props = defineProps({
                 totalCount: 0,
                 amountValue: 0,
                 tokenSymbol: "",
+                type: 1,
+                validityDuration: '',
                 userInfo: {
                     avatarUrl: "",
                     nickName: "",
@@ -118,8 +139,28 @@ const open = () => {
             font-size: 13px;
             line-height: 16px;
             letter-spacing: 0.05em;
-            text-align: center;
             color: #ffffff;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+
+            .icon-clock, .icon-trophy  {
+                width: 16px;
+                height: 16px;
+            }
+
+            .icon-clock {
+                margin-right: 4px;
+            }
+
+            .icon-trophy {
+                margin-left: 8px;
+                margin-right: 4px;
+            }
+
+            .trophy-count {
+                color: #FFCC4D;
+            }
         }
     }
 

+ 2 - 1
src/view/iframe/publish/components/paypal-button.vue

@@ -196,8 +196,9 @@ onMounted(() => {
             font-weight: 600;
             font-size: 18px;
             color: #fff;
-            cursor: pointer;
             padding: 0 30px;
+            word-break: break-all;
+            cursor: pointer;
             &.disabled {
                 background: #DEDEDE;
             }

+ 30 - 1
src/view/iframe/publish/components/preview-card.vue

@@ -23,6 +23,8 @@
                             amountValue: baseFormData.amountValue,
                             tokenSymbol: currentCurrencyInfo.tokenSymbol,
                             currencyIconUrl: currentCurrencyInfo.iconPath,
+                            type: baseFormData.type,
+                            validityDuration: baseFormData.validityDuration,
                             userInfo: {
                                 nickName: userInfo.name,
                                 avatarUrl: userInfo.avatarUrl
@@ -51,7 +53,11 @@
                 </div>
                 <div class="card-wrapper" 
                     :style="{'zoom': reviewCanvasParams.zoom}">
+                    <img :src="require('@/assets/img/img-preview-draw-after-bg.png')"
+                        v-if="baseFormData.type == 2"
+                        class="card-cover">
                     <img :src="require('@/assets/subject/img-card-cover-blue.png')"
+                        v-else
                         class="card-cover"/>
                     <div class="bottom-bar">
                         <div class="title">
@@ -79,7 +85,15 @@
                             </span>
                         </div>
                         <div class="desc">
-                            {{baseFormData.totalCount}} WINNERS TO SHARE
+                            <template  v-if="baseFormData.type == 2">
+                                <img class="icon-clock" 
+                                :src="require('@/assets/svg/icon-preview-clock.svg')" />  {{baseFormData.validityDuration}} H
+                                <img class="icon-trophy" 
+                                :src="require('@/assets/svg/icon-preview-trophy.svg')" /> <span class="trophy-count">{{baseFormData.totalCount}} WINNERS</span>
+                            </template>
+                            <template v-else>
+                                {{baseFormData.totalCount}} WINNERS TO SHARE
+                            </template>
                         </div>
                     </div>
                 </div>
@@ -374,6 +388,21 @@ onUnmounted(() => {
                         font-weight: 800;
                         font-size: 13px;
                         color: #ffffff;
+                        display: flex;
+                        align-items: center;
+
+                        .icon-clock {
+                            margin-right: 4px;
+                        }
+
+                        .icon-trophy {
+                            margin-left: 8px;
+                            margin-right: 4px;
+                        }
+
+                        .trophy-count {
+                            color: #FFCC4D;
+                        }
                     }
                 }
                 .card-cover {

+ 2 - 0
src/view/iframe/publish/give-dialog.vue

@@ -2208,6 +2208,7 @@ onMounted(() => {
             .price {
                 font-size: 16px;
                 font-weight: bold;
+                word-break: break-all;
             }
         }
         .refresh {
@@ -2256,6 +2257,7 @@ onMounted(() => {
             .price {
                 font-size: 14px;
                 font-weight: bold;
+                word-break: break-all;
             }
         }
         .refresh {

+ 137 - 9
src/view/iframe/red-packet/luck-draw.vue

@@ -415,13 +415,14 @@ import { getQueryString, guid, getBit } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import FontAmount from '@/view/components/font-amount.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
-import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
 import { getSetting, putSetting } from '@/http/user'
 import { getFrontConfig } from "@/http/account";
+import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue'
 var moment = require('moment');
 
@@ -434,6 +435,16 @@ let facebookAppConfig = {
     faceShareRedirectUrl
 };
 
+let reportParams = {
+  discordFans: '', 
+  twitterFans: '',
+  done: {
+  },
+  hasReport: false,
+}
+
+let discordTaskDetail = null;
+
 let state = reactive({
     status: '',
     userId: '',
@@ -650,6 +661,15 @@ function onTweetReplyClick(params) {
     }
 
     window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK", data: replyData }, "*");
+
+    Report.reportLog({
+        objectType: Report.objectType.comment_and_tag,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
 }
 
 function changeNotification(checked) {
@@ -717,6 +737,16 @@ async function clickRepostFacebook(params) {
 
     let shareUrl = feacebookShareUrl(shareUrlparams);
     openShareFacebookWindow({ url: shareUrl });
+
+    // 埋点
+    Report.reportLog({
+        objectType: Report.objectType.share_facebook,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
 }
 
 /**
@@ -897,6 +927,10 @@ async function clickFollowAll(item, is_all) {
 
 // 重新绑定
 const reSetBindTwtterId = (_params) => {
+    let postBizData = JSON.parse(_params.postBizData);
+    let {taskCondition} = postBizData;
+    let discordTask = JSON.parse(taskCondition).find(item => item.type == 7);
+
     getChromeStorage('userInfo', (_userInfo) => {
         if (_userInfo && _userInfo.uid == _params.uid) {
             srcPublishSuccess({
@@ -906,16 +940,66 @@ const reSetBindTwtterId = (_params) => {
                 }
             }).then((res) => {
                 if (res.code == 0 || res.code == 3003) {
-                    Report.reportLog({
-                        objectType: Report.objectType.tweetPostBinded
-                    });
                     init({ from: 'reSetBindTwtterId' })
+                    reportBindTweetSuccess({discordTask, ..._params});
                 }
             })
         }
     })
 }
 
+const reportBindTweetSuccess = (params) => {
+    let {discordTask, srcUserId} = params || {};
+    discordTaskDetail = discordTask;
+    sendChromeTabMessage({
+        actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
+        data: {
+            screen_name: srcUserId
+        }
+    })
+
+    if(discordTask) {
+        getDiscordInfo({inviteUrl: JSON.parse(discordTask.bizData).inviteUrl}, (res) => {
+            if(res.inviteCode == res.code) {
+                reportParams.discordFans = res.approximate_member_count;
+
+                if(reportParams.twitterFans !== '' && !reportParams.hasReport) { 
+                reportParams.hasReport = true;
+                Report.reportLog({
+                    objectType: Report.objectType.tweetPostBinded,
+                    twitterFans: reportParams.twitterFans,
+                    discordFans: reportParams.discordFans
+                });
+                }
+            }
+        })
+    }
+}
+
+const getDiscordInfo = (params, cb) => {
+    let {inviteUrl} = params;
+    if(!inviteUrl) return;
+
+    let inviteCode = '';
+    let arr = inviteUrl.split('/');
+    if(arr.length > 0) {
+        inviteCode = arr[arr.length - 1];
+    }
+    if(!inviteCode) {
+        return;
+    }
+
+    getInviteGuildInfo({
+        inviteCode
+    }).then(res => {
+        cb && cb({
+        ...res,
+        inviteCode
+        })
+    }).catch((err) => {
+    });
+}
+
 const showCloseEndTimePage = () => {
     state.status = 'close'
     state.close_status = '已经过期了'
@@ -943,6 +1027,8 @@ const showSuccessPage = () => {
         postId: state.postId,
         srcContentId: state.tweetId,
         senderId: state.userId,
+        isOldTwitterFans: reportParams.done.follow,
+        isOldDiscordFans: reportParams.done.join_discord
     });
 }
 const showNotOpenPage = () => {
@@ -957,10 +1043,14 @@ const showNotOpenPage = () => {
 }
 const showOpenedPage = () => {
     state.status = 'opened'
-
-    initTaskDetail()
+    initTaskDetail(() => {
+        showOpenedPageReport()
+    })
 }
 const showOpenedPageReport = () => {
+    reportParams.done.follow = state.done.follow;
+    reportParams.done.join_discord = state.done.join_discord;
+
     // 埋点
     Report.reportLog({
         pageSource: Report.pageSource.task_page,
@@ -968,6 +1058,8 @@ const showOpenedPageReport = () => {
         postId: state.postId,
         srcContentId: state.tweetId,
         senderId: state.userId,
+        isOldTwitterFans: state.done.follow,
+        isOldDiscordFans: state.done.join_discord
     });
 }
 
@@ -1036,7 +1128,6 @@ const handleStatusPage = () => {
         if (state.detail.myReceived.taskFinishStatus == 0) {
             // 显示任务未完成页面
             showOpenedPage()
-            showOpenedPageReport()
             if (state.process_mode != 'production') {
                 getValidity()
             }
@@ -1105,7 +1196,6 @@ function setFrontConfig() {
 
 function init(initParams) {
     let { type } = initParams || {};
-    onRuntimeMsg();
     onPageVisbile();
     onWindowMessage();
     setFrontConfig();
@@ -1147,7 +1237,7 @@ function init(initParams) {
     })
 }
 
-function initTaskDetail() {
+function initTaskDetail(cb) {
     getChromeStorage('userInfo', (_userInfo) => {
         if (_userInfo && _userInfo.uid) {
             // 任务详情
@@ -1187,6 +1277,7 @@ function initTaskDetail() {
                 } else {
                     handleErrorCode(res)
                 }
+                cb && cb()
             })
         }
     })
@@ -1315,6 +1406,7 @@ onMounted(() => {
 
     getTweetAuthor()
     init()
+    onRuntimeMsg();
     // state.loading_show = true
     // state.status = 'success'
     // state.status = 'close'
@@ -1747,6 +1839,32 @@ function onRuntimeMsg() {
                     state.done.reply_red = false;
                 }
                 break;
+            case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
+                let {user} = req.data || {};
+                if(user && user.result && user.result.legacy) {
+                    let legacy = user.result.legacy;
+                    reportParams.twitterFans = legacy.followers_count;
+
+                    if(!discordTaskDetail) {
+                        if(reportParams.hasReport) return;
+                        reportParams.hasReport = true;
+                        Report.reportLog({
+                            objectType: Report.objectType.tweetPostBinded,
+                            twitterFans: reportParams.twitterFans,
+                        });
+                    } else {
+                        if(reportParams.discordFans !== '') {
+                            if(reportParams.hasReport) return;
+                            reportParams.hasReport = true;
+                            Report.reportLog({
+                                objectType: Report.objectType.tweetPostBinded,
+                                twitterFans: reportParams.twitterFans,
+                                discordFans: reportParams.discordFans
+                            });
+                        }
+                    }
+                }
+                break;
         }
     })
 }
@@ -1802,6 +1920,16 @@ async function joinDiscord() {
     if (joinDiscordIng.value) {
         return;
     }
+    // 埋点
+    Report.reportLog({
+        objectType: Report.objectType.join_discord,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
+
     let url = getInviteUrl();
     if (url) {
         joinDiscordIng.value = true;

+ 136 - 9
src/view/iframe/red-packet/red-packet.vue

@@ -374,12 +374,13 @@ import { getQueryString, guid, getBit } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import FontAmount from '@/view/components/font-amount.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
-import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
 import { getFrontConfig } from "@/http/account";
+import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue'
 
 var moment = require('moment');
@@ -393,6 +394,16 @@ let facebookAppConfig = {
   faceShareRedirectUrl
 };
 
+let reportParams = {
+  discordFans: '', 
+  twitterFans: '',
+  done: {
+  },
+  hasReport: false,
+}
+
+let discordTaskDetail = null;
+
 let state = reactive({
   status: '',
   userId: '',
@@ -626,6 +637,15 @@ async function clickReply(params) {
   } else {
     window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_REPLY_CLICK", data: replyData }, "*");
   }
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.comment_and_tag,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
 }
 
 /**
@@ -657,6 +677,16 @@ async function clickRepostFacebook(params) {
 
   let shareUrl = feacebookShareUrl(shareUrlparams);
   openShareFacebookWindow({ url: shareUrl });
+
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.share_facebook,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
 }
 
 /**
@@ -837,6 +867,10 @@ async function clickFollowAll(item, is_all) {
 
 // 重新绑定
 const reSetBindTwtterId = (_params) => {
+  let postBizData = JSON.parse(_params.postBizData);
+  let {taskCondition} = postBizData;
+  let discordTask = JSON.parse(taskCondition).find(item => item.type == 7);
+
   getChromeStorage('userInfo', (_userInfo) => {
     if (_userInfo.uid == _params.uid) {
       srcPublishSuccess({
@@ -846,16 +880,64 @@ const reSetBindTwtterId = (_params) => {
         }
       }).then((res) => {
         if (res.code == 0 || res.code == 3003) {
-          Report.reportLog({
-            objectType: Report.objectType.tweetPostBinded
-          });
           init({ from: 'reSetBindTwtterId' })
+          reportBindTweetSuccess({discordTask, ..._params});
         }
       })
     }
   })
 }
 
+const reportBindTweetSuccess = (params) => {
+  let {discordTask, srcUserId} = params || {};
+  discordTaskDetail = discordTask;
+  sendChromeTabMessage({
+      actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
+      data: {
+        screen_name: srcUserId
+      }
+  })
+
+  if(discordTask) {
+    getDiscordInfo({inviteUrl: JSON.parse(discordTask.bizData).inviteUrl}, (res) => {
+      if(res.inviteCode == res.code) {
+        reportParams.discordFans = res.approximate_member_count;
+
+        if(reportParams.twitterFans !== '' && !reportParams.hasReport) { 
+          reportParams.hasReport = true;
+          Report.reportLog({
+            objectType: Report.objectType.tweetPostBinded,
+            twitterFans: reportParams.twitterFans,
+            discordFans: reportParams.discordFans
+          });
+        }
+      }
+    })
+  }
+}
+
+const getDiscordInfo = (params, cb) => {
+  let {inviteUrl} = params;
+  if(!inviteUrl) return;
+  let inviteCode = '';
+  let arr = inviteUrl.split('/');
+  if(arr.length > 0) {
+      inviteCode = arr[arr.length - 1];
+  }
+  if(!inviteCode) {
+      return;
+  }
+  getInviteGuildInfo({
+      inviteCode
+  }).then(res => {
+    cb && cb({
+      ...res,
+      inviteCode
+    })
+  }).catch((err) => {
+  });
+}
+
 const showCloseEndTimePage = () => {
   state.status = 'close'
   state.close_status = '红包过期了'
@@ -882,6 +964,8 @@ const showSuccessPage = () => {
     postId: state.postId,
     srcContentId: state.tweetId,
     senderId: state.userId,
+    isOldTwitterFans: reportParams.done.follow,
+    isOldDiscordFans: reportParams.done.join_discord
   });
 }
 const showNotOpenPage = () => {
@@ -896,10 +980,13 @@ const showNotOpenPage = () => {
 }
 const showOpenedPage = () => {
   state.status = 'opened'
-
-  initTaskDetail()
+  initTaskDetail(() => {
+    showOpenedPageReport()
+  })
 }
 const showOpenedPageReport = () => {
+  reportParams.done.follow = state.done.follow;
+  reportParams.done.join_discord = state.done.join_discord;
   // 埋点
   Report.reportLog({
     pageSource: Report.pageSource.task_page,
@@ -907,6 +994,8 @@ const showOpenedPageReport = () => {
     postId: state.postId,
     srcContentId: state.tweetId,
     senderId: state.userId,
+    isOldTwitterFans: state.done.follow,
+    isOldDiscordFans: state.done.join_discord
   });
 }
 
@@ -973,7 +1062,6 @@ const handleStatusPage = () => {
     if (state.detail.myReceived.taskFinishStatus == 0) {
       // 显示任务未完成页面
       showOpenedPage()
-      showOpenedPageReport()
       if (state.process_mode != 'production') {
         getValidity()
       }
@@ -1036,7 +1124,6 @@ function setFrontConfig() {
 
 function init(initParams) {
   let { type } = initParams || {};
-  onRuntimeMsg();
   onPageVisbile();
   onWindowMessage();
   setFrontConfig();
@@ -1078,7 +1165,7 @@ function init(initParams) {
   })
 }
 
-function initTaskDetail() {
+function initTaskDetail(cb) {
   getChromeStorage('userInfo', (_userInfo) => {
     if (_userInfo.uid) {
       // 任务详情
@@ -1118,6 +1205,7 @@ function initTaskDetail() {
         } else {
           handleErrorCode(res)
         }
+        cb && cb()
       })
     }
   })
@@ -1206,6 +1294,7 @@ onMounted(() => {
 
   getTweetAuthor();
   init()
+  onRuntimeMsg();
   // state.loading_show = true
   // state.status = 'opened'
   // state.close_status = '没有领到钱'
@@ -1638,6 +1727,33 @@ function onRuntimeMsg() {
           state.done.reply_red = false;
         }
         break;
+      case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
+        let {user} = req.data || {};
+        if(user && user.result && user.result.legacy) {
+          let legacy = user.result.legacy;
+          reportParams.twitterFans = legacy.followers_count;
+
+          if(!discordTaskDetail) {
+            if(reportParams.hasReport) return;
+            reportParams.hasReport = true;
+            Report.reportLog({
+              objectType: Report.objectType.tweetPostBinded,
+              twitterFans: reportParams.twitterFans,
+            });
+          } else {
+            if(reportParams.discordFans !== '') {
+              if(reportParams.hasReport) return;
+              reportParams.hasReport = true;
+              Report.reportLog({
+                objectType: Report.objectType.tweetPostBinded,
+                twitterFans: reportParams.twitterFans,
+                discordFans: reportParams.discordFans
+              });
+            }
+          }
+
+        }
+        break;
     }
   })
 }
@@ -1693,6 +1809,17 @@ async function joinDiscord() {
   if (joinDiscordIng.value) {
     return;
   }
+
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.join_discord,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
+
   let url = getInviteUrl();
   if (url) {
     joinDiscordIng.value = true;

+ 2 - 1
src/view/popup/tabbar-page/nft/detail.vue

@@ -255,7 +255,7 @@ onMounted(() => {
 
                 .prop-item {
                     width: 48%;
-                    height: 88px;
+                    min-height: 88px;
                     background: #f8f8f8;
                     border-radius: 10px;
                     display: flex;
@@ -275,6 +275,7 @@ onMounted(() => {
                         margin-top: 6px;
                         margin-bottom: 8px;
                         color: #000;
+                        word-break: break-all;
                     }
                 }
                 .prop-item:nth-child(odd) {