diff --git a/packages/react/src/provider/provider.tsx b/packages/react/src/provider/provider.tsx
index 35333db5f..ba98a2fc7 100644
--- a/packages/react/src/provider/provider.tsx
+++ b/packages/react/src/provider/provider.tsx
@@ -32,9 +32,7 @@ type ProviderProps = {
* @returns {OpenFeatureProvider} context provider
*/
export function OpenFeatureProvider({ client, domain, children, ...options }: ProviderProps): JSX.Element {
- if (!client) {
- client = OpenFeature.getClient(domain);
- }
+ const stableClient = React.useMemo(() => client || OpenFeature.getClient(domain), [client, domain]);
- return {children};
+ return {children};
}
diff --git a/packages/react/test/provider.spec.tsx b/packages/react/test/provider.spec.tsx
index 8d3af2ebc..91277140e 100644
--- a/packages/react/test/provider.spec.tsx
+++ b/packages/react/test/provider.spec.tsx
@@ -78,6 +78,20 @@ describe('OpenFeatureProvider', () => {
expect(result.current.metadata.domain).toEqual(DOMAIN);
});
+
+ it('should return a stable client across renders', () => {
+ const wrapper = ({ children }: Parameters[0]) => (
+ {children}
+ );
+
+ const { result, rerender } = renderHook(() => useOpenFeatureClient(), { wrapper });
+
+ const firstClient = result.current;
+ rerender();
+ const secondClient = result.current;
+
+ expect(firstClient).toBe(secondClient);
+ });
});
});