@ninetailed/experience.js-react 7.13.0-beta.0 → 7.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.cjs.js +23 -19
  2. package/index.esm.js +25 -19
  3. package/package.json +4 -4
package/index.cjs.js CHANGED
@@ -161,29 +161,36 @@ const usePersonalize = (baseline, variants, options = {
161
161
  function useFlag(flagKey, defaultValue) {
162
162
  const ninetailed = useNinetailed();
163
163
  const lastProcessedState = React.useRef(null);
164
+ const defaultValueRef = React.useRef(defaultValue);
165
+ const flagKeyRef = React.useRef(flagKey);
164
166
  const [result, setResult] = React.useState({
165
167
  value: defaultValue,
166
168
  status: 'loading',
167
169
  error: null
168
170
  });
171
+ // Effect 1: Track changes to `flagKey` or `defaultValue`
172
+ React.useEffect(() => {
173
+ if (!radash.isEqual(defaultValueRef.current, defaultValue) || flagKeyRef.current !== flagKey) {
174
+ defaultValueRef.current = defaultValue;
175
+ flagKeyRef.current = flagKey;
176
+ setResult({
177
+ value: defaultValue,
178
+ status: 'loading',
179
+ error: null
180
+ });
181
+ lastProcessedState.current = null;
182
+ }
183
+ }, [flagKey, defaultValue]);
184
+ // Effect 2: Handle Ninetailed changes
169
185
  React.useEffect(() => {
170
- // Reset state when dependencies change
171
- setResult({
172
- value: defaultValue,
173
- status: 'loading',
174
- error: null
175
- });
176
- lastProcessedState.current = null;
177
186
  const unsubscribe = ninetailed.onChangesChange(changesState => {
178
187
  if (lastProcessedState.current && radash.isEqual(lastProcessedState.current, changesState)) {
179
- experience_jsShared.logger.debug('Change State Did Not Change', changesState);
180
188
  return;
181
189
  }
182
190
  lastProcessedState.current = changesState;
183
191
  if (changesState.status === 'loading') {
184
- // Don't use a function updater here to avoid type issues
185
192
  setResult({
186
- value: defaultValue,
193
+ value: defaultValueRef.current,
187
194
  status: 'loading',
188
195
  error: null
189
196
  });
@@ -191,40 +198,37 @@ function useFlag(flagKey, defaultValue) {
191
198
  }
192
199
  if (changesState.status === 'error') {
193
200
  setResult({
194
- value: defaultValue,
201
+ value: defaultValueRef.current,
195
202
  status: 'error',
196
203
  error: changesState.error
197
204
  });
198
205
  return;
199
206
  }
200
207
  try {
201
- // Find the change with our flag key
202
- const change = changesState.changes.find(change => change.key === flagKey);
208
+ const change = changesState.changes.find(change => change.key === flagKeyRef.current);
203
209
  if (change && change.type === experience_jsShared.ChangeTypes.Variable) {
204
- const flagValue = change.value;
205
210
  setResult({
206
- value: flagValue,
211
+ value: change.value,
207
212
  status: 'success',
208
213
  error: null
209
214
  });
210
215
  } else {
211
- // Flag not found or wrong type, use default
212
216
  setResult({
213
- value: defaultValue,
217
+ value: defaultValueRef.current,
214
218
  status: 'success',
215
219
  error: null
216
220
  });
217
221
  }
218
222
  } catch (error) {
219
223
  setResult({
220
- value: defaultValue,
224
+ value: defaultValueRef.current,
221
225
  status: 'error',
222
226
  error: error instanceof Error ? error : new Error(String(error))
223
227
  });
224
228
  }
225
229
  });
226
230
  return unsubscribe;
227
- }, [ninetailed, flagKey, defaultValue]);
231
+ }, [ninetailed]);
228
232
  return result;
229
233
  }
230
234
 
package/index.esm.js CHANGED
@@ -142,29 +142,38 @@ const usePersonalize = (baseline, variants, options = {
142
142
  function useFlag(flagKey, defaultValue) {
143
143
  const ninetailed = useNinetailed();
144
144
  const lastProcessedState = useRef(null);
145
+ const defaultValueRef = useRef(defaultValue);
146
+ const flagKeyRef = useRef(flagKey);
145
147
  const [result, setResult] = useState({
146
148
  value: defaultValue,
147
149
  status: 'loading',
148
150
  error: null
149
151
  });
152
+
153
+ // Effect 1: Track changes to `flagKey` or `defaultValue`
154
+ useEffect(() => {
155
+ if (!isEqual(defaultValueRef.current, defaultValue) || flagKeyRef.current !== flagKey) {
156
+ defaultValueRef.current = defaultValue;
157
+ flagKeyRef.current = flagKey;
158
+ setResult({
159
+ value: defaultValue,
160
+ status: 'loading',
161
+ error: null
162
+ });
163
+ lastProcessedState.current = null;
164
+ }
165
+ }, [flagKey, defaultValue]);
166
+
167
+ // Effect 2: Handle Ninetailed changes
150
168
  useEffect(() => {
151
- // Reset state when dependencies change
152
- setResult({
153
- value: defaultValue,
154
- status: 'loading',
155
- error: null
156
- });
157
- lastProcessedState.current = null;
158
169
  const unsubscribe = ninetailed.onChangesChange(changesState => {
159
170
  if (lastProcessedState.current && isEqual(lastProcessedState.current, changesState)) {
160
- logger.debug('Change State Did Not Change', changesState);
161
171
  return;
162
172
  }
163
173
  lastProcessedState.current = changesState;
164
174
  if (changesState.status === 'loading') {
165
- // Don't use a function updater here to avoid type issues
166
175
  setResult({
167
- value: defaultValue,
176
+ value: defaultValueRef.current,
168
177
  status: 'loading',
169
178
  error: null
170
179
  });
@@ -172,40 +181,37 @@ function useFlag(flagKey, defaultValue) {
172
181
  }
173
182
  if (changesState.status === 'error') {
174
183
  setResult({
175
- value: defaultValue,
184
+ value: defaultValueRef.current,
176
185
  status: 'error',
177
186
  error: changesState.error
178
187
  });
179
188
  return;
180
189
  }
181
190
  try {
182
- // Find the change with our flag key
183
- const change = changesState.changes.find(change => change.key === flagKey);
191
+ const change = changesState.changes.find(change => change.key === flagKeyRef.current);
184
192
  if (change && change.type === ChangeTypes.Variable) {
185
- const flagValue = change.value;
186
193
  setResult({
187
- value: flagValue,
194
+ value: change.value,
188
195
  status: 'success',
189
196
  error: null
190
197
  });
191
198
  } else {
192
- // Flag not found or wrong type, use default
193
199
  setResult({
194
- value: defaultValue,
200
+ value: defaultValueRef.current,
195
201
  status: 'success',
196
202
  error: null
197
203
  });
198
204
  }
199
205
  } catch (error) {
200
206
  setResult({
201
- value: defaultValue,
207
+ value: defaultValueRef.current,
202
208
  status: 'error',
203
209
  error: error instanceof Error ? error : new Error(String(error))
204
210
  });
205
211
  }
206
212
  });
207
213
  return unsubscribe;
208
- }, [ninetailed, flagKey, defaultValue]);
214
+ }, [ninetailed]);
209
215
  return result;
210
216
  }
211
217
 
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ninetailed/experience.js-react",
3
- "version": "7.13.0-beta.0",
3
+ "version": "7.13.0",
4
4
  "description": "Ninetailed SDK for React",
5
5
  "dependencies": {
6
- "@ninetailed/experience.js": "7.13.0-beta.0",
7
- "@ninetailed/experience.js-shared": "7.13.0-beta.0",
8
- "@ninetailed/experience.js-plugin-analytics": "7.13.0-beta.0",
6
+ "@ninetailed/experience.js": "7.13.0",
7
+ "@ninetailed/experience.js-shared": "7.13.0",
8
+ "@ninetailed/experience.js-plugin-analytics": "7.13.0",
9
9
  "radash": "10.9.0",
10
10
  "react-is": "18.2.0"
11
11
  },