diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 2d12ca9ea..3baff5a5f 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -32,6 +32,8 @@ dev,react-native-webview,MIT,"Copyright (c) 2015-present, Facebook, Inc." dev,react-test-renderer,MIT,"Copyright (c) Facebook, Inc. and its affiliates." dev,typescript,Apache-2.0,"Copyright Microsoft Corporation" dev,genversion,MIT,"Copyright (c) 2021 Akseli Palén" +dev,@openfeature/core,Apache-2.0,"Copyright (c) The OpenFeature Authors" +prod,@openfeature/web-sdk,Apache-2.0,"Copyright (c) The OpenFeature Authors" prod,chokidar,MIT,"Copyright (c) 2012 Paul Miller (https://paulmillr.com), Elan Shanker" prod,fast-glob,MIT,"Copyright (c) Denis Malinochkin" prod,svgo,MIT,"Copyright (c) Kir Belevich" diff --git a/benchmarks/android/app/build.gradle b/benchmarks/android/app/build.gradle index 6e111a267..c674c588d 100644 --- a/benchmarks/android/app/build.gradle +++ b/benchmarks/android/app/build.gradle @@ -129,5 +129,5 @@ dependencies { // Benchmark tools from dd-sdk-android are used for vitals recording // Remember to bump thid alongside the main dd-sdk-android dependencies - implementation("com.datadoghq:dd-sdk-android-benchmark-internal:3.4.0") + implementation("com.datadoghq:dd-sdk-android-benchmark-internal:3.5.0") } diff --git a/example-new-architecture/App.tsx b/example-new-architecture/App.tsx index b5d9a8f58..517424501 100644 --- a/example-new-architecture/App.tsx +++ b/example-new-architecture/App.tsx @@ -9,10 +9,18 @@ import { DdLogs, DdTrace, TrackingConsent, + DdFlags, } from '@datadog/mobile-react-native'; -import React from 'react'; +import {DatadogOpenFeatureProvider} from '@datadog/mobile-react-native-openfeature'; +import { + OpenFeature, + OpenFeatureProvider, + useObjectFlagDetails, +} from '@openfeature/react-sdk'; +import React, {Suspense} from 'react'; import type {PropsWithChildren} from 'react'; import { + ActivityIndicator, SafeAreaView, ScrollView, StatusBar, @@ -53,51 +61,62 @@ import {APPLICATION_ID, CLIENT_TOKEN, ENVIRONMENT} from './ddCredentials'; config.uploadFrequency = UploadFrequency.FREQUENT; config.batchSize = BatchSize.SMALL; - + // Initialize the Datadog SDK. await DdSdkReactNative.initialize(config); + + // Enable Datadog Flags feature. + await DdFlags.enable(); + + // Set the provider with OpenFeature. + const provider = new DatadogOpenFeatureProvider(); + OpenFeature.setProvider(provider); + + // Datadog SDK usage examples. await DdRum.startView('main', 'Main'); setTimeout(async () => { await DdRum.addTiming('one_second'); }, 1000); await DdRum.addAction(RumActionType.CUSTOM, 'custom action'); + await DdLogs.info('info log'); + const spanId = await DdTrace.startSpan('test span'); await DdTrace.finishSpan(spanId); })(); -type SectionProps = PropsWithChildren<{ - title: string; -}>; +function AppWithProviders() { + React.useEffect(() => { + const user = { + id: 'user-123', + favoriteFruit: 'apple', + }; + + OpenFeature.setContext({ + targetingKey: user.id, + favoriteFruit: user.favoriteFruit, + }); + }, []); -function Section({children, title}: SectionProps): React.JSX.Element { - const isDarkMode = useColorScheme() === 'dark'; return ( - - - {title} - - - {children} - - + + + + }> + + + + ); } function App(): React.JSX.Element { - const isDarkMode = useColorScheme() === 'dark'; + const greetingFlag = useObjectFlagDetails('rn-sdk-test-json-flag', { + greeting: 'Default greeting', + }); + const isDarkMode = useColorScheme() === 'dark'; const backgroundStyle = { backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, }; @@ -108,14 +127,21 @@ function App(): React.JSX.Element { barStyle={isDarkMode ? 'light-content' : 'dark-content'} backgroundColor={backgroundStyle.backgroundColor} /> - +
- + + +
+ The title of this section is based on the{' '} + {greetingFlag.flagKey} feature + flag.{'\n\n'} + If it's different from "Default greeting", then it is coming from + the feature flag evaluation.{'\n\n'} + Evaluation reason is {greetingFlag.reason}.{'\n\n'}Inspect greetingFlag in{' '} + App.tsx for more evaluation + details. +
+
Edit App.tsx to change this screen and then come back to see your edits. @@ -136,6 +162,36 @@ function App(): React.JSX.Element { ); } +type SectionProps = PropsWithChildren<{ + title: string; +}>; + +function Section({children, title}: SectionProps): React.JSX.Element { + const isDarkMode = useColorScheme() === 'dark'; + return ( + + + {title} + + + {children} + + + ); +} + const styles = StyleSheet.create({ sectionContainer: { marginTop: 32, @@ -155,4 +211,4 @@ const styles = StyleSheet.create({ }, }); -export default App; +export default AppWithProviders; diff --git a/example-new-architecture/ios/Podfile b/example-new-architecture/ios/Podfile index f2f0fa09f..3c29ed272 100644 --- a/example-new-architecture/ios/Podfile +++ b/example-new-architecture/ios/Podfile @@ -26,7 +26,7 @@ target 'DdSdkReactNativeExample' do # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) - + post_install do |installer| # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( diff --git a/example-new-architecture/ios/Podfile.lock b/example-new-architecture/ios/Podfile.lock index 6e0553ece..a9bd4ab2b 100644 --- a/example-new-architecture/ios/Podfile.lock +++ b/example-new-architecture/ios/Podfile.lock @@ -1,22 +1,26 @@ PODS: - boost (1.84.0) - - DatadogCore (3.4.0): - - DatadogInternal (= 3.4.0) - - DatadogCrashReporting (3.4.0): - - DatadogInternal (= 3.4.0) - - PLCrashReporter (~> 1.12.0) - - DatadogInternal (3.4.0) - - DatadogLogs (3.4.0): - - DatadogInternal (= 3.4.0) - - DatadogRUM (3.4.0): - - DatadogInternal (= 3.4.0) + - DatadogCore (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogCrashReporting (3.5.0): + - DatadogInternal (= 3.5.0) + - KSCrash/Filters (= 2.5.0) + - KSCrash/Recording (= 2.5.0) + - DatadogFlags (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogInternal (3.5.0) + - DatadogLogs (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogRUM (3.5.0): + - DatadogInternal (= 3.5.0) - DatadogSDKReactNative (3.0.0): - - DatadogCore (= 3.4.0) - - DatadogCrashReporting (= 3.4.0) - - DatadogLogs (= 3.4.0) - - DatadogRUM (= 3.4.0) - - DatadogTrace (= 3.4.0) - - DatadogWebViewTracking (= 3.4.0) + - DatadogCore (= 3.5.0) + - DatadogCrashReporting (= 3.5.0) + - DatadogFlags (= 3.5.0) + - DatadogLogs (= 3.5.0) + - DatadogRUM (= 3.5.0) + - DatadogTrace (= 3.5.0) + - DatadogWebViewTracking (= 3.5.0) - DoubleConversion - glog - hermes-engine @@ -38,12 +42,13 @@ PODS: - ReactCommon/turbomodule/core - Yoga - DatadogSDKReactNative/Tests (3.0.0): - - DatadogCore (= 3.4.0) - - DatadogCrashReporting (= 3.4.0) - - DatadogLogs (= 3.4.0) - - DatadogRUM (= 3.4.0) - - DatadogTrace (= 3.4.0) - - DatadogWebViewTracking (= 3.4.0) + - DatadogCore (= 3.5.0) + - DatadogCrashReporting (= 3.5.0) + - DatadogFlags (= 3.5.0) + - DatadogLogs (= 3.5.0) + - DatadogRUM (= 3.5.0) + - DatadogTrace (= 3.5.0) + - DatadogWebViewTracking (= 3.5.0) - DoubleConversion - glog - hermes-engine @@ -64,11 +69,11 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - DatadogTrace (3.4.0): - - DatadogInternal (= 3.4.0) - - OpenTelemetrySwiftApi (= 1.13.1) - - DatadogWebViewTracking (3.4.0): - - DatadogInternal (= 3.4.0) + - DatadogTrace (3.5.0): + - DatadogInternal (= 3.5.0) + - OpenTelemetry-Swift-Api (~> 2.3.0) + - DatadogWebViewTracking (3.5.0): + - DatadogInternal (= 3.5.0) - DoubleConversion (1.1.6) - fast_float (6.1.4) - FBLazyVector (0.76.9) @@ -77,8 +82,18 @@ PODS: - hermes-engine (0.76.9): - hermes-engine/Pre-built (= 0.76.9) - hermes-engine/Pre-built (0.76.9) - - OpenTelemetrySwiftApi (1.13.1) - - PLCrashReporter (1.12.0) + - KSCrash/Core (2.5.0) + - KSCrash/Filters (2.5.0): + - KSCrash/Recording + - KSCrash/RecordingCore + - KSCrash/ReportingCore + - KSCrash/Recording (2.5.0): + - KSCrash/RecordingCore + - KSCrash/RecordingCore (2.5.0): + - KSCrash/Core + - KSCrash/ReportingCore (2.5.0): + - KSCrash/Core + - OpenTelemetry-Swift-Api (2.3.0) - RCT-Folly (2024.10.14.00): - boost - DoubleConversion @@ -1706,13 +1721,14 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - DatadogCore - DatadogCrashReporting + - DatadogFlags - DatadogInternal - DatadogLogs - DatadogRUM - DatadogTrace - DatadogWebViewTracking - - OpenTelemetrySwiftApi - - PLCrashReporter + - KSCrash + - OpenTelemetry-Swift-Api - SocketRocket EXTERNAL SOURCES: @@ -1850,81 +1866,82 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - DatadogCore: 8c384b6338c49534e43fdf7f9a0508b62bf1d426 - DatadogCrashReporting: 103bfb4077db2ccee1846f71e53712972732d3b7 - DatadogInternal: b0372935ad8dde5ad06960fe8d88c39b2cc92bcc - DatadogLogs: 484bb1bfe0c9a7cb2a7d9733f61614e8ea7b2f3a - DatadogRUM: 00069b27918e0ce4a9223b87b4bfa7929d6a0a1f - DatadogSDKReactNative: 2028776f30b047eb0d118ff7efc15786a20d766f - DatadogTrace: 852cb80f9370eb1321eb30a73c82c8e3d9e4e980 - DatadogWebViewTracking: 32dfeaf7aad47a605a689ed12e0d21ee8eb56141 + DatadogCore: 4cbe2646591d2f96fb3188400863ec93ac411235 + DatadogCrashReporting: e48da3f880a59d2aa2d04e5034e56507177e9d64 + DatadogFlags: f8cf88371460d6c672abfd97fdc9af5be208f33b + DatadogInternal: 63308b529cd87fb2f99c5961d9ff13afb300a3aa + DatadogLogs: be538def1d5204e011f7952915ad0261014a0dd5 + DatadogRUM: cffc65659ce29546fcc2639a74003135259548fc + DatadogSDKReactNative: ab55448d4e1fd641f08091f0329d2f1cfe0e5c78 + DatadogTrace: 085e35f9e4889f82f8a747922c58ea4b19728720 + DatadogWebViewTracking: 61b8344da898cbaccffc75bc1a17c86175e8573a DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45 fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11 - OpenTelemetrySwiftApi: aaee576ed961e0c348af78df58b61300e95bd104 - PLCrashReporter: db59ef96fa3d25f3650040d02ec2798cffee75f2 - RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17 + KSCrash: 80e1e24eaefbe5134934ae11ca8d7746586bc2ed + OpenTelemetry-Swift-Api: 3d77582ab6837a63b65bf7d2eacc57d8f2595edd + RCT-Folly: 7b4f73a92ad9571b9dbdb05bb30fad927fa971e1 RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83 RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716 RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea - React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245 - React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c - React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab + React-Core: 0a06707a0b34982efc4a556aff5dae4b22863455 + React-CoreModules: 907334e94314189c2e5eed4877f3efe7b26d85b0 + React-cxxreact: 3a1d5e8f4faa5e09be26614e9c8bbcae8d11b73d React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964 - React-defaultsnativemodule: 18a684542f82ce1897552a1c4b847be414c9566e - React-domnativemodule: 90bdd4ec3ab38c47cfc3461c1e9283a8507d613f - React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b - React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520 - React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576 + React-defaultsnativemodule: 814830ccbc3fb08d67d0190e63b179ee4098c67b + React-domnativemodule: 270acf94bd0960b026bc3bfb327e703665d27fb4 + React-Fabric: 64586dc191fc1c170372a638b8e722e4f1d0a09b + React-FabricComponents: b0ebd032387468ea700574c581b139f57a7497fb + React-FabricImage: 81f0e0794caf25ad1224fa406d288fbc1986607f React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c - React-featureflagsnativemodule: 742a8325b3c821d2a1ca13a6d2a0fc72d04555e0 - React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121 - React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf - React-idlecallbacksnativemodule: d61d9c9816131bf70d3d80cd04889fc625ee523f - React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020 - React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6 - React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d - React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893 - React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086 - React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f - React-logger: c4052eb941cca9a097ef01b59543a656dc088559 - React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de - React-microtasksnativemodule: d80ff86c8902872d397d9622f1a97aadcc12cead + React-featureflagsnativemodule: 0d7091ae344d6160c0557048e127897654a5c00f + React-graphics: cbebe910e4a15b65b0bff94a4d3ed278894d6386 + React-hermes: ec18c10f5a69d49fb9b5e17ae95494e9ea13d4d3 + React-idlecallbacksnativemodule: 6b84add48971da9c40403bd1860d4896462590f2 + React-ImageManager: f2a4c01c2ccb2193e60a20c135da74c7ca4d36f2 + React-jserrorhandler: 61d205b5a7cbc57fed3371dd7eed48c97f49fc64 + React-jsi: 95f7676103137861b79b0f319467627bcfa629ee + React-jsiexecutor: 41e0fe87cda9ea3970ffb872ef10f1ff8dbd1932 + React-jsinspector: 15578208796723e5c6f39069b6e8bf36863ef6e2 + React-jsitracing: 3758cdb155ea7711f0e77952572ea62d90c69f0b + React-logger: dbca7bdfd4aa5ef69431362bde6b36d49403cb20 + React-Mapbuffer: 6efad4a606c1fae7e4a93385ee096681ef0300dc + React-microtasksnativemodule: a645237a841d733861c70b69908ab4a1707b52ad React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678 - React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e - React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358 - React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc + React-NativeModulesApple: 958d4f6c5c2ace4c0f427cf7ef82e28ae6538a22 + React-perflogger: 9b4f13c0afe56bc7b4a0e93ec74b1150421ee22d + React-performancetimeline: 359db1cb889aa0282fafc5838331b0987c4915a9 React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342 - React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585 - React-RCTAppDelegate: 345a6f1b82abc578437df0ce7e9c48740eca827c - React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6 - React-RCTFabric: 007b1a98201cc49b5bc6e1417d7fe3f6fc6e2b78 - React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8 - React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa - React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7 - React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223 - React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf - React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78 + React-RCTAnimation: d8c82deebebe3aaf7a843affac1b57cb2dc073d4 + React-RCTAppDelegate: 1774aa421a29a41a704ecaf789811ef73c4634b6 + React-RCTBlob: 70a58c11a6a3500d1a12f2e51ca4f6c99babcff8 + React-RCTFabric: 731cda82aed592aacce2d32ead69d78cde5d9274 + React-RCTImage: 5e9d655ba6a790c31e3176016f9b47fd0978fbf0 + React-RCTLinking: 2a48338252805091f7521eaf92687206401bdf2a + React-RCTNetwork: 0c1282b377257f6b1c81934f72d8a1d0c010e4c3 + React-RCTSettings: f757b679a74e5962be64ea08d7865a7debd67b40 + React-RCTText: e7d20c490b407d3b4a2daa48db4bcd8ec1032af2 + React-RCTVibration: 8228e37144ca3122a91f1de16ba8e0707159cfec React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6 - React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec + React-rendererdebug: 81becbc8852b38d9b1b68672aa504556481330d5 React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74 - React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd - React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb + React-RuntimeApple: 52ed0e9e84a7c2607a901149fb13599a3c057655 + React-RuntimeCore: ca6189d2e53d86db826e2673fe8af6571b8be157 React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899 - React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385 - React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d + React-RuntimeHermes: 3b752dc5d8a1661c9d1687391d6d96acfa385549 + React-runtimescheduler: 8321bb09175ace2a4f0b3e3834637eb85bf42ebe React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9 - React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f - ReactCodegen: f853a20cc9125c5521c8766b4b49375fec20648b - ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9 + React-utils: 54df9ada708578c8ad40d92895d6fed03e0e8a9e + ReactCodegen: 21a52ccddc6479448fc91903a437dd23ddc7366c + ReactCommon: bfd3600989d79bc3acbe7704161b171a1480b9fd SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a -PODFILE CHECKSUM: d9d720c99b6fffec4dd489d565a544a358a52b83 +PODFILE CHECKSUM: 2046fc46dd3311048c09b49573c69b7aba2aab81 COCOAPODS: 1.16.2 diff --git a/example-new-architecture/package.json b/example-new-architecture/package.json index b72ce69e4..83a990a29 100644 --- a/example-new-architecture/package.json +++ b/example-new-architecture/package.json @@ -9,6 +9,8 @@ }, "dependencies": { "@datadog/mobile-react-native": "workspace:packages/core", + "@datadog/mobile-react-native-openfeature": "workspace:packages/react-native-openfeature", + "@openfeature/react-sdk": "^1.1.0", "react": "18.3.1", "react-native": "0.76.9" }, diff --git a/example/ios/Podfile b/example/ios/Podfile index 1736870c9..7484e6aa7 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -28,7 +28,7 @@ target 'ddSdkReactnativeExample' do # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) - + # pod 'DatadogSDKReactNative', :path => '../../packages/core/DatadogSDKReactNative.podspec', :testspecs => ['Tests'] post_install do |installer| diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index fb945f513..3d645cd7f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,34 +1,39 @@ PODS: - boost (1.84.0) - - DatadogCore (3.4.0): - - DatadogInternal (= 3.4.0) - - DatadogCrashReporting (3.4.0): - - DatadogInternal (= 3.4.0) - - PLCrashReporter (~> 1.12.0) - - DatadogInternal (3.4.0) - - DatadogLogs (3.4.0): - - DatadogInternal (= 3.4.0) - - DatadogRUM (3.4.0): - - DatadogInternal (= 3.4.0) + - DatadogCore (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogCrashReporting (3.5.0): + - DatadogInternal (= 3.5.0) + - KSCrash/Filters (= 2.5.0) + - KSCrash/Recording (= 2.5.0) + - DatadogFlags (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogInternal (3.5.0) + - DatadogLogs (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogRUM (3.5.0): + - DatadogInternal (= 3.5.0) - DatadogSDKReactNative (3.0.0): - - DatadogCore (= 3.4.0) - - DatadogCrashReporting (= 3.4.0) - - DatadogLogs (= 3.4.0) - - DatadogRUM (= 3.4.0) - - DatadogTrace (= 3.4.0) - - DatadogWebViewTracking (= 3.4.0) + - DatadogCore (= 3.5.0) + - DatadogCrashReporting (= 3.5.0) + - DatadogFlags (= 3.5.0) + - DatadogLogs (= 3.5.0) + - DatadogRUM (= 3.5.0) + - DatadogTrace (= 3.5.0) + - DatadogWebViewTracking (= 3.5.0) - React-Core - DatadogSDKReactNative/Tests (3.0.0): - - DatadogCore (= 3.4.0) - - DatadogCrashReporting (= 3.4.0) - - DatadogLogs (= 3.4.0) - - DatadogRUM (= 3.4.0) - - DatadogTrace (= 3.4.0) - - DatadogWebViewTracking (= 3.4.0) + - DatadogCore (= 3.5.0) + - DatadogCrashReporting (= 3.5.0) + - DatadogFlags (= 3.5.0) + - DatadogLogs (= 3.5.0) + - DatadogRUM (= 3.5.0) + - DatadogTrace (= 3.5.0) + - DatadogWebViewTracking (= 3.5.0) - React-Core - DatadogSDKReactNativeSessionReplay (3.0.0): - DatadogSDKReactNative - - DatadogSessionReplay (= 3.4.0) + - DatadogSessionReplay (= 3.5.0) - DoubleConversion - glog - hermes-engine @@ -51,7 +56,7 @@ PODS: - Yoga - DatadogSDKReactNativeSessionReplay/Tests (3.0.0): - DatadogSDKReactNative - - DatadogSessionReplay (= 3.4.0) + - DatadogSessionReplay (= 3.5.0) - DoubleConversion - glog - hermes-engine @@ -74,24 +79,24 @@ PODS: - ReactCommon/turbomodule/core - Yoga - DatadogSDKReactNativeWebView (3.0.0): - - DatadogInternal (= 3.4.0) + - DatadogInternal (= 3.5.0) - DatadogSDKReactNative - - DatadogWebViewTracking (= 3.4.0) + - DatadogWebViewTracking (= 3.5.0) - React-Core - DatadogSDKReactNativeWebView/Tests (3.0.0): - - DatadogInternal (= 3.4.0) + - DatadogInternal (= 3.5.0) - DatadogSDKReactNative - - DatadogWebViewTracking (= 3.4.0) + - DatadogWebViewTracking (= 3.5.0) - React-Core - react-native-webview - React-RCTText - - DatadogSessionReplay (3.4.0): - - DatadogInternal (= 3.4.0) - - DatadogTrace (3.4.0): - - DatadogInternal (= 3.4.0) - - OpenTelemetrySwiftApi (= 1.13.1) - - DatadogWebViewTracking (3.4.0): - - DatadogInternal (= 3.4.0) + - DatadogSessionReplay (3.5.0): + - DatadogInternal (= 3.5.0) + - DatadogTrace (3.5.0): + - DatadogInternal (= 3.5.0) + - OpenTelemetry-Swift-Api (~> 2.3.0) + - DatadogWebViewTracking (3.5.0): + - DatadogInternal (= 3.5.0) - DoubleConversion (1.1.6) - fast_float (6.1.4) - FBLazyVector (0.76.9) @@ -101,8 +106,18 @@ PODS: - hermes-engine/Pre-built (= 0.76.9) - hermes-engine/Pre-built (0.76.9) - HMSegmentedControl (1.5.6) - - OpenTelemetrySwiftApi (1.13.1) - - PLCrashReporter (1.12.0) + - KSCrash/Core (2.5.0) + - KSCrash/Filters (2.5.0): + - KSCrash/Recording + - KSCrash/RecordingCore + - KSCrash/ReportingCore + - KSCrash/Recording (2.5.0): + - KSCrash/RecordingCore + - KSCrash/RecordingCore (2.5.0): + - KSCrash/Core + - KSCrash/ReportingCore (2.5.0): + - KSCrash/Core + - OpenTelemetry-Swift-Api (2.3.0) - RCT-Folly (2024.10.14.00): - boost - DoubleConversion @@ -1824,6 +1839,7 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - DatadogCore - DatadogCrashReporting + - DatadogFlags - DatadogInternal - DatadogLogs - DatadogRUM @@ -1831,8 +1847,8 @@ SPEC REPOS: - DatadogTrace - DatadogWebViewTracking - HMSegmentedControl - - OpenTelemetrySwiftApi - - PLCrashReporter + - KSCrash + - OpenTelemetry-Swift-Api - SocketRocket EXTERNAL SOURCES: @@ -1988,17 +2004,18 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - DatadogCore: 8c384b6338c49534e43fdf7f9a0508b62bf1d426 - DatadogCrashReporting: 103bfb4077db2ccee1846f71e53712972732d3b7 - DatadogInternal: b0372935ad8dde5ad06960fe8d88c39b2cc92bcc - DatadogLogs: 484bb1bfe0c9a7cb2a7d9733f61614e8ea7b2f3a - DatadogRUM: 00069b27918e0ce4a9223b87b4bfa7929d6a0a1f - DatadogSDKReactNative: 94f17b16c05b0723923afb82ef8e51acb9609614 - DatadogSDKReactNativeSessionReplay: 9707e737f3ef4591a972b76e6f061619279b0958 - DatadogSDKReactNativeWebView: 8a524987010728a36a249785e823722746ce8b16 - DatadogSessionReplay: 462a3a2e39e9e2193528cf572c8d1acfd6cdace1 - DatadogTrace: 852cb80f9370eb1321eb30a73c82c8e3d9e4e980 - DatadogWebViewTracking: 32dfeaf7aad47a605a689ed12e0d21ee8eb56141 + DatadogCore: 4cbe2646591d2f96fb3188400863ec93ac411235 + DatadogCrashReporting: e48da3f880a59d2aa2d04e5034e56507177e9d64 + DatadogFlags: f8cf88371460d6c672abfd97fdc9af5be208f33b + DatadogInternal: 63308b529cd87fb2f99c5961d9ff13afb300a3aa + DatadogLogs: be538def1d5204e011f7952915ad0261014a0dd5 + DatadogRUM: cffc65659ce29546fcc2639a74003135259548fc + DatadogSDKReactNative: bf3df9195b39491ba37cea90c3924d807ae60036 + DatadogSDKReactNativeSessionReplay: 701ca8bfed785f9046b6defd779e0e23e43ce944 + DatadogSDKReactNativeWebView: 61b027a096421adc7288f286d479a2344246f4bd + DatadogSessionReplay: eea291df0135ec792177be1ffc4951750a66a011 + DatadogTrace: 085e35f9e4889f82f8a747922c58ea4b19728720 + DatadogWebViewTracking: 61b8344da898cbaccffc75bc1a17c86175e8573a DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45 @@ -2006,74 +2023,74 @@ SPEC CHECKSUMS: glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11 HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352 - OpenTelemetrySwiftApi: aaee576ed961e0c348af78df58b61300e95bd104 - PLCrashReporter: db59ef96fa3d25f3650040d02ec2798cffee75f2 - RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17 + KSCrash: 80e1e24eaefbe5134934ae11ca8d7746586bc2ed + OpenTelemetry-Swift-Api: 3d77582ab6837a63b65bf7d2eacc57d8f2595edd + RCT-Folly: 7b4f73a92ad9571b9dbdb05bb30fad927fa971e1 RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83 RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716 RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea - React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245 - React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c - React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab + React-Core: 0a06707a0b34982efc4a556aff5dae4b22863455 + React-CoreModules: 907334e94314189c2e5eed4877f3efe7b26d85b0 + React-cxxreact: 3a1d5e8f4faa5e09be26614e9c8bbcae8d11b73d React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964 - React-defaultsnativemodule: 21f216e8db975897eb32b5f13247f5bbfaa97f41 - React-domnativemodule: 19270ad4b8d33312838d257f24731a0026809d49 - React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b - React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520 - React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576 + React-defaultsnativemodule: a965cb39fb0a79276ab611793d39f52e59a9a851 + React-domnativemodule: d647f94e503c62c44f54291334b1aa22a30fa08b + React-Fabric: 64586dc191fc1c170372a638b8e722e4f1d0a09b + React-FabricComponents: b0ebd032387468ea700574c581b139f57a7497fb + React-FabricImage: 81f0e0794caf25ad1224fa406d288fbc1986607f React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c - React-featureflagsnativemodule: 3a8731d8fd9f755be57e00d9fa8a7f92aa77e87d - React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121 - React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf - React-idlecallbacksnativemodule: 9a2c5b5c174c0c476f039bedc1b9497a8272133e - React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020 - React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6 - React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d - React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893 - React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086 - React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f - React-logger: c4052eb941cca9a097ef01b59543a656dc088559 - React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de - React-microtasksnativemodule: 5c3d795318c22ab8df55100e50b151384a4a60b3 - react-native-crash-tester: 48bde9d6f5256c61ef2e0c52dfc74256b26e55eb - react-native-safe-area-context: e134b241010ebe2aacdcea013565963d13826faa - react-native-webview: 2ea635bc43fd8a4b89de61133e8cc0607084e9f8 + React-featureflagsnativemodule: 95a02d895475de8ace78fedd76143866838bb720 + React-graphics: cbebe910e4a15b65b0bff94a4d3ed278894d6386 + React-hermes: ec18c10f5a69d49fb9b5e17ae95494e9ea13d4d3 + React-idlecallbacksnativemodule: 0c1ae840cc5587197cd926a3cb76828ad059d116 + React-ImageManager: f2a4c01c2ccb2193e60a20c135da74c7ca4d36f2 + React-jserrorhandler: 61d205b5a7cbc57fed3371dd7eed48c97f49fc64 + React-jsi: 95f7676103137861b79b0f319467627bcfa629ee + React-jsiexecutor: 41e0fe87cda9ea3970ffb872ef10f1ff8dbd1932 + React-jsinspector: 15578208796723e5c6f39069b6e8bf36863ef6e2 + React-jsitracing: 3758cdb155ea7711f0e77952572ea62d90c69f0b + React-logger: dbca7bdfd4aa5ef69431362bde6b36d49403cb20 + React-Mapbuffer: 6efad4a606c1fae7e4a93385ee096681ef0300dc + React-microtasksnativemodule: 8732b71aa66045da4bb341ddee1bb539f71e5f38 + react-native-crash-tester: 3ffaa64141427ca362079cb53559fe9a532487ae + react-native-safe-area-context: 04803a01f39f31cc6605a5531280b477b48f8a88 + react-native-webview: 1e12de2fad74c17b4f8b1b53ebd1e3baa0148d71 React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678 - React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e - React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358 - React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc + React-NativeModulesApple: 958d4f6c5c2ace4c0f427cf7ef82e28ae6538a22 + React-perflogger: 9b4f13c0afe56bc7b4a0e93ec74b1150421ee22d + React-performancetimeline: 359db1cb889aa0282fafc5838331b0987c4915a9 React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342 - React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585 - React-RCTAppDelegate: 1e5b43833e3e36e9fa34eec20be98174bc0e14a2 - React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6 - React-RCTFabric: bd906861a4e971e21d8df496c2d8f3ca6956f840 - React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8 - React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa - React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7 - React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223 - React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf - React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78 + React-RCTAnimation: d8c82deebebe3aaf7a843affac1b57cb2dc073d4 + React-RCTAppDelegate: 6c0377d9c4058773ea7073bb34bb9ebd6ddf5a84 + React-RCTBlob: 70a58c11a6a3500d1a12f2e51ca4f6c99babcff8 + React-RCTFabric: 7eb6dd2c8fda98cb860a572e3f4e4eb60d62c89e + React-RCTImage: 5e9d655ba6a790c31e3176016f9b47fd0978fbf0 + React-RCTLinking: 2a48338252805091f7521eaf92687206401bdf2a + React-RCTNetwork: 0c1282b377257f6b1c81934f72d8a1d0c010e4c3 + React-RCTSettings: f757b679a74e5962be64ea08d7865a7debd67b40 + React-RCTText: e7d20c490b407d3b4a2daa48db4bcd8ec1032af2 + React-RCTVibration: 8228e37144ca3122a91f1de16ba8e0707159cfec React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6 - React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec + React-rendererdebug: 81becbc8852b38d9b1b68672aa504556481330d5 React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74 - React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd - React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb + React-RuntimeApple: 52ed0e9e84a7c2607a901149fb13599a3c057655 + React-RuntimeCore: ca6189d2e53d86db826e2673fe8af6571b8be157 React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899 - React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385 - React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d + React-RuntimeHermes: 3b752dc5d8a1661c9d1687391d6d96acfa385549 + React-runtimescheduler: 8321bb09175ace2a4f0b3e3834637eb85bf42ebe React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9 - React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f - ReactCodegen: f853a20cc9125c5521c8766b4b49375fec20648b - ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9 - ReactNativeNavigation: 445f86273eb245d15b14023ee4ef9d6e4f891ad6 - RNCAsyncStorage: b44e8a4e798c3e1f56bffccd0f591f674fb9198f - RNGestureHandler: cb711d56ee3b03a5adea1d38324d4459ab55653f - RNScreens: f75b26fd4777848c216e27b0a09e1bf9c9f4760a + React-utils: 54df9ada708578c8ad40d92895d6fed03e0e8a9e + ReactCodegen: 21a52ccddc6479448fc91903a437dd23ddc7366c + ReactCommon: bfd3600989d79bc3acbe7704161b171a1480b9fd + ReactNativeNavigation: 50c1eef68b821e7265eff3a391d27ed18fdce459 + RNCAsyncStorage: 23e56519cc41d3bade3c8d4479f7760cb1c11996 + RNGestureHandler: 950dfa674dbf481460ca389c65b9036ac4ab8ada + RNScreens: 606ab1cf68162f7ba0d049a31f2a84089a6fffb4 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a -PODFILE CHECKSUM: 2be76f6ff2a88869ff51bdbf48edb79d7d863c79 +PODFILE CHECKSUM: 9a1faac3ae43394b0b86e6fcabf63eced6c66dc2 COCOAPODS: 1.16.2 diff --git a/example/package.json b/example/package.json index db38f20b6..f065aab69 100644 --- a/example/package.json +++ b/example/package.json @@ -12,9 +12,11 @@ "dependencies": { "@datadog/mobile-react-native": "workspace:packages/core", "@datadog/mobile-react-native-navigation": "workspace:packages/react-native-navigation", + "@datadog/mobile-react-native-openfeature": "workspace:packages/react-native-openfeature", "@datadog/mobile-react-native-session-replay": "workspace:packages/react-native-session-replay", "@datadog/mobile-react-native-webview": "workspace:packages/react-native-webview", "@datadog/mobile-react-navigation": "workspace:packages/react-navigation", + "@openfeature/react-sdk": "^1.2.0", "@react-native-async-storage/async-storage": "^2.1.2", "@react-native-community/cli": "15.0.1", "@react-native-community/cli-platform-android": "15.0.1", diff --git a/example/src/App.tsx b/example/src/App.tsx index 1427dc5ba..897a1a3a8 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -7,11 +7,12 @@ import AboutScreen from './screens/AboutScreen'; import style from './screens/styles'; import { navigationRef } from './NavigationRoot'; import { DdRumReactNavigationTracking, NavigationTrackingOptions, ParamsTrackingPredicate, ViewNamePredicate, ViewTrackingPredicate } from '@datadog/mobile-react-navigation'; -import {DatadogProvider } from '@datadog/mobile-react-native' +import { DatadogProvider, TrackingConsent, DdFlags } from '@datadog/mobile-react-native' +import { DatadogOpenFeatureProvider } from '@datadog/mobile-react-native-openfeature'; +import { OpenFeature, OpenFeatureProvider } from '@openfeature/react-sdk'; import { Route } from "@react-navigation/native"; import { NestedNavigator } from './screens/NestedNavigator/NestedNavigator'; import { getDatadogConfig, onDatadogInitialization } from './ddUtils'; -import { TrackingConsent } from '@datadog/mobile-react-native'; const Tab = createBottomTabNavigator(); @@ -20,7 +21,7 @@ const viewNamePredicate: ViewNamePredicate = function customViewNamePredicate(ro return "Custom RN " + trackedName; } -const viewTrackingPredicate: ViewTrackingPredicate = function customViewTrackingPredicate(route: Route) { +const viewTrackingPredicate: ViewTrackingPredicate = function customViewTrackingPredicate(route: Route) { if (route.name === "AlertModal") { return false; } @@ -28,7 +29,7 @@ const viewTrackingPredicate: ViewTrackingPredicate = function customViewTracking return true; } -const paramsTrackingPredicate: ParamsTrackingPredicate = function customParamsTrackingPredicate(route: Route) { +const paramsTrackingPredicate: ParamsTrackingPredicate = function customParamsTrackingPredicate(route: Route) { const filteredParams: any = {}; if (route.params?.creditCardNumber) { filteredParams["creditCardNumber"] = "XXXX XXXX XXXX XXXX"; @@ -56,9 +57,9 @@ const configuration = getDatadogConfig(TrackingConsent.GRANTED) // 3.- File based configuration from .json and custom mapper setup // const configuration = new FileBasedConfiguration( { -// configuration: require("../datadog-configuration.json").configuration, -// errorEventMapper: (event) => event, -// resourceEventMapper: (event) => event, +// configuration: require("../datadog-configuration.json").configuration, +// errorEventMapper: (event) => event, +// resourceEventMapper: (event) => event, // actionEventMapper: (event) => event}); // 4.- File based configuration from the native side (using initFromNative) @@ -66,26 +67,38 @@ const configuration = getDatadogConfig(TrackingConsent.GRANTED) // const configuration = new DatadogProviderConfiguration("fake_value", "fake_value"); -export default function App() { +const handleDatadogInitialization = async () => { + onDatadogInitialization(); + + // Enable Datadog Flags feature. + await DdFlags.enable(); + // Set the provider with OpenFeature. + const provider = new DatadogOpenFeatureProvider(); + OpenFeature.setProvider(provider); +} + +export default function App() { return ( - - { - DdRumReactNavigationTracking.startTrackingViews( - navigationRef.current, - navigationTrackingOptions) - }}> - null + + + { + DdRumReactNavigationTracking.startTrackingViews( + navigationRef.current, + navigationTrackingOptions) }}> - - - - - - + null + }}> + + + + + + + ) } diff --git a/example/src/WixApp.tsx b/example/src/WixApp.tsx index 809912843..af685b934 100644 --- a/example/src/WixApp.tsx +++ b/example/src/WixApp.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { View, Text, Button } from 'react-native'; +import React from 'react'; +import { View, Text, Button, ActivityIndicator } from 'react-native'; import MainScreen from './screens/MainScreen'; import ErrorScreen from './screens/ErrorScreen'; import AboutScreen from './screens/AboutScreen'; @@ -11,15 +11,17 @@ import { } from '@datadog/mobile-react-native-navigation'; import styles from './screens/styles'; +import { DdFlags } from '@datadog/mobile-react-native'; import TraceScreen from './screens/TraceScreen'; import { NavigationTrackingOptions, ParamsTrackingPredicate, ViewTrackingPredicate } from '@datadog/mobile-react-native-navigation/src/rum/instrumentation/DdRumReactNativeNavigationTracking'; +import { OpenFeatureProvider, useFlag } from '@openfeature/react-sdk'; // === Navigation Tracking custom predicates const viewNamePredicate: ViewNamePredicate = function customViewNamePredicate(_event: ComponentDidAppearEvent, trackedName: string) { return "Custom RN " + trackedName; } -const viewTrackingPredicate: ViewTrackingPredicate = function customViewTrackingPredicate(event: ComponentDidAppearEvent) { +const viewTrackingPredicate: ViewTrackingPredicate = function customViewTrackingPredicate(event: ComponentDidAppearEvent) { if (event.name === "AlertModal") { return false; } @@ -27,7 +29,7 @@ const viewTrackingPredicate: ViewTrackingPredicate = function customViewTracking return true; } -const paramsTrackingPredicate: ParamsTrackingPredicate = function customParamsTrackingPredicate(event: ComponentDidAppearEvent) { +const paramsTrackingPredicate: ParamsTrackingPredicate = function customParamsTrackingPredicate(event: ComponentDidAppearEvent) { const filteredParams: any = {}; if (event.passProps?.creditCardNumber) { filteredParams["creditCardNumber"] = "XXXX XXXX XXXX XXXX"; @@ -61,14 +63,25 @@ function startReactNativeNavigation() { } function registerScreens() { - Navigation.registerComponent('Home', () => HomeScreen); + Navigation.registerComponent('Home', () => HomeScreenWithProviders); Navigation.registerComponent('Main', () => MainScreen); Navigation.registerComponent('Error', () => ErrorScreen); Navigation.registerComponent('Trace', () => TraceScreen); Navigation.registerComponent('About', () => AboutScreen); } +const HomeScreenWithProviders = () => { + return ( + + + + ) +} + const HomeScreen = props => { + const testFlagKey = 'rn-sdk-test-json-flag'; + const flag = useFlag(testFlagKey, {greeting: "Default greeting"}); + return ( @@ -109,11 +122,12 @@ const HomeScreen = props => { passProps: { username: "test", creditCardNumber: "4242 4242 4242 4242" - } + } } }); }} /> + {testFlagKey}: {JSON.stringify(flag.value)} ); }; diff --git a/example/src/ddUtils.tsx b/example/src/ddUtils.tsx index b49caadfd..8e2fa8a94 100644 --- a/example/src/ddUtils.tsx +++ b/example/src/ddUtils.tsx @@ -7,7 +7,10 @@ import { TrackingConsent, BatchSize, UploadFrequency, + DdFlags, } from '@datadog/mobile-react-native'; +import { DatadogOpenFeatureProvider } from '@datadog/mobile-react-native-openfeature'; +import { OpenFeature } from '@openfeature/react-sdk'; import {APPLICATION_ID, CLIENT_TOKEN, ENVIRONMENT} from './ddCredentials'; import { BatchProcessingLevel } from '@datadog/mobile-react-native/src/config/types'; @@ -82,4 +85,11 @@ export function initializeDatadog(trackingConsent: TrackingConsent) { DdSdkReactNative.setUserInfo({id: "1337", name: "Xavier", email: "xg@example.com", extraInfo: { type: "premium" } }) DdSdkReactNative.addAttributes({campaign: "ad-network"}) }); + + // Enable the Flags feature. + DdFlags.enable().then(() => { + // Set the provider with OpenFeature. + const provider = new DatadogOpenFeatureProvider(); + OpenFeature.setProvider(provider); + }) } diff --git a/example/src/screens/MainScreen.tsx b/example/src/screens/MainScreen.tsx index 53b94a180..1616e953d 100644 --- a/example/src/screens/MainScreen.tsx +++ b/example/src/screens/MainScreen.tsx @@ -7,11 +7,12 @@ import React, { Component, RefObject } from 'react'; import { View, Text, Button, TouchableOpacity, - TouchableWithoutFeedback, TouchableNativeFeedback + TouchableWithoutFeedback, TouchableNativeFeedback, ActivityIndicator } from 'react-native'; +import { DdLogs, DdSdkReactNative, TrackingConsent, DdFlags } from '@datadog/mobile-react-native'; +import { FeatureFlag } from '@openfeature/react-sdk'; import styles from './styles'; import { APPLICATION_KEY, API_KEY } from '../../src/ddCredentials'; -import { DdLogs, DdSdkReactNative, TrackingConsent } from '@datadog/mobile-react-native'; import { getTrackingConsent, saveTrackingConsent } from '../utils'; import { ConsentModal } from '../components/consent'; @@ -113,7 +114,12 @@ export default class MainScreen extends Component { render() { return - {this.state.welcomeMessage} + Welcome!}> + Greetings from the Feature Flags! + + + The above greeting is being controlled by the{'\n'}`rn-sdk-test-boolean-flag` feature flag. +