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
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ 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
Expand Down
28 changes: 27 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ DevRev.configure('abcdefg12345', {
supportWidgetTheme: {
prefersSystemTheme: true,
},
enableSupportChatStreaming: true,
supportWidgetArticleSearchFilters: articleSearchFilters,
});
```

Expand All @@ -147,6 +149,8 @@ DevRev.updateFeatureConfiguration({
supportWidgetTheme: {
prefersSystemTheme: true,
},
enableSupportChatStreaming: true,
supportWidgetArticleSearchFilters: articleSearchFilters,
});
```

Expand All @@ -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

Expand All @@ -175,6 +181,10 @@ const customTheme = {
bottom: '20px',
side: '16px',
},
conversationPageOptions: {
headerText: 'Support',
subheaderText: 'We typically reply in a few minutes',
},
};
```

Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down
Binary file added devrev-sdk-react-native-2.3.7.tgz
Binary file not shown.
2 changes: 1 addition & 1 deletion sample/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.6",
"@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",
Expand Down
57 changes: 57 additions & 0 deletions sample/react-native/src/screens/SessionAnalyticsScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -212,6 +247,28 @@ const SessionAnalyticsScreen: React.FC<{ navigation: any }> = ({
placeholder="Manually Unmasked UI Item"
/>

<Text style={commonStyles.heading}>Feature Configuration</Text>
{FeatureConfigurationButtons.map((button, index) => (
<TouchableOpacityButton
key={index}
onPress={button.onPress}
buttonText={button.text}
buttonStyle={commonStyles.button}
textStyle={commonStyles.buttonText}
/>
))}

<Text style={commonStyles.heading}>Error Capture</Text>
{CaptureErrorButtons.map((button, index) => (
<TouchableOpacityButton
key={index}
onPress={button.onPress}
buttonText={button.text}
buttonStyle={commonStyles.button}
textStyle={commonStyles.buttonText}
/>
))}

<Text style={commonStyles.heading}>On-Demand Sessions</Text>
{OnDemandSessionButtons.map((button, index) => (
<TouchableOpacityButton
Expand Down
2 changes: 1 addition & 1 deletion sample/react-native/src/screens/SupportChatScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const SupportChatScreen: React.FC = () => {
text: 'Create Support Conversation',
onPress: () => {
console.log('Creating support conversation');
DevRevSDK.createSupportConversation();
DevRevSDK.createSupportConversation('Hi, I need help with my account');
},
},
];
Expand Down
Loading