diff --git a/README.md b/README.md index 70162de..947774d 100644 --- a/README.md +++ b/README.md @@ -78,11 +78,15 @@ The example of implementation available in the [CounterScreen](example/src/Count https://mtford.co.uk/projects/react-native-watch-connectivity/docs/communication/ ```js -import { sendMessage } from 'react-native-wear-connectivity'; +import { sendMessage, sendMessageAsync } from 'react-native-wear-connectivity'; +// Callback API sendMessage({ text: 'Hello watch!' }, (reply) => { console.log(reply); // {"text": "Hello React Native app!"} }); + +// Promise API +await sendMessageAsync({ text: 'Hello watch!' }); ``` ### Receive Messages @@ -291,13 +295,20 @@ useEffect(() => { **Sending messages from React Native Mobile Device to Jetpack Compose WearOS** -The React Native Mobile App Example sends messages to the WearOS Jetpack Compose example with [sendMessage](https://github.com/fabOnReact/react-native-wear-connectivity/blob/2f936622422e197c22bef228b44eb24b46c878ae/example/src/CounterScreen/index.android.tsx#L29-L33). +The React Native Mobile App Example sends messages to the WearOS Jetpack Compose example with `sendMessageAsync` (a Promise based API). The callback based `sendMessage` is still available for backward compatibility. ```javascript -const sendMessageToWear = () => { +import { sendMessageAsync } from 'react-native-wear-connectivity'; + +const sendMessageToWear = async () => { setDisabled(true); const json = { text: 'hello' }; - sendMessage(json, onSuccess, onError); + try { + await sendMessageAsync(json); + onSuccess('message sent'); + } catch (error) { + onError(error); + } }; ``` diff --git a/android/src/main/java/com/wearconnectivity/WearConnectivityModule.java b/android/src/main/java/com/wearconnectivity/WearConnectivityModule.java index 5a63aeb..f296946 100644 --- a/android/src/main/java/com/wearconnectivity/WearConnectivityModule.java +++ b/android/src/main/java/com/wearconnectivity/WearConnectivityModule.java @@ -69,6 +69,38 @@ public void sendMessage(ReadableMap messageData, Callback replyCb, Callback erro } } + /** + * Sends a message and resolves or rejects a promise. + */ + @ReactMethod + public void sendMessageAsync(ReadableMap messageData, Promise promise) { + Callback errorCb = new Callback() { + @Override + public void invoke(Object... args) { + String message = (args != null && args.length > 0) ? args[0].toString() : ""; + promise.reject("E_SEND_MESSAGE_FAILED", message); + } + }; + + List connectedNodes = retrieveNodes(errorCb); + if (connectedNodes == null) { + return; + } + + if (!connectedNodes.isEmpty()) { + Callback replyCb = new Callback() { + @Override + public void invoke(Object... args) { + Object reply = (args != null && args.length > 0) ? args[0] : null; + promise.resolve(reply); + } + }; + messageClient.sendMessage(messageData, connectedNodes, replyCb, errorCb); + } else { + promise.reject("E_NO_NODES", NO_NODES_FOUND); + } + } + private List retrieveNodes(Callback errorCb) { try { int result = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getReactContext()); diff --git a/android/src/oldarch/WearConnectivitySpec.java b/android/src/oldarch/WearConnectivitySpec.java index ef4de3f..9f0b3f9 100644 --- a/android/src/oldarch/WearConnectivitySpec.java +++ b/android/src/oldarch/WearConnectivitySpec.java @@ -4,6 +4,7 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.Promise; abstract class WearConnectivitySpec extends ReactContextBaseJavaModule { WearConnectivitySpec(ReactApplicationContext context) { @@ -11,4 +12,6 @@ abstract class WearConnectivitySpec extends ReactContextBaseJavaModule { } public abstract void sendMessage(ReadableMap messageData, Callback replyCb, Callback errCb); + + public abstract void sendMessageAsync(ReadableMap messageData, Promise promise); } diff --git a/docs/alternative-installation.md b/docs/alternative-installation.md index 74eb6c8..8e38e4f 100644 --- a/docs/alternative-installation.md +++ b/docs/alternative-installation.md @@ -103,7 +103,7 @@ Example implementation of the above counter application for WearOS and Android M ```js import React, { useEffect, useState } from 'react'; import { View, Text, Button, StyleSheet } from 'react-native'; -import { sendMessage, watchEvents } from 'react-native-wear-connectivity'; +import { sendMessage, sendMessageAsync, watchEvents } from 'react-native-wear-connectivity'; function App() { return ; @@ -130,9 +130,20 @@ function CounterScreen() { sendMessage(json, onSuccess, onError); }; + const sendMessageToWearAsync = async () => { + const json = { text: 'hello' }; + try { + const result = await sendMessageAsync(json); + console.log(result); + } catch (error) { + console.log(error); + } + }; + return (