Skip to content

Commit e95320d

Browse files
[FSSDK-12249] review feedback
1 parent 46f583c commit e95320d

6 files changed

Lines changed: 71 additions & 19 deletions

File tree

package-lock.json

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"eslint-plugin-prettier": "^5.2.1",
6969
"eslint-plugin-react": "^7.35.0",
7070
"eslint-plugin-react-hooks": "^4.6.2",
71+
"happy-dom": "^20.4.0",
7172
"husky": "^9.0.0",
7273
"jest": "^30.0.0",
7374
"jest-environment-jsdom": "^30.0.0",

src/provider/OptimizelyProvider.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ export function OptimizelyProvider({
7474
} catch (error) {
7575
if (!isMounted) return;
7676
const err = error instanceof Error ? error : new Error(String(error));
77-
store.setClientReady(false);
78-
store.setError(err);
77+
store.setState({
78+
isClientReady: false,
79+
error: err,
80+
});
7981
}
8082
};
8183

src/provider/ProviderStateStore.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const initialState: ProviderState = {
3737
* The store follows a simple observable pattern:
3838
* - Hooks subscribe via `subscribe()` and receive state updates
3939
* - Provider updates state via setter methods
40-
* - State is immutable - each update creates a new state object
40+
* - Listeners are notified on state changes via callbacks
4141
*/
4242
export class ProviderStateStore {
4343
private state: ProviderState;
@@ -80,10 +80,7 @@ export class ProviderStateStore {
8080
return;
8181
}
8282

83-
this.state = {
84-
...this.state,
85-
isClientReady: ready,
86-
};
83+
this.state.isClientReady = ready;
8784
this.notifyListeners();
8885
}
8986

@@ -94,10 +91,7 @@ export class ProviderStateStore {
9491
setUserContext(ctx: OptimizelyUserContext | null): void {
9592
// Always update userContext even if same reference -
9693
// user attributes may have changed
97-
this.state = {
98-
...this.state,
99-
userContext: ctx,
100-
};
94+
this.state.userContext = ctx;
10195
this.notifyListeners();
10296
}
10397

@@ -110,10 +104,7 @@ export class ProviderStateStore {
110104
return; // No change, skip notification
111105
}
112106

113-
this.state = {
114-
...this.state,
115-
error,
116-
};
107+
this.state.error = error;
117108
this.notifyListeners();
118109
}
119110

src/provider/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { ProviderStateStore } from './ProviderStateStore';
2222
* User information passed to the Provider or hooks for user override.
2323
*/
2424
export interface UserInfo {
25-
id: string;
25+
id?: string;
2626
attributes?: UserAttributes;
2727
}
2828

@@ -64,7 +64,7 @@ export interface OptimizelyProviderProps {
6464
*/
6565
export interface ProviderState {
6666
/**
67-
* Whether the Optimizely client is ready (datafile loaded).
67+
* Whether the Optimizely client is ready.
6868
*/
6969
isClientReady: boolean;
7070

vitest.config.mts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { defineConfig } from 'vitest/config';
22

33
export default defineConfig({
44
test: {
5-
globals: true,
6-
environment: 'jsdom',
5+
environment: 'happy-dom',
76
setupFiles: ['./vitest.setup.ts'],
87
include: [
98
'src/client/**/*.spec.{ts,tsx}',

0 commit comments

Comments
 (0)