nieyuge 2 yıl önce
ebeveyn
işleme
d67fd7f44e

+ 4 - 0
src/assets/svg/icon-task-facebook.svg

@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.6004 10.0004C18.6004 5.25074 14.75 1.40039 10.0004 1.40039C5.25074 1.40039 1.40039 5.25074 1.40039 10.0004C1.40039 14.2928 4.54527 17.8507 8.65664 18.4959V12.4863H6.47305V10.0004H8.65664V8.1057C8.65664 5.95033 9.94059 4.75977 11.905 4.75977C12.8456 4.75977 13.8301 4.92773 13.8301 4.92773V7.04414H12.7457C11.6774 7.04414 11.3441 7.70711 11.3441 8.38789V10.0004H13.7293L13.348 12.4863H11.3441V18.4959C15.4555 17.8507 18.6004 14.2928 18.6004 10.0004Z" fill="#0D90F2"/>
+<path d="M13.3476 12.4863L13.7289 10.0004H11.3438V8.38789C11.3438 7.70779 11.677 7.04414 12.7453 7.04414H13.8297V4.92773C13.8297 4.92773 12.8456 4.75977 11.9046 4.75977C9.9402 4.75977 8.65625 5.95033 8.65625 8.1057V10.0004H6.47266V12.4863H8.65625V18.4959C9.54667 18.6352 10.4533 18.6352 11.3438 18.4959V12.4863H13.3476Z" fill="white"/>
+</svg>

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

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.6004 5.03875C17.9679 5.30807 17.2795 5.5019 16.5705 5.57739C17.3023 5.14689 17.8583 4.46747 18.1208 3.65951C17.4449 4.05737 16.6801 4.34913 15.8843 4.50011C15.2394 3.82069 14.3236 3.40039 13.3087 3.40039C11.3553 3.40039 9.78438 4.96326 9.78438 6.88115C9.78438 7.15047 9.81746 7.41979 9.8712 7.67891C6.94631 7.52793 4.33768 6.14868 2.60342 4.03697C2.29749 4.5552 2.12386 5.14689 2.12386 5.79367C2.12386 7.00153 2.74605 8.06656 3.69483 8.69294C3.11605 8.67049 2.57035 8.50931 2.10112 8.25019V8.29304C2.10112 9.98445 3.31242 11.3861 4.92679 11.7085C4.6312 11.784 4.31494 11.8268 3.99868 11.8268C3.76924 11.8268 3.5522 11.8044 3.33309 11.7738C3.77958 13.153 5.07976 14.1548 6.62798 14.1875C5.41669 15.124 3.89947 15.6749 2.25202 15.6749C1.95643 15.6749 1.68358 15.6647 1.40039 15.632C2.96309 16.6216 4.81724 17.1928 6.81402 17.1928C13.2963 17.1928 16.8434 11.8921 16.8434 7.29125C16.8434 7.14027 16.8434 6.98928 16.8331 6.8383C17.5193 6.34251 18.1208 5.72838 18.6004 5.03875Z" fill="#1D9BF0"/>
+</svg>

+ 7 - 0
src/entry/background.js

@@ -16,6 +16,10 @@ import {
     onDisconnectHandler
 } from "@/logic/background/twitter";
 
+import {
+    facebookShareSuccess
+} from "@/logic/background/facebook";
+
 //加载bg.js 执行
 setMessageCount();
 
@@ -80,6 +84,9 @@ function onMessageMethod(req, sender, sendResponse) {
             case 'RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID':
                 saveDiscordAuthWindowId(req);
                 break;
+            case 'CONTENT_FACEBOOK_SHARE_SUCCESS':
+                facebookShareSuccess(req, sender);
+                break;
         }
     }
 }

+ 6 - 1
src/entry/content.js

@@ -14,13 +14,18 @@ import {
     changeQueueNum
 } from "@/logic/content/twitter.js";
 
+import {
+    initFacebookContent
+} from "@/logic/content/facebook.js"
+
 
 chrome.storage.onChanged.addListener(changes => {
     initExecuteScript(changes)
 })
 
 window.onload = () => {
-    init()
+    init();
+    initFacebookContent();
 };
 
 window.onmessage = (res) => {

+ 2 - 0
src/http/configAPI.js

@@ -25,3 +25,5 @@ export const logAPIUrl = logApi[process.env.NODE_ENV] + '/log-center'
 export const pageUrl = page[process.env.NODE_ENV] 
 
 export const discordAuthRedirectUri = `${pageUrl}/auth/discordCallback`;
+
+export const faceShareRedirectUrl = `${pageUrl}/facebook/shareCallback`;

+ 36 - 0
src/logic/background/facebook.js

@@ -0,0 +1,36 @@
+import { fetchAddFinishEvent } from '@/logic/background/fetch/facebook'
+
+/**
+ * facebook分享成功逻辑
+ */
+export function facebookShareSuccess(params, sender) {
+    let {data} = params;
+    let {id} = sender.tab || {};
+    chrome.tabs.remove(id);
+
+    fetchAddFinishEvent({
+        eventType: data.type,
+        luckdropId: data.taskLuckdropId
+    }).then(res => {
+        if (res.code == 0) {
+            setTimeout(() => {
+                sendActivetabMessage({
+                    actionType: 'BG_FACEBOOK_SHARE_SUCCESS',
+                    data: data
+                });
+            })
+        }
+    })
+}
+
+
+function sendActivetabMessage(message = {}) {
+    chrome.tabs.query({
+        active: true,
+        currentWindow: true
+    }, (tabs) => {
+        chrome.tabs.sendMessage(tabs[0].id, message, res => {
+            console.log(res)
+        })
+    })
+}

+ 8 - 0
src/logic/background/fetch/facebook.js

@@ -0,0 +1,8 @@
+import { commonFetch } from '@/http/fetch'
+
+export function fetchAddFinishEvent(params = {}) {
+    return commonFetch({
+        url: '/post/luckdrop/addFinishEvent',
+        params
+    })
+}

+ 74 - 0
src/logic/content/facebook.js

@@ -0,0 +1,74 @@
+import { faceShareRedirectUrl } from '@/http/configAPI'
+import { getChromeStorage } from '@/uilts/chromeExtension.js'
+
+let tempData = {
+    isSetContent: false
+}
+
+/**
+ * 初始化contentjs调用逻辑
+ */
+export function initFacebookContent() {
+    // window.location.href.indexOf('facebook.com') > -1;
+    injectShareCode();
+
+    shareCallback();
+};
+
+/**
+ * 注入分享页面逻辑
+ * @returns 
+ */
+function injectShareCode() {
+    const {href, pathname} = window.location;
+    if(!(href.indexOf('facebook.com') > -1 && pathname.indexOf('dialog/share'))) {
+        return;
+    }
+
+    // 设置分享内容
+    setShareInputContent();
+}
+
+/**
+ * 格式化发布内容字符串
+ */
+function formatContentStr(content) {
+    let str = content.replace(/(\r)/g,'\n');
+    return str;
+}
+
+
+/**
+ * 设置分享输入框内容
+ */
+async function setShareInputContent() {
+    let shareData = await getChromeStorage('shareFacebookData') || {};
+    console.log(shareData);
+    const contentStr = formatContentStr(shareData.contentStr);
+
+    if (!tempData.isSetContent && contentStr) {
+        tempData.isSetContent = true;
+        setTimeout(() => {
+            document.execCommand("insertText", false, contentStr);
+            setTimeout(() => {
+                tempData.isSetContent = false;
+            }, 800)
+        }, 600);
+    }
+}
+
+/**
+ * 分享回调
+ */
+function shareCallback() {
+    if (window.location.href.indexOf(faceShareRedirectUrl) > -1) {
+        const urlParams = new URLSearchParams(window.location.search);
+        let params = JSON.parse(urlParams.get('params'));
+        if (params) {
+            chrome.storage.local.remove("shareFacebookData");
+            chrome.runtime.sendMessage({ actionType: "CONTENT_FACEBOOK_SHARE_SUCCESS", data: params }, () => { 
+
+            })
+        }
+    }
+}

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

@@ -73,7 +73,14 @@ export function hideIframeHandler() {
  * 展示twitter原生发布框
  */
 export function showTwitterPublishDialogHandler(publishRes) {
-    dom.tweetBtn.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();
+    }
+
     _setPublishContent(publishRes.srcContent);
     _publishTweetEvent(publishRes.postId, bindTwitterArtMethod);
 }

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

@@ -354,6 +354,11 @@ defineExpose({
 
             .right {
                 text-align: right;
+                max-width: calc(100% - 150px);
+                
+                .num, .amount {
+                    word-break: break-all;
+                }
 
                 .num {
                     font-weight: 500;

+ 27 - 13
src/view/iframe/publish/give-dialog.vue

@@ -210,7 +210,7 @@
                                         </div>
                                     </div>
                                     <el-switch
-                                        v-if="item.type == 2 || item.type == 7"
+                                        v-if="item.type == 2 || item.type == 7 || item.type == 8"
                                         v-model="item.checked"
                                         @change="formSwitchChange($event, item, index)"
                                     />
@@ -547,7 +547,7 @@ let iptErrType = ''; //discord
 let formList = reactive([
     {
         label: "Follow",
-        icon: require("@/assets/svg/icon-follow.svg"),
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "textarea",
         type: 1,
         text: [],
@@ -555,18 +555,26 @@ let formList = reactive([
     },
     {
         label: "Retweet",
-        icon: require("@/assets/svg/icon-retweet.svg"),
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "div",
         type: 3,
         checked: true,
     },
     {
         label: "Like Tweet",
-        icon: require("@/assets/svg/icon-like.svg"),
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "div",
         type: 2,
         checked: true,
     },
+    {
+        label: "Repost to Facebook",
+        icon: require("@/assets/svg/icon-task-facebook.svg"),
+        nodeType: "div",
+        text: '',
+        type: 8,
+        checked: true,
+    },
     {
         label: "Join Discord",
         icon: require("@/assets/svg/icon-discord-mini.svg"),
@@ -861,15 +869,14 @@ const submitRequest = async () => {
     let { amountValue = 0, totalCount = 0 } = baseFormData;
     baseFormData.amountCurrencyCode = currentCurrencyInfo.value.currencyCode;
     // 组装提交参数
-    formList[0]["text"] = atUserList.value;
 
     let finishConditions = [];
     for (let i = 0; i < formList.length; i++) {
         let item = {};
         item.type = formList[i]["type"];
-        if (item.type == 1 && formList[i]["text"]) {
+        if (item.type == 1 && atUserList.value.length) {
             // follow 参数
-            let relatedUsers = formList[i]["text"];
+            let relatedUsers = atUserList.value;
             item.relatedUsers = relatedUsers;
             finishConditions.push(item);
         } else  if (formList[i]["type"] == 7) {
@@ -879,6 +886,7 @@ const submitRequest = async () => {
                 finishConditions.push(item);
             }
         } else  if (formList[i]["checked"]) {
+            // 其余任务
             finishConditions.push(item);
         }
     }
@@ -942,7 +950,6 @@ const initParams = () => {
     resetFormIpt();
 
     // clear follow value
-    formList[0].text = [];
     atUserList.value = [];
 
     submitIng.value = false;
@@ -954,11 +961,16 @@ const initParams = () => {
     currentCurrencyInfo.value = {};
 
     // clear discord value
-    formList[3].text = '';
+    setDiscordIptTxt({text: ''});
 
     discordInviteInfo.value = {};
 };
 
+const setDiscordIptTxt = ({text}) => {
+    const index = formList.findIndex(item => item.type == 7);
+    formList[index]['text'] = text;
+}
+
 /**
  * 支付完成回调
  */
@@ -1150,17 +1162,17 @@ const onIptSetErrorTxt = (params = {}) => {
  */
 const formSwitchChange = (val, params, index) => {
     console.log('formSwitchChange')
-    if(!val) {
-        if(params.type == 7) {
+    if(params.type == 7) {
+        if(!val) {
             //错误类型 discord 清空discord错误校验
             if(iptErrType == 'discord') {
                 iptErrMsgTxt.value = '';
                 formList[index]['text'] = '';
                 onIptSetErrorTxt();
             }
+        } else {
+            onIptSetErrorTxt();
         }
-    } else {
-        onIptSetErrorTxt();
     }
 }
 
@@ -1172,6 +1184,8 @@ const onIptDiscordAddress = (e, index) => {
         checked = true;
         formList[index].checked = checked;
         formList[index].text = formList[index].text.replace(/\s/g,'');
+    } else if(!val){
+        discordInviteInfo.value = {};
     }
     onIptDiscordDebounce()
 }

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

@@ -68,6 +68,18 @@
             <img v-if="state.done.retweet" :src="require('@/assets/svg/icon-true.svg')" alt />
             <div v-else class="btn" @click="clickRetweetBtn">Retweet</div>
           </template>
+          <!-- repost feacebook -->
+          <template v-if="item.type == 8">
+            <img :src="require('@/assets/svg/icon-task-facebook.svg')" alt />
+            <div class="item-content">
+              <div class="item-title">Repost to Facebook</div>
+            </div>
+            <img :src="require('@/assets/gif/red-right.gif')" alt class="red-right"
+              v-show="!state.done.repost_facebook && state.done.repost_facebook_red" />
+            <img v-if="state.done.repost_facebook" :src="require('@/assets/svg/icon-true.svg')" alt />
+            <div v-else class="btn" @click="clickRepostFacebook(item)">Repost</div>
+          </template>
+          <!-- join discord  -->
           <template v-if="item.type == 7">
             <img :src="require('@/assets/svg/icon-discord-mini.svg')" alt />
             <div class="item-content">
@@ -344,11 +356,12 @@ 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 { getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
-import { discordAuthRedirectUri } from '@/http/configAPI'
+import { discordAuthRedirectUri, faceShareRedirectUrl} from '@/http/configAPI'
+import { getFrontConfig } from "@/http/account";
 import GlobalTip from '@/view/components/global-tip.vue'
 
 var moment = require('moment');
@@ -357,6 +370,11 @@ let discordAuthorizeRequired = false;
 let joinDiscordActionState = 'default'; //authAndJoinIng  joinIng  reAuth
 let joinDiscordIng = ref(false);
 
+let facebookAppConfig = {
+  facebookAppId: "",
+  faceShareRedirectUrl
+};
+
 let state = reactive({
   status: '',
   loading_show: false,
@@ -373,7 +391,8 @@ let state = reactive({
     follow: false,
     like: false,
     retweet: false,
-    join_discord: false
+    join_discord: false,
+    repost_facebook: false,
   }
 })
 function clickRetry() {
@@ -506,6 +525,69 @@ async function clickRetweetBtn() {
   });
 }
 
+/**
+ * 点击repost facebook
+ */
+async function clickRepostFacebook(params) {
+    let _userInfo = await checkIsLogin()
+    if (!_userInfo) {
+      return
+    }
+
+    let shareUrlparams = {
+      href: state.postRedirectUrl + '?tweetId=' + state.tweetId, 
+      type: params.type,
+      taskLuckdropId: state.detail.taskLuckdropId
+    }
+
+    setChromeStorage({shareFacebookData : JSON.stringify({
+      contentStr: state.srcContent
+    })}) 
+
+    let shareUrl = feacebookShareUrl(shareUrlparams);
+    openShareFacebookWindow({url: shareUrl});
+}
+
+/**
+ * 分享到facebook
+ */
+function openShareFacebookWindow({url}) {
+  const width = 800;
+  chrome.windows.create({
+    width,
+    type: 'normal',
+    url
+  }, function (window) {
+
+  })
+}
+
+/**
+ * 分享fecebook 地址
+ */
+function feacebookShareUrl(params = {}) {
+  let { href = '', type = '', taskLuckdropId } = params;
+  let cbParams = JSON.stringify({
+    type,
+    taskLuckdropId
+  })
+  let shareUrl = `https://www.facebook.com/dialog/share?app_id=${facebookAppConfig.facebookAppId}&display=popup&href=${href}&redirect_uri=${facebookAppConfig.faceShareRedirectUrl}?params=${cbParams}`;
+
+  return shareUrl;
+}
+
+/**
+ * 分享成功
+ */
+function facebookShareSuccess(params) {
+  let {taskLuckdropId} = params;
+
+  if(taskLuckdropId == state.detail.taskLuckdropId) {
+    state.done.repost_facebook = true;
+    state.done.repost_facebook_red = false;
+  }
+}
+
 
 function getValidity() {
   let _d1, _d2, _d3, _h, _m, _s
@@ -784,9 +866,20 @@ const handleStatusPage = () => {
 
 }
 
+function setFrontConfig() {
+    getFrontConfig({
+        params: {},
+    }).then((res) => {
+        if (res.code == 0) {
+            facebookAppConfig.facebookAppId = res.data.fbClientId;
+        }
+    });
+};
+
 function init() {
   onRuntimeMsg();
   onPageVisbile();
+  setFrontConfig();
   getPostDetail({
     params: {
       postId: state.postId
@@ -798,6 +891,9 @@ function init() {
     // 如果金额是0
     //    显示没有领到钱
     if (res.code == 0) {
+      state.srcContent = res.data.srcContent;
+      state.postRedirectUrl = res.data.postRedirectUrl;
+
       // 判断推特id,绑定逻辑
       state.srcContentId = res.data.srcContentId
       if (!state.srcContentId) {
@@ -927,11 +1023,7 @@ onMounted(() => {
 
 // 点击领取
 function clickOpenRedPacket() {
-  chrome.runtime.sendMessage({
-    actionType: 'CONTENT_GET_PINED'
-  }, res => {
-    console.log(res);
-  })
+  callEventPageMethod('CONTENT_GET_PINED', {})
   handleRedPacket()
 }
 
@@ -1057,7 +1149,17 @@ function handleFinishRedPacket() {
                 state.done.retweet = false
               }
               break
+            case '8':
+              //repost feacebook
+              if (_data[i].finished) {
+                state.done.repost_facebook = true
+                state.done.repost_facebook_red = false
+              } else {
+                state.done.repost_facebook = false;
+                state.done.repost_facebook_red = true
+              }
             case '7':
+              //join discord
               discordAuthorizeRequired = _data[i].discordAuthorizeRequired;
               if (_data[i].finished) {
                 state.done.join_discord = true
@@ -1261,12 +1363,16 @@ function onRuntimeMsg() {
       case 'BACK_DISCORD_LOGIN_SUCCESS':
         discordLoginSuccess();
         break;
+      case 'BG_FACEBOOK_SHARE_SUCCESS':
+        facebookShareSuccess(req.data);
+        break;
       case 'DO_TASK':
         if (!req.task_type || state.tweetId != req.tweet_Id) {
           return
         }
         state.loading_show = false
-        doTaskReport(req, sender)
+        doTaskReport(req, sender);
+        break;
     }
   })
 }