Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 1 addition & 10 deletions apps/AEPSampleAppNewArchEnabled/app/MessagingView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,7 @@ const refreshInAppMessages = () => {
const setMessagingDelegate = () => {
Messaging.setMessagingDelegate({
onDismiss: msg => console.log('dismissed!', msg),
onShow: msg => {
console.log('show', msg);
Messaging.handleJavascriptMessage(
msg.id,
'myInappCallback',
(content) => {
console.log('Received webview content:', content);
}
);
},
onShow: msg => console.log('show', msg),
shouldShowMessage: () => true,
shouldSaveMessage: () => true,
urlLoaded: (url, message) => console.log(url, message),
Expand Down
16 changes: 1 addition & 15 deletions packages/messaging/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,20 +156,6 @@ const messagingDelegate = {
};
```

### handleJavascriptMessage

Registers a javascript interface for the provided handler name to the WebView associated with the InAppMessage presentation to handle Javascript messages. When the registered handlers are executed via the HTML the result will be passed back to the associated callback.

**Syntax**

```javascript
handleJavascriptMessage(messageId: string, handlerName: string, callback: (content: string) => void)
```

**Example**

It can be used for the native handling of JavaScript events. Please refer to the [tutorial](./tutorials/In-App%20Messaging.md#native-handling-of-javascript-events) for more information.

### updatePropositionsForSurfaces

Dispatches an event to fetch propositions for the provided surfaces from remote.
Expand Down Expand Up @@ -473,4 +459,4 @@ Messaging.trackContentCardInteraction(proposition, contentCard);

## Tutorials
[Content Cards](./tutorials/ContentCards.md)
[In App Messaging](./tutorials/In-App%20Messaging.md)

11 changes: 0 additions & 11 deletions packages/messaging/__tests__/MessagingTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,4 @@ describe('Messaging', () => {
await Messaging.trackContentCardInteraction(mockProposition, mockContentCard);
expect(spy).toHaveBeenCalledWith(mockProposition, mockContentCard);
});

it('should call handleJavascriptMessage', () => {
const spy = jest.spyOn(NativeModules.AEPMessaging, 'handleJavascriptMessage');
const messageId = 'test-message-id';
const handlerName = 'myInappCallback';
const callback = jest.fn();

Messaging.handleJavascriptMessage(messageId, handlerName, callback);

expect(spy).toHaveBeenCalledWith(messageId, handlerName);
});
});

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import com.adobe.marketing.mobile.messaging.Surface;
import com.adobe.marketing.mobile.services.ServiceProvider;
import com.adobe.marketing.mobile.services.ui.InAppMessage;
import com.adobe.marketing.mobile.services.ui.message.InAppMessageEventHandler;
import com.adobe.marketing.mobile.services.ui.Presentable;
import com.adobe.marketing.mobile.services.ui.PresentationDelegate;
import com.facebook.react.bridge.Arguments;
Expand All @@ -58,7 +57,6 @@ public final class RCTAEPMessagingModule
private boolean shouldShowMessage = false;
private CountDownLatch latch = new CountDownLatch(1);
private Message latestMessage = null;
private final Map<String, Presentable<?>> presentableCache = new HashMap<>();

public RCTAEPMessagingModule(ReactApplicationContext reactContext) {
super(reactContext);
Expand Down Expand Up @@ -177,29 +175,11 @@ public void track(final String messageId, final String interaction,
}
}

@ReactMethod
public void handleJavascriptMessage(final String messageId, final String handlerName) {
Presentable<?> presentable = presentableCache.get(messageId);
if (presentable == null || !(presentable.getPresentation() instanceof InAppMessage)) return;

Presentable<InAppMessage> inAppMessagePresentable = (Presentable<InAppMessage>) presentable;
InAppMessageEventHandler eventHandler = inAppMessagePresentable.getPresentation().getEventHandler();

eventHandler.handleJavascriptMessage(handlerName, content -> {
Map<String, String> params = new HashMap<>();
params.put(RCTAEPMessagingConstants.MESSAGE_ID_KEY, messageId);
params.put(RCTAEPMessagingConstants.HANDLER_NAME_KEY, handlerName);
params.put(RCTAEPMessagingConstants.CONTENT_KEY, content);
emitEvent(RCTAEPMessagingConstants.ON_JAVASCRIPT_MESSAGE_EVENT, params);
});
}

// Messaging Delegate functions
@Override
public void onShow(final Presentable<?> presentable) {
if (!(presentable.getPresentation() instanceof InAppMessage)) return;
Message message = MessagingUtils.getMessageForPresentable((Presentable<InAppMessage>) presentable);
presentableCache.put(message.getId(), presentable);
if (message != null) {
Map<String, String> data =
convertMessageToMap(message);
Expand All @@ -211,7 +191,6 @@ public void onShow(final Presentable<?> presentable) {
public void onDismiss(final Presentable<?> presentable) {
if (!(presentable.getPresentation() instanceof InAppMessage)) return;
Message message = MessagingUtils.getMessageForPresentable((Presentable<InAppMessage>) presentable);
presentableCache.remove(message.getId());
if (message != null) {
Map<String, String> data =
convertMessageToMap(message);
Expand Down
4 changes: 0 additions & 4 deletions packages/messaging/ios/src/RCTAEPMessaging.mm
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,4 @@ @interface RCT_EXTERN_MODULE (RCTAEPMessaging, RCTEventEmitter)
: (NSDictionary *)propositionMap contentCardMap
: (NSDictionary *)contentCardMap);

RCT_EXTERN_METHOD(handleJavascriptMessage
: (NSString *)messageId handlerName
: (NSString *)handlerName)

@end
27 changes: 0 additions & 27 deletions packages/messaging/ios/src/RCTAEPMessaging.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import WebKit
@objc(RCTAEPMessaging)
public class RCTAEPMessaging: RCTEventEmitter, MessagingDelegate {
private var messageCache = [String: Message]()
private var jsHandlerMessageCache = [String: Message]()
private var latestMessage: Message? = nil
private let semaphore = DispatchSemaphore(value: 0)
private var shouldSaveMessage = false
Expand Down Expand Up @@ -250,35 +249,11 @@ public class RCTAEPMessaging: RCTEventEmitter, MessagingDelegate {
}
}

@objc
func handleJavascriptMessage(
_ messageId: String,
handlerName: String
) {
guard let message = jsHandlerMessageCache[messageId] else {
print("[RCTAEPMessaging] handleJavascriptMessage: No message found in cache for messageId: \(messageId)")
return
}

message.handleJavascriptMessage(handlerName) { [weak self] content in
self?.emitNativeEvent(
name: Constants.ON_JAVASCRIPT_MESSAGE_EVENT,
body: [
Constants.MESSAGE_ID_KEY: messageId,
Constants.HANDLER_NAME_KEY: handlerName,
Constants.CONTENT_KEY: content ?? ""
]
)
}
}

// Messaging Delegate Methods
public func onDismiss(message: Showable) {
if let fullscreenMessage = message as? FullscreenMessage,
let parentMessage = fullscreenMessage.parent
{
jsHandlerMessageCache.removeValue(forKey: parentMessage.id)

emitNativeEvent(
name: Constants.ON_DISMISS_EVENT,
body: RCTAEPMessagingDataBridge.transformToMessage(
Expand All @@ -292,8 +267,6 @@ public class RCTAEPMessaging: RCTEventEmitter, MessagingDelegate {
if let fullscreenMessage = message as? FullscreenMessage,
let message = fullscreenMessage.parent
{
jsHandlerMessageCache[message.id] = message

emitNativeEvent(
name: Constants.ON_SHOW_EVENT,
body: RCTAEPMessagingDataBridge.transformToMessage(message: message)
Expand Down
6 changes: 1 addition & 5 deletions packages/messaging/ios/src/RCTAEPMessagingConstants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@ class Constants {
static let ON_SHOW_EVENT = "onShow"
static let SHOULD_SHOW_MESSAGE_EVENT = "shouldShowMessage"
static let URL_LOADED_EVENT = "urlLoaded"
static let ON_JAVASCRIPT_MESSAGE_EVENT = "onJavascriptMessage"
static let SUPPORTED_EVENTS = [
ON_DISMISS_EVENT, ON_SHOW_EVENT, SHOULD_SHOW_MESSAGE_EVENT, URL_LOADED_EVENT, ON_JAVASCRIPT_MESSAGE_EVENT
ON_DISMISS_EVENT, ON_SHOW_EVENT, SHOULD_SHOW_MESSAGE_EVENT, URL_LOADED_EVENT,
]
static let MESSAGE_ID_KEY = "messageId"
static let HANDLER_NAME_KEY = "handlerName"
static let CONTENT_KEY = "content"
}
31 changes: 0 additions & 31 deletions packages/messaging/src/Messaging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ export interface NativeMessagingModule {
updatePropositionsForSurfaces: (surfaces: string[]) => void;
trackContentCardDisplay: (proposition: MessagingProposition, contentCard: ContentCard) => void;
trackContentCardInteraction: (proposition: MessagingProposition, contentCard: ContentCard) => void;
handleJavascriptMessage: (messageId: string, handlerName: string) => void;
}

const RCTAEPMessaging: NativeModule & NativeMessagingModule =
Expand All @@ -46,18 +45,6 @@ const RCTAEPMessaging: NativeModule & NativeMessagingModule =
declare var messagingDelegate: MessagingDelegate;
var messagingDelegate: MessagingDelegate;

// Registery to store callbacks for each message in handleJavascriptMessage
// Record - {messageId : {handlerName : callback}}
const jsMessageHandlers: Record<string, Record<string, (content: string) => void>> = {};
const handleJSMessageEventEmitter = new NativeEventEmitter(RCTAEPMessaging);

handleJSMessageEventEmitter.addListener('onJavascriptMessage', (event) => {
const {messageId, handlerName, content} = event;
if (jsMessageHandlers[messageId] && jsMessageHandlers[messageId][handlerName]) {
jsMessageHandlers[messageId][handlerName](content);
}
});

class Messaging {
/**
* Returns the version of the AEPMessaging extension
Expand Down Expand Up @@ -183,24 +170,6 @@ class Messaging {
static updatePropositionsForSurfaces(surfaces: string[]) {
RCTAEPMessaging.updatePropositionsForSurfaces(surfaces);
}

/**
* Registers a javascript interface for the provided handler name
* to the WebView associated with the InAppMessage presentation
* to handle Javascript messages.
* When the registered handlers are executed via the HTML
* the result will be passed back to the associated callback.
* @param messageId The id of the message to handle
* @param handlerName The name of the handler to handle
* @param callback The callback to handle the message
*/
static handleJavascriptMessage(messageId: string, handlerName: string, callback: (content: string) => void) {
if (!jsMessageHandlers[messageId]) {
jsMessageHandlers[messageId] = {};
}
jsMessageHandlers[messageId][handlerName] = callback;
RCTAEPMessaging.handleJavascriptMessage(messageId, handlerName);
}
}

export default Messaging;
68 changes: 0 additions & 68 deletions packages/messaging/tutorials/In-App Messaging.md

This file was deleted.

6 changes: 4 additions & 2 deletions tests/jest/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,14 +149,16 @@ jest.doMock('react-native', () => {
show: jest.fn(),
dismiss: jest.fn(),
track: jest.fn(),
handleJavascriptMessage: jest.fn(
() => new Promise((resolve) => resolve(new Object()))
),
clear: jest.fn(),
updatePropositionsForSurfaces: jest.fn(),
getPropositionsForSurfaces: jest.fn(
() => new Promise((resolve) => resolve([]))
),
trackContentCardDisplay: jest.fn(),
trackContentCardInteraction: jest.fn(),
handleJavascriptMessage: jest.fn(),
trackContentCardInteraction: jest.fn()
},
AEPOptimize: {
extensionVersion: jest.fn(
Expand Down