nft.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import { getOffsetRect, nextTick } from '@/uilts/help'
  2. import { listJoinNftGroup } from '@/http/nft';
  3. import { getChromeStorage } from '@/uilts/chromeExtension.js'
  4. import { _setPublishContent, publishNFTTweetEvent } from './twitter';
  5. var ifShowNftGroup = false;
  6. var tempNftGroupPost = null;
  7. export const showNFTGroupIcon = () => {
  8. let urlInfo = new URL(window.location.href)
  9. let isTwitter = urlInfo.hostname === 'twitter.com'
  10. let toolElem = document.querySelector('div[data-testid="toolBar"]');
  11. let isAppend = toolElem && toolElem.querySelector('#de-nft-group-enter');
  12. let where = isTwitter && toolElem && !isAppend && ifShowNftGroup;
  13. if (where) {
  14. let oDiv = document.createElement(`div`);
  15. oDiv.id = 'de-nft-group-enter';
  16. let oImg = document.createElement('img');
  17. oImg.src = require("@/assets/img/icon-nft-group-entry.png");
  18. oImg.className = 'addGroup';
  19. oDiv.innerHTML = `
  20. ${oImg.outerHTML}
  21. <style>
  22. #de-nft-group-enter {position:relative; display:flex; padding:0 8px;}
  23. #de-nft-group-enter .addGroup {cursor:pointer; height:32px;}
  24. </style>
  25. `;
  26. oDiv.addEventListener('click', (e) => {
  27. showNFTGroupList(e);
  28. e.stopPropagation();
  29. })
  30. toolElem.firstChild.appendChild(oDiv)
  31. }
  32. }
  33. export const showNFTGroupList = (e) => {
  34. let { top, left } = getOffsetRect(e.target);
  35. let oTop = top + e.target.offsetHeight + 10;
  36. let iframe = document.createElement('iframe');
  37. iframe.src = chrome.runtime.getURL(`/iframe/nft-group.html`)
  38. iframe.style.cssText = 'border:medium none; width:315px; height:260px;';
  39. let html = document.createElement('div');
  40. html.id = 'de-nft-group-list';
  41. html.innerHTML = `
  42. <div class="de-nft-group-div">
  43. ${iframe.outerHTML}
  44. </div>
  45. <div class="de-nft-group-mask"></div>
  46. <style>
  47. .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);}
  48. .de-nft-group-mask {position:fixed; z-index:99; width:100%; height:100%; left:0; top:0;}
  49. </style>`;
  50. document.body.appendChild(html);
  51. document.querySelector('.de-nft-group-mask').addEventListener('click', () => {
  52. hideNFTGroupList();
  53. })
  54. }
  55. export const hideNFTGroupList = () => {
  56. let dom = document.querySelector('#de-nft-group-list');
  57. dom && document.body.removeChild(dom);
  58. }
  59. export const checkUserJoinGroup = (fn) => {
  60. getChromeStorage('userInfo', (res) => {
  61. // 如果登录
  62. if (res) {
  63. listJoinNftGroup({
  64. params: {
  65. pageNum: 1,
  66. pageSize: 1
  67. }
  68. }).then(res => {
  69. let { data = [] } = res;
  70. if (data !== null && data.length > 0) {
  71. ifShowNftGroup = true;
  72. if (fn) fn()
  73. }
  74. })
  75. }
  76. })
  77. }
  78. export const clearPostContent = (fn) => {
  79. let edit = document.querySelector('div[contenteditable="true"]')
  80. let where = (edit.innerText === '\n') || (edit.innerText === '')
  81. if (where) {
  82. fn()
  83. } else {
  84. nextTick(() => {
  85. let inputEle = document.querySelector('div[contenteditable="true"]');
  86. if (inputEle) {
  87. inputEle.focus();
  88. }
  89. }, 20).then(() => {
  90. document.execCommand('selectAll');
  91. document.execCommand('delete');
  92. clearPostContent(fn)
  93. })
  94. }
  95. }
  96. export const setPostContent = (res) => {
  97. nextTick(() => {
  98. let inputEle = document.querySelector('div[contenteditable="true"]');
  99. if (inputEle) {
  100. inputEle.focus();
  101. }
  102. }, 100).then(() => {
  103. _setPublishContent(res.srcContent);
  104. })
  105. }
  106. export const setNFTGroupContent = (res) => {
  107. tempNftGroupPost = res;
  108. let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
  109. if (bigBtn) {
  110. bigBtn.click();
  111. } else {
  112. let smallBtn = document.querySelector('a[href="/compose/tweet"]')
  113. smallBtn && smallBtn.click();
  114. }
  115. let edit = document.querySelector('div[contenteditable="true"]')
  116. let where = (edit.innerText === '\n') || (edit.innerText === '')
  117. if (where) {
  118. setPostContent(res)
  119. nextTick(() => {
  120. _addTweetButtonListen()
  121. }, 100)
  122. } else {
  123. clearPostContent(() => {
  124. let inputEle = document.querySelector('div[contenteditable="true"]');
  125. if (inputEle) {
  126. inputEle.focus();
  127. }
  128. setPostContent(res)
  129. nextTick(() => {
  130. _addTweetButtonListen()
  131. }, 100)
  132. })
  133. }
  134. }
  135. export const elemAddEventListener = (elem, action, fn) => {
  136. if (elem) {
  137. elem.addEventListener(action, fn)
  138. }
  139. }
  140. export const addJoinedGroupList = () => {
  141. if(ifShowNftGroup) {
  142. let {pathname} = window.location;
  143. let iframe = document.createElement('iframe');
  144. iframe.id = 'de-joined-group-list';
  145. iframe.src = chrome.runtime.getURL('/iframe/joined-group-list.html');
  146. iframe.style.cssText = `border: medium none;width: 350px;height: 120px;border-radius: 16px;margin-bottom: 16px`
  147. let iframeContent = document.getElementById('de-joined-group-list');
  148. if (!iframeContent && pathname == '/home') {
  149. let sidebarColumn = document.querySelector('div[data-testid="sidebarColumn"]');
  150. if(sidebarColumn) {
  151. let searchDom = sidebarColumn.querySelector('form[role="search"]');
  152. if(searchDom) {
  153. let listWrapperDom = searchDom.parentElement.parentElement.parentElement.parentElement;
  154. let listParent = listWrapperDom.parentElement;
  155. listParent.insertBefore(iframe, listWrapperDom.nextElementSibling.nextElementSibling);
  156. }
  157. }
  158. }
  159. }
  160. };
  161. export const setJoinedGroupIframeStyle = (params) => {
  162. let {height = '321px'} = params;
  163. let iframeContent = document.getElementById('de-joined-group-list');
  164. if(iframeContent) {
  165. iframeContent.style.height = height;
  166. }
  167. }
  168. function _addTweetButtonListen() {
  169. let btn = document.querySelector('div[data-testid="tweetButton"]');
  170. btn.removeEventListener('click', _postTweetContent);
  171. btn.addEventListener('click', _postTweetContent)
  172. }
  173. function _postTweetContent() {
  174. if (tempNftGroupPost && tempNftGroupPost.groupId) {
  175. publishNFTTweetEvent(tempNftGroupPost)
  176. }
  177. }