diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b4907a..0f58836 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [3.4.0] - Mar 9, 2026 + +### New Features +- Add a server-safe bundle that is automatically resolved when imported in React Server Components, excluding client-only React APIs ([#318](https://github.com/optimizely/react-sdk/pull/318)) +- Add `qualifiedSegments` prop to `OptimizelyProvider` for passing pre-fetched ODP segments, enabling synchronous ODP-based decisions during SSR ([#318](https://github.com/optimizely/react-sdk/pull/318)) +- Add `getQualifiedSegments` utility for fetching ODP audience segments server-side ([#318](https://github.com/optimizely/react-sdk/pull/318)) + +### Enhancements +- Improve `useExperiment`, `useFeature`, and `useDecision` hooks to compute decisions when config and user context (including segments) are available, without waiting for `onReady` ([#318](https://github.com/optimizely/react-sdk/pull/318)) +- Add comprehensive server-side rendering integration guide covering SSR, SSG, and App Router patterns ([#318](https://github.com/optimizely/react-sdk/pull/318)) + ## [3.3.1] - Dec 8, 2025 ### Changed diff --git a/README.md b/README.md index 75906c2..6df1eb2 100644 --- a/README.md +++ b/README.md @@ -471,9 +471,9 @@ const segments = await getQualifiedSegments(userId, datafile); > **Caching recommendation:** The ODP segment fetch adds latency to server rendering. Consider caching the result per user to avoid re-fetching on every request. -### React Server Components +### React Server Components (v3.4.0+) -The SDK can also be used directly in React Server Components without `OptimizelyProvider`. Create an instance, set the user, wait for readiness, and make decisions — all within an `async` server component: +Since version 3.4.0, the SDK can be used directly in React Server Components without `OptimizelyProvider`. Create an instance, set the user, wait for readiness, and make decisions — all within an `async` server component: ```tsx import { createInstance } from '@optimizely/react-sdk'; diff --git a/package.json b/package.json index 1450232..d0d0ec4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@optimizely/react-sdk", - "version": "3.3.1", + "version": "3.4.0", "description": "React SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts", "homepage": "https://github.com/optimizely/react-sdk", "repository": "https://github.com/optimizely/react-sdk", diff --git a/src/client.spec.ts b/src/client.spec.ts index c30f0ce..badcffa 100644 --- a/src/client.spec.ts +++ b/src/client.spec.ts @@ -178,7 +178,7 @@ describe('ReactSDKClient', () => { expect(createInstanceSpy).toHaveBeenCalledWith({ ...config, clientEngine: 'react-sdk', - clientVersion: '3.3.1', + clientVersion: '3.4.0', }); }); diff --git a/src/client.ts b/src/client.ts index b564884..9988a01 100644 --- a/src/client.ts +++ b/src/client.ts @@ -47,7 +47,7 @@ export interface OnReadyResult extends ResolveResult { } const REACT_SDK_CLIENT_ENGINE = 'react-sdk'; -const REACT_SDK_CLIENT_VERSION = '3.3.1'; +const REACT_SDK_CLIENT_VERSION = '3.4.0'; export const DefaultUser: UserInfo = { id: null,