@schematichq/schematic-react 0.1.4 → 0.1.6

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.
@@ -72,8 +72,9 @@ var v4_default = v4;
72
72
  var anonymousIdKey = "schematicId";
73
73
  var Schematic = class {
74
74
  apiKey;
75
- apiUrl = "api.schematichq.com";
76
- eventUrl = "c.schematichq.com";
75
+ apiUrl = "https://api.schematichq.com";
76
+ webSocketUrl = "wss://api.schematichq.com";
77
+ eventUrl = "https://c.schematichq.com";
77
78
  conn = null;
78
79
  context = {};
79
80
  eventQueue;
@@ -97,7 +98,10 @@ var Schematic = class {
97
98
  if (options?.eventUrl !== void 0) {
98
99
  this.eventUrl = options.eventUrl;
99
100
  }
100
- if (typeof window !== "undefined") {
101
+ if (options?.webSocketUrl !== void 0) {
102
+ this.webSocketUrl = options.webSocketUrl;
103
+ }
104
+ if (window?.addEventListener) {
101
105
  window.addEventListener("beforeunload", () => {
102
106
  this.flushEventQueue();
103
107
  });
@@ -110,7 +114,7 @@ var Schematic = class {
110
114
  const contextVals = this.values[contextString(context)] ?? {};
111
115
  return typeof contextVals[key] === "undefined" ? fallback : contextVals[key];
112
116
  }
113
- const requestUrl = this.getUrl(this.apiUrl, `flags/${key}/check`);
117
+ const requestUrl = `${this.apiUrl}/flags/${key}/check`;
114
118
  return fetch(requestUrl, {
115
119
  method: "POST",
116
120
  headers: {
@@ -133,7 +137,7 @@ var Schematic = class {
133
137
  // Make a REST API call to fetch all flag values for a given context
134
138
  checkFlags = async (context) => {
135
139
  context = context || this.context;
136
- const requestUrl = this.getUrl(this.apiUrl, "flags/check");
140
+ const requestUrl = `${this.apiUrl}/flags/check`;
137
141
  const requestBody = JSON.stringify(context);
138
142
  return fetch(requestUrl, {
139
143
  method: "POST",
@@ -189,16 +193,6 @@ var Schematic = class {
189
193
  track = (body) => {
190
194
  this.handleEvent("track", body);
191
195
  };
192
- getUrl = (domain, path, urlType) => {
193
- let scheme = "http";
194
- if (urlType === "ws") {
195
- scheme = "ws";
196
- }
197
- if (typeof window === "undefined" || window.location.protocol === "https:") {
198
- return `${scheme}s://${domain}/${path}`;
199
- }
200
- return `${scheme}://${domain}/${path}`;
201
- };
202
196
  flushEventQueue = () => {
203
197
  while (this.eventQueue.length > 0) {
204
198
  const event = this.eventQueue.shift();
@@ -228,14 +222,14 @@ var Schematic = class {
228
222
  tracker_user_id: this.getAnonymousId(),
229
223
  type: eventType
230
224
  };
231
- if (typeof document !== "undefined" && document.hidden) {
225
+ if (document?.hidden) {
232
226
  this.storeEvent(event);
233
227
  } else {
234
228
  this.sendEvent(event);
235
229
  }
236
230
  };
237
231
  sendEvent = (event) => {
238
- const captureUrl = this.getUrl(this.eventUrl, "e");
232
+ const captureUrl = `${this.eventUrl}/e`;
239
233
  const payload = JSON.stringify(event);
240
234
  fetch(captureUrl, {
241
235
  method: "POST",
@@ -261,7 +255,7 @@ var Schematic = class {
261
255
  if (this.conn) {
262
256
  resolve();
263
257
  }
264
- const wsUrl = this.getUrl(this.apiUrl, "flags/bootstrap", "ws");
258
+ const wsUrl = `${this.webSocketUrl}/flags/bootstrap`;
265
259
  const webSocket = new WebSocket(wsUrl);
266
260
  this.conn = webSocket;
267
261
  webSocket.onopen = () => {
@@ -343,24 +337,29 @@ var SchematicContext = (0, import_react.createContext)({
343
337
  flagValues: {}
344
338
  });
345
339
  var SchematicProvider = ({
346
- apiUrl,
347
340
  children,
341
+ client: providedClient,
342
+ clientOpts,
348
343
  publishableKey
349
344
  }) => {
350
345
  const [client, setClient] = (0, import_react.useState)();
351
346
  const [flagValues, setFlagValues] = (0, import_react.useState)({});
352
347
  (0, import_react.useEffect)(() => {
348
+ if (providedClient) {
349
+ setClient(providedClient);
350
+ return providedClient.cleanup;
351
+ }
353
352
  if (publishableKey === void 0) {
354
353
  return;
355
354
  }
356
- const client2 = new Schematic(publishableKey, {
357
- apiUrl,
355
+ const newClient = new Schematic(publishableKey, {
356
+ ...clientOpts,
358
357
  flagListener: setFlagValues,
359
358
  useWebSocket: true
360
359
  });
361
- setClient(client2);
362
- return client2.cleanup;
363
- }, [publishableKey]);
360
+ setClient(newClient);
361
+ return newClient.cleanup;
362
+ }, [clientOpts, providedClient, publishableKey]);
364
363
  const contextValue = {
365
364
  client,
366
365
  flagValues
@@ -368,23 +367,36 @@ var SchematicProvider = ({
368
367
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SchematicContext.Provider, { value: contextValue, children });
369
368
  };
370
369
  var useSchematic = () => (0, import_react.useContext)(SchematicContext);
371
- var useSchematicContext = () => {
372
- const { client } = useSchematic();
370
+ var useSchematicClient = (opts) => {
371
+ const schematic = useSchematic();
372
+ const { client } = opts ?? {};
373
+ if (client) {
374
+ return client;
375
+ }
376
+ return schematic.client;
377
+ };
378
+ var useSchematicContext = (opts) => {
379
+ const client = useSchematicClient(opts);
373
380
  const { setContext } = client ?? {};
374
381
  return { setContext };
375
382
  };
376
- var useSchematicEvents = () => {
377
- const { client } = useSchematic();
383
+ var useSchematicEvents = (opts) => {
384
+ const client = useSchematicClient(opts);
378
385
  const { track, identify } = client ?? {};
379
386
  return { track, identify };
380
387
  };
381
- var useSchematicFlag = (key, fallback) => {
388
+ var useSchematicFlag = (key, opts) => {
382
389
  const { flagValues } = useSchematic();
390
+ const { client } = opts ?? {};
391
+ const { fallback = false } = opts ?? {};
383
392
  const [value, setValue] = (0, import_react.useState)(fallback ?? false);
384
393
  const flagValue = flagValues[key];
385
394
  (0, import_react.useEffect)(() => {
386
- typeof flagValue === "undefined" ? setValue(fallback ?? false) : setValue(flagValue);
395
+ typeof flagValue === "undefined" ? setValue(fallback) : setValue(flagValue);
387
396
  }, [key, fallback, flagValue]);
397
+ if (client) {
398
+ return client.checkFlag({ key, fallback });
399
+ }
388
400
  return value;
389
401
  };
390
402
  /*! 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,27 +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
62
  }
52
63
 
53
64
  export { Traits }
54
65
 
55
66
  export declare const useSchematic: () => SchematicContextProps;
56
67
 
57
- export declare const useSchematicContext: () => {
68
+ export declare const useSchematicContext: (opts?: SchematicHookOpts) => {
58
69
  setContext: ((context: SchematicJS.SchematicContext) => Promise<void>) | undefined;
59
70
  };
60
71
 
61
- export declare const useSchematicEvents: () => {
72
+ export declare const useSchematicEvents: (opts?: SchematicHookOpts) => {
62
73
  track: ((body: SchematicJS.EventBodyTrack) => void) | undefined;
63
74
  identify: ((body: SchematicJS.EventBodyIdentify) => void) | undefined;
64
75
  };
65
76
 
66
- export declare const useSchematicFlag: (key: string, fallback?: boolean) => boolean;
77
+ export declare const useSchematicFlag: (key: string, opts?: UseSchematicFlagOpts) => boolean | Promise<boolean>;
78
+
79
+ export declare type UseSchematicFlagOpts = SchematicHookOpts & {
80
+ fallback?: boolean;
81
+ };
67
82
 
68
83
  export { }
@@ -42,8 +42,9 @@ var v4_default = v4;
42
42
  var anonymousIdKey = "schematicId";
43
43
  var Schematic = class {
44
44
  apiKey;
45
- apiUrl = "api.schematichq.com";
46
- eventUrl = "c.schematichq.com";
45
+ apiUrl = "https://api.schematichq.com";
46
+ webSocketUrl = "wss://api.schematichq.com";
47
+ eventUrl = "https://c.schematichq.com";
47
48
  conn = null;
48
49
  context = {};
49
50
  eventQueue;
@@ -67,7 +68,10 @@ var Schematic = class {
67
68
  if (options?.eventUrl !== void 0) {
68
69
  this.eventUrl = options.eventUrl;
69
70
  }
70
- if (typeof window !== "undefined") {
71
+ if (options?.webSocketUrl !== void 0) {
72
+ this.webSocketUrl = options.webSocketUrl;
73
+ }
74
+ if (window?.addEventListener) {
71
75
  window.addEventListener("beforeunload", () => {
72
76
  this.flushEventQueue();
73
77
  });
@@ -80,7 +84,7 @@ var Schematic = class {
80
84
  const contextVals = this.values[contextString(context)] ?? {};
81
85
  return typeof contextVals[key] === "undefined" ? fallback : contextVals[key];
82
86
  }
83
- const requestUrl = this.getUrl(this.apiUrl, `flags/${key}/check`);
87
+ const requestUrl = `${this.apiUrl}/flags/${key}/check`;
84
88
  return fetch(requestUrl, {
85
89
  method: "POST",
86
90
  headers: {
@@ -103,7 +107,7 @@ var Schematic = class {
103
107
  // Make a REST API call to fetch all flag values for a given context
104
108
  checkFlags = async (context) => {
105
109
  context = context || this.context;
106
- const requestUrl = this.getUrl(this.apiUrl, "flags/check");
110
+ const requestUrl = `${this.apiUrl}/flags/check`;
107
111
  const requestBody = JSON.stringify(context);
108
112
  return fetch(requestUrl, {
109
113
  method: "POST",
@@ -159,16 +163,6 @@ var Schematic = class {
159
163
  track = (body) => {
160
164
  this.handleEvent("track", body);
161
165
  };
162
- getUrl = (domain, path, urlType) => {
163
- let scheme = "http";
164
- if (urlType === "ws") {
165
- scheme = "ws";
166
- }
167
- if (typeof window === "undefined" || window.location.protocol === "https:") {
168
- return `${scheme}s://${domain}/${path}`;
169
- }
170
- return `${scheme}://${domain}/${path}`;
171
- };
172
166
  flushEventQueue = () => {
173
167
  while (this.eventQueue.length > 0) {
174
168
  const event = this.eventQueue.shift();
@@ -198,14 +192,14 @@ var Schematic = class {
198
192
  tracker_user_id: this.getAnonymousId(),
199
193
  type: eventType
200
194
  };
201
- if (typeof document !== "undefined" && document.hidden) {
195
+ if (document?.hidden) {
202
196
  this.storeEvent(event);
203
197
  } else {
204
198
  this.sendEvent(event);
205
199
  }
206
200
  };
207
201
  sendEvent = (event) => {
208
- const captureUrl = this.getUrl(this.eventUrl, "e");
202
+ const captureUrl = `${this.eventUrl}/e`;
209
203
  const payload = JSON.stringify(event);
210
204
  fetch(captureUrl, {
211
205
  method: "POST",
@@ -231,7 +225,7 @@ var Schematic = class {
231
225
  if (this.conn) {
232
226
  resolve();
233
227
  }
234
- const wsUrl = this.getUrl(this.apiUrl, "flags/bootstrap", "ws");
228
+ const wsUrl = `${this.webSocketUrl}/flags/bootstrap`;
235
229
  const webSocket = new WebSocket(wsUrl);
236
230
  this.conn = webSocket;
237
231
  webSocket.onopen = () => {
@@ -318,24 +312,29 @@ var SchematicContext = createContext({
318
312
  flagValues: {}
319
313
  });
320
314
  var SchematicProvider = ({
321
- apiUrl,
322
315
  children,
316
+ client: providedClient,
317
+ clientOpts,
323
318
  publishableKey
324
319
  }) => {
325
320
  const [client, setClient] = useState();
326
321
  const [flagValues, setFlagValues] = useState({});
327
322
  useEffect(() => {
323
+ if (providedClient) {
324
+ setClient(providedClient);
325
+ return providedClient.cleanup;
326
+ }
328
327
  if (publishableKey === void 0) {
329
328
  return;
330
329
  }
331
- const client2 = new Schematic(publishableKey, {
332
- apiUrl,
330
+ const newClient = new Schematic(publishableKey, {
331
+ ...clientOpts,
333
332
  flagListener: setFlagValues,
334
333
  useWebSocket: true
335
334
  });
336
- setClient(client2);
337
- return client2.cleanup;
338
- }, [publishableKey]);
335
+ setClient(newClient);
336
+ return newClient.cleanup;
337
+ }, [clientOpts, providedClient, publishableKey]);
339
338
  const contextValue = {
340
339
  client,
341
340
  flagValues
@@ -343,23 +342,36 @@ var SchematicProvider = ({
343
342
  return /* @__PURE__ */ jsx(SchematicContext.Provider, { value: contextValue, children });
344
343
  };
345
344
  var useSchematic = () => useContext(SchematicContext);
346
- var useSchematicContext = () => {
347
- const { client } = useSchematic();
345
+ var useSchematicClient = (opts) => {
346
+ const schematic = useSchematic();
347
+ const { client } = opts ?? {};
348
+ if (client) {
349
+ return client;
350
+ }
351
+ return schematic.client;
352
+ };
353
+ var useSchematicContext = (opts) => {
354
+ const client = useSchematicClient(opts);
348
355
  const { setContext } = client ?? {};
349
356
  return { setContext };
350
357
  };
351
- var useSchematicEvents = () => {
352
- const { client } = useSchematic();
358
+ var useSchematicEvents = (opts) => {
359
+ const client = useSchematicClient(opts);
353
360
  const { track, identify } = client ?? {};
354
361
  return { track, identify };
355
362
  };
356
- var useSchematicFlag = (key, fallback) => {
363
+ var useSchematicFlag = (key, opts) => {
357
364
  const { flagValues } = useSchematic();
365
+ const { client } = opts ?? {};
366
+ const { fallback = false } = opts ?? {};
358
367
  const [value, setValue] = useState(fallback ?? false);
359
368
  const flagValue = flagValues[key];
360
369
  useEffect(() => {
361
- typeof flagValue === "undefined" ? setValue(fallback ?? false) : setValue(flagValue);
370
+ typeof flagValue === "undefined" ? setValue(fallback) : setValue(flagValue);
362
371
  }, [key, fallback, flagValue]);
372
+ if (client) {
373
+ return client.checkFlag({ key, fallback });
374
+ }
363
375
  return value;
364
376
  };
365
377
  export {
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.4",
45
+ "version": "0.1.6",
46
46
  "dependencies": {
47
- "@schematichq/schematic-js": "^0.1.4"
47
+ "@schematichq/schematic-js": "^0.1.7"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "react": ">=18"