@schematichq/schematic-react 0.1.5 → 0.1.7
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/dist/schematic-react.cjs.js +45 -30
- package/dist/schematic-react.d.ts +20 -7
- package/dist/schematic-react.esm.js +45 -30
- package/package.json +2 -2
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
20
20
|
// src/index.tsx
|
21
21
|
var src_exports = {};
|
22
22
|
__export(src_exports, {
|
23
|
+
Schematic: () => Schematic,
|
23
24
|
SchematicProvider: () => SchematicProvider,
|
24
25
|
useSchematic: () => useSchematic,
|
25
26
|
useSchematicContext: () => useSchematicContext,
|
@@ -101,13 +102,13 @@ var Schematic = class {
|
|
101
102
|
if (options?.webSocketUrl !== void 0) {
|
102
103
|
this.webSocketUrl = options.webSocketUrl;
|
103
104
|
}
|
104
|
-
if (
|
105
|
+
if (window?.addEventListener) {
|
105
106
|
window.addEventListener("beforeunload", () => {
|
106
107
|
this.flushEventQueue();
|
107
108
|
});
|
108
109
|
}
|
109
110
|
}
|
110
|
-
|
111
|
+
async checkFlag(options) {
|
111
112
|
const { fallback = false, key } = options;
|
112
113
|
const context = options.context || this.context;
|
113
114
|
if (this.useWebSocket) {
|
@@ -133,7 +134,7 @@ var Schematic = class {
|
|
133
134
|
console.error("There was a problem with the fetch operation:", error);
|
134
135
|
return fallback;
|
135
136
|
});
|
136
|
-
}
|
137
|
+
}
|
137
138
|
// Make a REST API call to fetch all flag values for a given context
|
138
139
|
checkFlags = async (context) => {
|
139
140
|
context = context || this.context;
|
@@ -222,7 +223,7 @@ var Schematic = class {
|
|
222
223
|
tracker_user_id: this.getAnonymousId(),
|
223
224
|
type: eventType
|
224
225
|
};
|
225
|
-
if (
|
226
|
+
if (document?.hidden) {
|
226
227
|
this.storeEvent(event);
|
227
228
|
} else {
|
228
229
|
this.sendEvent(event);
|
@@ -255,7 +256,7 @@ var Schematic = class {
|
|
255
256
|
if (this.conn) {
|
256
257
|
resolve();
|
257
258
|
}
|
258
|
-
const wsUrl = `${this.webSocketUrl}/flags/
|
259
|
+
const wsUrl = `${this.webSocketUrl}/flags/subscribe`;
|
259
260
|
const webSocket = new WebSocket(wsUrl);
|
260
261
|
this.conn = webSocket;
|
261
262
|
webSocket.onopen = () => {
|
@@ -281,13 +282,9 @@ var Schematic = class {
|
|
281
282
|
let resolved = false;
|
282
283
|
this.conn.onmessage = (event) => {
|
283
284
|
const message = JSON.parse(event.data);
|
284
|
-
|
285
|
-
(
|
286
|
-
|
287
|
-
return accum;
|
288
|
-
},
|
289
|
-
{}
|
290
|
-
);
|
285
|
+
(message.flags ?? []).forEach((flag) => {
|
286
|
+
this.values[contextString(context)][flag.flag] = flag.value;
|
287
|
+
});
|
291
288
|
if (this.flagListener) {
|
292
289
|
this.flagListener(this.values[contextString(context)]);
|
293
290
|
}
|
@@ -337,28 +334,29 @@ var SchematicContext = (0, import_react.createContext)({
|
|
337
334
|
flagValues: {}
|
338
335
|
});
|
339
336
|
var SchematicProvider = ({
|
340
|
-
apiUrl,
|
341
337
|
children,
|
342
|
-
|
343
|
-
|
344
|
-
|
338
|
+
client: providedClient,
|
339
|
+
clientOpts,
|
340
|
+
publishableKey
|
345
341
|
}) => {
|
346
342
|
const [client, setClient] = (0, import_react.useState)();
|
347
343
|
const [flagValues, setFlagValues] = (0, import_react.useState)({});
|
348
344
|
(0, import_react.useEffect)(() => {
|
345
|
+
if (providedClient) {
|
346
|
+
setClient(providedClient);
|
347
|
+
return providedClient.cleanup;
|
348
|
+
}
|
349
349
|
if (publishableKey === void 0) {
|
350
350
|
return;
|
351
351
|
}
|
352
|
-
const
|
353
|
-
|
354
|
-
eventUrl,
|
352
|
+
const newClient = new Schematic(publishableKey, {
|
353
|
+
...clientOpts,
|
355
354
|
flagListener: setFlagValues,
|
356
|
-
useWebSocket: true
|
357
|
-
webSocketUrl
|
355
|
+
useWebSocket: true
|
358
356
|
});
|
359
|
-
setClient(
|
360
|
-
return
|
361
|
-
}, [
|
357
|
+
setClient(newClient);
|
358
|
+
return newClient.cleanup;
|
359
|
+
}, [clientOpts, providedClient, publishableKey]);
|
362
360
|
const contextValue = {
|
363
361
|
client,
|
364
362
|
flagValues
|
@@ -366,23 +364,40 @@ var SchematicProvider = ({
|
|
366
364
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SchematicContext.Provider, { value: contextValue, children });
|
367
365
|
};
|
368
366
|
var useSchematic = () => (0, import_react.useContext)(SchematicContext);
|
369
|
-
var
|
370
|
-
const
|
367
|
+
var useSchematicClient = (opts) => {
|
368
|
+
const schematic = useSchematic();
|
369
|
+
const { client } = opts ?? {};
|
370
|
+
if (client) {
|
371
|
+
return client;
|
372
|
+
}
|
373
|
+
return schematic.client;
|
374
|
+
};
|
375
|
+
var useSchematicContext = (opts) => {
|
376
|
+
const client = useSchematicClient(opts);
|
371
377
|
const { setContext } = client ?? {};
|
372
378
|
return { setContext };
|
373
379
|
};
|
374
|
-
var useSchematicEvents = () => {
|
375
|
-
const
|
380
|
+
var useSchematicEvents = (opts) => {
|
381
|
+
const client = useSchematicClient(opts);
|
376
382
|
const { track, identify } = client ?? {};
|
377
383
|
return { track, identify };
|
378
384
|
};
|
379
|
-
var useSchematicFlag = (key,
|
385
|
+
var useSchematicFlag = (key, opts) => {
|
380
386
|
const { flagValues } = useSchematic();
|
387
|
+
const { client } = opts ?? {};
|
388
|
+
const { fallback = false } = opts ?? {};
|
381
389
|
const [value, setValue] = (0, import_react.useState)(fallback ?? false);
|
382
390
|
const flagValue = flagValues[key];
|
383
391
|
(0, import_react.useEffect)(() => {
|
384
|
-
typeof flagValue === "undefined" ? setValue(fallback
|
392
|
+
typeof flagValue === "undefined" ? setValue(fallback) : setValue(flagValue);
|
385
393
|
}, [key, fallback, flagValue]);
|
394
|
+
(0, import_react.useEffect)(() => {
|
395
|
+
if (!client)
|
396
|
+
return;
|
397
|
+
client.checkFlag({ key, fallback }).then((value2) => {
|
398
|
+
setValue(value2);
|
399
|
+
});
|
400
|
+
}, [client, key, fallback]);
|
386
401
|
return value;
|
387
402
|
};
|
388
403
|
/*! Bundled license information:
|
@@ -9,8 +9,10 @@ import { FlagCheckWithKeyResponseBody } from '@schematichq/schematic-js';
|
|
9
9
|
import { Keys } from '@schematichq/schematic-js';
|
10
10
|
import { default as React_2 } from 'react';
|
11
11
|
import { ReactNode } from 'react';
|
12
|
+
import { Schematic } from '@schematichq/schematic-js';
|
12
13
|
import { SchematicContext } from '@schematichq/schematic-js';
|
13
14
|
import * as SchematicJS from '@schematichq/schematic-js';
|
15
|
+
import { SchematicOptions } from '@schematichq/schematic-js';
|
14
16
|
import { Traits } from '@schematichq/schematic-js';
|
15
17
|
|
16
18
|
export { Event_2 as Event }
|
@@ -31,6 +33,8 @@ export { FlagCheckWithKeyResponseBody }
|
|
31
33
|
|
32
34
|
export { Keys }
|
33
35
|
|
36
|
+
export { Schematic }
|
37
|
+
|
34
38
|
export { SchematicContext }
|
35
39
|
|
36
40
|
declare interface SchematicContextProps {
|
@@ -42,29 +46,38 @@ export declare interface SchematicFlags {
|
|
42
46
|
[key: string]: boolean;
|
43
47
|
}
|
44
48
|
|
49
|
+
export declare interface SchematicHookOpts {
|
50
|
+
client?: SchematicJS.Schematic;
|
51
|
+
}
|
52
|
+
|
53
|
+
export { SchematicOptions }
|
54
|
+
|
45
55
|
export declare const SchematicProvider: React_2.FC<SchematicProviderProps>;
|
46
56
|
|
47
|
-
declare interface SchematicProviderProps {
|
57
|
+
export declare interface SchematicProviderProps {
|
48
58
|
children: ReactNode;
|
59
|
+
client?: SchematicJS.Schematic;
|
60
|
+
clientOpts?: SchematicJS.SchematicOptions;
|
49
61
|
publishableKey?: string;
|
50
|
-
apiUrl?: string;
|
51
|
-
eventUrl?: string;
|
52
|
-
webSocketUrl?: string;
|
53
62
|
}
|
54
63
|
|
55
64
|
export { Traits }
|
56
65
|
|
57
66
|
export declare const useSchematic: () => SchematicContextProps;
|
58
67
|
|
59
|
-
export declare const useSchematicContext: () => {
|
68
|
+
export declare const useSchematicContext: (opts?: SchematicHookOpts) => {
|
60
69
|
setContext: ((context: SchematicJS.SchematicContext) => Promise<void>) | undefined;
|
61
70
|
};
|
62
71
|
|
63
|
-
export declare const useSchematicEvents: () => {
|
72
|
+
export declare const useSchematicEvents: (opts?: SchematicHookOpts) => {
|
64
73
|
track: ((body: SchematicJS.EventBodyTrack) => void) | undefined;
|
65
74
|
identify: ((body: SchematicJS.EventBodyIdentify) => void) | undefined;
|
66
75
|
};
|
67
76
|
|
68
|
-
export declare const useSchematicFlag: (key: string,
|
77
|
+
export declare const useSchematicFlag: (key: string, opts?: UseSchematicFlagOpts) => boolean;
|
78
|
+
|
79
|
+
export declare type UseSchematicFlagOpts = SchematicHookOpts & {
|
80
|
+
fallback?: boolean;
|
81
|
+
};
|
69
82
|
|
70
83
|
export { }
|
@@ -71,13 +71,13 @@ var Schematic = class {
|
|
71
71
|
if (options?.webSocketUrl !== void 0) {
|
72
72
|
this.webSocketUrl = options.webSocketUrl;
|
73
73
|
}
|
74
|
-
if (
|
74
|
+
if (window?.addEventListener) {
|
75
75
|
window.addEventListener("beforeunload", () => {
|
76
76
|
this.flushEventQueue();
|
77
77
|
});
|
78
78
|
}
|
79
79
|
}
|
80
|
-
|
80
|
+
async checkFlag(options) {
|
81
81
|
const { fallback = false, key } = options;
|
82
82
|
const context = options.context || this.context;
|
83
83
|
if (this.useWebSocket) {
|
@@ -103,7 +103,7 @@ var Schematic = class {
|
|
103
103
|
console.error("There was a problem with the fetch operation:", error);
|
104
104
|
return fallback;
|
105
105
|
});
|
106
|
-
}
|
106
|
+
}
|
107
107
|
// Make a REST API call to fetch all flag values for a given context
|
108
108
|
checkFlags = async (context) => {
|
109
109
|
context = context || this.context;
|
@@ -192,7 +192,7 @@ var Schematic = class {
|
|
192
192
|
tracker_user_id: this.getAnonymousId(),
|
193
193
|
type: eventType
|
194
194
|
};
|
195
|
-
if (
|
195
|
+
if (document?.hidden) {
|
196
196
|
this.storeEvent(event);
|
197
197
|
} else {
|
198
198
|
this.sendEvent(event);
|
@@ -225,7 +225,7 @@ var Schematic = class {
|
|
225
225
|
if (this.conn) {
|
226
226
|
resolve();
|
227
227
|
}
|
228
|
-
const wsUrl = `${this.webSocketUrl}/flags/
|
228
|
+
const wsUrl = `${this.webSocketUrl}/flags/subscribe`;
|
229
229
|
const webSocket = new WebSocket(wsUrl);
|
230
230
|
this.conn = webSocket;
|
231
231
|
webSocket.onopen = () => {
|
@@ -251,13 +251,9 @@ var Schematic = class {
|
|
251
251
|
let resolved = false;
|
252
252
|
this.conn.onmessage = (event) => {
|
253
253
|
const message = JSON.parse(event.data);
|
254
|
-
|
255
|
-
(
|
256
|
-
|
257
|
-
return accum;
|
258
|
-
},
|
259
|
-
{}
|
260
|
-
);
|
254
|
+
(message.flags ?? []).forEach((flag) => {
|
255
|
+
this.values[contextString(context)][flag.flag] = flag.value;
|
256
|
+
});
|
261
257
|
if (this.flagListener) {
|
262
258
|
this.flagListener(this.values[contextString(context)]);
|
263
259
|
}
|
@@ -312,28 +308,29 @@ var SchematicContext = createContext({
|
|
312
308
|
flagValues: {}
|
313
309
|
});
|
314
310
|
var SchematicProvider = ({
|
315
|
-
apiUrl,
|
316
311
|
children,
|
317
|
-
|
318
|
-
|
319
|
-
|
312
|
+
client: providedClient,
|
313
|
+
clientOpts,
|
314
|
+
publishableKey
|
320
315
|
}) => {
|
321
316
|
const [client, setClient] = useState();
|
322
317
|
const [flagValues, setFlagValues] = useState({});
|
323
318
|
useEffect(() => {
|
319
|
+
if (providedClient) {
|
320
|
+
setClient(providedClient);
|
321
|
+
return providedClient.cleanup;
|
322
|
+
}
|
324
323
|
if (publishableKey === void 0) {
|
325
324
|
return;
|
326
325
|
}
|
327
|
-
const
|
328
|
-
|
329
|
-
eventUrl,
|
326
|
+
const newClient = new Schematic(publishableKey, {
|
327
|
+
...clientOpts,
|
330
328
|
flagListener: setFlagValues,
|
331
|
-
useWebSocket: true
|
332
|
-
webSocketUrl
|
329
|
+
useWebSocket: true
|
333
330
|
});
|
334
|
-
setClient(
|
335
|
-
return
|
336
|
-
}, [
|
331
|
+
setClient(newClient);
|
332
|
+
return newClient.cleanup;
|
333
|
+
}, [clientOpts, providedClient, publishableKey]);
|
337
334
|
const contextValue = {
|
338
335
|
client,
|
339
336
|
flagValues
|
@@ -341,26 +338,44 @@ var SchematicProvider = ({
|
|
341
338
|
return /* @__PURE__ */ jsx(SchematicContext.Provider, { value: contextValue, children });
|
342
339
|
};
|
343
340
|
var useSchematic = () => useContext(SchematicContext);
|
344
|
-
var
|
345
|
-
const
|
341
|
+
var useSchematicClient = (opts) => {
|
342
|
+
const schematic = useSchematic();
|
343
|
+
const { client } = opts ?? {};
|
344
|
+
if (client) {
|
345
|
+
return client;
|
346
|
+
}
|
347
|
+
return schematic.client;
|
348
|
+
};
|
349
|
+
var useSchematicContext = (opts) => {
|
350
|
+
const client = useSchematicClient(opts);
|
346
351
|
const { setContext } = client ?? {};
|
347
352
|
return { setContext };
|
348
353
|
};
|
349
|
-
var useSchematicEvents = () => {
|
350
|
-
const
|
354
|
+
var useSchematicEvents = (opts) => {
|
355
|
+
const client = useSchematicClient(opts);
|
351
356
|
const { track, identify } = client ?? {};
|
352
357
|
return { track, identify };
|
353
358
|
};
|
354
|
-
var useSchematicFlag = (key,
|
359
|
+
var useSchematicFlag = (key, opts) => {
|
355
360
|
const { flagValues } = useSchematic();
|
361
|
+
const { client } = opts ?? {};
|
362
|
+
const { fallback = false } = opts ?? {};
|
356
363
|
const [value, setValue] = useState(fallback ?? false);
|
357
364
|
const flagValue = flagValues[key];
|
358
365
|
useEffect(() => {
|
359
|
-
typeof flagValue === "undefined" ? setValue(fallback
|
366
|
+
typeof flagValue === "undefined" ? setValue(fallback) : setValue(flagValue);
|
360
367
|
}, [key, fallback, flagValue]);
|
368
|
+
useEffect(() => {
|
369
|
+
if (!client)
|
370
|
+
return;
|
371
|
+
client.checkFlag({ key, fallback }).then((value2) => {
|
372
|
+
setValue(value2);
|
373
|
+
});
|
374
|
+
}, [client, key, fallback]);
|
361
375
|
return value;
|
362
376
|
};
|
363
377
|
export {
|
378
|
+
Schematic,
|
364
379
|
SchematicProvider,
|
365
380
|
useSchematic,
|
366
381
|
useSchematicContext,
|
package/package.json
CHANGED
@@ -42,9 +42,9 @@
|
|
42
42
|
"test": "jest --config jest.config.js"
|
43
43
|
},
|
44
44
|
"types": "dist/schematic-react.d.ts",
|
45
|
-
"version": "0.1.
|
45
|
+
"version": "0.1.7",
|
46
46
|
"dependencies": {
|
47
|
-
"@schematichq/schematic-js": "^0.1.
|
47
|
+
"@schematichq/schematic-js": "^0.1.8"
|
48
48
|
},
|
49
49
|
"peerDependencies": {
|
50
50
|
"react": ">=18"
|