@ninetailed/experience.js-react 7.13.0-beta.0 → 7.13.0-beta.1
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.
- package/index.cjs.js +23 -19
- package/index.esm.js +25 -19
- 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:
|
|
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:
|
|
201
|
+
value: defaultValueRef.current,
|
|
195
202
|
status: 'error',
|
|
196
203
|
error: changesState.error
|
|
197
204
|
});
|
|
198
205
|
return;
|
|
199
206
|
}
|
|
200
207
|
try {
|
|
201
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
184
|
+
value: defaultValueRef.current,
|
|
176
185
|
status: 'error',
|
|
177
186
|
error: changesState.error
|
|
178
187
|
});
|
|
179
188
|
return;
|
|
180
189
|
}
|
|
181
190
|
try {
|
|
182
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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.
|
|
3
|
+
"version": "7.13.0-beta.1",
|
|
4
4
|
"description": "Ninetailed SDK for React",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@ninetailed/experience.js": "7.13.0-beta.
|
|
7
|
-
"@ninetailed/experience.js-shared": "7.13.0-beta.
|
|
8
|
-
"@ninetailed/experience.js-plugin-analytics": "7.13.0-beta.
|
|
6
|
+
"@ninetailed/experience.js": "7.13.0-beta.1",
|
|
7
|
+
"@ninetailed/experience.js-shared": "7.13.0-beta.1",
|
|
8
|
+
"@ninetailed/experience.js-plugin-analytics": "7.13.0-beta.1",
|
|
9
9
|
"radash": "10.9.0",
|
|
10
10
|
"react-is": "18.2.0"
|
|
11
11
|
},
|