diff --git a/CHANGELOG.md b/CHANGELOG.md
index 58f54cc..d7cff69 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [2.3.7] - 2026-07-02
+
+### Added
+- Agent response streaming, article search filters, and conversation page header branding added in FeatureConfiguration.
+- Prefill message support when creating support conversations.
+
+### Fixed
+- [Android] Fixed a crash related to NPEs on activities.
+
+## [2.3.6] - 2026-06-24
+
+### Changed
+- [iOS] Improved memory usage during offline session replay uploads.
+- Enhanced overall performance during screen navigations.
+
+### Fixed
+- [Android] Fixed an issue related to rapid navigations.
+- [Android] Fixed an ANR related to animated dialog captures.
+- [Android] Fixed an issue related to keyboard scrolls on webviews.
+- [Android] Fixed an issue related to dispatch window callback mutations.
+
+## [2.3.5] - 2026-06-12
+
+### Fixed
+- [iOS] Fixed unknown network type in session events by correctly identifying the cellular data service, radio generation, and Wi‑Fi/cellular transitions.
+- [iOS] Fixed session replay snapshot quality and touch coordinate rendering in landscape orientation.
+- [iOS] Fixed support chat conversation being cleared when a transient modal is dismissed.
+- [iOS] Fixed trait collection initialization crash.
+
## [2.3.4] - 2026-06-03
### Fixed
diff --git a/README.md b/README.md
index f9c12c9..5bacb7b 100644
--- a/README.md
+++ b/README.md
@@ -131,6 +131,8 @@ DevRev.configure('abcdefg12345', {
supportWidgetTheme: {
prefersSystemTheme: true,
},
+ enableSupportChatStreaming: true,
+ supportWidgetArticleSearchFilters: articleSearchFilters,
});
```
@@ -147,6 +149,8 @@ DevRev.updateFeatureConfiguration({
supportWidgetTheme: {
prefersSystemTheme: true,
},
+ enableSupportChatStreaming: true,
+ supportWidgetArticleSearchFilters: articleSearchFilters,
});
```
@@ -161,6 +165,8 @@ DevRev.updateFeatureConfiguration({
| `prefersDialogMode` | `boolean` | `false` | Prefer dialog mode for the support UI (Android only). |
| `alwaysUseRemoteConfig` | `boolean` | `true` | Always use remote config. |
| `supportWidgetTheme` | `SupportWidgetTheme` | — | Controls the appearance of the in-app support widget, including dynamic theme behavior. |
+| `enableSupportChatStreaming` | `boolean?` | `false` | When `true`, enables real-time AI agent response streaming in PLuG conversations (WebSocket streaming, optimistic UI, animated text). |
+| `supportWidgetArticleSearchFilters` | `ArticleSearchFilters?` | — | Optional filters for PLuG article search (widget and CMDK). Applied automatically when the support widget is ready. |
##### Support widget theme options
@@ -175,6 +181,10 @@ const customTheme = {
bottom: '20px',
side: '16px',
},
+ conversationPageOptions: {
+ headerText: 'Support',
+ subheaderText: 'We typically reply in a few minutes',
+ },
};
```
@@ -184,6 +194,16 @@ const customTheme = {
| `primaryTextColor` | `string?` | — | Hex color string (e.g. `'#000000'`, `'#1F2933'`) for primary text in the support widget. |
| `accentColor` | `string?` | — | Hex color string (e.g. `'#F97316'`, `'#FF0000'`) applied to buttons and highlights. |
| `spacing` | `{ [key: string]: string }?` | — | CSS-like spacing overrides (`bottom` and `side` keys are recognized). |
+| `conversationPageOptions` | `ConversationPageOptions?` | — | Customizes the conversation page header branding. |
+
+##### Conversation page options
+
+`ConversationPageOptions` customizes the header strings shown on the support conversation page. Both fields are optional — when omitted, the server-configured defaults are used.
+
+| Property | Type | Default | Description |
+|----------|------|---------|-------------|
+| `headerText` | `string?` | — | Custom text for the conversation header. |
+| `subheaderText` | `string?` | — | Custom text for the conversation subheader. Pass a single space (`' '`) to render a blank subheader. |
## Features
@@ -365,7 +385,13 @@ DevRev.showSupport()
You can initiate a new support conversation directly from your app. This method displays the support chat screen and simultaneously creates a new conversation.
```typescript
-DevRev.createSupportConversation()
+DevRev.createSupportConversation(prefillMessage?: string)
+```
+
+You can optionally pass a plain-text message to prefill the conversation input field:
+
+```typescript
+DevRev.createSupportConversation('I need help with billing for order #12345')
```
### In-app link handling
diff --git a/devrev-sdk-react-native-2.3.7.tgz b/devrev-sdk-react-native-2.3.7.tgz
new file mode 100644
index 0000000..96836da
Binary files /dev/null and b/devrev-sdk-react-native-2.3.7.tgz differ
diff --git a/sample/expo/package.json b/sample/expo/package.json
index 3a7e389..0353fde 100644
--- a/sample/expo/package.json
+++ b/sample/expo/package.json
@@ -48,6 +48,15 @@
"@types/react": "~19.0.10",
"typescript": "~5.8.3"
},
+ "resolutions": {
+ "@grpc/grpc-js": "^1.9.16",
+ "postcss": "^8.5.0",
+ "protobufjs": "^7.5.8",
+ "qs": "^6.15.2",
+ "shell-quote": "^1.8.4",
+ "uuid": "^9.0.0",
+ "ws": "^8.20.1"
+ },
"private": true,
"expo": {
"autolinking": {
diff --git a/sample/package.json b/sample/package.json
index 7f98b83..96821bd 100644
--- a/sample/package.json
+++ b/sample/package.json
@@ -10,7 +10,7 @@
"build:ios": "react-native build-ios --scheme DevRevSDKSample --mode Debug --extra-params \"-sdk iphonesimulator CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ GCC_OPTIMIZATION_LEVEL=0 GCC_PRECOMPILE_PREFIX_HEADER=YES ASSETCATALOG_COMPILER_OPTIMIZATION=time DEBUG_INFORMATION_FORMAT=dwarf COMPILER_INDEX_STORE_ENABLE=NO\""
},
"dependencies": {
- "@devrev/sdk-react-native": "^2.3.4",
+ "@devrev/sdk-react-native": "^2.3.7",
"@notifee/react-native": "^9.1.3",
"@react-native-community/cli-platform-ios": "^13.6.9",
"@react-native-firebase/app": "^21.0.0",
diff --git a/sample/react-native/android/build.gradle b/sample/react-native/android/build.gradle
index f37f1ec..8dc0493 100644
--- a/sample/react-native/android/build.gradle
+++ b/sample/react-native/android/build.gradle
@@ -7,7 +7,7 @@ buildscript {
}
dependencies {
classpath("com.android.tools.build:gradle:8.6.1")
- classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.0")
classpath("com.google.gms:google-services:4.4.2")
}
}
@@ -22,7 +22,7 @@ ext {
compileSdkVersion = 35
targetSdkVersion = 35
ndkVersion = "26.1.10909125"
- kotlinVersion = "2.0.21"
+ kotlinVersion = "2.1.0"
}
apply plugin: "com.facebook.react.rootproject"
@@ -39,4 +39,26 @@ rootProject.allprojects {
}
}
}
+
+ configurations.all {
+ resolutionStrategy {
+ force "io.netty:netty-codec-http2:4.1.135.Final"
+ force "io.netty:netty-codec-http:4.1.135.Final"
+ force "io.netty:netty-codec:4.1.135.Final"
+ force "io.netty:netty-handler:4.1.135.Final"
+ force "io.netty:netty-handler-proxy:4.1.135.Final"
+ force "io.netty:netty-common:4.1.135.Final"
+ force "io.netty:netty-transport-native-unix-common:4.1.135.Final"
+ force "com.google.protobuf:protobuf-java:3.25.5"
+ force "commons-io:commons-io:2.14.0"
+ force "junit:junit:4.13.1"
+ force "org.jetbrains.kotlin:kotlin-stdlib:2.1.0"
+ force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0"
+ force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0"
+ force "org.robolectric:robolectric:4.15"
+ force "org.assertj:assertj-core:3.27.7"
+ force "org.bouncycastle:bcprov-jdk18on:1.84"
+ force "com.google.android.gms:play-services-basement:18.0.2"
+ }
+ }
}
diff --git a/sample/react-native/ios/DevRevSDKSampleRN.xcworkspace/xcshareddata/swiftpm/Package.resolved b/sample/react-native/ios/DevRevSDKSampleRN.xcworkspace/xcshareddata/swiftpm/Package.resolved
index c8f7252..715afd7 100644
--- a/sample/react-native/ios/DevRevSDKSampleRN.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/sample/react-native/ios/DevRevSDKSampleRN.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -6,8 +6,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/devrev/devrev-sdk-ios.git",
"state" : {
- "revision" : "9d0c748067ed66906dc0a9388abdf2aa2a3b9de7",
- "version" : "2.3.6"
+ "revision" : "1c2ce7a441affde1a57339e9af3e8831788c5d4f",
+ "version" : "2.3.8"
}
}
],
diff --git a/sample/react-native/ios/Podfile b/sample/react-native/ios/Podfile
index 7222b41..96a50fd 100644
--- a/sample/react-native/ios/Podfile
+++ b/sample/react-native/ios/Podfile
@@ -48,12 +48,6 @@ post_integrate do |installer|
/#{root_uuid} \/\* DevRevSDK \*\/ = \{\n\t\t\tisa = XCSwiftPackageProductDependency;/,
)
- post_install do |installer|
- react_native_post_install(
- installer,
- config[:reactNativePath],
- :mac_catalyst_enabled => false,
- # :ccache_enabled => true
if spm_collision && !content.include?('isa = PBXProject')
content = content.gsub(
"#{root_uuid} /* DevRevSDK */",
diff --git a/sample/react-native/ios/Podfile.lock b/sample/react-native/ios/Podfile.lock
index 975dbd9..ac9f2a7 100644
--- a/sample/react-native/ios/Podfile.lock
+++ b/sample/react-native/ios/Podfile.lock
@@ -2,7 +2,7 @@ PODS:
- boost (1.84.0)
- BVLinearGradient (2.8.3):
- React-Core
- - devrev-sdk-react-native (2.3.1):
+ - devrev-sdk-react-native (2.3.2):
- DoubleConversion
- glog
- hermes-engine
@@ -1999,7 +1999,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - RNSVG (15.15.4):
+ - RNPermissions (5.5.1):
- DoubleConversion
- glog
- hermes-engine
@@ -2022,9 +2022,33 @@ PODS:
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- - RNSVG/common (= 15.15.4)
- Yoga
- - RNSVG/common (15.15.4):
+ - RNSVG (15.15.5):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.11.18.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNSVG/common (= 15.15.5)
+ - Yoga
+ - RNSVG/common (15.15.5):
- DoubleConversion
- glog
- hermes-engine
@@ -2141,6 +2165,7 @@ DEPENDENCIES:
- "RNFBInstallations (from `../node_modules/@react-native-firebase/installations`)"
- "RNFBMessaging (from `../node_modules/@react-native-firebase/messaging`)"
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
+ - RNPermissions (from `../node_modules/react-native-permissions`)
- RNSVG (from `../node_modules/react-native-svg`)
- VisionCamera (from `../node_modules/react-native-vision-camera`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
@@ -2324,6 +2349,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-firebase/messaging"
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
+ RNPermissions:
+ :path: "../node_modules/react-native-permissions"
RNSVG:
:path: "../node_modules/react-native-svg"
VisionCamera:
@@ -2334,7 +2361,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70
- devrev-sdk-react-native: c39d15eaac67cdb71efbf3b939baffd9a34fcf32
+ devrev-sdk-react-native: 146e6600a96c7bdb545e45c8d9af0aadd5fdf0f2
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: b60fe06f0f15b7d7408f169442176e69e8eeacde
@@ -2424,7 +2451,8 @@ SPEC CHECKSUMS:
RNFBInstallations: 533a3f89922cf8da06147176127beb06f03a1ba3
RNFBMessaging: 8e747b6a477b4ee27b8cefde1e94a215b22bd860
RNGestureHandler: ee4fab31b7325a6090ccd19392800a5e0911a2d5
- RNSVG: 0917f41364761ab9f5f488a51c3d10428c3c8dd1
+ RNPermissions: a1e9844aad4410e084c81ce16458cd6befbf86aa
+ RNSVG: 76243ae0219c97fc021489356341a1d044b08466
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
VisionCamera: 7187b3dac1ff3071234ead959ce311875748e14f
Yoga: fce72270ebed754904bbe5e18bb05cda3c3075db
diff --git a/sample/react-native/package.json b/sample/react-native/package.json
index cc674ed..61622b1 100644
--- a/sample/react-native/package.json
+++ b/sample/react-native/package.json
@@ -73,7 +73,13 @@
}
},
"resolutions": {
- "protobufjs": ">=7.5.8"
+ "@grpc/grpc-js": "^1.9.16",
+ "postcss": "^8.5.0",
+ "protobufjs": "^7.5.8",
+ "qs": "^6.15.2",
+ "shell-quote": "^1.8.4",
+ "uuid": "^9.0.0",
+ "ws": "^8.20.1"
},
"peerDependencies": {
"@react-navigation/native": "^6.0.8",
diff --git a/sample/react-native/src/screens/SessionAnalyticsScreen.tsx b/sample/react-native/src/screens/SessionAnalyticsScreen.tsx
index fe18ff7..baff469 100644
--- a/sample/react-native/src/screens/SessionAnalyticsScreen.tsx
+++ b/sample/react-native/src/screens/SessionAnalyticsScreen.tsx
@@ -76,6 +76,41 @@ const OnDemandSessionButtons = [
},
] as const;
+const FeatureConfigurationButtons = [
+ {
+ text: 'Enable Frame Capture',
+ onPress: () =>
+ DevRev.updateFeatureConfiguration({
+ enableFrameCapture: true,
+ autoStartRecording: true,
+ prefersDialogMode: false,
+ alwaysUseRemoteConfig: true,
+ supportWidgetTheme: { prefersSystemTheme: true },
+ }),
+ },
+ {
+ text: 'Disable Frame Capture',
+ onPress: () =>
+ DevRev.updateFeatureConfiguration({
+ enableFrameCapture: false,
+ autoStartRecording: true,
+ prefersDialogMode: false,
+ alwaysUseRemoteConfig: true,
+ supportWidgetTheme: { prefersSystemTheme: true },
+ }),
+ },
+] as const;
+
+const CaptureErrorButtons = [
+ {
+ text: 'Capture Error',
+ onPress: () => {
+ const error = new Error('Simulated handled error for testing');
+ DevRev.captureError(error, 'test-error');
+ },
+ },
+] as const;
+
const WebViewButton = [
{
text: 'Open Web View',
@@ -212,6 +247,28 @@ const SessionAnalyticsScreen: React.FC<{ navigation: any }> = ({
placeholder="Manually Unmasked UI Item"
/>
+ Feature Configuration
+ {FeatureConfigurationButtons.map((button, index) => (
+
+ ))}
+
+ Error Capture
+ {CaptureErrorButtons.map((button, index) => (
+
+ ))}
+
On-Demand Sessions
{OnDemandSessionButtons.map((button, index) => (
{
text: 'Create Support Conversation',
onPress: () => {
console.log('Creating support conversation');
- DevRevSDK.createSupportConversation();
+ DevRevSDK.createSupportConversation('Hi, I need help with my account');
},
},
];