Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
34f617b
lerna version upgrade
namArora3112 Jul 1, 2025
b898164
Revert "add handleJavascriptMessage in AEPMessaging (#497)" (#501)
ishita-gambhir-adobe Aug 4, 2025
c2d4ba1
Revert "Optimize: add APIs for displayed and generateDisplayInteracti…
ishita-gambhir-adobe Aug 4, 2025
69a8fe1
remove tutorial doc
cacheung Aug 11, 2025
2de6e78
Merge pull request #510 from cacheung/doc
cacheung Aug 11, 2025
05045f9
Main to staging (#515)
akhiljain1907 Aug 20, 2025
23c968c
Feat- Optimize Enhancements (Callback and Batch Tracking) (#513)
akhiljain1907 Aug 20, 2025
04981b7
Read Me update for update proposition api with callback (#514)
akhiljain1907 Aug 20, 2025
4be535f
Version Update for 7.1.0 release (#517)
akhiljain1907 Aug 20, 2025
3182032
Staging to Main for Optimize 7.1.0 release (#516)
akhiljain1907 Aug 20, 2025
4d3c359
refactor shouldShowMessage native emitter function add commented out …
cdhoffmann Aug 25, 2025
f8a4201
refactor shouldShowMessage native emitter function add commented out …
cdhoffmann Aug 25, 2025
579eb2b
Merge pull request #520 from adobe/main
cdhoffmann Aug 26, 2025
b929cde
remove ds store
cdhoffmann Aug 26, 2025
79b9c89
add ds store ignore
cdhoffmann Aug 26, 2025
65287b5
Merge pull request #521 from cdhoffmann/fixDelegateOfNonIAM
cdhoffmann Aug 27, 2025
b9c72fd
update messaging extension for 7.1.1 release
cdhoffmann Aug 27, 2025
655853f
Merge pull request #522 from cdhoffmann/updateVersionMessaging
cdhoffmann Aug 27, 2025
30ffaaf
PropositionItem class added along with unified track functionality (…
namArora3112 Sep 2, 2025
78a650f
add handleJavascriptMessage in AEPMessaging (#519)
ishita-gambhir-adobe Sep 3, 2025
b471c22
Merge branch 'staging' of github.com:adobe/aepsdk-react-native into c…
cacheung Sep 3, 2025
0872dc6
messaging version bump for 7.2.0 release (#526)
ishita-gambhir-adobe Sep 3, 2025
fb1e842
Merge pull request #525 from adobe/feat/messagingEnhancements-7.2.0
namArora3112 Sep 3, 2025
fe0042a
typecaste to Message object (#527)
ishita-gambhir-adobe Sep 3, 2025
231ba84
read me updates regarding deprecated apis
Sep 3, 2025
e9979f9
Merge pull request #529 from adobe/readme-updates
namArora3112 Sep 3, 2025
e1176e3
Merge branch 'staging' of github.com:adobe/aepsdk-react-native into c…
cacheung Sep 3, 2025
d2a570f
update integration with track PR
cacheung Sep 3, 2025
4f01fb1
Merge branch 'content-card-ui' of github.com:adobe/aepsdk-react-nativ…
cacheung Sep 4, 2025
d675cb8
Upate RCTAEPMessaging
cacheung Sep 4, 2025
e13b8c0
fix unit test
cacheung Sep 4, 2025
d464d36
merge update
cacheung Sep 5, 2025
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,6 @@ out/
# Ignore VSCode settings
.vscode/
.vscode/settings.json

# ignore ds store
.DS_Store
91 changes: 53 additions & 38 deletions apps/AEPSampleAppNewArchEnabled/app/MessagingView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,27 @@ OF ANY KIND, either express or implied. See the License for the specific languag
governing permissions and limitations under the License.
*/

import React from "react";
import { Button, Text, View, ScrollView } from "react-native";
import { MobileCore } from "@adobe/react-native-aepcore";
import React from 'react';
import {Button, Text, View, ScrollView} from 'react-native';
import {MobileCore} from '@adobe/react-native-aepcore';
import {
Messaging,
PersonalizationSchema,
} from "@adobe/react-native-aepmessaging";
import styles from "../styles/styles";
import { useRouter } from "expo-router";
Messaging,
PersonalizationSchema,
MessagingEdgeEventType,
PropositionItem,
Message,
ContentCard,
HTMLProposition,
JSONPropositionItem
} from '@adobe/react-native-aepmessaging'
import { MessagingProposition } from '@adobe/react-native-aepmessaging';
import styles from '../styles/styles';
import { useRouter } from 'expo-router';

const SURFACES = ["android-cbe-preview", "cbe/json", "android-cc"];
const SURFACES_WITH_CONTENT_CARDS = ["android-cc"];


const messagingExtensionVersion = async () => {
const version = await Messaging.extensionVersion();
console.log(`AdobeExperienceSDK: Messaging version: ${version}`);
Expand All @@ -35,31 +43,25 @@ 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);
}
);
onDismiss: msg => console.log('dismissed!', msg),
onShow: msg => {
console.log('show', msg);
msg.handleJavascriptMessage('myInappCallback', (content: string) => {
console.log('Received webview content in onShow:', content);
});
},
shouldShowMessage: () => true,
shouldSaveMessage: () => true,
urlLoaded: (url, message) => console.log(url, message),
});
console.log("messaging delegate set");
};

const getPropositionsForSurfaces = async () => {
const messages = await Messaging.getPropositionsForSurfaces(SURFACES);
console.log(JSON.stringify(messages));
console.log('getPropositionsForSurfaces', JSON.stringify(messages));
};

const trackAction = async () => {
MobileCore.trackAction("tuesday", { full: true });
MobileCore.trackAction('iamjs', {full: true});
};

const updatePropositionsForSurfaces = async () => {
Expand Down Expand Up @@ -89,12 +91,9 @@ const trackContentCardInteraction = async () => {
for (const proposition of propositions) {
for (const propositionItem of proposition.items) {
if (propositionItem.schema === PersonalizationSchema.CONTENT_CARD) {
Messaging.trackContentCardInteraction(proposition, propositionItem);
console.log(
"trackContentCardInteraction",
proposition,
propositionItem
);
// Cast to ContentCard for the legacy tracking method
Messaging.trackContentCardInteraction(proposition, propositionItem as any);
console.log('trackContentCardInteraction', proposition, propositionItem);
}
}
}
Expand All @@ -113,14 +112,35 @@ const trackContentCardDisplay = async () => {
for (const proposition of propositions) {
for (const propositionItem of proposition.items) {
if (propositionItem.schema === PersonalizationSchema.CONTENT_CARD) {
Messaging.trackContentCardDisplay(proposition, propositionItem);
console.log("trackContentCardDisplay", proposition, propositionItem);
// Cast to ContentCard for the legacy tracking method
Messaging.trackContentCardDisplay(proposition, propositionItem as any);
console.log('trackContentCardDisplay', proposition, propositionItem);
}
}
}
}
};


// Method demonstrating unified tracking using PropositionItem methods
const unifiedTrackingExample = async () => {
const messages = await Messaging.getPropositionsForSurfaces(SURFACES);
for (const surface of SURFACES) {
const propositions = messages[surface] || [];

for (const proposition of propositions) {
const propositionWrapper = new MessagingProposition(proposition);
if (propositionWrapper.items.length > 0) {
const propositionItem = propositionWrapper.items[0];
propositionItem.track(MessagingEdgeEventType.DISPLAY);
propositionItem.track('content_card_clicked', MessagingEdgeEventType.INTERACT, null);
}
}
}
}



function MessagingView() {
const router = useRouter();

Expand All @@ -146,14 +166,9 @@ function MessagingView() {
<Button title="getCachedMessages()" onPress={getCachedMessages} />
<Button title="getLatestMessage()" onPress={getLatestMessage} />
<Button title="trackAction()" onPress={trackAction} />
<Button
title="trackPropositionInteraction()"
onPress={trackContentCardInteraction}
/>
<Button
title="trackContentCardDisplay()"
onPress={trackContentCardDisplay}
/>
<Button title="trackPropositionInteraction()" onPress={trackContentCardInteraction} />
<Button title="trackContentCardDisplay()" onPress={trackContentCardDisplay} />
<Button title="Unified Tracking Example" onPress={unifiedTrackingExample} />
</ScrollView>
</View>
);
Expand Down
82 changes: 44 additions & 38 deletions apps/AEPSampleAppNewArchEnabled/app/OptimizeView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
Optimize,
DecisionScope,
Proposition,
Offer,
} from '@adobe/react-native-aepoptimize';
import {WebView} from 'react-native-webview';
import styles from '../styles/styles';
Expand Down Expand Up @@ -73,7 +74,7 @@ export default () => {
decisionScopeImage,
decisionScopeHtml,
decisionScopeJson,
decisionScopeTargetMbox,
decisionScopeTargetMbox
];

const optimizeExtensionVersion = async () => {
Expand All @@ -84,19 +85,36 @@ export default () => {

const updatePropositions = () => {
Optimize.updatePropositions(decisionScopes);
console.log('Updated Proposition for decisionScopes:', decisionScopes);
console.log('Updated Propositions');
};

const testUpdatePropositionsCallback = () => {
console.log('Testing updatePropositions with callback...');
Optimize.updatePropositions(
decisionScopes,
undefined,
undefined,
(response) => {
console.log('Callback received:', response);
},
(error) => {
console.log('Error:', error);
}
);
};

const getPropositions = async () => {
const propositions: Map<string, Proposition> =
await Optimize.getPropositions(decisionScopes);
console.log(propositions.size, ' propositions size');
if (propositions) {
console.log("get propositions", JSON.stringify(Object.fromEntries(propositions), null, 2));
setTextProposition(propositions.get(decisionScopeText.getName()));
setImageProposition(propositions.get(decisionScopeImage.getName()));
setHtmlProposition(propositions.get(decisionScopeHtml.getName()));
setJsonProposition(propositions.get(decisionScopeJson.getName()));
setTargetProposition(propositions.get(decisionScopeTargetMbox.getName()));
const propositionObject = Object.fromEntries(propositions);
console.log('propositions', JSON.stringify(propositionObject, null, 2));
}
};

Expand All @@ -120,49 +138,34 @@ export default () => {

const multipleOffersDisplayed = async () => {
const propositionsMap: Map<string, Proposition> = await Optimize.getPropositions(decisionScopes);
const offerPairs: Array<{proposition: Proposition, offerId: string}> = [];

const offers: Array<Offer> = [];
propositionsMap.forEach((proposition: Proposition) => {
if (proposition && proposition.items) {
if (proposition && proposition.items && proposition.items.length > 0) {
proposition.items.forEach((offer) => {
offerPairs.push({
proposition: proposition,
offerId: offer.id
});
offers.push(offer);
});
}
});

console.log('Extracted offer pairs:', offerPairs);

if (offerPairs.length > 0) {
Optimize.displayed(offerPairs);
console.log(`Called multipleOffersDisplayed with ${offerPairs.length} offers`);
} else {
console.log('No offers found to display');
}
console.log('offers', offers);
Optimize.displayed(offers);
};

const generateDisplayInteractionXdmForMultipleOffers = async () => {
const multipleOffersGenerateDisplayInteractionXdm = async () => {
const propositionsMap: Map<string, Proposition> = await Optimize.getPropositions(decisionScopes);
const offerPairs: Array<{proposition: Proposition, offerId: string}> = [];

const offers: Array<Offer> = [];
propositionsMap.forEach((proposition: Proposition) => {
if (proposition && proposition.items) {
if (proposition && proposition.items && proposition.items.length > 0) {
proposition.items.forEach((offer) => {
offerPairs.push({
proposition: proposition,
offerId: offer.id
});
offers.push(offer);
});
}
});

const xdm = await Optimize.generateDisplayInteractionXdm(offerPairs);
if (xdm) {
console.log('Generated Display Interaction XDM for Multiple Offers:', JSON.stringify(xdm, null, 2));
console.log('offers', offers);
const displayInteractionXdm = await Optimize.generateDisplayInteractionXdm(offers);
if (displayInteractionXdm) {
console.log('displayInteractionXdm', JSON.stringify(displayInteractionXdm, null, 2));
} else {
console.log('Error in generating Display interaction XDM for multiple offers.');
console.log('displayInteractionXdm is null');
}
};

Expand Down Expand Up @@ -377,6 +380,9 @@ export default () => {
<View style={{margin: 5}}>
<Button title="Update Propositions" onPress={updatePropositions} />
</View>
<View style={{margin: 5}}>
<Button title="Test Update Propositions Callback" onPress={testUpdatePropositionsCallback} />
</View>
<View style={{margin: 5}}>
<Button title="Get Propositions" onPress={getPropositions} />
</View>
Expand All @@ -388,20 +394,20 @@ export default () => {
</View>
<View style={{margin: 5}}>
<Button
title="Multiple Offers Displayed"
onPress={multipleOffersDisplayed}
title="Subscribe to Proposition Update"
onPress={onPropositionUpdate}
/>
</View>
<View style={{margin: 5}}>
<Button
title="Generate Display Interaction XDM for Multiple Offers"
onPress={generateDisplayInteractionXdmForMultipleOffers}
title="Multiple Offers Displayed"
onPress={multipleOffersDisplayed}
/>
</View>
<View style={{margin: 5}}>
<Button
title="Subscribe to Proposition Update"
onPress={onPropositionUpdate}
title="Multiple Offers Generate Display Interaction XDM"
onPress={multipleOffersGenerateDisplayInteractionXdm}
/>
</View>
<Text style={{...styles.welcome, fontSize: 20}}>
Expand Down
26 changes: 26 additions & 0 deletions apps/AEPSampleAppNewArchEnabled/app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,32 @@ export default function RootLayout() {
.then(() => {
console.log("update propositions after - SUCCESS");
console.log("Propositions updated successfully in layout");

// // Set up messaging delegate after SDK initialization
// const unsubscribe = Messaging.setMessagingDelegate({
// onDismiss: (message) => {
// console.log('Message dismissed:', message);
// },
// onShow: (message) => {
// console.log('Message shown:', message);
// },
// shouldShowMessage: (message) => {
// console.log('Should show message:', message);
// return true; // Always show messages in sample app
// },
// shouldSaveMessage: (message) => {
// console.log('Should save message:', message);
// return true; // Always save messages in sample app
// },
// urlLoaded: (url, message) => {
// console.log('URL loaded:', url, 'for message:', message);
// },
// });

// console.log("Messaging delegate set up successfully");

// Store unsubscribe function if needed for cleanup
// You could return it from useEffect if you need to clean up on unmount
})
.catch((error) => {
console.error("AEP SDK Initialization error:", error);
Expand Down
Loading