index.vue 10 KB

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