Skip to content

Commit e90d007

Browse files
committed
Add rudimentary React provider option for local singleton
Signed-off-by: MattIPv4 <[email protected]>
1 parent 6b1f7e9 commit e90d007

File tree

4 files changed

+14
-2
lines changed

4 files changed

+14
-2
lines changed

packages/react/src/context/use-context-mutator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export function useContextMutator(options: ContextMutationOptions = { defaultCon
3939
async (
4040
updatedContext: EvaluationContext | ((currentContext: EvaluationContext) => EvaluationContext),
4141
): Promise<void> => {
42+
// TODO: Needs to handle `isolated` option like OpenFeatureProvider
4243
const previousContext = OpenFeature.getContext(options?.defaultContext ? undefined : domain);
4344
const resolvedContext = typeof updatedContext === 'function' ? updatedContext(previousContext) : updatedContext;
4445

packages/react/src/provider/provider.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ type ClientOrDomain =
1111
* @see OpenFeature.setProvider() and overloads.
1212
*/
1313
domain?: string;
14+
/**
15+
* If the package-local isolated OpenFeature singleton should be used
16+
* @see OpenFeature.isolated for more details.
17+
*/
18+
isolated?: boolean;
1419
client?: never;
1520
}
1621
| {
@@ -19,6 +24,7 @@ type ClientOrDomain =
1924
*/
2025
client?: Client;
2126
domain?: never;
27+
isolated?: never;
2228
};
2329

2430
type ProviderProps = {
@@ -31,8 +37,11 @@ type ProviderProps = {
3137
* @param {ProviderProps} properties props for the context provider
3238
* @returns {OpenFeatureProvider} context provider
3339
*/
34-
export function OpenFeatureProvider({ client, domain, children, ...options }: ProviderProps) {
35-
const stableClient = React.useMemo(() => client || OpenFeature.getClient(domain), [client, domain]);
40+
export function OpenFeatureProvider({ client, domain, isolated, children, ...options }: ProviderProps) {
41+
const stableClient = React.useMemo(
42+
() => client || (isolated ? OpenFeature.isolated : OpenFeature).getClient(domain),
43+
[client, domain],
44+
);
3645

3746
return <Context.Provider value={{ client: stableClient, options, domain }}>{children}</Context.Provider>;
3847
}

packages/react/src/provider/test-provider.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export function OpenFeatureTestProvider(testProviderOptions: TestProviderProps)
8787
const effectiveProvider = (
8888
flagValueMap ? new TestProvider(flagValueMap, testProviderOptions.delayMs) : mixInNoop(provider) || NOOP_PROVIDER
8989
) as Provider;
90+
// TODO: Needs to handle `isolated` option like OpenFeatureProvider
9091
testProviderOptions.domain
9192
? OpenFeature.setProvider(testProviderOptions.domain, effectiveProvider)
9293
: OpenFeature.setProvider(effectiveProvider);

packages/react/src/provider/use-open-feature-provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ export function useOpenFeatureProvider(): Provider {
1717
throw new MissingContextError('No OpenFeature context available');
1818
}
1919

20+
// TODO: Needs to handle `isolated` option like OpenFeatureProvider
2021
return OpenFeature.getProvider(openFeatureContext.domain);
2122
}

0 commit comments

Comments
 (0)