twitter.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /* eslint-disable react-native/no-inline-styles */
  2. import React, { Component } from 'react';
  3. import { View, DeviceEventEmitter } from 'react-native';
  4. import { DenetWebview } from '@/components/webview';
  5. import { addDom, addDataToStorge } from '../../utils/contentInTwitterJS/addDom';
  6. // import EventEmitter from 'react-native-eventemitter';
  7. interface Props {
  8. navigation: any;
  9. route: any;
  10. }
  11. class Twitter extends Component<Props> {
  12. webref: any;
  13. packUrl: any;
  14. taskLikeMap: Map<string, any> = new Map();
  15. taskRetweetMap: Map<string, any> = new Map();
  16. getPostIdByType = (post_Id: string) => {
  17. let result: any = { post_Id };
  18. if (post_Id.includes('nft/')) {
  19. result.post_Id = post_Id.replace('nft/', '');
  20. result.page_type = 'NFT';
  21. } else if (post_Id.includes('nft_group/')) {
  22. result.post_Id = post_Id.replace('nft_group/', '');
  23. result.page_type = 'nft_group';
  24. } else if (post_Id.includes('luckdraw/')) {
  25. result.post_Id = post_Id.replace('luckdraw/', '');
  26. result.page_type = '抽奖';
  27. } else if (post_Id.includes('toolbox/')) {
  28. result.post_Id = post_Id.split('toolbox/')[1] || '';
  29. result.page_type = 'toolbox';
  30. } else if (!post_Id.includes('/')) {
  31. result.post_Id = post_Id;
  32. result.page_type = '红包';
  33. } else if (post_Id.includes('treasure/')) {
  34. if (post_Id.includes('invite/')) {
  35. post_Id = post_Id.replace('/undefined', '');
  36. let arr = post_Id.split('/');
  37. let index;
  38. for (let i in arr) {
  39. index = Number(i) + 1;
  40. if (arr[i] == 'invite' && arr.length >= index) {
  41. result.invite_code = arr[index];
  42. if (arr.length > index + 1) {
  43. result.invite_channel = arr[index + 1];
  44. } else {
  45. result.invite_channel = '';
  46. }
  47. break;
  48. }
  49. }
  50. result.page_type = '邀请链接';
  51. if (result.invite_code) {
  52. result.post_Id = '';
  53. }
  54. } else {
  55. // 原始链接
  56. result.page_type = '原始链接';
  57. result.post_Id = result.post_Id.split('treasure/')[1] || '';
  58. }
  59. }
  60. return result;
  61. };
  62. onMessageHandle = async (messageData: any) => {
  63. let { actionType, data } =
  64. (messageData.nativeEvent.data &&
  65. JSON.parse(messageData.nativeEvent.data)) ||
  66. {};
  67. let callBackData: any = null;
  68. switch (actionType) {
  69. case 'goDetailPage':
  70. // const { tweet_Id, ct0, post_Id, invite_code } = data;
  71. this.props.navigation.navigate('Redpack', data);
  72. break;
  73. case 'fetchPostId':
  74. const postId = await this.getPostId(data.short_url);
  75. const postIdData = this.getPostIdByType(postId);
  76. data = { ...data, ...postIdData };
  77. this.webref.injectJavaScript(`
  78. (${addDataToStorge})(${JSON.stringify(data)});
  79. true;
  80. `);
  81. break;
  82. case 'TwitterLikeSuccess':
  83. callBackData = this.taskLikeMap.get(data.tweetId) || {};
  84. if (callBackData) {
  85. DeviceEventEmitter.emit(
  86. callBackData.info.rnMessageId,
  87. data,
  88. );
  89. }
  90. break;
  91. case 'RetweetSuccess':
  92. callBackData = this.taskRetweetMap.get(data.tweetId) || {};
  93. if (callBackData) {
  94. DeviceEventEmitter.emit(
  95. callBackData.info.rnMessageId,
  96. data,
  97. );
  98. }
  99. }
  100. };
  101. handleWebViewNavigationStateChange = (newNavState: { url: any }) => {
  102. const { url } = newNavState;
  103. this.packUrl = url;
  104. console.log(url);
  105. if (!url) {
  106. return;
  107. }
  108. };
  109. injectJavaScript = () => {
  110. this.webref.injectJavaScript(`
  111. (${addDom})();
  112. true;
  113. `);
  114. };
  115. getSplitTweetId(tweetId: string) {
  116. const idArray = tweetId.split('');
  117. console.log('idArray', idArray);
  118. const len = idArray.length;
  119. const idArray1 = idArray.splice(0, Math.floor(len / 2));
  120. const id1 = idArray1.join('');
  121. const id2 = idArray.join('');
  122. return { id1, id2 };
  123. }
  124. FavoriteTweet = (data: any) => {
  125. console.log('FavoriteTweet', data);
  126. const { id1, id2 } = this.getSplitTweetId(data.data.tweetId);
  127. this.taskLikeMap.set(data.data.tweetId, data);
  128. this.webref.injectJavaScript(`
  129. window.denetJS.TwitterLikeAPI(${id1},${id2});
  130. true;
  131. `);
  132. };
  133. retweet(data: any) {
  134. console.log('retweet', data);
  135. const { id1, id2 } = this.getSplitTweetId(data.data.tweetId);
  136. this.taskRetweetMap.set(data.data.tweetId, data);
  137. this.webref.injectJavaScript(`
  138. window.denetJS.TwitterRetweetAPI(${id1},${id2});
  139. true;
  140. `);
  141. }
  142. getPostId(shortUrl: RequestInfo) {
  143. return fetch(shortUrl) // 返回一个Promise对象
  144. .then(res => {
  145. return res.text(); // res.text()是一个Promise对象
  146. })
  147. .then(res => {
  148. res = res.toString();
  149. let str_arr = res.match(/denetme.net\/([\s\S]*?)"/) || [];
  150. let post_Id = str_arr[1] || '';
  151. return post_Id;
  152. });
  153. }
  154. async componentDidMount() {
  155. DeviceEventEmitter.addListener('IFRAME_DO_TASK_LIKE', (data: any) => {
  156. this.FavoriteTweet(data);
  157. });
  158. DeviceEventEmitter.addListener(
  159. 'IFRAME_DO_TASK_RETWEET',
  160. (data: any) => {
  161. this.retweet(data);
  162. },
  163. );
  164. }
  165. render() {
  166. return (
  167. <View style={{ flex: 1 }}>
  168. <DenetWebview
  169. onLoadEndHandle={this.injectJavaScript}
  170. refHandle={r => (this.webref = r)}
  171. onMessageHandle={this.onMessageHandle}
  172. handleWebViewNavigationStateChange={
  173. this.handleWebViewNavigationStateChange
  174. }
  175. uri={this.props.route.params.webUrl}
  176. />
  177. </View>
  178. );
  179. }
  180. }
  181. export default Twitter;