| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /* eslint-disable react-native/no-inline-styles */
- import React, { Component } from 'react';
- import { View, DeviceEventEmitter } from 'react-native';
- import { DenetWebview } from '@/components/webview';
- import { addDom, addDataToStorge } from '../../utils/contentInTwitterJS/addDom';
- // import EventEmitter from 'react-native-eventemitter';
- interface Props {
- navigation: any;
- route: any;
- }
- class Twitter extends Component<Props> {
- webref: any;
- packUrl: any;
- taskLikeMap: Map<string, any> = new Map();
- taskRetweetMap: Map<string, any> = new Map();
- getPostIdByType = (post_Id: string) => {
- let result: any = { post_Id };
- if (post_Id.includes('nft/')) {
- result.post_Id = post_Id.replace('nft/', '');
- result.page_type = 'NFT';
- } else if (post_Id.includes('nft_group/')) {
- result.post_Id = post_Id.replace('nft_group/', '');
- result.page_type = 'nft_group';
- } else if (post_Id.includes('luckdraw/')) {
- result.post_Id = post_Id.replace('luckdraw/', '');
- result.page_type = '抽奖';
- } else if (post_Id.includes('toolbox/')) {
- result.post_Id = post_Id.split('toolbox/')[1] || '';
- result.page_type = 'toolbox';
- } else if (!post_Id.includes('/')) {
- result.post_Id = post_Id;
- result.page_type = '红包';
- } else if (post_Id.includes('treasure/')) {
- if (post_Id.includes('invite/')) {
- post_Id = post_Id.replace('/undefined', '');
- let arr = post_Id.split('/');
- let index;
- for (let i in arr) {
- index = Number(i) + 1;
- if (arr[i] == 'invite' && arr.length >= index) {
- result.invite_code = arr[index];
- if (arr.length > index + 1) {
- result.invite_channel = arr[index + 1];
- } else {
- result.invite_channel = '';
- }
- break;
- }
- }
- result.page_type = '邀请链接';
- if (result.invite_code) {
- result.post_Id = '';
- }
- } else {
- // 原始链接
- result.page_type = '原始链接';
- result.post_Id = result.post_Id.split('treasure/')[1] || '';
- }
- }
- return result;
- };
- onMessageHandle = async (messageData: any) => {
- let { actionType, data } =
- (messageData.nativeEvent.data &&
- JSON.parse(messageData.nativeEvent.data)) ||
- {};
- let callBackData: any = null;
- switch (actionType) {
- case 'goDetailPage':
- // const { tweet_Id, ct0, post_Id, invite_code } = data;
- this.props.navigation.navigate('Redpack', data);
- break;
- case 'fetchPostId':
- const postId = await this.getPostId(data.short_url);
- const postIdData = this.getPostIdByType(postId);
- data = { ...data, ...postIdData };
- this.webref.injectJavaScript(`
- (${addDataToStorge})(${JSON.stringify(data)});
- true;
- `);
- break;
- case 'TwitterLikeSuccess':
- callBackData = this.taskLikeMap.get(data.tweetId) || {};
- if (callBackData) {
- DeviceEventEmitter.emit(
- callBackData.info.rnMessageId,
- data,
- );
- }
- break;
- case 'RetweetSuccess':
- callBackData = this.taskRetweetMap.get(data.tweetId) || {};
- if (callBackData) {
- DeviceEventEmitter.emit(
- callBackData.info.rnMessageId,
- data,
- );
- }
- }
- };
- handleWebViewNavigationStateChange = (newNavState: { url: any }) => {
- const { url } = newNavState;
- this.packUrl = url;
- console.log(url);
- if (!url) {
- return;
- }
- };
- injectJavaScript = () => {
- this.webref.injectJavaScript(`
- (${addDom})();
- true;
- `);
- };
- getSplitTweetId(tweetId: string) {
- const idArray = tweetId.split('');
- console.log('idArray', idArray);
- const len = idArray.length;
- const idArray1 = idArray.splice(0, Math.floor(len / 2));
- const id1 = idArray1.join('');
- const id2 = idArray.join('');
- return { id1, id2 };
- }
- FavoriteTweet = (data: any) => {
- console.log('FavoriteTweet', data);
- const { id1, id2 } = this.getSplitTweetId(data.data.tweetId);
- this.taskLikeMap.set(data.data.tweetId, data);
- this.webref.injectJavaScript(`
- window.denetJS.TwitterLikeAPI(${id1},${id2});
- true;
- `);
- };
- retweet(data: any) {
- console.log('retweet', data);
- const { id1, id2 } = this.getSplitTweetId(data.data.tweetId);
- this.taskRetweetMap.set(data.data.tweetId, data);
- this.webref.injectJavaScript(`
- window.denetJS.TwitterRetweetAPI(${id1},${id2});
- true;
- `);
- }
- getPostId(shortUrl: RequestInfo) {
- return fetch(shortUrl) // 返回一个Promise对象
- .then(res => {
- return res.text(); // res.text()是一个Promise对象
- })
- .then(res => {
- res = res.toString();
- let str_arr = res.match(/denetme.net\/([\s\S]*?)"/) || [];
- let post_Id = str_arr[1] || '';
- return post_Id;
- });
- }
- async componentDidMount() {
- DeviceEventEmitter.addListener('IFRAME_DO_TASK_LIKE', (data: any) => {
- this.FavoriteTweet(data);
- });
- DeviceEventEmitter.addListener(
- 'IFRAME_DO_TASK_RETWEET',
- (data: any) => {
- this.retweet(data);
- },
- );
- }
- render() {
- return (
- <View style={{ flex: 1 }}>
- <DenetWebview
- onLoadEndHandle={this.injectJavaScript}
- refHandle={r => (this.webref = r)}
- onMessageHandle={this.onMessageHandle}
- handleWebViewNavigationStateChange={
- this.handleWebViewNavigationStateChange
- }
- uri={this.props.route.params.webUrl}
- />
- </View>
- );
- }
- }
- export default Twitter;
|