diff --git a/README.md b/README.md index 3d5457bb..71f4ce47 100755 --- a/README.md +++ b/README.md @@ -335,14 +335,12 @@ export default class App extends Component { componentWillMount() { OneSignal.addEventListener('received', this.onReceived); OneSignal.addEventListener('opened', this.onOpened); - OneSignal.addEventListener('registered', this.onRegistered); OneSignal.addEventListener('ids', this.onIds); } componentWillUnmount() { OneSignal.removeEventListener('received', this.onReceived); OneSignal.removeEventListener('opened', this.onOpened); - OneSignal.removeEventListener('registered', this.onRegistered); OneSignal.removeEventListener('ids', this.onIds); } @@ -357,10 +355,6 @@ export default class App extends Component { console.log('openResult: ', openResult); } - onRegistered(notifData) { - console.log("Device had been registered for push notifications!", notifData); - } - onIds(device) { console.log('Device info: ', device); } @@ -435,6 +429,36 @@ Sync hashed email if you have a login system or collect it. Will be used to reac OneSignal.syncHashedEmail("test@domain.com"); ``` +### Using Email Features + +OneSignal now allows you to send emails to your userbase. This email can be set using the OneSignal react-native SDK. + +To set the email: + +```javascript +let emailAuthCode = ""; //Your email auth code should be securely generated by your backend server + +OneSignal.setEmail("test@test.com", emailAuthCode, {(error) => { + //handle error if it occurred +}}); +``` + +If you don't want to implement email auth hashing on your backend (which is heavily recommended), you can still use the OneSignal email feature in an unauthenticated state like this: + +```javascript +OneSignal.setEmail("test@test.com", {(error) => { + //handle error if it occurred +}}); +``` + +If your application implements logout functionality, you can logout of the OneSignal email for this user using the logout function: + +```javascript +OneSignal.logoutEmail({(error) => { + //handle error if it occurred +}}); +``` + ### Getting Player ID and Push Token We exposed the idsAvailable API of OneSignal (both Android & iOS) as an event. diff --git a/android/build.gradle b/android/build.gradle index 9c4bb15c..025bccc9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.2.2' } } @@ -36,9 +36,9 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.facebook.react:react-native:+' - compile 'com.onesignal:OneSignal:3.+@aar' compile 'com.google.android.gms:play-services-gcm:+' compile 'com.google.android.gms:play-services-analytics:+' compile 'com.google.android.gms:play-services-location:+' testCompile 'junit:junit:4.12' + compile 'com.onesignal:OneSignal:3.+@aar' } diff --git a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java index ec9daef8..38625a04 100644 --- a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java @@ -24,6 +24,8 @@ import com.onesignal.OSPermissionSubscriptionState; import com.onesignal.OSSubscriptionState; import com.onesignal.OneSignal; +import com.onesignal.OneSignal.EmailUpdateHandler; +import com.onesignal.OneSignal.EmailUpdateError; import org.json.JSONObject; import org.json.JSONException; @@ -53,6 +55,7 @@ public RNOneSignal(ReactApplicationContext reactContext) { // However it seems it is also to soon to call getCurrentActivity() from the reactContext as well. // This will normally succeed when onHostResume fires instead. private void initOneSignal() { + Activity activity = getCurrentActivity(); if (activity == null || oneSignalInitDone) return; @@ -98,6 +101,66 @@ public void tagsAvailable(JSONObject tags) { }); } + @ReactMethod + public void setUnauthenticatedEmail(String email, final Callback callback) { + OneSignal.setEmail(email, null, new OneSignal.EmailUpdateHandler() { + @Override + public void onSuccess() { + callback.invoke(); + } + + @Override + public void onFailure(EmailUpdateError error) { + try { + JSONObject errorObject = new JSONObject("{'error' : '" + error.getMessage() + "'}"); + callback.invoke(RNUtils.jsonToWritableMap(errorObject)); + } catch (JSONException exception) { + exception.printStackTrace(); + } + } + }); + } + + @ReactMethod + public void setEmail(String email, String emailAuthToken, final Callback callback) { + OneSignal.setEmail(email, emailAuthToken, new EmailUpdateHandler() { + @Override + public void onSuccess() { + callback.invoke(); + } + + @Override + public void onFailure(EmailUpdateError error) { + try { + JSONObject errorObject = new JSONObject("{'error' : '" + error.getMessage() + "'}"); + callback.invoke(RNUtils.jsonToWritableMap(errorObject)); + } catch (JSONException exception) { + exception.printStackTrace(); + } + } + }); + } + + @ReactMethod + public void logoutEmail(final Callback callback) { + OneSignal.logoutEmail(new EmailUpdateHandler() { + @Override + public void onSuccess() { + callback.invoke(); + } + + @Override + public void onFailure(EmailUpdateError error) { + try { + JSONObject errorObject = new JSONObject("{'error' : '" + error.getMessage() + "'}"); + callback.invoke(RNUtils.jsonToWritableMap(errorObject)); + } catch (JSONException exception) { + exception.printStackTrace(); + } + } + }); + } + @ReactMethod public void configure() { OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() { @@ -178,7 +241,7 @@ public void syncHashedEmail(String email) { } @ReactMethod - public void setlogLevel(int logLevel, int visualLogLevel) { + public void setLogLevel(int logLevel, int visualLogLevel) { OneSignal.setLogLevel(logLevel, visualLogLevel); } diff --git a/examples/RNOneSignal/index.android.js b/examples/RNOneSignal/index.android.js index edd7c9b8..d84f07d5 100644 --- a/examples/RNOneSignal/index.android.js +++ b/examples/RNOneSignal/index.android.js @@ -9,25 +9,71 @@ import { AppRegistry, StyleSheet, Text, - View + View, + Button, + Image, + TextInput, + Dimensions, + KeyboardAvoidingView, + ActivityIndicator, + Platform, + ScrollView, + Linking } from 'react-native'; import OneSignal from 'react-native-onesignal'; +let imageUri = 'https://media.licdn.com/media/AAEAAQAAAAAAAAyOAAAAJDJhY2JlMmJjLWI1NzctNGNmNC1iMDU1LWE4NjI4Nzc1YTU2Zg.png' + export default class RNOneSignal extends Component { - + constructor(properties) { + super(properties); + } + + validateEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email).toLowerCase()); + } + componentWillMount() { + console.log("setting log level"); + OneSignal.setLogLevel(7, 0); + this.setState({emailEnabled: false, + animatingEmailButton : false, + initialOpenFromPush : "Did NOT open from push", + activityWidth : 0, + width: 0, + activityMargin: 0, + buttonColor : Platform.OS == "ios" ? "#ffffff" : "#d45653", + jsonDebugText : "" + }); + OneSignal.setLocationShared(true); + + + OneSignal.inFocusDisplaying(2) + } + + componentDidMount() { + this.onReceived = this.onReceived.bind(this); + this.onOpened = this.onOpened.bind(this); + this.onIds = this.onIds.bind(this); + this.onEmailRegistrationChange = this.onEmailRegistrationChange.bind(this); + OneSignal.addEventListener('received', this.onReceived); OneSignal.addEventListener('opened', this.onOpened); - OneSignal.addEventListener('registered', this.onRegistered); OneSignal.addEventListener('ids', this.onIds); + OneSignal.addEventListener('emailSubscription', this.onEmailRegistrationChange); } componentWillUnmount() { OneSignal.removeEventListener('received', this.onReceived); OneSignal.removeEventListener('opened', this.onOpened); - OneSignal.removeEventListener('registered', this.onRegistered); OneSignal.removeEventListener('ids', this.onIds); + OneSignal.removeEventListener('emailSubscription', this.onEmailRegistrationChange); + } + + onEmailRegistrationChange(registration) { + console.log("onEmailRegistrationChange: ", registration); } onReceived(notification) { @@ -41,36 +87,136 @@ export default class RNOneSignal extends Component { console.log('openResult: ', openResult); } - onRegistered(notifData) { - console.log("Device had been registered for push notifications!", notifData); - } - onIds(device) { console.log('Device info: ', device); } render() { return ( - - - Welcome to React Native! - - - To get started, edit index.android.js - - - Double tap R on your keyboard to reload,{'\n'} - Shake or press menu button for dev menu - - + + + + + + + Welcome to React Native! + + + To get started, edit index.android.js + + + Double tap R on your keyboard to reload,{'\n'} + Shake or press menu button for dev menu + + + +