nft.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. import { getOffsetRect, nextTick } from '@/uilts/help'
  2. import { listJoinNftGroup } from '@/http/nft';
  3. import { getChromeStorage } from '@/uilts/chromeExtension.js'
  4. import { _setPublishContent, publishNFTTweetPost, bindTwitterArt, bindTwitterArtMethod, getSysTheme, systemInfo } from './twitter';
  5. import { jumpTwitterDetailByAlert } from '@/logic/content/help/twitter.js';
  6. import Report from "@/log-center/log"
  7. var ifShowNftGroup = false;
  8. var tempNftGroupPost = null;
  9. var groupImgNoSelect = require("@/assets/img/icon-nft-group-entry.png");
  10. var groupImgSelect = require("@/assets/img/icon-nft-group-select.png");
  11. let fixProfileTabAutoTimer = null;
  12. export const showNFTGroupIcon = () => {
  13. let urlInfo = new URL(window.location.href)
  14. let isTwitter = urlInfo.hostname === 'twitter.com'
  15. let toolElem = document.querySelector('div[data-testid="toolBar"]');
  16. let isAppend = toolElem && toolElem.querySelector('#de-nft-group-enter');
  17. let where = isTwitter && toolElem && !isAppend && ifShowNftGroup;
  18. if (where) {
  19. let oDiv = document.createElement(`div`);
  20. oDiv.id = 'de-nft-group-enter';
  21. let oImg = document.createElement('img');
  22. oImg.src = groupImgNoSelect;
  23. oImg.className = 'addGroup';
  24. oDiv.innerHTML = `
  25. ${oImg.outerHTML}
  26. <style>
  27. #de-nft-group-enter {position:relative; display:flex; padding:0 8px;}
  28. #de-nft-group-enter .addGroup {cursor:pointer; height:32px;}
  29. </style>
  30. `;
  31. oDiv.addEventListener('click', (e) => {
  32. showNFTGroupList(e);
  33. e.stopPropagation();
  34. })
  35. toolElem.firstChild.appendChild(oDiv)
  36. }
  37. }
  38. export const showNFTGroupList = (e) => {
  39. let rectObject = e.target.getBoundingClientRect();
  40. let { top, left, height } = rectObject;
  41. let oTop = top + height + 10;
  42. // 居底判断
  43. let wHeight = document.body.offsetHeight || document.body.clientHeight;
  44. if ((top + height + 290) > wHeight) oTop = top - 290;
  45. let iframe = document.createElement('iframe');
  46. iframe.src = chrome.runtime.getURL(`/iframe/nft-group.html`)
  47. iframe.style.cssText = 'border:medium none; width:315px; height:260px;';
  48. let html = document.createElement('div');
  49. html.id = 'de-nft-group-list';
  50. html.innerHTML = `
  51. <div class="de-nft-group-div">
  52. ${iframe.outerHTML}
  53. </div>
  54. <div class="de-nft-group-mask"></div>
  55. <style>
  56. .de-nft-group-div {position:fixed; display:flex; align-items:center; justify-content:center; z-index:100; width:350px; height:280px; left:${left}px; top:${oTop}px; background:#fff; border-radius:20px; box-shadow:0px 4px 20px 0px rgba(0, 0, 0, 0.26);}
  57. .de-nft-group-mask {position:fixed; z-index:99; width:100%; height:100%; left:0; top:0;}
  58. </style>`;
  59. document.body.appendChild(html);
  60. document.querySelector('.de-nft-group-mask').addEventListener('click', () => {
  61. hideNFTGroupList();
  62. })
  63. }
  64. export const hideNFTGroupList = () => {
  65. let dom = document.querySelector('#de-nft-group-list');
  66. dom && document.body.removeChild(dom);
  67. }
  68. export const checkUserJoinGroup = (fn) => {
  69. getChromeStorage('userInfo', (res) => {
  70. // 如果登录
  71. if (res) {
  72. listJoinNftGroup({
  73. params: {
  74. pageNum: 1,
  75. pageSize: 1
  76. }
  77. }).then(res => {
  78. let { data = [] } = res;
  79. if (data !== null && data.length > 0) {
  80. ifShowNftGroup = true;
  81. if (fn) fn()
  82. }
  83. })
  84. }
  85. })
  86. }
  87. export const clearPostContent = (fn) => {
  88. let edit = document.querySelector('div[contenteditable="true"]')
  89. let where = (edit.innerText === '\n') || (edit.innerText === '')
  90. if (where) {
  91. fn()
  92. } else {
  93. nextTick(() => {
  94. let inputEle = document.querySelector('div[contenteditable="true"]');
  95. if (inputEle) {
  96. inputEle.focus();
  97. }
  98. }, 20).then(() => {
  99. document.execCommand('selectAll');
  100. document.execCommand('delete');
  101. clearPostContent(fn)
  102. })
  103. }
  104. }
  105. export const setPostContent = (res) => {
  106. nextTick(() => {
  107. let inputEle = document.querySelector('div[contenteditable="true"]');
  108. if (inputEle) {
  109. inputEle.focus();
  110. }
  111. setGroupIconStatus();
  112. }, 100).then(() => {
  113. _setPublishContent(res.srcContent + ' ');
  114. })
  115. }
  116. export const endPostContent = () => {
  117. return new Promise((resolve) => {
  118. let inputEle = document.querySelector('div[contenteditable="true"]');
  119. let range = document.createRange();
  120. range.selectNodeContents(inputEle);
  121. range.collapse(false);
  122. let sel = window.getSelection();
  123. sel.removeAllRanges();
  124. sel.addRange(range);
  125. resolve()
  126. })
  127. }
  128. export const setNFTGroupContent = (res) => {
  129. tempNftGroupPost = res;
  130. let dialogDiv = document.querySelectorAll('div[role="dialog"]');
  131. if (dialogDiv.length === 0) {
  132. let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
  133. if (bigBtn) {
  134. bigBtn.click();
  135. } else {
  136. let smallBtn = document.querySelector('a[href="/compose/tweet"]')
  137. smallBtn && smallBtn.click();
  138. }
  139. }
  140. let edit = document.querySelector('div[contenteditable="true"]')
  141. let where = (edit.innerText === '\n') || (edit.innerText === '')
  142. if (where) {
  143. setPostContent(res)
  144. nextTick(() => {
  145. _addTweetButtonListen()
  146. }, 100)
  147. } else {
  148. endPostContent().then(() => {
  149. let inputEle = document.querySelector('div[contenteditable="true"]');
  150. if (inputEle) {
  151. inputEle.focus();
  152. }
  153. setPostContent(res)
  154. nextTick(() => {
  155. _addTweetButtonListen()
  156. }, 100)
  157. })
  158. }
  159. }
  160. export const elemAddEventListener = (elem, action, fn) => {
  161. if (elem) {
  162. elem.removeEventListener(action, fn)
  163. elem.addEventListener(action, fn)
  164. }
  165. }
  166. export const addJoinedGroupList = () => {
  167. if(ifShowNftGroup) {
  168. let {pathname} = window.location;
  169. let iframe = document.createElement('iframe');
  170. iframe.id = 'de-joined-group-list';
  171. iframe.src = chrome.runtime.getURL('/iframe/joined-group-list.html');
  172. iframe.style.cssText = `border: medium none;height: 120px;border-radius: 16px;margin-bottom: 16px`
  173. let iframeContent = document.getElementById('de-joined-group-list');
  174. if (!iframeContent && pathname == '/home') {
  175. let sidebarColumn = document.querySelector('div[data-testid="sidebarColumn"]');
  176. if(sidebarColumn) {
  177. let searchDom = sidebarColumn.querySelector('form[role="search"]');
  178. if(searchDom) {
  179. let listWrapperDom = searchDom.parentElement.parentElement.parentElement.parentElement;
  180. if(listWrapperDom) {
  181. let listParent = listWrapperDom.parentElement;
  182. if(listParent) {
  183. listParent.insertBefore(iframe, listWrapperDom.nextElementSibling.nextElementSibling);
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. };
  191. export const setJoinedGroupIframeStyle = (params) => {
  192. let {height = '321px'} = params;
  193. let iframeContent = document.getElementById('de-joined-group-list');
  194. if(iframeContent) {
  195. iframeContent.style.height = height;
  196. }
  197. }
  198. export function setGroupIconStatus() {
  199. let editElem = document.querySelector('div[contenteditable="true"]');
  200. let main_observer = new MutationObserver(() => {
  201. let groupImg = document.querySelector('#de-nft-group-enter');
  202. let innerText = editElem.innerText || '';
  203. if (groupImg && innerText) {
  204. let where = innerText.indexOf('#DNFT') !== -1 && innerText.indexOf('nft_group') !== -1;
  205. if (where) {
  206. groupImg.querySelector('.addGroup').src = groupImgSelect;
  207. } else {
  208. groupImg.querySelector('.addGroup').src = groupImgNoSelect;
  209. }
  210. }
  211. });
  212. main_observer.observe(editElem, { attributes: false, childList: true, subtree: true })
  213. }
  214. function _addTweetButtonListen() {
  215. let btn = document.querySelector('div[data-testid="tweetButton"]');
  216. btn.removeEventListener('click', _postTweetContent);
  217. btn.addEventListener('click', _postTweetContent)
  218. }
  219. function _postTweetContent() {
  220. if (tempNftGroupPost && tempNftGroupPost.groupId) {
  221. publishNFTTweetPost(tempNftGroupPost)
  222. bindTwitterArt.needBind = true;
  223. bindTwitterArt.postId = tempNftGroupPost.postId;
  224. bindTwitterArtMethod();
  225. // 非首页处理
  226. let homeTag = document.querySelectorAll('div[data-testid="toolBar"]');
  227. if (homeTag.length === 1) {
  228. jumpTwitterDetailByAlert()
  229. }
  230. }
  231. }
  232. /**
  233. * mask web3 Tab
  234. *
  235. */
  236. const getMaskWeb3Tab = () => {
  237. let tab = document.querySelector('div[data-testid="ScrollSnap-nextButtonWrapper"] + span');
  238. return tab;
  239. }
  240. const getGroupTabNode = () => {
  241. let tab = document.querySelector('#de-nav-tab-group');
  242. return tab;
  243. }
  244. const getGroupTabContentNode = () => {
  245. let content = document.getElementById('de-tab-group-content');
  246. return content;
  247. }
  248. /**
  249. *
  250. * 获取 twitter tab 下的内容
  251. */
  252. const getTweetTabContent = () => {
  253. let tweetTabContent = document.querySelector('[data-testid="primaryColumn"] [role="navigation"] + * > div[aria-label]:not([role="progressbar"])') || document.querySelector('div[data-testid="emptyState"]');
  254. return tweetTabContent;
  255. }
  256. export const setGroupInfo = (params = {}) => {
  257. let groupTab = getGroupTabNode();
  258. if (!params.nftGroupId) {
  259. let { pathname = '' } = window.location;
  260. if (pathname == "/compose/tweet") {
  261. return;
  262. };
  263. if (groupTab) {
  264. groupTab.style.display = 'none';
  265. } else {
  266. setTimeout(() => {
  267. groupTab = getGroupTabNode();
  268. if (groupTab) {
  269. groupTab.style.display = 'none';
  270. }
  271. }, 800)
  272. }
  273. } else {
  274. if (groupTab) {
  275. let { display } = groupTab.style;
  276. if (display == 'none') {
  277. groupTab.style.display = 'block';
  278. }
  279. }
  280. }
  281. }
  282. /**
  283. *
  284. * 设置Tab Group Iframe 样式
  285. */
  286. export const setTabGroupIframeStyle = (params, isReSize = false) => {
  287. if(!isReSize) {
  288. getSysTheme();
  289. }
  290. let iframeContent = getGroupTabContentNode();
  291. if (iframeContent) {
  292. let htmlHeight = document.querySelector('html').offsetHeight;
  293. let primaryColumnHeightn = document.querySelector('div[data-testid="primaryColumn"]').offsetHeight;
  294. let height = primaryColumnHeightn > htmlHeight ? primaryColumnHeightn : htmlHeight;
  295. iframeContent.style.height = height + 'px';
  296. }
  297. }
  298. export const setGroupTabStatus = () => {
  299. let groupTab = getGroupTabNode();
  300. if (groupTab) {
  301. let line = groupTab.querySelector('#de-tab-line');
  302. if (line) {
  303. let { display } = line.style;
  304. if (display != 'none') {
  305. groupTab.click();
  306. }
  307. }
  308. } else {
  309. setTimeout(() => {
  310. addGroupTab();
  311. }, 2000)
  312. }
  313. clearInterval(fixProfileTabAutoTimer);
  314. fixProfileTabAutoSwitch();
  315. };
  316. const fixProfileTabAutoSwitch = () => {
  317. fixProfileTabAutoTimer = setInterval(() => {
  318. let groupTab = getGroupTabNode();
  319. let tweetTab = document.querySelector('a[aria-selected="true"]');
  320. if (groupTab) {
  321. let line = groupTab.querySelector('#de-tab-line');
  322. if (line) {
  323. let { display } = line.style;
  324. if (display != 'none' && tweetTab) {
  325. let groupContent = getGroupTabContentNode();
  326. if (groupContent) {
  327. let tweetTabContent = getTweetTabContent();
  328. let { visibility } = tweetTabContent.style;
  329. let { display } = groupContent.style;
  330. if (display == 'block' && visibility != 'hidden') {
  331. groupTab.click();
  332. }
  333. }
  334. }
  335. }
  336. }
  337. }, 1000)
  338. }
  339. const hiddenMaskWeb3Tab = (count) => {
  340. setTimeout(() => {
  341. count++;
  342. if (count < 6) {
  343. let tab = getMaskWeb3Tab();
  344. if (tab) {
  345. tab.style.display = 'none'
  346. } else {
  347. hiddenMaskWeb3Tab(count);
  348. }
  349. }
  350. }, 1000);
  351. }
  352. /**
  353. * 注入 Group List 内容
  354. */
  355. const addTabGroupContent = (cb) => {
  356. let params = {
  357. windowLocation: window.location
  358. }
  359. let iframe = document.createElement('iframe');
  360. iframe.id = 'de-tab-group-content';
  361. iframe.src = chrome.runtime.getURL('/iframe/tab-group.html') + `?params=${JSON.stringify(params)}`;
  362. iframe.style.cssText = `border: medium none; height: 500px;display: none`
  363. let iframeContent = getGroupTabContentNode();
  364. let tweetTabContent = getTweetTabContent();
  365. if (!iframeContent) {
  366. if (tweetTabContent && tweetTabContent.parentElement) {
  367. tweetTabContent.parentElement.appendChild(iframe);
  368. cb && cb();
  369. }
  370. }
  371. };
  372. /**
  373. *
  374. * 设置 tab 切换时 tab内容的样式(显示隐藏)
  375. */
  376. const setTabContentStyle = (params) => {
  377. let { tweetTabContentDisply, iframeContentDisplay } = params;
  378. let tweetTabContent = getTweetTabContent();
  379. if (tweetTabContent) {
  380. if (tweetTabContentDisply == 'block') {
  381. let { visibility } = tweetTabContent.style;
  382. if (visibility == 'hidden') {
  383. tweetTabContent.style.visibility = 'visible';
  384. tweetTabContent.style.height = 'auto';
  385. tweetTabContent.style.overflow = 'auto';
  386. }
  387. } else {
  388. tweetTabContent.style.visibility = 'hidden';
  389. tweetTabContent.style.height = '0px';
  390. tweetTabContent.style.overflow = 'hidden';
  391. tweetTabContent.style.margin = '0';
  392. }
  393. }
  394. let iframeContent = getGroupTabContentNode();
  395. if (!iframeContent) {
  396. addTabGroupContent();
  397. }
  398. setTimeout(() => {
  399. iframeContent = getGroupTabContentNode();
  400. if (iframeContent) {
  401. iframeContent.style.display = iframeContentDisplay;
  402. }
  403. })
  404. };
  405. /**
  406. * 切换到 Group tab时 刷新列表
  407. */
  408. export const refreshTabGroup = () => {
  409. chrome.runtime.sendMessage({
  410. actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
  411. data: {}
  412. }, () => { });
  413. }
  414. /**
  415. *
  416. * tab选中时设置 激活 的字体样式和选中条
  417. */
  418. const setTweetActiveTabStyle = (params) => {
  419. let { color, display } = params || {};
  420. let tab = document.querySelector('a[aria-selected="true"]');
  421. if (tab) {
  422. let tweetActiveTab = tab.querySelector('div');
  423. if (tweetActiveTab) {
  424. tweetActiveTab.style.color = color;
  425. let tweetTabLine = tweetActiveTab.querySelector('div');
  426. if (tweetTabLine) {
  427. tweetTabLine.style.display = display;
  428. }
  429. }
  430. }
  431. }
  432. /**
  433. * 设置 Group Tab 样式
  434. * */
  435. export const setGroupTabSelfStyle = (params = {}) => {
  436. let { groupColor, groupFontWeight, lineDisplay } = params;
  437. let groupTab = getGroupTabNode();
  438. if (groupTab) {
  439. groupTab.style.color = groupColor;
  440. groupTab.style.fontWeight = groupFontWeight;
  441. let lineDom = groupTab.querySelector('#de-tab-line');
  442. if (lineDom) {
  443. lineDom.style.display = lineDisplay;
  444. }
  445. }
  446. };
  447. const TweetTabEventHandler = () => {
  448. window.removeEventListener('scroll', addPageScrollEvent);
  449. setGroupTabSelfStyle({
  450. groupColor: 'rgb(83, 100, 113)',
  451. groupFontWeight: '500',
  452. lineDisplay: 'none'
  453. });
  454. setTabContentStyle({
  455. tweetTabContentDisply: 'block',
  456. iframeContentDisplay: 'none'
  457. });
  458. setTweetActiveTabStyle({
  459. color: 'rgb(15, 20, 25)',
  460. display: 'block'
  461. });
  462. sendMessageToGroupBanner({ type: 'arrow' })
  463. };
  464. export const sendMessageToGroupBanner = (params) => {
  465. chrome.runtime.sendMessage({
  466. actionType: "SWITCH_GROUP_BANNER_STATUS",
  467. data: params
  468. }, (res) => {
  469. if (!res) {
  470. Report.reportLog({
  471. objectType: Report.objectType.chrome_extension_sendmessage_error
  472. })
  473. }
  474. });
  475. }
  476. /**
  477. *
  478. * twitter tab点击事件监听
  479. */
  480. const addTweetTabEventListener = (params) => {
  481. let { tabListDom } = params;
  482. let groupItemTab = getGroupTabNode();
  483. if (tabListDom && groupItemTab) {
  484. // 监听twitter tab点击事件
  485. let tweetTabItem = tabListDom.querySelectorAll('div[role="presentation"]');
  486. if (tweetTabItem.length) {
  487. for (let i = 0; i < tweetTabItem.length; i++) {
  488. let item = tweetTabItem[i];
  489. item.addEventListener('click', TweetTabEventHandler)
  490. }
  491. }
  492. }
  493. }
  494. const removeTweetTabEvent = (params) => {
  495. let { tabListDom } = params;
  496. if (tabListDom) {
  497. let tweetTabItem = tabListDom.querySelectorAll('div[role="presentation"]');
  498. if (tweetTabItem.length) {
  499. for (let i = 0; i < tweetTabItem.length; i++) {
  500. let item = tweetTabItem[i];
  501. item.removeEventListener('click', TweetTabEventHandler)
  502. }
  503. }
  504. }
  505. }
  506. const addPageScrollEvent = () => {
  507. let wrapperDom = document.querySelector('html');
  508. let contentDom = document.querySelector('main[role="main"]');
  509. let data = {
  510. wrapperHeight: wrapperDom.offsetHeight,
  511. wrapperScrollTop: wrapperDom.scrollTop,
  512. contentHeight: contentDom.offsetHeight
  513. }
  514. chrome.runtime.sendMessage({
  515. actionType: "CONTENT_GROUP_LIST_SCROLL",
  516. data: data
  517. }, () => { });
  518. };
  519. const onShowGroupBanner = () => {
  520. chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
  521. switch (req.actionType) {
  522. case 'IFRAME_SHOW_GROUP_TIP':
  523. sendMessageToGroupBanner({ type: 'btn' })
  524. if (!getGroupTabNode()) {
  525. addGroupTab();
  526. }
  527. break
  528. }
  529. })
  530. }
  531. /**
  532. *
  533. * Group tab点击事件监听
  534. */
  535. const addGroupTabEventListener = () => {
  536. let groupTab = getGroupTabNode();
  537. groupTab.addEventListener('click', function () {
  538. let bgColor = document.querySelector('body').style.backgroundColor;
  539. let groupColor = systemInfo.theme == 'dark' && bgColor == 'rgb(0, 0, 0)' ? '#fff' : 'rgb(15, 20, 25)';
  540. // let groupColor = systemInfo.theme == 'light' ? 'rgb(15, 20, 25)' : '#fff';
  541. setGroupTabSelfStyle({
  542. groupColor: groupColor,
  543. groupFontWeight: '700',
  544. lineDisplay: 'block'
  545. });
  546. setTweetActiveTabStyle({
  547. color: 'rgb(83, 100, 113)',
  548. display: 'none'
  549. });
  550. setTabContentStyle({
  551. tweetTabContentDisply: 'none',
  552. iframeContentDisplay: 'block'
  553. });
  554. refreshTabGroup();
  555. window.addEventListener('scroll', addPageScrollEvent);
  556. let tipsDom = document.querySelector('#denet_group_banner');
  557. if (tipsDom) {
  558. sendMessageToGroupBanner({ type: 'btn' })
  559. } else {
  560. onShowGroupBanner();
  561. }
  562. })
  563. }
  564. /** 选中 Group tab */
  565. export const selectGroupTab = () => {
  566. let groupTab = getGroupTabNode();
  567. if (groupTab) {
  568. groupTab.click();
  569. }
  570. };
  571. /**
  572. * 跳转到个人主页 检查是否需要选中 Group tab
  573. */
  574. const checkNeedSelectGroupTab = () => {
  575. if (window.location.pathname != '/home') {
  576. setTimeout(() => {
  577. getChromeStorage('groupTabData', (res) => {
  578. console.log('groupTabData', res);
  579. if (res && res.deTabVal == 'deGroupTab') {
  580. chrome.storage.local.remove("groupTabData");
  581. setTimeout(() => {
  582. selectGroupTab();
  583. }, 300)
  584. }
  585. })
  586. }, 1300)
  587. }
  588. }
  589. export const groupTipsSelectGroupTab = (params = {}) => {
  590. if (params.type == 'btn') {
  591. let groupTab = getGroupTabNode();
  592. if (groupTab) {
  593. let line = groupTab.querySelector('#de-tab-line');
  594. if (line) {
  595. let { display } = line.style;
  596. if (display == 'none') {
  597. groupTab.click();
  598. }
  599. }
  600. }
  601. } else {
  602. selectGroupTab();
  603. }
  604. }
  605. export const addGroupTab = () => {
  606. if (!document.querySelector('div[data-testid=UserName]')) {
  607. return
  608. }
  609. let tabListDom = document.querySelector('div[role="tablist"]');
  610. let groupItemTab = getGroupTabNode();
  611. if (tabListDom && !groupItemTab) {
  612. let groupTab = createGroupTabNode();
  613. tabListDom.appendChild(groupTab);
  614. groupTab.addEventListener('mouseenter', function () {
  615. groupTab.style.background = 'rgba(15, 20, 25, 0.1)'
  616. });
  617. groupTab.addEventListener('mouseleave', function () {
  618. groupTab.style.background = 'none'
  619. });
  620. setTimeout(() => {
  621. let count = 0;
  622. hiddenMaskWeb3Tab(count);
  623. }, 1300)
  624. addGroupTabEventListener();
  625. }
  626. removeTweetTabEvent({
  627. tabListDom
  628. });
  629. addTweetTabEventListener({
  630. tabListDom
  631. });
  632. addTabGroupContent(() => {
  633. checkNeedSelectGroupTab();
  634. });
  635. }
  636. /**
  637. *
  638. * 创建 Group Tab
  639. */
  640. const createGroupTabNode = () => {
  641. let groupIcon = document.createElement('img');
  642. groupIcon.id = 'de-group-tab-icon'
  643. groupIcon.src = require("@/assets/img/icon-group-tab-item.png");
  644. groupIcon.style.cssText = 'width:20px;height: 20px;margin-right:4px;';
  645. let divNode = document.createElement('div');
  646. divNode.style.cssText = 'display: flex; align-items: center;height: 100%';
  647. divNode.appendChild(groupIcon);
  648. divNode.appendChild(document.createTextNode('Group'));
  649. let lineDom = document.createElement('div');
  650. lineDom.id = 'de-tab-line';
  651. lineDom.style.cssText = `border-radius: 9999px;
  652. position: absolute;
  653. bottom: 0px;
  654. min-width: 56px;
  655. align-self: center;
  656. height: 4px;
  657. background-color: rgb(29, 155, 240);
  658. display: none`;
  659. let groupTab = document.createElement('div');
  660. groupTab.id = 'de-nav-tab-group';
  661. groupTab.style.cssText = `z-index: 1;
  662. position: relative;
  663. display: flex;
  664. min-width: 56px;
  665. -webkit-box-pack: center;
  666. justify-content: center;
  667. -webkit-box-align: center;
  668. align-items: center;
  669. text-align: center;
  670. padding: 0px 16px;
  671. color: rgb(83, 100, 113);
  672. font-weight: 700;
  673. height: 53px;
  674. cursor: pointer;
  675. font: 500 15px / 20px TwitterChirp, -apple-system, "system-ui", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;`;
  676. groupTab.appendChild(divNode);
  677. groupTab.appendChild(lineDom);
  678. return groupTab;
  679. }
  680. export const groupBtnStyleChange = () => {
  681. let tab = getGroupTabNode();
  682. if (tab) {
  683. let line = tab.querySelector('#de-tab-line');
  684. if (line) {
  685. let { display } = line.style;
  686. if (display != 'none') {
  687. sendMessageToGroupBanner({ type: 'btn' })
  688. }
  689. }
  690. }
  691. }