diff --git a/packages/react/src/declarative/FeatureFlag.tsx b/packages/react/src/declarative/FeatureFlag.tsx index f1cd967b9..f2f7143e6 100644 --- a/packages/react/src/declarative/FeatureFlag.tsx +++ b/packages/react/src/declarative/FeatureFlag.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { useFlag } from '../evaluation'; import type { FlagQuery } from '../query'; import type { FlagValue, EvaluationDetails } from '@openfeature/core'; +import { isEqual } from '../internal'; /** * Default predicate function that checks if the expected value equals the actual flag value. @@ -10,7 +11,7 @@ import type { FlagValue, EvaluationDetails } from '@openfeature/core'; * @returns {boolean} true if the values match, false otherwise */ function equals(expected: T, actual: EvaluationDetails): boolean { - return expected === actual.value; + return isEqual(expected, actual.value); } /** @@ -89,9 +90,11 @@ export function FeatureFlag({ } else if (match !== undefined) { // Default behavior: check if match value equals flag value shouldRender = equals(match, details.details as EvaluationDetails); - } else { + } else if (details.type === 'boolean') { // If no match value is provided, render if flag is truthy shouldRender = Boolean(details.value); + } else { + shouldRender = false; } if (shouldRender) { diff --git a/packages/react/test/declarative.spec.tsx b/packages/react/test/declarative.spec.tsx index fcc803631..dd9be5ffd 100644 --- a/packages/react/test/declarative.spec.tsx +++ b/packages/react/test/declarative.spec.tsx @@ -69,6 +69,18 @@ describe('Feature Component', () => { expect(screen.queryByText(childText)).toBeInTheDocument(); }); + it('should not show a non-boolean feature flag without match', () => { + render( + + + + + , + ); + + expect(screen.queryByText(childText)).not.toBeInTheDocument(); + }); + it('should fallback when provided', () => { render( @@ -138,7 +150,7 @@ describe('Feature Component', () => { it('should support function-based fallback with EvaluationDetails', () => { const fallbackFunction = jest.fn((details: EvaluationDetails) =>
Fallback: {details.flagKey}
); - + render( @@ -158,7 +170,7 @@ describe('Feature Component', () => { const fallbackFunction = jest.fn((details: EvaluationDetails) => { return
Flag: {details.flagKey}, Value: {String(details.value)}, Reason: {details.reason}
; }); - + render( @@ -178,9 +190,9 @@ describe('Feature Component', () => { // Create a provider that will cause an error const errorProvider = new InMemoryProvider({}); OpenFeature.setProvider('error-test', errorProvider); - + const fallbackFunction = jest.fn((details: EvaluationDetails) =>
Error fallback: {details.reason}
); - + render(