index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <v-cover v-if="state.page == '封面页'"></v-cover>
  3. <v-invite v-if="state.page == '邀请页'"></v-invite>
  4. <v-result v-if="state.page == '开奖页'"></v-result>
  5. <open-box v-show="state.open_box.show"></open-box>
  6. <v-toast :show="state.toast.show" :txt="state.toast.txt" :has_icon="state.toast.has_icon"></v-toast>
  7. </template>
  8. <script setup>
  9. import { reactive, provide, onMounted } from 'vue'
  10. import VCover from '@/view/iframe/treasure-hunt/cover.vue'
  11. import VInvite from '@/view/iframe/treasure-hunt/invite.vue'
  12. import VResult from '@/view/iframe/treasure-hunt/result.vue'
  13. import { inviteDetail, treasureDetail, treasureOpen } from '@/http/treasure.js'
  14. import { reSetBindTwtterId, reSetBindRepost } from '@/http/help.js'
  15. import { getQueryString } from '@/uilts/help'
  16. import { getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
  17. import VToast from '@/view/iframe/treasure-hunt/components/toast.vue'
  18. import OpenBox from '@/view/iframe/treasure-hunt/components/open-box.vue'
  19. import Report from "@/log-center/log"
  20. let state = reactive({
  21. page: '',
  22. detail: {},
  23. oldDetail: {},
  24. btn_loading: false,
  25. open_box: {
  26. show: false,
  27. data: {}
  28. },
  29. open_btn: {
  30. txt: '',
  31. disabled: false
  32. },
  33. dialog: {
  34. show: false,
  35. },
  36. start_task: {},
  37. toast: {}
  38. })
  39. provide('state', state)
  40. let params = {}
  41. onMounted(() => {
  42. params = JSON.parse(getQueryString('params') || '{}')
  43. state.postId = params.post_Id || ''
  44. state.tweetId = params.tweet_Id || ''
  45. state.invite_code = params.invite_code || ''
  46. state.init();
  47. onRuntimeMsg();
  48. })
  49. state.checkIsLogin = () => {
  50. return new Promise((resolve) => {
  51. getChromeStorage('userInfo', (_userInfo) => {
  52. if (!_userInfo) {
  53. state.btn_loading = true
  54. setTimeout(() => {
  55. state.btn_loading = false
  56. }, 3000)
  57. chrome.runtime.sendMessage({ actionType: "POPUP_LOGIN", data: "" })
  58. resolve(_userInfo)
  59. } else {
  60. resolve(_userInfo)
  61. }
  62. })
  63. })
  64. }
  65. state.init = (callback) => {
  66. if (params.page_type == '邀请链接') {
  67. // 邀请链接
  68. inviteDetail({
  69. params: {
  70. inviteCode: params.invite_code
  71. }
  72. }).then((res) => {
  73. if (res.code == 0) {
  74. handleCommon(res, callback)
  75. // 绑定repostSrcContentId
  76. if (!res.data.repostSrcContentId) {
  77. reSetBindRepost({
  78. inviteCode: state.invite_code,
  79. tweetId: state.tweetId
  80. })
  81. }
  82. }
  83. })
  84. } else if (params.page_type == '原始链接') {
  85. // 原始链接
  86. treasureDetail({
  87. params: {
  88. postId: params.post_Id
  89. }
  90. }).then((res) => {
  91. if (res.code == 0) {
  92. handleCommon(res, callback)
  93. }
  94. })
  95. }
  96. }
  97. const handleCommon = (res, callback) => {
  98. state.detail = res.data
  99. state.postId = state.detail.postId
  100. try {
  101. state.tasks = JSON.parse(state.detail.startCondition)
  102. let follows = state.tasks.filter((item) => { return item.type == 1 })
  103. if (follows.length) {
  104. state.follows = follows[0].relatedUsers
  105. }
  106. }
  107. catch (error) {
  108. console.error('catch', error)
  109. }
  110. if (!res.data.srcContentId) {
  111. reSetBindTwtterId({
  112. postId: state.postId || '',
  113. tweetId: state.tweetId || ''
  114. }, () => {
  115. sendChromeTabMessage({
  116. actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
  117. data: {
  118. screen_name: state.detail.postUserInfo.nickName,
  119. tweetId: state.tweetId,
  120. objectType: Report.objectType.tweetPostBinded
  121. }
  122. })
  123. })
  124. }
  125. handleStatus(callback)
  126. }
  127. let silver_open_box_big = require('@/assets/img/icon-silver-open-box-big.png')
  128. let gold_open_box_big = require('@/assets/img/icon-gold-open-box-big.png')
  129. state.treasureOpen = () => {
  130. treasureOpen({
  131. params: {
  132. postId: state.postId,
  133. treasureId: state.treasureId,
  134. }
  135. }).then((res) => {
  136. state.btn_loading = false
  137. if (res.code == 0) {
  138. // icon
  139. for (let i in state.boxs) {
  140. if (state.boxs[i].id == state.treasureId) {
  141. if (i > 0) {
  142. state.open_box.icon = gold_open_box_big
  143. } else {
  144. state.open_box.icon = silver_open_box_big
  145. }
  146. break
  147. }
  148. }
  149. state.open_box.show = true
  150. state.open_box.data = res.data
  151. state.oldDetail = state.detail
  152. state.log_open_box_show = {
  153. businessType: Report.businessType.pageView,
  154. pageSource: Report.pageSource.openTreasurePage,
  155. redPacketType: Report.redPacketType.treasure,
  156. shareLinkId: state.invite_code,
  157. myShareLinkId: state.oldDetail.inviteCopyUrl,
  158. currentInvitedNum: state.oldDetail.inviteCount,
  159. postId: state.postId
  160. }
  161. state.log_open_box_btn_click = {
  162. businessType: Report.businessType.buttonClick,
  163. pageSource: Report.pageSource.openTreasurePage,
  164. objectType: Report.objectType.nextButton,
  165. redPacketType: Report.redPacketType.treasure,
  166. shareLinkId: state.invite_code,
  167. myShareLinkId: state.oldDetail.inviteCopyUrl,
  168. currentInvitedNum: state.oldDetail.inviteCount,
  169. postId: state.postId
  170. }
  171. state.init(() => {
  172. state.inviteInit()
  173. state.inviteList()
  174. })
  175. } else {
  176. switch (String(res.code)) {
  177. case '2037':
  178. state.dialog.show = true
  179. break;
  180. case '2203':
  181. state.toast.txt = 'You have already opened the treasure chest'
  182. state.toast.show = true
  183. break
  184. case '2208':
  185. state.toast.txt = 'No treasure chests to open'
  186. state.toast.show = true
  187. break
  188. default:
  189. state.toast.txt = 'System Error'
  190. state.toast.show = true
  191. break
  192. }
  193. state.toast.has_icon = false
  194. setTimeout(() => {
  195. state.toast.show = false
  196. }, 2000)
  197. state.init(() => {
  198. state.inviteInit()
  199. state.inviteList()
  200. })
  201. }
  202. }).catch(() => {
  203. state.btn_loading = false
  204. })
  205. }
  206. const handleStatus = (callback) => {
  207. // 如果 夺宝状态 = 未开始
  208. // 显示未开始页面
  209. // 如果 夺宝状态 = 进行中
  210. // 如果 夺宝参与状态 = 未参与夺宝
  211. // 显示封面页
  212. // 如果 夺宝参与状态 = 已参与夺宝
  213. // 显示邀请页
  214. // 如果 夺宝状态 = 已结束
  215. // 显示结束页面
  216. let { status, joinStatus } = state.detail || {}
  217. state.open_btn.txt = 'Start'
  218. // 如果 夺宝状态 = 未开始
  219. if (status == 0) {
  220. state.page = '封面页'
  221. }
  222. // 如果 夺宝状态 = 进行中
  223. else if (status == 1) {
  224. // 如果 夺宝参与状态 = 未参与夺宝
  225. if (joinStatus == 0) {
  226. // 显示封面页
  227. state.page = '封面页'
  228. state.cover_status = '有邀请人'
  229. state.open_btn.txt = 'Start'
  230. // state.cover_status = '无邀请人'
  231. // state.cover_status = '奖励已被领光'
  232. }
  233. // 如果 夺宝参与状态 = 已参与夺宝
  234. else if (joinStatus == 1) {
  235. state.page = '邀请页'
  236. }
  237. }
  238. // 如果 夺宝状态 = 已结束
  239. else {
  240. state.open_btn.txt = 'Look for more treasures'
  241. state.page = '封面页'
  242. state.cover_status = '奖励已被领光'
  243. state.btn_loading = false
  244. return
  245. }
  246. callback && callback()
  247. }
  248. function onRuntimeMsg() {
  249. chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
  250. switch (req.actionType) {
  251. case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
  252. let twitterFans = 0;
  253. let { user } = req.data || {};
  254. if (user && user.result && user.result.legacy) {
  255. let legacy = user.result.legacy;
  256. twitterFans = legacy ? legacy.followers_count : 0;
  257. }
  258. if (state.tweetId == req.tweetId && req.objectType == Report.objectType.tweetPostBinded) {
  259. Report.reportLog({
  260. objectType: Report.objectType.tweetPostBinded,
  261. twitterFans: twitterFans,
  262. redPacketType: Report.redPacketType.treasure,
  263. postId: state.postId
  264. });
  265. }
  266. break;
  267. }
  268. sendResponse && sendResponse();
  269. })
  270. }
  271. </script>
  272. <style lang="scss" >
  273. html,
  274. body {
  275. margin: 0;
  276. padding: 0;
  277. }
  278. </style>