import { getOffsetRect, nextTick } from '@/uilts/help' import { listJoinNftGroup } from '@/http/nft'; import { getChromeStorage } from '@/uilts/chromeExtension.js' import { _setPublishContent, publishNFTTweetPost, bindTwitterArt, bindTwitterArtMethod, getSysTheme, systemInfo } from './twitter'; import { jumpTwitterDetailByAlert } from '@/logic/content/help/twitter.js'; import Report from "@/log-center/log" var ifShowNftGroup = false; var tempNftGroupPost = null; var groupImgNoSelect = require("@/assets/img/icon-nft-group-entry.png"); var groupImgSelect = require("@/assets/img/icon-nft-group-select.png"); let fixProfileTabAutoTimer = null; export const showNFTGroupIcon = () => { let urlInfo = new URL(window.location.href) let isTwitter = urlInfo.hostname === 'twitter.com' let toolElem = document.querySelector('div[data-testid="toolBar"]'); let isAppend = toolElem && toolElem.querySelector('#de-nft-group-enter'); let where = isTwitter && toolElem && !isAppend && ifShowNftGroup; if (where) { let oDiv = document.createElement(`div`); oDiv.id = 'de-nft-group-enter'; let oImg = document.createElement('img'); oImg.src = groupImgNoSelect; oImg.className = 'addGroup'; oDiv.innerHTML = ` ${oImg.outerHTML} `; oDiv.addEventListener('click', (e) => { showNFTGroupList(e); e.stopPropagation(); }) toolElem.firstChild.appendChild(oDiv) } } export const showNFTGroupList = (e) => { let rectObject = e.target.getBoundingClientRect(); let { top, left, height } = rectObject; let oTop = top + height + 10; // 居底判断 let wHeight = document.body.offsetHeight || document.body.clientHeight; if ((top + height + 290) > wHeight) oTop = top - 290; let iframe = document.createElement('iframe'); iframe.src = chrome.runtime.getURL(`/iframe/nft-group.html`) iframe.style.cssText = 'border:medium none; width:315px; height:260px;'; let html = document.createElement('div'); html.id = 'de-nft-group-list'; html.innerHTML = `
${iframe.outerHTML}
`; document.body.appendChild(html); document.querySelector('.de-nft-group-mask').addEventListener('click', () => { hideNFTGroupList(); }) } export const hideNFTGroupList = () => { let dom = document.querySelector('#de-nft-group-list'); dom && document.body.removeChild(dom); } export const checkUserJoinGroup = (fn) => { getChromeStorage('userInfo', (res) => { // 如果登录 if (res) { listJoinNftGroup({ params: { pageNum: 1, pageSize: 1 } }).then(res => { let { data = [] } = res; if (data !== null && data.length > 0) { ifShowNftGroup = true; if (fn) fn() } }) } }) } export const clearPostContent = (fn) => { let edit = document.querySelector('div[contenteditable="true"]') let where = (edit.innerText === '\n') || (edit.innerText === '') if (where) { fn() } else { nextTick(() => { let inputEle = document.querySelector('div[contenteditable="true"]'); if (inputEle) { inputEle.focus(); } }, 20).then(() => { document.execCommand('selectAll'); document.execCommand('delete'); clearPostContent(fn) }) } } export const setPostContent = (res) => { nextTick(() => { let inputEle = document.querySelector('div[contenteditable="true"]'); if (inputEle) { inputEle.focus(); } setGroupIconStatus(); }, 100).then(() => { _setPublishContent(res.srcContent + ' '); }) } export const endPostContent = () => { return new Promise((resolve) => { let inputEle = document.querySelector('div[contenteditable="true"]'); let range = document.createRange(); range.selectNodeContents(inputEle); range.collapse(false); let sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); resolve() }) } export const setNFTGroupContent = (res) => { tempNftGroupPost = res; let dialogDiv = document.querySelectorAll('div[role="dialog"]'); if (dialogDiv.length === 0) { 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 edit = document.querySelector('div[contenteditable="true"]') let where = (edit.innerText === '\n') || (edit.innerText === '') if (where) { setPostContent(res) nextTick(() => { _addTweetButtonListen() }, 100) } else { endPostContent().then(() => { let inputEle = document.querySelector('div[contenteditable="true"]'); if (inputEle) { inputEle.focus(); } setPostContent(res) nextTick(() => { _addTweetButtonListen() }, 100) }) } } export const elemAddEventListener = (elem, action, fn) => { if (elem) { elem.removeEventListener(action, fn) elem.addEventListener(action, fn) } } export const addJoinedGroupList = () => { if(ifShowNftGroup) { let {pathname} = window.location; let iframe = document.createElement('iframe'); iframe.id = 'de-joined-group-list'; iframe.src = chrome.runtime.getURL('/iframe/joined-group-list.html'); iframe.style.cssText = `border: medium none;height: 120px;border-radius: 16px;margin-bottom: 16px` let iframeContent = document.getElementById('de-joined-group-list'); if (!iframeContent && pathname == '/home') { let sidebarColumn = document.querySelector('div[data-testid="sidebarColumn"]'); if(sidebarColumn) { let searchDom = sidebarColumn.querySelector('form[role="search"]'); if(searchDom) { let listWrapperDom = searchDom.parentElement.parentElement.parentElement.parentElement; if(listWrapperDom) { let listParent = listWrapperDom.parentElement; if(listParent) { listParent.insertBefore(iframe, listWrapperDom.nextElementSibling.nextElementSibling); } } } } } } }; export const setJoinedGroupIframeStyle = (params) => { let {height = '321px'} = params; let iframeContent = document.getElementById('de-joined-group-list'); if(iframeContent) { iframeContent.style.height = height; } } export function setGroupIconStatus() { let editElem = document.querySelector('div[contenteditable="true"]'); let main_observer = new MutationObserver(() => { let groupImg = document.querySelector('#de-nft-group-enter'); let innerText = editElem.innerText || ''; if (groupImg && innerText) { let where = innerText.indexOf('#DNFT') !== -1 && innerText.indexOf('nft_group') !== -1; if (where) { groupImg.querySelector('.addGroup').src = groupImgSelect; } else { groupImg.querySelector('.addGroup').src = groupImgNoSelect; } } }); main_observer.observe(editElem, { attributes: false, childList: true, subtree: true }) } function _addTweetButtonListen() { let btn = document.querySelector('div[data-testid="tweetButton"]'); btn.removeEventListener('click', _postTweetContent); btn.addEventListener('click', _postTweetContent) } function _postTweetContent() { if (tempNftGroupPost && tempNftGroupPost.groupId) { publishNFTTweetPost(tempNftGroupPost) bindTwitterArt.needBind = true; bindTwitterArt.postId = tempNftGroupPost.postId; bindTwitterArtMethod(); // 非首页处理 let homeTag = document.querySelectorAll('div[data-testid="toolBar"]'); if (homeTag.length === 1) { jumpTwitterDetailByAlert() } } } /** * mask web3 Tab * */ const getMaskWeb3Tab = () => { let tab = document.querySelector('div[data-testid="ScrollSnap-nextButtonWrapper"] + span'); return tab; } const getGroupTabNode = () => { let tab = document.querySelector('#de-nav-tab-group'); return tab; } const getGroupTabContentNode = () => { let content = document.getElementById('de-tab-group-content'); return content; } /** * * 获取 twitter tab 下的内容 */ const getTweetTabContent = () => { let tweetTabContent = document.querySelector('[data-testid="primaryColumn"] [role="navigation"] + * > div[aria-label]:not([role="progressbar"])') || document.querySelector('div[data-testid="emptyState"]'); return tweetTabContent; } export const setGroupInfo = (params = {}) => { let groupTab = getGroupTabNode(); if (!params.nftGroupId) { let { pathname = '' } = window.location; if (pathname == "/compose/tweet") { return; }; if (groupTab) { groupTab.style.display = 'none'; } else { setTimeout(() => { groupTab = getGroupTabNode(); if (groupTab) { groupTab.style.display = 'none'; } }, 800) } } else { if (groupTab) { let { display } = groupTab.style; if (display == 'none') { groupTab.style.display = 'block'; } } } } /** * * 设置Tab Group Iframe 样式 */ export const setTabGroupIframeStyle = (params, isReSize = false) => { if(!isReSize) { getSysTheme(); } let iframeContent = getGroupTabContentNode(); if (iframeContent) { let htmlHeight = document.querySelector('html').offsetHeight; let primaryColumnHeightn = document.querySelector('div[data-testid="primaryColumn"]').offsetHeight; let height = primaryColumnHeightn > htmlHeight ? primaryColumnHeightn : htmlHeight; iframeContent.style.height = height + 'px'; } } export const setGroupTabStatus = () => { let groupTab = getGroupTabNode(); if (groupTab) { let line = groupTab.querySelector('#de-tab-line'); if (line) { let { display } = line.style; if (display != 'none') { groupTab.click(); } } } else { setTimeout(() => { addGroupTab(); }, 2000) } clearInterval(fixProfileTabAutoTimer); fixProfileTabAutoSwitch(); }; const fixProfileTabAutoSwitch = () => { fixProfileTabAutoTimer = setInterval(() => { let groupTab = getGroupTabNode(); let tweetTab = document.querySelector('a[aria-selected="true"]'); if (groupTab) { let line = groupTab.querySelector('#de-tab-line'); if (line) { let { display } = line.style; if (display != 'none' && tweetTab) { let groupContent = getGroupTabContentNode(); if (groupContent) { let tweetTabContent = getTweetTabContent(); let { visibility } = tweetTabContent.style; let { display } = groupContent.style; if (display == 'block' && visibility != 'hidden') { groupTab.click(); } } } } } }, 1000) } const hiddenMaskWeb3Tab = (count) => { setTimeout(() => { count++; if (count < 6) { let tab = getMaskWeb3Tab(); if (tab) { tab.style.display = 'none' } else { hiddenMaskWeb3Tab(count); } } }, 1000); } /** * 注入 Group List 内容 */ const addTabGroupContent = (cb) => { let params = { windowLocation: window.location } let iframe = document.createElement('iframe'); iframe.id = 'de-tab-group-content'; iframe.src = chrome.runtime.getURL('/iframe/tab-group.html') + `?params=${JSON.stringify(params)}`; iframe.style.cssText = `border: medium none; height: 500px;display: none` let iframeContent = getGroupTabContentNode(); let tweetTabContent = getTweetTabContent(); if (!iframeContent) { if (tweetTabContent && tweetTabContent.parentElement) { tweetTabContent.parentElement.appendChild(iframe); cb && cb(); } } }; /** * * 设置 tab 切换时 tab内容的样式(显示隐藏) */ const setTabContentStyle = (params) => { let { tweetTabContentDisply, iframeContentDisplay } = params; let tweetTabContent = getTweetTabContent(); if (tweetTabContent) { if (tweetTabContentDisply == 'block') { let { visibility } = tweetTabContent.style; if (visibility == 'hidden') { tweetTabContent.style.visibility = 'visible'; tweetTabContent.style.height = 'auto'; tweetTabContent.style.overflow = 'auto'; } } else { tweetTabContent.style.visibility = 'hidden'; tweetTabContent.style.height = '0px'; tweetTabContent.style.overflow = 'hidden'; tweetTabContent.style.margin = '0'; } } let iframeContent = getGroupTabContentNode(); if (!iframeContent) { addTabGroupContent(); } setTimeout(() => { iframeContent = getGroupTabContentNode(); if (iframeContent) { iframeContent.style.display = iframeContentDisplay; } }) }; /** * 切换到 Group tab时 刷新列表 */ export const refreshTabGroup = () => { chrome.runtime.sendMessage({ actionType: "CONTENT_REFRESH_TAB_GROUP_LIST", data: {} }, () => { }); } /** * * tab选中时设置 激活 的字体样式和选中条 */ const setTweetActiveTabStyle = (params) => { let { color, display } = params || {}; let tab = document.querySelector('a[aria-selected="true"]'); if (tab) { let tweetActiveTab = tab.querySelector('div'); if (tweetActiveTab) { tweetActiveTab.style.color = color; let tweetTabLine = tweetActiveTab.querySelector('div'); if (tweetTabLine) { tweetTabLine.style.display = display; } } } } /** * 设置 Group Tab 样式 * */ export const setGroupTabSelfStyle = (params = {}) => { let { groupColor, groupFontWeight, lineDisplay } = params; let groupTab = getGroupTabNode(); if (groupTab) { groupTab.style.color = groupColor; groupTab.style.fontWeight = groupFontWeight; let lineDom = groupTab.querySelector('#de-tab-line'); if (lineDom) { lineDom.style.display = lineDisplay; } } }; const TweetTabEventHandler = () => { window.removeEventListener('scroll', addPageScrollEvent); setGroupTabSelfStyle({ groupColor: 'rgb(83, 100, 113)', groupFontWeight: '500', lineDisplay: 'none' }); setTabContentStyle({ tweetTabContentDisply: 'block', iframeContentDisplay: 'none' }); setTweetActiveTabStyle({ color: 'rgb(15, 20, 25)', display: 'block' }); sendMessageToGroupBanner({ type: 'arrow' }) }; export const sendMessageToGroupBanner = (params) => { chrome.runtime.sendMessage({ actionType: "SWITCH_GROUP_BANNER_STATUS", data: params }, (res) => { if (!res) { Report.reportLog({ objectType: Report.objectType.chrome_extension_sendmessage_error }) } }); } /** * * twitter tab点击事件监听 */ const addTweetTabEventListener = (params) => { let { tabListDom } = params; let groupItemTab = getGroupTabNode(); if (tabListDom && groupItemTab) { // 监听twitter tab点击事件 let tweetTabItem = tabListDom.querySelectorAll('div[role="presentation"]'); if (tweetTabItem.length) { for (let i = 0; i < tweetTabItem.length; i++) { let item = tweetTabItem[i]; item.addEventListener('click', TweetTabEventHandler) } } } } const removeTweetTabEvent = (params) => { let { tabListDom } = params; if (tabListDom) { let tweetTabItem = tabListDom.querySelectorAll('div[role="presentation"]'); if (tweetTabItem.length) { for (let i = 0; i < tweetTabItem.length; i++) { let item = tweetTabItem[i]; item.removeEventListener('click', TweetTabEventHandler) } } } } const addPageScrollEvent = () => { let wrapperDom = document.querySelector('html'); let contentDom = document.querySelector('main[role="main"]'); let data = { wrapperHeight: wrapperDom.offsetHeight, wrapperScrollTop: wrapperDom.scrollTop, contentHeight: contentDom.offsetHeight } chrome.runtime.sendMessage({ actionType: "CONTENT_GROUP_LIST_SCROLL", data: data }, () => { }); }; const onShowGroupBanner = () => { chrome.runtime.onMessage.addListener((req, sender, sendResponse) => { switch (req.actionType) { case 'IFRAME_SHOW_GROUP_TIP': sendMessageToGroupBanner({ type: 'btn' }) if (!getGroupTabNode()) { addGroupTab(); } break } }) } /** * * Group tab点击事件监听 */ const addGroupTabEventListener = () => { let groupTab = getGroupTabNode(); groupTab.addEventListener('click', function () { let bgColor = document.querySelector('body').style.backgroundColor; let groupColor = systemInfo.theme == 'dark' && bgColor == 'rgb(0, 0, 0)' ? '#fff' : 'rgb(15, 20, 25)'; // let groupColor = systemInfo.theme == 'light' ? 'rgb(15, 20, 25)' : '#fff'; setGroupTabSelfStyle({ groupColor: groupColor, groupFontWeight: '700', lineDisplay: 'block' }); setTweetActiveTabStyle({ color: 'rgb(83, 100, 113)', display: 'none' }); setTabContentStyle({ tweetTabContentDisply: 'none', iframeContentDisplay: 'block' }); refreshTabGroup(); window.addEventListener('scroll', addPageScrollEvent); let tipsDom = document.querySelector('#denet_group_banner'); if (tipsDom) { sendMessageToGroupBanner({ type: 'btn' }) } else { onShowGroupBanner(); } }) } /** 选中 Group tab */ export const selectGroupTab = () => { let groupTab = getGroupTabNode(); if (groupTab) { groupTab.click(); } }; /** * 跳转到个人主页 检查是否需要选中 Group tab */ const checkNeedSelectGroupTab = () => { if (window.location.pathname != '/home') { setTimeout(() => { getChromeStorage('groupTabData', (res) => { console.log('groupTabData', res); if (res && res.deTabVal == 'deGroupTab') { chrome.storage.local.remove("groupTabData"); setTimeout(() => { selectGroupTab(); }, 300) } }) }, 1300) } } export const groupTipsSelectGroupTab = (params = {}) => { if (params.type == 'btn') { let groupTab = getGroupTabNode(); if (groupTab) { let line = groupTab.querySelector('#de-tab-line'); if (line) { let { display } = line.style; if (display == 'none') { groupTab.click(); } } } } else { selectGroupTab(); } } export const addGroupTab = () => { if (!document.querySelector('div[data-testid=UserName]')) { return } let tabListDom = document.querySelector('div[role="tablist"]'); let groupItemTab = getGroupTabNode(); if (tabListDom && !groupItemTab) { let groupTab = createGroupTabNode(); tabListDom.appendChild(groupTab); groupTab.addEventListener('mouseenter', function () { groupTab.style.background = 'rgba(15, 20, 25, 0.1)' }); groupTab.addEventListener('mouseleave', function () { groupTab.style.background = 'none' }); setTimeout(() => { let count = 0; hiddenMaskWeb3Tab(count); }, 1300) addGroupTabEventListener(); } removeTweetTabEvent({ tabListDom }); addTweetTabEventListener({ tabListDom }); addTabGroupContent(() => { checkNeedSelectGroupTab(); }); } /** * * 创建 Group Tab */ const createGroupTabNode = () => { let groupIcon = document.createElement('img'); groupIcon.id = 'de-group-tab-icon' groupIcon.src = require("@/assets/img/icon-group-tab-item.png"); groupIcon.style.cssText = 'width:20px;height: 20px;margin-right:4px;'; let divNode = document.createElement('div'); divNode.style.cssText = 'display: flex; align-items: center;height: 100%'; divNode.appendChild(groupIcon); divNode.appendChild(document.createTextNode('Group')); let lineDom = document.createElement('div'); lineDom.id = 'de-tab-line'; lineDom.style.cssText = `border-radius: 9999px; position: absolute; bottom: 0px; min-width: 56px; align-self: center; height: 4px; background-color: rgb(29, 155, 240); display: none`; let groupTab = document.createElement('div'); groupTab.id = 'de-nav-tab-group'; groupTab.style.cssText = `z-index: 1; position: relative; display: flex; min-width: 56px; -webkit-box-pack: center; justify-content: center; -webkit-box-align: center; align-items: center; text-align: center; padding: 0px 16px; color: rgb(83, 100, 113); font-weight: 700; height: 53px; cursor: pointer; font: 500 15px / 20px TwitterChirp, -apple-system, "system-ui", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;`; groupTab.appendChild(divNode); groupTab.appendChild(lineDom); return groupTab; } export const groupBtnStyleChange = () => { let tab = getGroupTabNode(); if (tab) { let line = tab.querySelector('#de-tab-line'); if (line) { let { display } = line.style; if (display != 'none') { sendMessageToGroupBanner({ type: 'btn' }) } } } }