Skip to content

Commit

Permalink
add AlibcTradeWebView to show pages with embeded webview
Browse files Browse the repository at this point in the history
  • Loading branch information
et authored and et committed Apr 15, 2017
1 parent b5b061b commit 3ea2bc7
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 7 deletions.
82 changes: 82 additions & 0 deletions android/src/main/java/com/daiyan/AlibcTradeWebView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.daiyan;

import android.content.Context;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.events.RCTEventEmitter;

import com.alibaba.baichuan.android.trade.AlibcTrade;
import com.alibaba.baichuan.android.trade.model.AlibcShowParams;
import com.alibaba.baichuan.android.trade.model.AlibcTaokeParams;
import com.alibaba.baichuan.android.trade.page.AlibcAddCartPage;
import com.alibaba.baichuan.android.trade.page.AlibcBasePage;
import com.alibaba.baichuan.android.trade.page.AlibcDetailPage;
import com.alibaba.baichuan.android.trade.page.AlibcMiniDetailPage;
import com.alibaba.baichuan.android.trade.page.AlibcPage;
import com.alibaba.baichuan.android.trade.page.AlibcShopPage;
import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback;
import com.alibaba.baichuan.android.trade.model.ResultType;
import com.alibaba.baichuan.android.trade.model.TradeResult;

import java.util.HashMap;
import java.util.Map;

import android.util.Log;

public class AlibcTradeWebView extends WebView {
private static final String TAG = "AlibcTradeWebView";
ThemedReactContext mContext;

public AlibcTradeWebView(ThemedReactContext context) {
super(context.getCurrentActivity());
this.getSettings().setJavaScriptEnabled(true);
mContext = context;
}

public void show(String itemId, AlibcShowParams showParams, AlibcTaokeParams taokeParams, Map<String, String> exParams) {
AlibcTrade.show(mContext.getCurrentActivity(),
this,
null,
null,
new AlibcDetailPage(itemId),
showParams,
taokeParams,
exParams,
new AlibcTradeCallback() {
@Override
public void onTradeSuccess(TradeResult tradeResult) {
Log.v("ReactNative", TAG + ":onTradeSuccess");
WritableMap event = Arguments.createMap();
//打开电商组件,用户操作中成功信息回调。tradeResult:成功信息(结果类型:加购,支付;支付结果)
if(tradeResult.resultType.equals(ResultType.TYPECART)){
event.putString("type", "card");
}else if (tradeResult.resultType.equals(ResultType.TYPEPAY)){
event.putString("type", "pay");
event.putArray("orders", Arguments.fromArray(tradeResult.payResult.paySuccessOrders));
}else {
event.putString("type", "no type");
}
mContext.getJSModule(RCTEventEmitter.class).receiveEvent(
getId(),
"topChange",
event);
}
@Override
public void onFailure(int code, String msg) {
WritableMap event = Arguments.createMap();
event.putInt("code", code);
event.putString("msg", msg);
mContext.getJSModule(RCTEventEmitter.class).receiveEvent(
getId(),
"topChange",
event);
}
});
}
}
38 changes: 38 additions & 0 deletions android/src/main/java/com/daiyan/AlibcTradeWebViewManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.daiyan;

import android.webkit.WebView;

import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.bridge.ReadableMap;

import android.util.Log;
public class AlibcTradeWebViewManager extends SimpleViewManager<AlibcTradeWebView> {
private final static String REACT_CLASS = "AlibcTradeWebView";
private RNAlibcSdkModule mModule;

AlibcTradeWebViewManager(RNAlibcSdkModule module) {
mModule = module;
}

@Override
public String getName() {
return REACT_CLASS;
}

@Override
protected AlibcTradeWebView createViewInstance(ThemedReactContext themedReactContext) {
return new AlibcTradeWebView(themedReactContext);
}

@ReactProp(name = "itemId")
public void propSetItemId(AlibcTradeWebView view, String itemId) {
view.show(itemId,
mModule.getShowParams(),
mModule.getTaokeParams(),
mModule.getExParams());
}
}
33 changes: 30 additions & 3 deletions android/src/main/java/com/daiyan/RNAlibcSdkModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import com.alibaba.baichuan.android.trade.page.AlibcAddCartPage;
import com.alibaba.baichuan.android.trade.page.AlibcBasePage;
import com.alibaba.baichuan.android.trade.page.AlibcDetailPage;
import com.alibaba.baichuan.android.trade.page.AlibcMiniDetailPage;
import com.alibaba.baichuan.android.trade.page.AlibcPage;
import com.alibaba.baichuan.android.trade.page.AlibcShopPage;
import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback;
Expand All @@ -50,6 +51,7 @@ public class RNAlibcSdkModule extends ReactContextBaseJavaModule {
private static final String TAG = "RNAlibcSdkModule";

private final static String NOT_LOGIN = "not login";
private final static String INVALID_TRADE_RESULT = "invalid trade result";

private Map<String, String> exParams;//yhhpass参数
private AlibcShowParams alibcShowParams;//页面打开方式,默认,H5,Native
Expand All @@ -62,6 +64,14 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
}
};

static private RNAlibcSdkModule mRNAlibcSdkModule = null;
static public RNAlibcSdkModule sharedInstance(ReactApplicationContext context) {
if (mRNAlibcSdkModule == null)
return new RNAlibcSdkModule(context);
else
return mRNAlibcSdkModule;
}

public RNAlibcSdkModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
Expand All @@ -72,6 +82,18 @@ public RNAlibcSdkModule(ReactApplicationContext reactContext) {
exParams.put(AlibcConstants.ISV_CODE, "rnappisvcode");
}

public AlibcShowParams getShowParams() {
return this.alibcShowParams;
}

public AlibcTaokeParams getTaokeParams() {
return this.alibcTaokeParams;
}

public Map<String, String> getExParams() {
return this.exParams;
}

@Override
public String getName() {
return "RNAlibcSdk";
Expand All @@ -81,11 +103,12 @@ public String getName() {
* 初始化
*/
@ReactMethod
public void init(final String pid, final Callback callback) {
public void init(final String pid, final Boolean forceH5, final Callback callback) {
this.alibcTaokeParams = new AlibcTaokeParams(pid, "", "");
AlibcTradeSDK.asyncInit(reactContext, new AlibcTradeInitCallback() {
@Override
public void onSuccess() {
AlibcTradeSDK.setForceH5(forceH5);
callback.invoke(null, "init success");
}

Expand Down Expand Up @@ -175,12 +198,13 @@ public void onFailure(int code, String msg) {
public void show(final String itemId, final Callback callback) {
AlibcTrade.show(getCurrentActivity(),
new AlibcDetailPage(itemId),
alibcShowParams,
this.alibcShowParams,
this.alibcTaokeParams,
exParams,
this.exParams,
new AlibcTradeCallback() {
@Override
public void onTradeSuccess(TradeResult tradeResult) {
Log.v("ReactNative", TAG + ":onTradeSuccess");
//打开电商组件,用户操作中成功信息回调。tradeResult:成功信息(结果类型:加购,支付;支付结果)
if(tradeResult.resultType.equals(ResultType.TYPECART)){
//加购成功
Expand All @@ -193,6 +217,9 @@ public void onTradeSuccess(TradeResult tradeResult) {
map.putString("type", "pay");
map.putArray("orders", Arguments.fromArray(tradeResult.payResult.paySuccessOrders));
callback.invoke(null, map);
}else {
WritableMap map = Arguments.createMap();
callback.invoke(INVALID_TRADE_RESULT);
}
}
@Override
Expand Down
11 changes: 8 additions & 3 deletions android/src/main/java/com/daiyan/RNAlibcSdkPackage.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
public class RNAlibcSdkPackage implements ReactPackage {

@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new RNAlibcSdkModule(reactContext));
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(
RNAlibcSdkModule.sharedInstance(reactContext)
);
}

@Override
Expand All @@ -23,6 +26,8 @@ public List<Class<? extends JavaScriptModule>> createJSModules() {

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
return Arrays.<ViewManager>asList(
new AlibcTradeWebViewManager(RNAlibcSdkModule.sharedInstance(reactContext))
);
}
}
32 changes: 31 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,35 @@

import { NativeModules } from 'react-native';
import { NativeModules, requireNativeComponent } from 'react-native';
import React, { Component, PureComponent, PropTypes } from 'react';
import {
View,
Button
} from 'react-native';


export class AlibcTradeWebView extends React.Component {
constructor(props) {
super(props);
this._onTradeResult = this._onTradeResult.bind(this);
}
_onTradeResult(event) {
if (!this.props.onChange) {
return;
}
this.props.onChange(event.nativeEvent);
}
render() {
return <NativeComponent {...this.props} onChange={this._onTradeResult} />;
}
}

AlibcTradeWebView.propTypes = {
itemId: PropTypes.string,
onChange: React.PropTypes.func,
...View.propTypes,
};

const NativeComponent = requireNativeComponent("AlibcTradeWebView", AlibcTradeWebView, {nativeOnly: {onChange: true}});

const { RNAlibcSdk } = NativeModules;

Expand Down

0 comments on commit 3ea2bc7

Please sign in to comment.