Skip to content

Commit f1d783f

Browse files
[FSSDK-12274] Provider cleanup + UCM stateful
1 parent ec343d0 commit f1d783f

4 files changed

Lines changed: 223 additions & 79 deletions

File tree

src/provider/OptimizelyProvider.spec.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ describe('OptimizelyProvider', () => {
520520
expect(userCtx.fetchQualifiedSegments).not.toHaveBeenCalled();
521521
});
522522

523-
it('should recreate manager when skipSegments changes', async () => {
523+
it('should recreate user context when skipSegments changes', async () => {
524524
const mockClient = createMockClient();
525525

526526
const { rerender } = render(
@@ -531,7 +531,7 @@ describe('OptimizelyProvider', () => {
531531

532532
expect(mockClient.createUserContext).toHaveBeenCalledTimes(1);
533533

534-
// Change skipSegments — should recreate manager and call createUserContext again
534+
// Change skipSegments — UCM detects the change and recreates user context
535535
rerender(
536536
<OptimizelyProvider client={mockClient} user={{ id: 'user-1' }} skipSegments={true}>
537537
<div>Child</div>

src/provider/OptimizelyProvider.tsx

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import React, { createContext, useRef, useMemo, useEffect } from 'react';
1818

1919
import { ProviderStateStore } from './ProviderStateStore';
2020
import { UserContextManager } from '../utils/UserContextManager';
21-
import { areUsersEqual, areSegmentsEqual } from '../utils/helpers';
2221
import type { OptimizelyProviderProps, OptimizelyContextValue } from './types';
2322
import type { Client } from '@optimizely/optimizely-sdk';
2423

@@ -44,21 +43,13 @@ export function OptimizelyProvider({
4443
}: OptimizelyProviderProps): React.ReactElement {
4544
const storeRef = useRef<ProviderStateStore | null>(null);
4645
const userManagerRef = useRef<UserContextManager | null>(null);
47-
const prevRef = useRef<{
48-
client?: Client;
49-
skipSegments?: boolean;
50-
user?: OptimizelyProviderProps['user'];
51-
segments?: string[];
52-
}>({});
46+
const prevClientRef = useRef<Client>();
5347

5448
if (storeRef.current === null) {
5549
storeRef.current = new ProviderStateStore();
5650
}
5751

5852
const store = storeRef.current;
59-
const prev = prevRef.current;
60-
const clientChanged = prev.client !== client;
61-
const skipSegmentsChanged = prev.skipSegments !== skipSegments;
6253
const contextValue = useMemo<OptimizelyContextValue>(
6354
() => ({
6455
store,
@@ -68,31 +59,21 @@ export function OptimizelyProvider({
6859
);
6960

7061
if (client) {
71-
// Create UserContextManager if not exists or if client/skipSegments config has changed
72-
if (userManagerRef.current === null || clientChanged || skipSegmentsChanged) {
62+
// Create UserContextManager if not exists or if client has changed
63+
if (userManagerRef.current === null || prevClientRef.current !== client) {
7364
userManagerRef.current?.dispose();
7465

7566
userManagerRef.current = new UserContextManager({
7667
client,
77-
skipSegments,
7868
onUserContextReady: (ctx) => store.setUserContext(ctx),
7969
onError: (error) => store.setError(error),
8070
});
8171

82-
prev.client = client;
83-
prev.skipSegments = skipSegments;
84-
prev.user = user;
85-
prev.segments = qualifiedSegments;
86-
userManagerRef.current.createUserContext(user, qualifiedSegments);
87-
}
88-
}
89-
// Update user context if user or qualifiedSegments props have changed (value equality)
90-
if (userManagerRef.current) {
91-
if (!areUsersEqual(prev.user, user) || !areSegmentsEqual(prev.segments, qualifiedSegments)) {
92-
prev.user = user;
93-
prev.segments = qualifiedSegments;
94-
userManagerRef.current.createUserContext(user, qualifiedSegments);
72+
prevClientRef.current = client;
9573
}
74+
75+
// UCM internally checks for user/segments/skipSegments changes
76+
userManagerRef.current.resolveUserContext(user, qualifiedSegments, skipSegments);
9677
}
9778

9879
// Effect: Client onReady

0 commit comments

Comments
 (0)