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); + }); }); });